반응형
반응형

http://mysqldba.tistory.com/111#recentTrackback











반응형
반응형

http://mysqldba.tistory.com/110





반응형
반응형

http://mysqldba.tistory.com/109










반응형
반응형

http://mysqldba.tistory.com/108





반응형
반응형

http://mysqldba.tistory.com/104









반응형
반응형

http://mysqldba.tistory.com/103








반응형
반응형

http://mysqldba.tistory.com/102






반응형
반응형

http://mysqldba.tistory.com/101








반응형
반응형

http://mysqldba.tistory.com/97













반응형
반응형

http://mysqldba.tistory.com/96






반응형
반응형

http://mysqldba.tistory.com/95






반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[MySQLVer.5.6Reference]4. COLUMNS Partition  (0) 2014.09.19
[MySQLVer.5.6Reference]3. LIST Partition  (0) 2014.09.19
[MySQLVer.5.6Reference]1. Partition Type  (0) 2014.09.19
mysql 로그 삭제하기  (0) 2014.09.19
STATUS Variable  (0) 2014.09.16
반응형

http://mysqldba.tistory.com/94



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[MySQLVer.5.6Reference]3. LIST Partition  (0) 2014.09.19
[MySQLVer.5.6Reference]2. RANGE Partition  (0) 2014.09.19
mysql 로그 삭제하기  (0) 2014.09.19
STATUS Variable  (0) 2014.09.16
monitoring 정리 할 것  (0) 2014.09.16
반응형

http://cafe.naver.com/hostingfaq/659



MySQL 에서 로그를 삭제할 때 그냥 로그 파일을 삭제하는 방법도 있지만

원하는 날짜까지의 로그만 삭제하는 방법도 있습니다.


MySQL 에서 쿼리문으로 지원하는 삭제 방법은 3가지가 존재하며,

파일을 삭제하는 방법, 날짜를 지정해서 지정한 날짜까지만 삭제하는 방법, 전체 로그를 삭제하는 방법이 존재합니다.


purge master logs to 'filename' : 지정한 파일까지의 파일을 순서대로 삭제

purge master logs before 'date' : 지정한 날짜까지의 로그를 삭제

reset master : 모든 로그를 삭제하고 로그 파일 새로 시작




반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[MySQLVer.5.6Reference]2. RANGE Partition  (0) 2014.09.19
[MySQLVer.5.6Reference]1. Partition Type  (0) 2014.09.19
STATUS Variable  (0) 2014.09.16
monitoring 정리 할 것  (0) 2014.09.16
기초 Admin 10장 테스트  (0) 2014.09.16
반응형














반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[MySQLVer.5.6Reference]1. Partition Type  (0) 2014.09.19
mysql 로그 삭제하기  (0) 2014.09.19
monitoring 정리 할 것  (0) 2014.09.16
기초 Admin 10장 테스트  (0) 2014.09.16
기초 Admin 9장 테스트  (0) 2014.09.16
반응형

show processlist;

show full processlist;

mytop -u root -p


qps 및 프로세스 확인

mysqladmin -uroot -p proc stat 

mysqladmin -uroot -p proc stat -i 1


show status like '%connect%';

+------------------------+-------+

| Variable_name               | Value |

+------------------------+-------+

| Aborted_connects          | 47      |     실패한 연결 수

| Connections                 | 4841   |      총 연결 수

| Max_used_connections  | 54      |     최대 연결 수

| Threads_connected       | 1        |     현재 열려 있는 연결 숫자. 


show status like '%Threads%';

+------------------------+-------+

| Variable_name              | Value |

+------------------------+-------+

| Delayed_insert_threads  |   0      |     사용 중에 있는 INSERT DELAYED 핸들러 쓰레드 숫자

| Slow_launch_threads     |  0      |      slow_launch_time 시간보다 더많은 생성 시간이 필요한 쓰레드의 숫자.

| Threads_cached            |  7      |     쓰레드 캐시에 있는 쓰레드의 숫자.

| Threads_connected        |  2      |     현재 열려 있는 연결 숫자. 

| Threads_created            | 57      |     연결을 처리하기 위해 생성된 쓰레드의 숫자

| Threads_running            | 1       |      슬리핑 (sleeping) 상태가 아닌쓰레드의 숫자.

+------------------------+-------+


dstat 

cpu -> dstat -c

memory -> dstat -m

disk -> dstat -d

network -> dstat -n


dstat -c -m -n -d


mysql> show processlist;

* 현재 process의 snapshot이며, 현재 걸려 있는 쿼리를 볼 수 있다.

* slow query가 있는 경우 processlist로 확인해 볼 수 있다.

* processlist 테이블은 information_schema DB에 있다.

 

SELECT user,LEFT(host, instr(host,':')-1) IP , count(*) 

FROM INFORMATION_SCHEMA.PROCESSLIST 

WHERE user not in ('admin','repl','agent','system user') 

GROUP BY LEFT(host, instr(host,':')-1);

* 현재 process의 snapshot을 접속된 client별로 집계해서 보여준다.

* 각 client별로 세션을 몇개 열었는지 알 수 있다.

mysql> show global status;

* 수행되는 쿼리 종류에 따라서 mysql status에 카운트가 누적됨.

* show global status로 com_select, com_update, com_delete ... 이 값을 1분 단위로 추출해서... "증가값 / 60" -> 초당 처리량(qps)을 계산할 수 있다.

* slow_query 값도 모니터링할 수 있다.




yum install -y dstat

show engin innodb status

show processlist

mysqladmin -uroot -p'rpdlaqlf' extended-status -r -i 1 | grep -E 'Com_select |Com_update |Com_insert |Com_delete '




sar -ur -o cpu.log 1 300

sar -f cpu.log


mpstat 1 300



cpu / io check

iostat -c 3


memory check

free -s 2




dstat 

cpu -> dstat -c

memory -> dstat -m

disk -> dstat -d

network -> dstat -n


dstat -c -m -n -d




SHOW STATUS / SHOW VARIABLES 


쿼리 캐쉬 히트율

Qcache_hits / (Qcache_hits + Com_select)



MyISAM

캐쉬 적중률

100 - ((Key_reads * 100) / Key_read_requests)


버퍼 사용률

100 - ((Key_blocks_unused * key_ cache_block_size) * 100 / key_buffer_size)





테이블 잠금 확인

SHOW OPEN TABLES FROM DB명;

SHOW OPEN TABLES FROM DB명 LIKE 'Table명';



잠금 대기 체크

SELECT 

r.trx_id waiting_trx_id,

r.trx_mysql_thread_id waiting_thread,

r.trx_query waiting_query,

b.trx_id blocking_trx_id,

b.trx_mysql_thread_id blocking_thread,

b.trx_query blocking_query

FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS w

INNER JOIN INFORMATION_SCHEMA.INNODB_TRX b ON b.trx_id = w.blocking_trx_id

INNER JOIN INFORMATION_SCHEMA.INNODB_TRX r ON r.trx_id = w.requesting_trx_id;





slowquery 확인

mysqldumpslow -r -s c slow-query.log > parsed_slowquery.log


쿼리 실행 횟수(-s c)를 역순(-r) 

"mysqldumpslow -r -s c" 


쿼리의 잠금 시간

"mysqldumpslow -r -s l"(테이블 수준의 잠금만 해당)


쿼리로 조회한 레코드(row sent)

"mysqldumpslow -r -s r"



tail -f mysql-slow.log | mysql_slow_log_filter -T 0.5 -R 1000

- 0.5초 이상 걸리거나 행을 1000개 이상 access 하는 쿼리만 추출

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql 로그 삭제하기  (0) 2014.09.19
STATUS Variable  (0) 2014.09.16
기초 Admin 10장 테스트  (0) 2014.09.16
기초 Admin 9장 테스트  (0) 2014.09.16
기초 Admin 4장 테스트  (0) 2014.09.16
반응형

mysqldba.tistory.com/68


1. 쿼리 작성 시 내가 사용할 index를 설정하는 방법은?

 -> use index (index_nm)을 사용하거나, force index (index_nm)을 사용하여 from 절에 기입한다.


2. 예약어로 지정되어 있는 단어를 컬럼 명으로 사용하고자 할 경우 가능한가 가능하지 않은가?

 -> 인용 부호를 이용하면 가능하다.


3. 식별자를 사용할 때 숫자만으로 이루어진 식별자를 사용할 수 있는가?

 -> 인용부호를 이용하면 가능하지만, 하지 않는 것이 좋다.


4. InnoDB Storage Engine을 사용하는 경우 mysqldump를 사용하더라도 대기현상에 빠져 서비스 운용에 문제가 발생할 가능성이 있다. 그 가능성은 어떤 것 때문인가?

 -> mysqldump를 실행하는 경우 mysqldump 모듈은 데이터를 내리기 전에 flush table 구문을 통해 table 들에 대한 정보를 flush 하는데, 이 때 실행시간이 오래 걸리는 쿼리가 동작하고 있다면, 그로 인해 대기 현상에 빠질 수 있다.


5. 만약, MySQL 접속하는 커넥션들이 커넥션 pool을 이용하여 관리되고 있는 것이 아니라면, MySQL의 (thread_cache_size)의 값을 수정하여 몇 개의 커넥션을 캐쉬하여 커넥션 pool과 같은 효과를 낼 수 있다.


6. 테이블이 어느 순간에 열리지 않는 경우, (table_open_cache 또는 table_cache)의 값을 확인하여 모든 스레드가 열 수 있는 테이블 수를 확인하고,

(open_files_limit)의 값을 확인하여 os가 mysqld에 할당한 오픈 가능한 파일의 갯수가 얼마인지도 확인해야한다. 만약 이 variable의 값이 0인 경우 os상의 설정값을 그대로 가져간다는 의미이다.


7. 테이블에 현재 시간을 입력해야 하는 경우 sysdate()을 사용하기보다는 (now())를 사용하는 것이 좋다.


8. 실행 계획을 보고자 하는 경우 SQL문 앞에 (explain)을 사용하여 실행하면 된다.


9. 테이블의 실행계획 상에서 조합하는 순서를 from 절에 기술된 순서대로 처리하고자 하는 경우 쿼리 앞에 (straight join) 구문을 사용하면 된다.

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

STATUS Variable  (0) 2014.09.16
monitoring 정리 할 것  (0) 2014.09.16
기초 Admin 9장 테스트  (0) 2014.09.16
기초 Admin 4장 테스트  (0) 2014.09.16
기초 Admin 3장 테스트  (0) 2014.09.16
반응형

mysqldba.tistory.com/67


1. MyISAM 테이블은 테이블 생성 시 해당 스키마의 OS영역에 어떤 파일들이 생성되는가?

 -> 생성되는 테이블을 이름으로 하는 frm, MYD, MYI 확장자를 가진 파일들이 생성된다.


2. MySQL System Schema 는 어떤 스토리지 엔진으로 생성되는가?

 -> MyISAM


3. MyISAM 으로 생성된 테이블의 인덱스에서 특정 데이터 영역을 찾아가기 위해서 MyISAM은 각 인덱스의 leaf block에 해당 key의 값을 가르키는

(record pointer)를 가지고 있다.


4. MyISAM은 3가지의 format으로 생성될 수 있다. fixed 컬럼으로만 이루어진 (Fixed-row Format), 가변적인 컬럼이 포함된 컬럼 타입을 사용하는 경우에는 (Dynamic-row Format), 일반 테이블을 압축한 형태인 (Compressed Format)이 있다.


5. MyISAM이 사용하는 메모리 영역인 (Key Cache) 영역은 my.cnf의 key_buffer_size 값으로 설정이 가능하다. 이 영역은 원할 경우 여러 개 생성이 가능하고, 특정 영역에 특정 테이블에 대한 내용을 사용하게 설정할 수도 있다.


6. Innodb의 buffer pool size를 설정하고자 하는 경우 (innodb_buffer_pool_size)를 설정하면 되고, innodb log file의 갯수를 설정하고자 하는 경우

(innodb_log_files_in_group)을 설정하면 된다.


7. 같은 데이터 양을 가진 Innodb 테이블과 MyISAM 테이블이 있다면 실제 OS상 공간 차지 비율은 어떤 스토리지 엔진의 테이블이 더 많을 가능성이 높은가?

 -> InnoDB


8. InnoDB에서 FK 생성 시 지켜야 하는 제약 조건은 무엇인가?

 -> 두 테이블의 해당하는 컬럼의 type이 같아야하고, 두 컬럼을 선두 컬럼으로 하는 인덱스가 생성되어 있어야 함.


9. InnoDB의 default transaction Isolation Level은 무엇인가?

 -> Repeatable Read


10. Innodb는 데이터 저장 시 (Clustered Index) 영역을 생성하여 그 영역에 인덱스와 함께 데이터를 함께 보관한다.

 

11. Clustered Index가 Primary key로 구현되어진 경우, InnoDB의 Non-Clustered-Index는 해당하는 key의 데이터 영역을 접근하기 위해 각 key마다 해당하는 영역에 대한 (Primary key)값을 가지고 있다.


12. remote에 위치한 테이블에 접근하고자 하는 경우 사용할 수 있는 스토리지 엔진은 무엇인가?

 -> federated storage engine


13. federated storage engine을 사용하는 서버의 경우 복구할 때 어떤 문제점이 발생할 수 있는가?

 -> federated storage engine으로 생성된 테이블에서 발생된 DML이 바이너리 로그에 남기 때문에 복구 시 원치 않게 remote table에 DML을 다시 적용하게 할 수 있다.


14. memory table 과 internal temporary table의 차이점은 무엇인가?

 -> 1. memory table은 모든 세션이 전부 접근할 수 있고, internal temporary table은 생성한 그 세션에서만 사용이 가능하다.

      2. memory table은 메모리 영역에서만 생성되고, internal tempoary table은 사이즈가 커지는 경우 디스크로 옮겨가기도 한다.


15. memory table은 어떤 종류의 인덱스를 생성할 수 있는가?

 -> hash index, b-tree index

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

monitoring 정리 할 것  (0) 2014.09.16
기초 Admin 10장 테스트  (0) 2014.09.16
기초 Admin 4장 테스트  (0) 2014.09.16
기초 Admin 3장 테스트  (0) 2014.09.16
기초 Admin 2장 테스트  (0) 2014.09.16
반응형

1. MySQL을 설치하고 난 뒤에 root 패스워드에는 패스워드가 지정되어 있는가? 지정되어 있지 않은가?

 -> 지정되어 있지 않다.


2. MySQL 접근하는 방법은 LOCAL에서 접속하는 방법인 (Socket File) 을 사용하여 접근하는 방법과, 

(IP)와 (Port) 정보를 이용하여 TCP/IP로 접근하는 방법 2가지가 있다.


3. MySQL에서는 Account를 생성하고 난 뒤에 따로 schema 를 생성하지 않으면 사용할 schema가 존재하지 않는다.( O/X )

 -> O


4. MySQL에서는 schema란 용어 대신 (database)라는 용어를 사용한다.


5. MySQL에 생성된 schema의 목록을 보고자 하는 경우 (show databases) 또는 (show schema) 를 실행하면 된다.

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 10장 테스트  (0) 2014.09.16
기초 Admin 9장 테스트  (0) 2014.09.16
기초 Admin 3장 테스트  (0) 2014.09.16
기초 Admin 2장 테스트  (0) 2014.09.16
기초 Admin 1장 테스트  (0) 2014.09.16
반응형

1. MySQL Engine이 설치된 위치를 우리는 (base directory) 라고 하고, 속성이름으로는 (basedir) 이라고 한다.


2. MySQL 이 생성하는 파일들의 default 위치를 우리는 (data directory) 라고 하고, 설정할 때에는 (datadir) 속성 이름으로 그 위치를 지정할 수 있다.


3. my.cnf에서 MySQL Server의 프로세스에 영향을 줄 속성들을 정의하는 그룹명은 (mysqld) 이다.


4. binary log를 설정하여 사용하는데에 필요한 속성을 아는대로 작성하시오.

 -> binary_cache_size, binlog_format, log_bin, max_binlog_size


5. 서버와 Client간의 통신 시 주고 받을 packet 사이즈를 결정하는 속성은 무엇인가?

 -> max_allowed_packet


6. MySQL 서버에 접근하는 Root를 제외한 모든 Client에 대해 DML 를 제약하는 속성은 무엇인가?

 -> Read_only


7. MySQL Server와 Server 사이의 통신 시 사용하는 유일한 값을 지정하는 속성은 무엇인가?

 -> server_id


8. mysqld_safe를 구동시킬 때 사용할 my.cnf를 지정하는 옵션은 무엇인가?

 -> --defaults-file


9. mysqld_safe를 구동시킬 때 사용할 my.cnf를 지정하지 않을 경우 MySQL 서버는 어느 위치에서 파일을 찾는가?

 -> /etc/mysql/my.cnf or /etc/my.cnf -> $MYSQL_HOME/my.cnf -> ~/my.cnf


10. Server에 커넥션이 생성되어 사용될 때 각 커넥션이 사용할 메모리 영역을 할당할 때 가장 대표적으로 설정해야 하는 속성은 무엇인가?

 -> read_buffer_size, sort_buffer_size


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 9장 테스트  (0) 2014.09.16
기초 Admin 4장 테스트  (0) 2014.09.16
기초 Admin 2장 테스트  (0) 2014.09.16
기초 Admin 1장 테스트  (0) 2014.09.16
MMM (Multi-Master Replication Mananger) 설치  (0) 2014.09.15
반응형

1. MySQLAB에서 제공하는 Release된 Community 버젼 중 최종 버젼으로 실제 사용하다고 말할 수 있는 버젼은 어떤 버젼을 말하는가?

 -> Generally Available (GA)


2. Download해서 받은 엔진파일의 이름에서 추출할 수 있는 엔진에 대한 정보에는 어떠한 것이 있는가?

 -> MySQL Version 정보, OS 정보, Gilbc 버전 정보


3. 엔진 설치할 때 압축을 푼 디렉토리에서 실제 사용할 symbolic link를 거는 이유는 무엇인가?

 -> 엔진에 대한 정보를 제거하지 않으므로, 엔진에 대한 정보 추출이 용이하게 하고, 실제 사용할 때에는 짧은 이름을 사용함으로서 사용시 불편함을 줄일 수 있다. 또한 엔진 업그레이드 시 엔진 영역에 대한 디렉토리 변경을 따로 하지 않아도 된다.


4. 엔진 설치시 configure 파일이 하는 역할은 무엇인가?

 -> mysql schema (database) 생성, mysql server startup


5. MySQL Server 구동 시 구동에 필요한 속성들을 정의한 파일의 이름은 무엇인가?

 -> my.cnf

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 4장 테스트  (0) 2014.09.16
기초 Admin 3장 테스트  (0) 2014.09.16
기초 Admin 1장 테스트  (0) 2014.09.16
MMM (Multi-Master Replication Mananger) 설치  (0) 2014.09.15
SHOW ENGINE INNODB STATUS  (0) 2014.09.15
반응형

1. MySQL 구조 중에 데이터의 저장과 추출 부분을 담당하는 부분으로 MySQL에만 존재하는 독특한 Layer 부분은 무엇인가?

 -> Storage Engine


2. MySQL Server에 접근하기 위해 Application에서 설치하여 MySQL Server와 통신하는데 사용하는 모듈들을 말하는 것으로 C API, JDBC 등 여러 언어에 따라 다양한 모듈을 제공하는데, 그것을 무엇이라고 하는가?

 -> Connector


3. 실행되는 Select문과 그 실행결과가 저장되는 영역으로 반복적으로 수행되는 Select의 실행 속도를 향상시켜주는 역할을 하는 Cache 영역을 무엇이라고 하는가?

 -> Query Cache


4. Select를 제외한 구문은 Query Cache에 저장되는가 저장되지 않는가?

 -> 저장되지 않는다.


5. MySQL의 Cluster를 구성할 때에만 사용되는 Storage Engine은 무엇인가?

 -> NDB (Cluster) Storage Engine


6. MVCC를 지원하는 Storage Engine은 무엇인가?

 -> INNODB


7. InnoDB는 (Row) level 로 Lock이 구현되고, MyISAM은 (Table) level로 Lock이 구현된다.


8. MyISAM은 text단위의 검색을 할 수 있는 (Full-text Search Index)를 생성하여 사용할 수 있다.


9. MyISAM과 InnoDB 모두 Replication을 하여 구성할 수 있는가?

 -> 네, 가능합니다.


10. MySQLAB에서 무료로 제공하는 Client Tool로서 모델링, 서버접속, Admin관리까지 가능한 Client Tool은 무엇인가?

 -> MySQL Workbench

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 3장 테스트  (0) 2014.09.16
기초 Admin 2장 테스트  (0) 2014.09.16
MMM (Multi-Master Replication Mananger) 설치  (0) 2014.09.15
SHOW ENGINE INNODB STATUS  (0) 2014.09.15
INNODB 두번째  (0) 2014.09.15
반응형

http://cafe.naver.com/mysqlpg/32



actions.pm


monitor.pm


network.pm




* 본 문서는 오픈소스 MySQL Failover 솔루션인 MMM (Multi-Master Replication Mananger) 설치 절차를 정리한 문서입니다.

* 테스트 환경에서 사용된 DB의 구성 정보는 아래와 같습니다.
 db1 (10.211.55.4 : 3306) - active master
 db2 (10.211.55.5 : 3306) - second master & slave 
 db3 (10.211.55.6 : 3306) - slave
 writer vip (master db 접근을 위한 ip) 10.211.55.10
 reader vip (slave db 접근을 위한 ip) =  10.211.55.11, 10.211.55.12

(1) DB 환경 구성
 MMM 구성할 MySQL DB중 active master / passive master 2대를 양방향 복제 환경으로 구성합니다.
 추가 slave db들이 있는 경우 active master의 slave로 구성합니다.

 MMM 데몬이 접속할 수 있도록 별도의 DB 계정을 생성합니다.
 필요한 권한은 SUPER, PROCESS, REPLICATION CLIENT 3개이며, MMM 모니터 서버와 각 DB 서버의 IP에서 접근할 수 있도록 구성합니다.
 

 GRANT SUPER, PROCESS, REPLICATION CLIENT ON *.* TO mmm_user@xxx.xxx.xxx.xxx IDENTIFIED BY '***';

 => 모니터 서버와 각 DB 서버의 ip address로 전체 DB에 동일하게 적용

(2) Perl 모듈 설치
 MMM은 Perl 기반으로 제작되어 있으며, 기본적으로 시스템에 설치된 라이브러리 이외에도 몇 가지 추가 모듈 설치가 필요합니다. 추가 Perl 모듈들은 cpan(Comprehensive Perl Archive Network)을 통해 설치하면 매우 편리하며, 일부 모듈의 경우에는 gcc 컴파일도 필요하므로 사전에 gcc 컴파일러도 설치되어 있어야 합니다.
(MMM 설치 완료 후 debug 모드로 데몬을 구동해 봄으로써 누락된 모듈이 없는지 확인이 가능합니다.)

또한 매번 Perl 모듈 설치를 할 필요없이 한번 설치를 진행했던 시스템의 Perl Library 디렉토리를 동일 플랫폼의 다른 시스템에 그대로 복사해서 사용이 가능합니다.
 Algorithm::Diff Class:Singleton DBI and DBD::mysql File::Basename
 File::stat File::Temp Log::Dispatch Log::Log4perl
 Mail::Send Net::ARP Net::Ping Proc::Daemon
 Thread::Queue Time::HiRes  

(3) MMM 설치 및 구성
 * 모니터 설치 
   - make install_monitor
   - 보통 한대의 모니터 서버에 MMM 모니터 데몬을 여러개 구동하므로 멀티 인스턴스 구동이 가능하도록 init scrip를 수정합니다.
     ( /etc/init.d/mysql-mmm-monitor 파일의 CLUSTER='' 부분을 CLUSTER=$2로 수정 )
   - 이미 MMM 모니터 데몬이 구동중인 서버인 경우 설정 파일만 신규로 생성해서 모니터 데몬만 추가로 구동합니다.
 
 * 에이전트 설치 (각 DB 서버에 설치) 
   - make install_agent
   - Master만 Failover 구성하고 Slave의 Failover 구성을 하지 않는 경우에도 Slave DB에 모두 설치합니다.
     ( master가 변경되었을 때 자동으로 change master 처리 )

 * MMM 모니터 설정
  - 모니터 데몬을 생성하기 전에 클러스터 이름을 먼저 정의합니다. (본 예제에서는 hellommm 으로 사용함)
  - 설정파일 => /etc/mysql-mmm/mmm_mon_hellommm.conf
active_master_role writer
<monitor>
        ip 127.0.0.1
        port 20211       -> 모니터 데몬 별로 포트를 다르게 구성합니다.
        pid_path /var/run/mmm_mond-hellommm.pid
        bin_path /usr/lib/mysql-mmm/
        status_path /var/lib/misc/mmm_mond-hellommm.status
        ping_ips 10.211.55.4,10.211.55.5,10.211.55.6  
                 -> 실제 모니터링해야 할 DB 서버들의 IP 주소입니다. (master/slave 전체)
</monitor>

<host default>
        monitor_user mmm_user
        monitor_password ***
</host>

<host db1>
        ip 10.211.55.4
        peer db2
        mysql_port 3306
        mode master   -> master mode인 서버(active master, second master는 반드시 2대가 사전 정의되어야 합니다.)
</host>

<host db2>
        ip 10.211.55.5
        peer db1
        mysql_port 3306
        mode master
</host>

<host db3>
        ip 10.211.55.6
        mysql_port 3306
        mode slave
</host>

<role writer>  
        hosts db1,db2  -> writer role vip가 할당될 수 있는 서버를 정의합니다. (반드시 2대 지정)
        ips 10.211.55.10
        mode exclusive
</role>
-> master 접근을 위해 사용할 mmm vip를 정의합니다.

<role reader>
        hosts db1,db2,db3 -> reader role vip가 할당될 수 있는 서버를 정의합니다.
        ips 10.211.55.11,10.211.55.12
        mode balanced
</role>
-> slave 접근을 위해 사용할 mmm vip를 정의합니다. slave db failover에 MMM을 사용하지 않는 경우 생략해도 무방합니다.

debug 1 
-> (위에서 잠시 언급된) debug 모드로 구동하는 옵션입니다.
    최초 구동시 debug 모드로 구동을 해보고, Perl 모듈 참조 에러 등이 발생하지 않는지 체크해 보는 것을 권장합니다.
    이상 없으면 해당 라인을 지우거나 debug 0 옵션으로 데몬을 재가동합니다.

 * MMM 에이전트 설정
  - 설정파일 => /etc/mysql-mmm/mmm_agent.conf
 active_master_role      writer

<host default>
        cluster_interface eth1   -> 실제 DB 서버 IP가 할당되어 있는 인터페이스를 지정합니다. 
        pid_path /var/run/mmm_agentd.pid
        bin_path /usr/lib/mysql-mmm/
        replication_user repl_user -> 복제 계정 정보
        replication_password 111
        agent_user mmm_user -> MMM 접근 계정 정보
        agent_password 111
</host>

this db1  -> 에이전트가 설치되는 서버가 어느 서버인지 정보를 기재합니다. (아래 호스트 설정에 사용된 이름으로 지정)

<host db1>
        ip 10.211.55.4
        peer db2
        mysql_port 3306
        mode master
</host>

<host db2>
        ip 10.211.55.5
        peer db1
        mysql_port 3306
        mode master
</host>

<host db3>
        ip 10.211.55.6
        mysql_port 3306
        mode slave
</host>

<role writer>
        hosts db1,db2
        ips 10.211.55.10
        mode exclusive
</role>

<role reader>
        hosts db1,db2,db3
        ips 10.211.55.11,10.211.55.12
        mode balanced
</role>

debug 1

(4) MMM 데몬 가동
 * 모니터 데몬 가동 : /etc/init.d/mysql-mmm-monitor start hellommm 
 * 에이전트 데몬 가동 (각 DB 서버) : /etc/init.d/mysql-mmm-agent start

 * MMM 모니터 상에서 클러스터 정보를 확인해보면 모두 AWAITING RECOVERY 초기 상태가 되어 있으며, ONLINE 처리를 해주면 됩니다.
   (mmm_control 사용시 항상 클러스터명 앞에 @를 붙여주어야 됩니다.)

   mon# mmm_control @hellommm show
    db1(10.211.55.4) master/AWAITING_RECOVERY. Roles: 
    db2(10.211.55.5) master/AWAITING_RECOVERY. Roles: 
    db3(10.211.55.6) slave/AWAITING_RECOVERY. Roles: 

   mon# mmm_control @hellommm set_online db1
   mon# mmm_control @hellommm set_online db2
   mon# mmm_control @hellommm set_online db3

   mon# mmm_control @hellommm show
    db1(10.211.55.4) master/ONLINE. Roles: writer(10.211.55.10)
    db2(10.211.55.5) master/ONLINE. Roles: reader(10.211.55.11)
    db3(10.211.55.6) slave/ONLINE. Roles: reader(10.211.55.12)

  * 각 서버에서 IP가 정상 할당되었는지 확인합니다. 단, ifconfig 커맨드 대신 ip addr 커맨드를 사용합니다.
   db1# ip addr show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:1c:42:13:ea:2e brd ff:ff:ff:ff:ff:ff
        inet 10.211.55.4/24 brd 10.211.55.255 scope global eth0   --> 실제 DB 서버 IP
        inet 10.211.55.10/32 scope global eth0                               --> MMM IP
        inet6 fdb2:2c26:f4e4:0:21c:42ff:fe13:ea2e/64 scope global dynamic 
           valid_lft 2591925sec preferred_lft 604725sec
        inet6 fe80::21c:42ff:fe13:ea2e/64 scope link 
           valid_lft forever preferred_lft forever
 
(5) MMM 제어
 * mmm 관련 모든 제어는 모니터 서버에서 mmm_control 툴을 사용합니다.

 * 자주 사용하는 커맨드 
 - SHOW : agent 상태 및 클러스터 상태 확인
 - MOVE_ROLE : exclusive 모드의 vip (writer)를 다른 서버로 강제 이동 (master 강제 failover)
 - SET_OFFLINE : 특정 노드를 강제로 OFFLINE 처리하고 해당 서버의 모든 MMM IP를 모두 다른 서버로 이동 
 - SET_ONLINE : AWAITING_RECOVERY, ADMIN_OFFLINE 상태의 노드를 ONLINE 처리함 (reader IP가 자동으로 분산됨)
 - SET_PASSIVE : 모니터를 PASSIVE 모드로 변경 (DB 모니터링은 하되 failover 작업은 하지 않음)
 - SET_ACTIVE : 모니터의 PASSIVE 모드 해제

Valid commands are:
    help                              - show this message
    ping                              - ping monitor
    show                              - show status
    checks [<host>|all [<check>|all]] - show checks status
    set_online <host>                 - set host <host> online
    set_offline <host>                - set host <host> offline
    mode                              - print current mode.
    set_active                        - switch into active mode.
    set_manual                        - switch into manual mode.
    set_passive                       - switch into passive mode.
    move_role [--force] <role> <host> - move exclusive role <role> to host <host>
                                        (Only use --force if you know what you are doing!)
    set_ip <ip> <host>                - set role with ip <ip> to host <host> 

(6) MMM 패치 적용
 - 현재 MMM 2.2.1 버전에는 몇가지 버그가 존재하고 있으며, 아래 패치를 적용하면 문제를 해결할 수 있습니다.

 [MMM 모니터]
 - /usr/share/perl5/vendor_perl/MMM/Monitor/Monitor.pm 파일을 첨부된 파일로 교체
  DB 서버가 커널 패닉 등의 상태가 되는 경우, 에이전트와 통신하는 MMM 모니터 데몬이 같이 hang 상태에 빠지는 버그가 존재하며, 해당 로직에 타임아웃 처리가 필요합니다.

 [MMM 에이전트]
 - /usr/share/perl5/vendor_perl/MMM/Agent/Helpers/ 경로의 Actions.pm, Network.pm 파일을 첨부된 파일로 교체
  Master failover가 진행될 때, active/second master로 지정된 2대의 DB이외 Slave들은 신규 서버로 change master를 수행해야 하지만, 잘못된 binary log 포지션으로 연결하거나 혹은 지연 중인 복제를 모두 적용하지 못하고 master를 변경하는 문제가 수정되었습니다.
 IP 할당 과정에서의 ARP 패킷을 broadcasting interval을 수정했습니다.
 동시에 너무 많은 ARP 패킷이 유입되면 DS 스위치 동작 방식에 따라 ARP 패킷이 drop 되면서, IP 할당이 실패할 수 있습니다.


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 2장 테스트  (0) 2014.09.16
기초 Admin 1장 테스트  (0) 2014.09.16
SHOW ENGINE INNODB STATUS  (0) 2014.09.15
INNODB 두번째  (0) 2014.09.15
INNODB 첫번째  (0) 2014.09.15
반응형

MySQL InnoDB BACKGROUND THREAD




[출처] MySQL InnoDB BACKGROUND THREAD (MySQL Power Group) |작성자 악동

http://cafe.naver.com/mysqlpg/421


여기 저기 많은 Site 내용을 끼워 맞추었고...ㅠㅠ영어 Site 는 음... 틀리게 이해 한 부분 있으면 바로 지적해주세요

 

여기 저기 끼워맞추기 1탄입니다.

 

데이터베이스는 ACID 조건을 만족하고 최적의 실행 계획을 찾아 내기 위해서 복잡하고 정교한 작업을 진행합니다.
내부적으로는 동시 처리를 위한 저수준 잠금, 롤백 세그먼트 관리, disk Flush를 유기적으로 처리해야만 하며
MySQL InnoDB 역시 MVCC(multiversion concurrency controll)를 통해서 변경 전후 데이터를 유지하며
MUTEX(mutual exclusion)를 통해 수많은 동시 DB 명령어를 처리합니다.
모든 DB 명령어는 엔진에서 재귀 명령어를 발생시고 세션이나 사용자 동접이 올라가면 부하는 지수적으로 올라갑니다.

MySQL은 버전 업그레이드가 진행 되면서 동시 처리 성능 증대를 위한 많은 변경이 있었으며 
MySQL 명령어인 show engine innodb status\G 에서 innodb 상태를 체크 할 수 있으며
버전이 올라가면서 각 Thread 분리 혹은 성능 최적화를 위한 주요 내용들에 대한 성능 개선에 대한 이해를 show engine innodb status 부분과 연관지어 보려고 합니다.
( 최근 MySQL 에서는 information_schema performance_schema 를 통해 보다 많은 성능 수치를 확인 할 수 있다. )

 

----------------------
BACKGROUND THREAD 
----------------------
srv_master_thread loops: 4155278 1_second, 4155276 sleeps, 397985 10_second, 3508874 background, 3507563 flush 
srv_master_thread log flush and write: 4354878

 * srv_master_thread (마스터 Thread)
   - mysql 5.1 이전 버전 : srv_master_thread 한개로 purge(innodb dirty page check 및 purge,

                                  transcation commit 처리, redo log check 및 purge) 수행합니다.
      문제 : Main Thread 한나로 purge함으로써 대량 트래픽 발생으로 인한 transaction purge 부하 증가가 되고

                                  dirty 및 redo의 처리에 대한 지연발생으로 전체적인 성능 저하가 발생 합니다.
   - MySQL 5.5 : main thread or background thread로 transaction purge를 분리할 수 있도록 합니다.

                                  ( innodb_purge_threads=[0|1],innodb_purge_batch_size )
   - MySQL 5.6 : main thread 가 아닌 background thread 로 동작하며 multi purge thread 를 위해 32까지 가능합니다.

                                  (innodb-purge-threads=[1..32])


      multi threaded purge 참고

      (https://blogs.oracle.com/mysqlinnodb/entry/mysql_5_6_multi_threaded)
      purge thread 성능 비교 참고

      (http://dimitrik.free.fr/blog/archives/2010/04/mysql-performance-why-purge-thread-in-innodb.html)
      => dirty page purge Thread 분리 MySQL 5.6(page cleaner thread)
      MySQL purge thread 참고

      (https://dev.mysql.com/doc/innodb/1.1/en/innodb-improved-purge-scheduling.html)

 

 MySQL InnoDB는 버전이 업그레이드 되면서 purge 를 위한 Thread 들이 각각 기능별 분리 및 성능 향샹을 위한 옵션이 추가 되었습니다.


 

 

show engine innodb status 의 TRANSACTIONS 섹션을 통해서 transaction, redo log ,dirty page, insert buffer purge 에 대한 자세한 내용을 언급 하도록 하겠습니다.






여기 저기 끼워맞추기 2탄 입니다.

 

--------------
SEMAPHORES
--------------
OS WAIT ARRAY  INFO: reservation count 16808581, singal count 75349348
Mutex spin waits 567136608, rounds 989818342, OS waits 7441108
RW-shared spins 23382110, rounds 222945748, os waits 7441108
RW-excl spins 7120585, rounds 2349470423, OS waits 3060884
Spin rounds per wait: 1.75 mutex, 9.53 RW-shared, 33.63 RW-excl

 

--Thread 140426532412 has waited at btr/btr0sea.c line 774 for 0.00 seconds
S-lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139
a writer (thread id 1404265345512) has reserved it in node exclusive number of readers 0, 
waiters flag 1

 

 * semaphore : 다중 프로세스처리시 공유 데이터에 접근할때(context switch 와 같은 케이스...) 순서에 따라

                      동기화 처리 하도록 합니다.
 * mutex : 임계영역(공유데이터) 접근시 하나의 쓰레드만 처리할수 있도록 Lock 처리합니다.
 * reservation count : 세마포어 slot 에 추가된 건수입니다.
 * signal count : 쓰레드가 공유데이터에 접근하기 위한 signal 을 받은 건수입니다.
 * spin waits : mutex 획득을 통해 lock한 건수입니다.
 * rounds : mutex 를 획득 못할때 바로 context switch 를 발생하지 않도록 retry 한 건수입니다.
 * os waits : Thread 가 공유 데이터 접근하기 위해 context Switch 한 건수이며 일정 spin waits 시도 후에

                     context switch 가 발생합니다. 
 * 평균 mutex 획득 요청수 = spin_rounds/ sin_waits

 * innodb_spin_wait_delay 를 통해 mutex 획득을 위한 ms 를 정할수 있습니다. default 6
     http://topnanis.tistory.com/195
     mutex 개선 변경 히스토리
     http://www.tocker.ca/2013/11/27/what-is-a-mutex-anyway.html
     mutex 개선 내용
     http://dev.mysql.com/doc/innodb/1.1/en/innodb-performance-latching.html

 

 

   - A,B 두개의 Thread 가 아래 코드를 실행할때 케이스
     --------------------------------------------------------------------------------------
     i = 10; 전역변수
     i += 10;
     --------------------------------------------------------------------------------------
     A Thread                                        B Thread
     --------------------------------------------------------------------------------------
      임시변수 i = 전역변수 i 10 + 10 처리 
                                                          임시변수 i = 전역변수 i 10 + 10 처리 
      전역변수 i = 임시변수 i(20) 복사
                                                           전역변수 i = 임시변수 i(20) 복사
     --------------------------------------------------------------------------------------

     => A, B Thread 가 시간 차이를 두고 실행 되때 전역변수i를 A Thread 가 Lock(Mutex) 처리 하고 B Thread 가

         rounds 시도 이후 context switch이 발생합니다.
        위 같은 상황에서 다른 Thread 가 요청 발생이 되면 B Thread 가 우선 순위(Semaphore)로 동기화가 됩니다.
        
        MySQL rounds 는 OS context switch 발생으로 인한 리소스 소비를 줄이기 위하여 mutex 획득 재시도 합니다.
        참고 (http://topnanis.tistory.com/195)

 

 


 * MySQL 5.5.4 Mutex 개선 내용
   http://blog.zawodny.com/2010/04/14/mysql-5-5-4-is-very-exicting/

 

 

 * MySQL InnoDB는 MUTEX 성능을 최대화 하기 위해 많은 개선이 이루어 졌으며 아래와 같은 내용들이 수정 되었습니다.

 

 

   - buffer pool mutex : 대용량 buffer pool 사용으로 인한 LRU list, flush list 를 인스턴스별로 관리하여  

                purge 성능을 높일수 있다.
                https://dev.mysql.com/doc/innodb/1.1/en/innodb-multiple-buffer-pools.html
                http://mikaelronstrom.blogspot.ca/2010/09/multiple-buffer-pools-in-mysql-55.html
                MySQL 5.5 버전에서 buffer pool instance 분리 기능 추가
   

 

   - adaptive hash index (AHI) mutex : innodb는 secondary index에 대해 호출 패턴을 분석하여 prefix 값을 통해

                hash 인덱스를 생성하여 관리하나 index search 시 경합 문제가 발생합니다.
                MySQL 5.1 버전부터 (innodb_adaptive_hash_index) 을 통해 제어 가능합니다.
                http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-performance-adaptive_hash_index.html

 

 

 

   - log_sys mutex : in memory log buffer(innodb_log_buffer_size)의 사용자 transaction redo log 적용부분과 
                innodb buffer pool 의 dirty page 가 겹치게 되면 과도한 I/O 발생 및 경합이 발생하게 됩니다.
                MySQL 5.5 부터는 dirty page flush 처리를 위해 모든 dirty page의 연속적인

                최소 트랜잭션 로그 MTR(mini-transaction)과 global log buffer로 나누어 관리합니다.
                http://dev.mysql.com/doc/innodb/1.1/en/innodb-improved-log-sys-mutex.html
                https://blogs.oracle.com/mysqlinnodb/entry/redo_logging_in_innodb
                http://www.sba-research.org/wp-content/uploads/publications/WSDF2012_InnoDB.pdf
                http://cafe.naver.com/mysqlpg/86

 

 

   - rseg mutex : innodb는 ibdata의 rollback segement를 통해 변경 이전 정보를 기록하며 비정상 Fail 에도 Data 일관성을

                보장하며 변경전 데이터에 대한 동기화 mutex에 개선이 아래와 같이 이루어졌습니다.
                변경이전 데이터에 대한 동기화가 지연될 경우 show engine innodb status 에서 "TRANSACTIONS" 부분의

                history list length 에 해당 갯수가 카운트 됩니다.
                rollback segment mutex 는 purge와 연관이 있으며 
                MySQL 5.0 (innodb 1.0) : rollback segment 관리는 Main Thread 에서 직접 Purge 를 관리하며

                disk bound disk I/O 발생으로 전반적으로 느려지는 현상이 발생한다.
                MySQL 5.5 (innodb 1.1) : rollback segment 관리가 Background Thread 로 분리되었으며 한개

                rollback segment에 slot 1024개의 동시 트랜잭션 처리가 가능하도록 변경되었습니다.
                대량 변경으로 인한 disk 요청량이 많아지면서 unflushed된 history list 가 쌓이는 현상이 발생하며

                Innodb_max_purge_lag 옵션을 통해 조절이 가능합니다.
                      예) history list length : 3000 => innodb_max_purge_lag 에 지연 수치를 적용(2000)         
                          : (( history list length / innodb_max_purge_lag ) * 10 ) - 5          3000 / 2000 * 10 - 5 = 10ms      
                           => innodb_max_purge_lag 변경에 따른 undo log segement Size 가 커지는 문제발생       
                           => history list length 수치에 따른 Query 영향도          
                          : undo log segement 를 scan 하는 리소스 발생한다.


                MySQL 5.6 (innodb 1.1) : 128개 rollback segment에 각 segment당 slot 1024개의 동시 트랜잭션 약 128K 처리가

               가능하도록 변경되었으며(multiple thread,page cleaner) 새로운 flush 방식을 통해 MySQL 5.5의

               history list length 문제점이 개선 되었습니다.
               http://www.pythian.com/blog/some-fun-around-mysql-history-list/
               http://dev.mysql.com/doc/innodb/1.1/en/innodb-multiple-rollback-segments.html
               http://dev.mysql.com/doc/innodb/1.1/en/innodb-separate-flush-list-mutex.html
               https://blogs.oracle.com/mysqlinnodb/entry/better_scalability_with_multiple_rollback
               http://mysqldba.tistory.com/83


 

 

   - kernel mutex : V5.5까지 InnoDB core sub-system(Locking, Transaction, MVCC view sub-system)의

               쿼리의 상태 변화를 체크를 커널 뮤텍스라는 글로벌 뮤텍스로 처리하였으며
               Thread 증가로 여러개의 transaction이 동시 처리를 위해 각 Thread의 Query 상태는 lock, release 발생 및

               transaction 처리가 완료되며
               Thread별 Query의 상태 변화 때마다 글로벌 뮤텍스를 사용하게 되여 동시 처리량이 감소하는 현상이 발생합니다.
               MySQL V5.6 에서는 multi thread 처리를 위해 innodb core sub-system에서 transaction 시작과 끝에는

               글로벌 lock과 Query 상태 변화는 mutex로 분리하여 처리하도록 변경되었습니다.
                https://blogs.oracle.com/mysqlinnodb/entry/mysql_5_6_innodb_scalability
                
               MySQL 5.5이전 버전에서 Kernel mutex 이슈로 innodb_sync_spin_loops 변경에 따른 성능 비교가 있으나

               Thread 증가에 따른 영향도는 크지 않습니다.
               http://www.mysqlperformanceblog.com/2011/12/02/kernel_mutex-problem-or-double-throughput-with-single-variable/

               아래는 tcmalloc의 per thread cache 를 사용관련 내용입니다.
               http://jamesgolick.com/2012/7/18/innodb-kernel-mutex-contention-and-memory-allocators.html


 

 

   - MDL(Meta Data Lock) mutex : MySQL V5.3 을 기준으로 이전 버전에서 isolation level repeatable-read 트랜잭션 안의

               구문단위로 MDL 을 획득 하여 다른 세션에서 DDL 수행이 완료되며 트랜잭션 안에서 읽기 일관성이 깨지는 현상 발생
               MySQL V5.3 이상부터 트랜잭션 단위로 MDL을 처리하여 다른 세션의 DDL은 트랜잭션이 끝나기를 기다리므로 읽기

               일관성은 일치하나 wait 이 발생합니다.
               MySQL V5.7 에서는 metadata_locks_cache_size 와  metadata_locks_hash_instances 가 소개된다.
               http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html
               http://sql.dzone.com/articles/implications-metadata-locking

 









여기 저기 끼워맞추기 3탄 입니다.

 

 

---------------
TRANSACTIONS
---------------
Trx id counter A881F4E8
purge done for trx's n:0 < A881F4D0 undo n:0 < 0
History list length 2597
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 4339297, OS thread handle 0x7fd3c7cc6700, query id 3360966151 localhost root
show engine innodb status
---TRANSACTION A881F4E7, not started
MySQL thread id 3244653, OS thread handle 0x7fd3c7cc6700, query id 3360966151 Slave has read all relay log; waiting for the slave I/O thread to update it

 

 * MySQL InnoDB의 트랜잭션을 처리를 위해서 FILE I/O, INSERT BUFFER AND ADAPTIVE HASH INDEX, LOG, BUFFER   

   POOL AND MEMORY 간의 서로 연관된 복잡한 동기화를 실행합니다.


   TRANSACTIONS 에 가장 눈에 띄는 History list length 관련하여 SEMAPHORE rseg mutex에서 언급한

   Rollback Segment 구조를 이해하기 전에 전체 InnoDB 의 레이아웃부터 확인해 보고자 합니다.

 

   Rollback segement 구조에 대한 search를 하다가 InnoDB 테이블 구조에 대한 내용이 잘 정리된 곳부터 소개해 드립니다.
   InnoDB table space 에 대한 전반적인 레이아웃은 Jeremy Cole 블로그를 통해 많은 정보를 얻을수 있습니다.
   http://blog.jcole.us/2013/01/03/the-basics-of-innodb-space-file-layout/
   http://blog.jcole.us/2013/01/04/page-management-in-innodb-space-files/

   InnoDB 다이어그램 다운로드 https://github.com/jeremycole/innodb_diagrams 에서 png파일을 받아 볼수 있습니다.
   ( System, Extents, Index, Free list, Transaction, Data, Undo 공간에 대한 구조를 볼수 있습니다. )
   관심 있는분은 위 URL을 참고하세요

 

   InnoDB Page(16Kbyte) header에는 이전Page, 다음Page 위치 정보를 4byte로 모든 Page 주소를 표현할수 있습니다.
   최대 관리되는 Page 숫자는 2^32 = 약42억(4294967296)개를 가질수 있으며

   하나의 Default Page Size는 16Kbyte(16384Byte)로 2^32*16Kbyte = 약64Tbyte 까지 사용할수 있습니다.

   ( MySQL V5.6.4 부터는 set innodb_page_size=n(4k, 8k, 16k, or 4096, 8192, 16384) 으로 변경가능합니다 )

 

   대락 적인 구조 정보



   
   Table Space 구조 정보



     - InnoDB 의 ibdata Talble space 0 ~ 191page는 전체 구조 정보를 담고 있습니다.

       ( 약 3Mbyte 이상의 공간에  필요한 중요 정보들이 포함되어 있습니다. )

       page0 type FSP_HDR       : space, lists of free, fragmented, full extents 들의 정보 저장
       page1 type IBUF_BITMAP : Insert Buffer bitmap 정보 저장
       page2 type INODE            : inode 관련된 정보 저장
       page3 type SYS               : Insert Buffer Header 정보 저장
       page4 type INDEX            : insert buffering 를 위한 index의 root page 정보 저장
       Page5 type TRX_SYS        : innodb 트랜잭션을 위한 정보 저장

                                             (마지막 transaction id,binlog 정보, double write buffer extents 위치 정보)
       Page6 type SYS                : first rollback segment 정보 저장 
       Page7 type SYS                : index data dictionary 정보 저장
       Page 8 ~ 63                      : 확장 SYS type 정보 저장
       Pages 64 ~ 127                 : 1번째 double write buffer(64page or 1 Extent 1Mbyte)
       Pages 128 ~ 191                : 2번째 double write buffer(64page or 1 Extent 1Mbyte)

 

    그중에서 Page5 type TRX_SYS 부터 rollback segment 에 대한 구조를 통해

    InnoDB history 관리가 어떻게 되는지에 대한 구조를 확인 할 수 있습니다.



 

    Page5 type TRX_SYS 에는 rollback segment 를 위한 128개의 slot 가 존재하며

                     각 slot 는 Page43 type SYS 와 같이 rollback segments 를 가리키고 있습니다.
    Page43 에는 동시 트랜잭션 처리를 위한 undo Segment Arrary 0 ~ 1023(1024) 가 존재하며

                     history list 정보를 통해서 purge 되지 않는 리스트를 관리합니다.
    page301 에는 undo log segment가 존재하며 실제 ungo Logs 에 purge 되어 Sync 가 이루어 집니다.

 

    rollback segment 구조에 이어 show engine innodb status\G TRANSACTIONS부분에 나온 내용은 아래와 같습니다.
    
    Trx id counter A881F4E8  : 전체 트랜잭션의 갯수를 16진수(64bit 범위)로 표시하며 총 트랜잭션 갯수를 의미합니다.

        A881F4E8 => 2827089108
    purge done for trx's n:o < A881F4D0 undo n:o < 0  : purge done for trx's n:o 는 purge된 트랜잭션 갯수 입니다.

        A881F4D0 => 2827089104
        undo n:o 는 purge 가 진행되고 있는 갯수 입니다.
        not started 된 상태 => trx id counter - (purge done + undo)
    History list length 2597  : undo space 에서 purge 가 안된 갯수입니다.

    트랜잭션의 상태를 표시하는 정보들이 이어서 보여 줍니다.
    "not started", "ACTIVE", "fetching rows", "updating", 
    "Thread declared inside InnoDB 400" 
    "waiting in InnoDB queue","sleeping before joining InnoDB queue"

 

    InnoDB kernel 내부 Queue에 진입하기 위해 Innodb_thread_concurrency, innodb_thread_sleep_delay 를 통해

    성능 최상의 성능을 발휘하도록 변경가능합니다.
      http://dimitrik.free.fr/blog/archives/2010/11/mysql-performance-55-and-innodb-thread-concurrency.html

      (관련 테스트 내용입니다.)

    InnoDB 커널내부에서 동시에 처리되는 Queue 옵션으로 innodb_concurrency_tickets로 조절할수 있으며

    MySQL V5.5 까지 defaults 500이며 V5.6.6 에서는 5000 으로 변경되었습니다.
      http://www.pythian.com/blog/once-again-about-innodb-concurrency-tickets/ 

      ( 간단한 테스트 내용입니다.)

show engine innodb status\G 에 대한 이해는 필요할 것으로 보여 여기 저기 블럭 맞추기를 하고 있습니다.

혹 틀린 부분 있으면 언제든지..말씀 주세요







여기 저기 끼워맞추기 4탄 입니다.

 

--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Pending normal aio reads: 0[0,0,0,0], aio writes: 0 [0,0,0,0] ,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
293406 OS file reads, 10470446 OS file writes, 175420 OS fsyncs
9.33 reads/s, 16384 avg bytes/read, 696.86 writes/s, 2.75 fsyncs/s

 

 

Linux 데이터 동기화는 system API 호출을 통해 OS Kernel 내부 캐시 자체 대기열을 사용하여 DISK 에 기록하며 자체

대기열로 인한 문제를 해결하기 위해 sync(), fsync(), fdatasync() 시스템 콜 함수를 제공합니다.

 - sync() : 모든 버퍼 내용(데이터, 메타데이터) 동기화합니다. 일반적으로 시스템이 30초 주기로 flush 할때 호출 됩니다.
 - fsync() :  fd(file descriptor) 로 지정된 파일과 관련된 모든 변경내용(데이터, 메타데이터)을 디스크에 동기화 합니다.
 - fdatasync() : fd(file descriptor) 로 지정된 파일과 관련된 데이터만 디스크에 동기화 합니다.(fsync() 보다 빠릅니다.)

 

 시스템 콜 함수 이외에 open() 함수를 사용하여 O_SYNC, O_DSYNC, O_RSYNC, O_DIRECT 플래그를 통하여

 데이터 동기화를 사용할 수 있습니다.
 - O_SYNC : write()호출 직후 fsync()를 강제로 호출을 하여 데이터 동기식 입출력을 할수 있도록 합니다.

                  (쓰기 연산 시간이 늘어날 수 있습니다.)
 - O_DSYNC : write()호출 직후 fdatasync()를 강제로 호출 합니다.
 - O_RSYNC : write()와  read() 호출전에 메타데이터 동기화를 하도록 합니다.
 - O_DIRECT : 캐시를 우회해서 사용자 영역 버퍼에서 디바이스로 직접 입출력 동기화를 합니다.

 

InnoDB 역시 데이터를 DISK 에 기록하기 위해(Linux OS경우) Asynchronous I/O(AIO)에 대해

innodb plugin 1.1 innodb_use_native_aio 설정을 통해 pread() pwrite() 시스템 콜을 활용하여 파일의 처음부터

오프셋으로 access를 하지 않고 지정된 위치 부터 오프셋에 access 하여 flush_list 에 대한 별도의 marking(clean,removed)을

하지 않아 IO를 줄이도록 하였습니다.
https://blogs.oracle.com/mysqlinnodb/entry/innodb_now_supports_native_aio

 

InnoDB DISK I/O를 위한 Thread는 
 - insert buffer thread : buffer pool에 존재하지 않는 secondary index 데이터 수정이 되면 buffer pool 일부분에 해당 정보를

                                기록하여 Secondary Index 의 Random DISK I/O를 줄이도록 하며 해당 데이터가 memory에

                                load 될때 merge 작업을 통해 leaf node의 데이터를 동기화 하는 Thread 입니다.
                               http://dev.mysql.com/doc/innodb/1.1/en/innodb-performance-change_buffering.html

 

 - log thread : redo log disk sync를 위한 Thread이며 MySQL V5.1 까지 srv_master_thread 에서 purge를 했으며 V5.5 부터

                               분리되었습니다.
 
 - read thread / write thread : buffer pool 데이터 동기화 하며 MySQL V5.1 부터 srv_master_thread Thread 에서 분리되어

                                innodb_write_io_threads/innodb_read_io_threads 옵션으로 조절 됩니다.
                                innodb_use_native_aio 를 통해 시스템 콜을 사용하여 대량 트래픽 발생시 Linux System IO Call 의

                                제한으로 error 이 발생될 수 있습니다.

 

                        InnoDB: Using Linux native AIO
                        InnoDB: Warning: io_setup() failed with EAGAIN. Will make 5 attempts before giving up.
                        InnoDB: Warning: io_setup() attempt 1 failed.
                        InnoDB: Warning: io_setup() attempt 2 failed.
                        InnoDB: Warning: io_setup() attempt 3 failed.
                        InnoDB: Warning: io_setup() attempt 4 failed.
                        InnoDB: Warning: io_setup() attempt 5 failed.
                        InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts.
                        InnoDB: You can disable Linux Native AIO by setting innodb_native_aio = off in my.cnf
                        InnoDB: Initializing buffer pool, size = 128.0M
                        InnoDB: Completed initialization of buffer pool
                        mysqld got signal 11 ;

 

        * Linux aio max nr 설정 확인                        
          cat /proc/sys/fs/aio-max-nr
          65536
                        
        * Linux aio 사용 현황
          cat /proc/sys/fs/aio-nr

 

         * Linux aio 설정 변경       
           sysctl fs.aio-max-nr=262144

           http://elenst.ru/mariadb/aio-max-nr-in-general-and-innodb-error-io_setup-failed-with-eagain-in-particular/

 

FILE I/O 이외의 다른 Thread 정보 확인

select * from performance_schema.thread;
+-----------+----------------------------------------+------------+----------------+
| thread_id | name                                   | type       | PROCESSLIST_ID |
+-----------+----------------------------------------+------------+----------------+
|         1 | thread/sql/main                        | BACKGROUND |           NULL |
|         2 | thread/innodb/io_log_thread            | BACKGROUND |           NULL |
|         3 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         4 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         5 | thread/innodb/io_ibuf_thread           | BACKGROUND |           NULL |
|         6 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         7 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         8 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|         9 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        10 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        11 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        14 | thread/innodb/srv_lock_timeout_thread  | BACKGROUND |           NULL |
|        15 | thread/innodb/srv_error_monitor_thread | BACKGROUND |           NULL |
|        16 | thread/innodb/srv_monitor_thread       | BACKGROUND |           NULL |
|        17 | thread/innodb/srv_master_thread        | BACKGROUND |           NULL |
|        18 | thread/innodb/srv_purge_thread         | BACKGROUND |           NULL |
|        19 | thread/innodb/page_cleaner_thread      | BACKGROUND |           NULL |
|        20 | thread/sql/signal_handler              | BACKGROUND |           NULL |
|        22 | thread/sql/one_connection              | FOREGROUND |              2 |
+-----------+----------------------------------------+------------+----------------+
19 rows in set (0.00 sec)


와 같이 main, purge(srv_purge_thread), one_connection(thread_handling) 과 같은 Thread 정보를 확인 할 수 있습니다.
http://dba.stackexchange.com/questions/56482/how-can-i-determine-the-maximum-possible-number-of-threads

 

Pending normal aio reads: 0[0,0,0,0], aio writes: 0 [0,0,0,0]
                         read,write aio 의 Pending page 갯수를 표시합니다.
                         예) Pending normal aio reads: 8[1,2,1,4], aio writes: 0 [0,0,0,0]
                             현재 read aio 에서 4개의 Thread 에서 각각 page(16K) 들이 Pending 된 상태를 보여 줍니다.

 

 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
                         insert buffer AIO Pending read page 갯수를 표시합니다, log i/o's : log Pending log i/o 수 입니다,

                         sync i/o's: Pending sync 수 입니다.

 

Pending flushes (fsync) log: 0; buffer pool: 0
                         fsync 를 통한 동기화 Pending 수입니다.

 

293406 OS file reads, 10470446 OS file writes, 175420 OS fsyncs
                         reads는 innodb page(16Kbyte) 단위로 읽어 들이는 건수이며 16384 avg bytes/read 보다 크게 되면

                         Random Read 가 발생하여 Read I/O 에 영향이 될수 있습니다.
                         writes 는 data,log file write 건수이며 data의 경우 innodb page(16Kbyte) 수이며 log file ,

                         double write 의 경우 512byte 의 건수 입니다.
                         show global status 의 innodb_data_writes와 innodb_log_writes 의 합한 결과입니다.
                         
9.33 reads/s, 16384 avg bytes/read, 696.86 writes/s, 2.75 fsyncs/s
                         초당 reads,writes 한 건수 와 평균 read 한 byte 수가 표시 됩니다.

                         (writes 의 경우 data, log write 단위가 서로 다릅니다.)
                         16384 byte 이상의 avg bytes/read 발생시 많은 Random read 발생 확률이 높아집니다.
http://www.mysqlperformanceblog.com/2007/06/26/can-innodb-read-ahead-reduce-read-performance/

 

 

innodb data read write 관련 설명 
http://www.facebook.com/notes/mysql-at-facebook/innodb-disk-io-counters-in-show-status/445139830932

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

기초 Admin 1장 테스트  (0) 2014.09.16
MMM (Multi-Master Replication Mananger) 설치  (0) 2014.09.15
INNODB 두번째  (0) 2014.09.15
INNODB 첫번째  (0) 2014.09.15
TokuDB? Fractal Index에 대해 알아보아요~!  (0) 2014.09.15
반응형

http://cafe.naver.com/mysqlpg/293









반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MMM (Multi-Master Replication Mananger) 설치  (0) 2014.09.15
SHOW ENGINE INNODB STATUS  (0) 2014.09.15
INNODB 첫번째  (0) 2014.09.15
TokuDB? Fractal Index에 대해 알아보아요~!  (0) 2014.09.15
mysql 구조문서  (0) 2014.09.15
반응형


http://cafe.naver.com/mysqlpg/293




















































반응형

'연구개발 > MYSQL' 카테고리의 다른 글

SHOW ENGINE INNODB STATUS  (0) 2014.09.15
INNODB 두번째  (0) 2014.09.15
TokuDB? Fractal Index에 대해 알아보아요~!  (0) 2014.09.15
mysql 구조문서  (0) 2014.09.15
monitoring tuner  (0) 2014.09.12
반응형


[출처] TokuDB? Fractal Index에 대해 알아보아요~! (MySQL Power Group) |작성자 gywn_net

http://cafe.naver.com/mysqlpg/189



이 야심한 밤에.. 눈팅을 하다가 나도 오늘은 올려야겠다는 왠지 모를 의무감이 들어서.. 미뤄두었던 글 하나 올릴까 합니다. ^^


과거와는 다르게 데이터 사이즈가 비약적으로 커지고 있다. 특히, 최근 들어 SNS 서비스가 성황을 이루면서, 개인화된 데이터는 날이 갈수록 기하 급수적으로 늘어나고 있습니다. 최근 Fratical Index 기반의 TokuDB가 오픈 소스로 풀리면서 재조명을 받고 있는데, 이에 대해서 간단하게 설명해보도록 하겠습니다. 

B-Tree?
TokuDB에 논하기에 앞서, 전통적인 트리 구조인 B-Tree에 대해 알아보도록 하죠.

일반적으로 RDBMS에서 인덱스는 대부분 B-Tree기반으로 동작하는데, 크게는 “Internal Node”와 “Leaf Node”로 나뉩니다. Internal Node는 데이터를 어느 방향(작으면 왼쪽, 크거나 같으면 오른쪽)으로 보낼 지 결정하는 Pivot과 다음 Pivot의 위치를 알려주는 포인터로 구성됩니다. Internal Node의 가장 마지막 포인터는 Leaf Node를 향하는데, Leaf Node에는 보통은 데이터가 저장이 되죠.




Leaf Node는 트리 특성대로 왼쪽에서 오른쪽으로 순서대로 데이터가 저장되어 있습니다. 이러한 특성으로 트리로 구성된 구조에서는 데이터를 특정 범위를 가져올 수 있는 Range 처리가 가능하죠.

B-Tree는 데이터가 증가를 해도 Pivot을 거치는 횟수가 일정 수치 이상으로는 늘어지는 않습니다. 물론 Pivot 수와  Leaf Node 수는 데이터 증가 수와 비례하여 선형적으로 늘어날 수도 있겠지만, 원하는 Leaf Node에 접근하기 위해 거치는 Pivot 수는 크게 늘지는 않습니다. (비용으로 따진다면..  1회 데이터 접근이 O(logN)라는 수치가.. 신경은 안쓰셔도 됩니다. ^^)

위 트리에서 Leaf Node에 접근하기 위해 거치는 Pivot 수는 3입니다. 만약 Leaf Node가 8개로 늘어나게 되면 거쳐야 하는 수는 4번이고, 16개이면 5번이 됩니다. 즉, Leaf Node 수(데이터 사이즈)가 현재 수보다 2배 사이즈가 되어야 1회 더 거치게 되는 것이죠.

Leaf Node는 키 순으로 저장이 되어 있다는 것과 Pivot을 통한 데이터 접근이 가능한 B-Tree의 특성으로 단 건 데이터 접근과 특정 범위 처리에 좋은 성능을 보여줍니다.

그러나, 데이터 사이즈가 커지게 되면 B-Tree에도 큰 문제점에 봉착하게 되는데, 메모리 자원은 한계가 있다는 점입니다. 데이터가 커지면 모든 데이터를 메모리에 위치할 수가 없겠죠. 메모리 자원은 한정적이기 때문에, Leaf Node의 대부분은 디스크에 존재할 가능성이 크다. Leaf Node가 디스크에 존재하는 비율이 높아질 수록 해당 데이터를 Read/Write 시 잦은 Disk I/O가 발생할 수 밖에 없습니다.




컴퓨터 시스템 내부에서 가장 느린 성능을 보여주는 것은 바로 디스크로부터 Read/Write을 수행하는 것인데요.. 아무리 좋은 알고리즘을 가지고 데이터를 처리한다 하여도, 잦은 디스크 접근을 통해 동작하게 되면, 게다가 그 동작이 순서가 보장되지 않는 랜덤한 디스크 블록을 읽어야하는 이슈라면 결코 성능이 보장되지 않습니다.

B-Tree 특성 상 트리에 데이터 유입 시 바로 반영을 해주어야 하기 때문에, 메모리가 부족하게 되면 Disk Read/Write에서 즉시 성능 병목 현상이 발생할 수밖에 없는 것이죠.




아무리 CPU 자원이 남아돌아도, Disk I/O Wait으로 인해 처리할 데이터를 메모리에 로딩하지를 못하면, 의미없는 상태입니다. 디스크로부터 데이터를 읽어와야 요청을 처리할 수 밖에 없기 때문이죠.  잦은 Disk I/O Wait.. 이것은 성능 저하를 유발하는 가장 큰 요소입니다.

tokutek에서는 이러한 잦은 디스크 I/O로 인한 문제를 해결하고자 새로운 해결법은 제시하였는데, 그것은 바로 "Fractal Tree"입니다.

Fractal Tree?
그렇다면 Fractal Tree란 무엇일까요?
 Fractal Tree는 “Big I/O”에 촛점을 맞춘 자료 구조로, 잦은 Disk I/O를 줄이고, 한번에 다량의 데이터를 하단 노드로 전달함에 따라 데이터가 많은 상황에서도 효과적으로 처리할 수 있는 방안을 제시합니다.

Fractal Tree의 생김새는 B-Tree와 크게 다르지는 않습니다. Fractal Tree는 B-Tree와 같이 Internal Node와 Leaf Node로 구성되어 있고, Leaf Node에는 일반적으로 데이터가 저장되어 있습니다. Internal Node는 데이터를 어느 방향(작으면 왼쪽, 크거나 같으면 오른쪽)으로 보낼 지 결정하는 Pivot과 다음 Pivot의 위치를 알려주는 포인터로 B-Tree와 마찬가지로 구성되나 한가지 특이한 점이 더 추가됩니다. 바로 각 Pivot에는 Buffer 공간이 있다는 점이죠.. 바로 아래 그림처럼 말이죠. ^^




데이터가 유입되면, B-Tree처럼 바로 데이터를 Child Node(Pointer가 가리키는 Node)로 전달하지 않고, Buffer 공간에 저장을 합니다. 그리고 Buffer에 데이터가 가득 차는 순간 Buffer에 쌓인 데이터를 Child Node로 전달하게 됩니다.  버퍼를 어떻게 Child Node에 넘기는 지에 대한 내용은 스킵.. (쵸큼 많이 복잡해서.. 그림 그리기가 힘들어요. ㅠㅠ)

하단 이미지의 왼쪽 트리를 보면, 각 노드마다 버퍼 공간(회색 사각형)이 있습니다. 이 버퍼는 메모리 상에 존재하는 별도의 공간이며, 데이터가 유입 시 바로 자식 노드로 데이터를 내려보지 않고, 일시적으로 버퍼 공간에 보관을 합니다. 만약 하단 트리에서 2, 22 데이터가 유입되면(오른쪽 이미지 참고), 22 노드의 자식 노드로 바로 데이터를 내리지 않고 일시적으로 보관하고 있음을 보여줍니다. (버퍼는 최대 2개의 데이터를 저장할 수 있다고 가정!!)




이 상태에서 추가로 99 데이터가 들어오게 되면, 하단 그림 1)번과 같이 오른쪽 버퍼 공간에 채워지게 됩니다. 이후 23 데이터가 들어오면, 오른쪽 버퍼에 더 이상 공간이 없게 되므로, 이 순간 데이터를 자식 노드로 내리게 되죠. 이 단계에서 Disk I/O가 발생할 수는 단계이다. 버퍼 공간이 확보되면, 23을 다시 빈 버퍼 공간에 넣게 되며, 최종적으로 23이 Fractal Tree에 저장되게 됩니다.
즉, B-Tree에서 데이터 유입시 매번 자식 노드로 데이터를 보내며 발생하던 잦은 Disk I/O 수가 Fractal Tree에서는 각 노드에 존재하는 버퍼 공간으로 인해 극적으로 감소합니다. 실제로 TokuDB를 사용하고 테스트 데이터를 생성하는 동안, TokuDB의 데이터 사이즈 변화가 크지 않음에 처음에는 의아하기도 하였어요. ^^

한번에 Disk I/O가 발생하기에 얻을 수 있는 점은 I/O 횟수 외에 추가로 더 있습니다. B-Tree에서는 잦은 Random Insert시 Leaf Node의 블록이 단편화되는 현상이 잦아들 수 있겠지만, Fractal Tree에서는 뭉쳐서 Disk I/O를 수행하므로 압축률이 좋을 뿐만 아니라 블록 단편화가 훨씬 줄어들게 되는 것이죠. 물론 InnoDB에서 Barracuda로 압축 포멧으로 테이블을 구성할 수는 있겠지만, 블록 단편화가 많아지는 경우 압축률이 저하될 수밖에 없기에, 얻는 것보다는 오히려 잃는 것이 더 많아질 수 있습니다.ㅜㅜ




TokuDB에서 Fractal Tree Index는 Message 기반으로 동작을 합니다. 데이터 변화가 발생하더라도, 즉시 Leaf Node로의 전달이 일어나는 것이 아닌, 발생했던 이벤트를 각 노드가 가지는 Buffer에 순차적으로 붙이고, 버퍼가 가득 차게 되면, 자식 노드로 버퍼에 저장된 메시지를 전달합니다.



 
위 그림에서 가장 마지막에 수행된 연산은 99번 데이터를 지우라는 것이나, 실제로 Leaf Node에서 즉시 지워지지 않습니다. 이에 대한 이벤트는 메시지 형태로 버퍼에 저장이 되고, 관련 내용은 언젠가는 Leaf Node로 전달되어 적용될 것입니다.

자~! 야심한 이 밤!! 여기까지 정리하도록 하겠습니다. ^^
사실 B-Tree와는 컨셉이 조금 다른지라, 많이 헤매기도 했었지만.. 그림을 그리다보니 여기까지 오게되었네요. -_-;;

저와는 조금 다르게 생각하시는 분은 언제든지 제게 지적질을 해주세요!! 원래 지적 받으며 성장하기 마련..쿨럭~!

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

INNODB 두번째  (0) 2014.09.15
INNODB 첫번째  (0) 2014.09.15
mysql 구조문서  (0) 2014.09.15
monitoring tuner  (0) 2014.09.12
Buffer Cache 초기화 후, Data Caching 을 위한 Script 공유  (0) 2014.09.12
반응형


mysql 구조.pptx


반응형
반응형

$ sudo apt-get install mysqltuner -y


$ mysqltuner 

Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: 

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.1.66-0ubuntu0.10.04.1
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 578K (Tables: 34)
[!!] InnoDB is enabled but isn't being used
[!!] Total fragmented tables: 2

-------- Performance Metrics -------------------------------------------------
[--] Up for: 23h 42m 11s (6K q [0.079 qps], 362 conn, TX: 332K, RX: 120K)
[--] Reads / Writes: 100% / 0%
[--] Total buffers: 58.0M global + 2.7M per thread (151 max threads)
[OK] Maximum possible memory usage: 463.8M (23% of installed RAM)
[OK] Slow queries: 0% (0/6K)
[OK] Highest usage of available connections: 1% (2/151)
[OK] Key buffer size / total MyISAM indexes: 16.0M/311.0K
[!!] Key buffer hit rate: 50.0% (4 cached / 2 reads)
[!!] Query cache efficiency: 0.0% (0 cached / 136 selects)
[OK] Query cache prunes per day: 0
[OK] Temporary tables created on disk: 24% (48 on disk / 200 total)
[OK] Thread cache hit rate: 99% (2 created / 362 connections)
[OK] Table cache hit rate: 24% (57 open / 235 opened)
[OK] Open file limit used: 11% (114/1K)
[OK] Table locks acquired immediately: 100% (76 immediate / 76 locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Add skip-innodb to MySQL configuration to disable InnoDB
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Enable the slow query log to troubleshoot bad queries
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)

반응형
반응형

Buffer Cache 초기화 후, Data Caching 을 위한 Script 공유




dba_cache_data.sh


dba_cache_data.sql




안녕하세요. 준경대디 입니다.

 

금일 새벽점검 나왔다가 잠시 여유가 생겨,

Data Cache Script 을 만들어보았습니다.

 

 목적

점검시 DB Restart 가 진행되어 Buffer Memory 가 초기화 되었을 때,

점검 오픈전 데이터들을 일부 Buffer Memory 로 Caching 함으로서

유저유입시 발생하는 Disk IO 충격을 완화함

 

 Reference

- MySQL NF 5.6 - InnoDB Buffer Pool Warm-Up (5.6.3~)

  : http://cafe.naver.com/mysqlpg/102

- MariaDB InnoDB Buffer Pool Warm-Up

  : http://cafe.naver.com/mysqlpg/75

 

 dba_cache_data.sh

 

#!/bin/bash

 

source  /usr1/mysql/dba/.env.ini

i

f [ -z "$1" ]
then
   SLEEP_TIME=1;
else
   SLEEP_TIME=$1;
fi

 

LoginPathStatus=`$MySQL_HOME/bin/mysql_config_editor print --all | grep dbmon | wc -l`

if [ $LoginPathStatus -eq 1 ];
then
   DBMonIdPwd=`echo --login-path=dbmon`
else
   DBMonIdPwd=`echo --user="${_DB_MON_UID}" --password="${_DB_MON_PWD}"`
fi

 

$MySQL_HOME/bin/mysql ${DBMonIdPwd} --skip-column-names -s < dba_cache_data.sql > dba_cache_data_tmp.sql
$MySQL_HOME/bin/mysql ${DBMonIdPwd} --skip-column-names -s < dba_cache_data_tmp.sql

 

 

 dba_cache_data.sql

 


select replace(sql_text, "count(*)", concat('count(*) as "[',rno,'] ', table_name, '"')) xxx
  from (
          select @no := @no + 1 as rno
                 , concat(table_schema, '.', table_name)                              as table_name
                 , concat('select count(*) from ', table_schema, '.', table_name,';') as sql_text
            from (select @no := 0 as rno) x, information_schema.tables
         where table_schema not in ('information_schema','common_schema','moniter'
                                                ,' mysql','perf_mon','performance_schema','ps_helper','test','zzdba','sys','mysql')
            and table_name not like '%log%'
            and table_name not like 'z_drop%'
            and table_name not like '%tmp%'
            and table_name not like '%temp%'
            and table_name not like '%event%'
            and table_name not like '%hist%'
            and engine not in ('FEDERATED')
            and engine is not null
) z;

 

 

 dba_cache_data_old.sql

 

select concat('select "[', rno, '] ', table_name,'"; ', sql_text) xxx
  from (
          select @no := @no + 1 as rno
                 , concat(table_schema, '.', table_name)                              as table_name
                 , concat('select count(*) from ', table_schema, '.', table_name,';') as sql_text
            from (select @no := 0 as rno) x, information_schema.tables
         where table_schema not in ('information_schema','common_schema','moniter'

                                                ,' mysql','perf_mon','performance_schema','ps_helper','test','zzdba','sys','mysql')
            and table_name not like '%log%'
            and table_name not like 'z_drop%'
            and table_name not like '%tmp%'
            and table_name not like '%temp%'
            and table_name not like '%event%'
            and table_name not like '%hist%'
) z;

 

 

반응형
반응형

[출처] Convert Unixtime to Date Shell 공유 (ex.slowquery 분석) (MySQL Power Group) |작성자 준경대디



Convert Unixtime to Date.txt



slowquery 분석하다보면 가장 불편한 점 중의 하나가 Unixtime 에 대한 부분인데요.

잠시 시간내어 Unixtime 을 Date 로 변환하는 shell 을 만들어보았습니다.

 

필요하신 분들 유용히 사용해 주시면 좋겠네요.

 

 

■ Convert Unixtime to Date in Shell

 

date +'%Y/%m/%d_%H:%M:%S'

-- 2014/04/17_18:31:07

 

date --date='04/17/2014 18:31:07' +"%s"

-- 1397727067

 

date -d @1397727067  +'%Y/%m/%d_%H:%M:%S'

-- 2014/04/17_18:31:07

 

 

■ Convert Unixtime to Date in slowquery.log


vi convert_unixtime2date.sh
===========================================================================================================
#!/bin/bash

if [ -z "$1" ]
then
   echo "<Usage> sh  convert_unixtime2date  [filename]";
   exit;
fi

cat $1 | sed 's/*/[asterisk]/g' |
while read line;
do
   templine=''
   templine=`echo $line | grep 'SET timestamp' | awk '{print $1}'`

   if [ ! -z $templine ]
   then
      sec_time=`echo $line | awk -F= '{print $2}' | sed 's/;//g'`
      str_time=`date -d @${sec_time}  +'%Y/%m/%d_%H:%M:%S'`
      new_line="SET timestamp="${str_time}
      echo $new_line;
   else
      echo $line;
   fi
done
===========================================================================================================

 

 

vi convert_unixtime2date2.sh
===========================================================================================================
#!/bin/bash

if [ -z "$1" ]
then
   echo "<Usage> sh  convert_unixtime2date2  [filename]";
   exit;
fi

cat $1 | sed 's/*/[asterisk]/g' |
while read line;
do
   echo $line;
   CheckString="SET timestamp=";
   if [[ $line == *${CheckString}* ]]; then
      echo "NEW timestamp="`date -d @\`echo $line | sed -r 's/[A-Za-z=; ]//g'\` +'%Y/%m/%d_%H:%M:%S'`;
   fi;
done
===========================================================================================================

 

 

vi slowquery.log (샘플)
===========================================================================================================
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.72]  Id: 45625
# Query_time: 0.706817  Lock_time: 0.000084 Rows_sent: 1  Rows_examined: 3
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.70]  Id: 44436
# Query_time: 0.884152  Lock_time: 0.000076 Rows_sent: 1  Rows_examined: 3
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.68]  Id: 45507
# Query_time: 0.727718  Lock_time: 0.000081 Rows_sent: 1  Rows_examined: 3
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.72]  Id: 45626
# Query_time: 0.793878  Lock_time: 0.000065 Rows_sent: 2  Rows_examined: 6
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102290 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.70]  Id: 54486
# Query_time: 0.683718  Lock_time: 0.000118 Rows_sent: 2  Rows_examined: 6
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102290 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.68]  Id: 47172
# Query_time: 0.570113  Lock_time: 0.000079 Rows_sent: 1  Rows_examined: 3
SET timestamp=1397692808;
select * from (select id, nick from member  where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @  [10.17.152.72]  Id: 48101
# Query_time: 0.574550  Lock_time: 0.000083 Rows_sent: 1  Rows_examined: 3
===========================================================================================================

 

 

Test.1

 

sh convert_unixtime2date.sh slowquery.log
===========================================================================================================
SET timestamp=2014/04/17_09:00:08
select [asterisk] from (select id, nick from member where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @ 1 2 Id: 45625
# Query_time: 0.706817 Lock_time: 0.000084 Rows_sent: 1 Rows_examined: 3
SET timestamp=2014/04/17_09:00:08
select [asterisk] from (select id, nick from member where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @ 1 2 Id: 44436
# Query_time: 0.884152 Lock_time: 0.000076 Rows_sent: 1 Rows_examined: 3
SET timestamp=2014/04/17_09:00:08
select [asterisk] from (select id, nick from member where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @ 1 2 Id: 45507
# Query_time: 0.727718 Lock_time: 0.000081 Rows_sent: 1 Rows_examined: 3
...
...
===========================================================================================================


 

Test.2

 

sh convert_unixtime2date2.sh slowquery.log
===========================================================================================================
SET timestamp=1397692808;
NEW timestamp=2014/04/17_09:00:08
select [asterisk] from (select id, nick from member where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @ 1 2 Id: 45625
# Query_time: 0.706817 Lock_time: 0.000084 Rows_sent: 1 Rows_examined: 3
SET timestamp=1397692808;
NEW timestamp=2014/04/17_09:00:08
select [asterisk] from (select id, nick from member where id > 102291 order by id desc limit 20) a order by id asc;
# User@Host: lastdayuser[lastdayuser] @ 1 2 Id: 44436
# Query_time: 0.884152 Lock_time: 0.000076 Rows_sent: 1 Rows_examined: 3
SET timestamp=1397692808;
NEW timestamp=2014/04/17_09:00:08
...
...
===========================================================================================================

반응형

+ Recent posts

반응형