* 이 문서는 dev.mysql.com 을 번역해 만들었음을 밝힌다.
1. Semisynchronous Replication
MySQL 5.5 부터 기존의 built-in asynchronous replication 에 semisynchronous replication 이 추가되었다.
MySQL replication 은 기본적으로 asynchronous replication 을 사용한다. Master 는 Slave 가 Binary log 에 언제 엑세스를 했는지 혹은 수행을 했는지 아무정보가 없다.
Master crash 의 경우 Commit 된 정보가 어떤 Slave 로도 전송되지 말아야 한다. (하지만 Asynchronous Replication 에서는 이를 확인할 길이 없다.)
그 결과 Master 에서 Slave 로의 failover 시 누락된 트랜젝션이 발생하게 된다.
Semisynchronous Replication 은 asynchronous replication 의 대안이 될 수 있다.
l semisynchronous-capable slave 는 master 에 접속시 이를 알린다.
l master 에서 semisynchronous replication 활성 시 반드시 하나 이상의 semisynchronous slave 를 가져야 한다.
Master block 의 transaction commit 을 수행하는 쓰레드는 commit 의 완결과 하나 이상의
semisynchronous slave 로부터 트랜잭션에 대한 모든 정보를 받았음에 대한 확인이나 timeout 발생을 대기한다.
l Slave 는 이벤트가 relay log 에 쓰였고 disk 로 flush 되었음을 알린다.
l 만약 모든 slave 가 transaction 에 대한 확인에 대한 알림없이 timeout 이 나는 경우 asynchronous replication 으로 변경된다. 이후 최소 하나 이상의 Slave 에 대해 확인이 되면 semisynchronous slave 로 변경된다.
l Semisynchronous replication 은 master 와 slave 모두 활성화 되어야 한다. 만약 semisynchronous replication 이 master 상에서 비활성화 되어 있거나 Slave 가 없는 경우 master 는 asynchronous 를 사용한다.
마스터가 블로킹 상태 (commit 수행 후 slave 로부터 알림을 기다리는 상태) 중에는 transaction 을 수행중인 세션으로 돌아가지 않는다. 블록이 끝나면 다른 구문을 수행하기 위해 세션으로 돌아간다. 이 시점에 마스터 사이드의 트랜젝션은 commit 되며 그 이벤트에 대한 확인이 최소 하나 이상의 Slave 에 의해 알려진다.
/*+ 해석 다시 볼 것 Ref.A */
블록킹은 binay log 에 쓰여진 rollbacks 후에도 발생하며, nontransactional table 에 대한 수정이 rollback 될 때 일어난다. rolled-back transaction 은 그것이 transactional table 에 아무 영향이 없더라도 로깅된다. 그 이유는 nontransactional tables 에 대한 변경은 rollback 될 수 없으며 slave 에 반드시 전달되야하기 때문이다.
semisynchronous replication 의 semi 를 이해하기 위해선 asynchronous 와 full synchronous replication 을 비교한다.
l asynchronous replication 에서는 master 가 events 를 바이너리 로그에 기록하며 slaves 는 받을 준비가 되면 요청한다. 이 과정엔 event 가 slave 에 도달한다는 보증이 없다.
l full synchronous replication 에서는 마스터가 transaction 을 commit 하면 마스터가 세션으로 돌아가 transaction 을 수행하기 전에 모든 slave 가 transaction 에 대해 commit 해야 한다. 이로 인해
transaction 종료까지 많은 delay 가 생길 수 있다.
l semisynchronous replication 은 asynchronous 와 full synchronous Replication 사이에 위치한다. 마스터는 다만 하나이상의 slave 가 event 를 받고 기록했음을 대기한다. 이는 모든 slave 에 대해 대기하지는 않는다. 또 slave side 에서 완전히 다 실행되었고 commit 되었는가에 대한 대기가 아니다.
Asynchronous replication 에 대해 semisynchronous replication 은 보다 향상된 데이터 무결성을 제공한다. commit 이 성공적으로 완료되었을 때 데이터가 최소한 두 곳에 존재함을 알 수 있다. (master , 최소하나의 slave) 만약 master 가 commit 했지만 master 가 Slave 의 확인을 대기중에 crash 가 발생한 경우 트랜젝션이 아무 slave 에도 도달하지 못했음을 알 수 있다.
semisynchronous replication 은 성능상 부하가 있을 수 있다. 그 이유는 slave 를 대기하는 시간으로 인해 commit 이 느려지기 때문이다. 이 지연은 최소한 slave 로 commit 을 보내고 slave 로부터 확인을 받기위한 TCP/IP roundtrip 시간만큼 발생할 것이다.
이것이 의미하는 바는 가까운 네트워크에 구성 시 잘 동작하겠지만 거리가 있는 서버의 경우 부하가 커짐을 의미한다.
2. Semisynchronous Replication Administrative Interface
이 기능을 사용하기 위해 두개의 플러그인이 필요하며, 하나는 Master 다른 하나는 Slave 를 위한 플러그인이다.
system 환경변수가 plugin 의 행동을 컨트롤한다.
아래는 몇가지 예이다.
rpl_semi_sync_master_enabled | semisync 기능의 활성화 master 에서 사용. 1:enable, 0:disable 을 의미 |
rpl_semi_sync_master_timeout | timeout 시간을 지정. 단위는 밀리세컨드. 예 : 1000 (10second) |
rpl_semi_sync_slave_enabled | semisync 기능의 활성화 Slave 에서 사용. 1:enable, 0:disable |
status 변수로 semisynchronous replication 모니터링이 가능하다.
rpl_semi_sync_master_clients | semisynchronous slave 수 |
rpl_semi_sync_master_status | 1 : plugin 사용가능하며 commit acknowledgement 가 발생했음. |
rpl_semi_sync_master_no_tx | slave 로부터 승인받지 못한 수 |
rpl_semi_sync_masger_yes_tx | slave 로부터 승인받은 수 |
rpl_semi_sync_slave_status | slave 상태를 조회하는 것으로 0 : 기타 |
위의 system 과 status 변수들은 master 나 slave 에 플러그인이 ‘INSTALL PLUGIN’ 을 통해 설치 된 경우 사용가능하다.
3. Semisynchronous Replication Installation and Configuration
semisynchronous replication 을 사용하기 위해서는 다음의 조건을 만족해야 한다.
l MySQL 5.5 나 그 이상의 버전이 설치되어 있어야 한다.
l plugin 설치에는 MySQL server 가 dynamic loading 을 지원해야 한다. 이를 확인하기 위해서는 system 변수 have_dynamic_loading 변수가 YES 인지를 확인한다. Binary 배포버전은 dynamic loading 을 지원해야 한다.
l Replication 이 이미 구성되어 있고 동작중이어야 한다.
Semisynchronous replication 구성을 위해서는 다음의 명령이 필요하다. INSTALL PLUGIN, SET GLOBAL, STOP SLAVE, START SLAVEJ. 이 명령어는 SUPER 권한으로 수행되어야 한다.
semisynchronous replication plugins 은 MySQL 배포버전에 포함되어 있다.
플러그인 위치는 system variable plugin_dir 을 확인한다.
On the master :
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; |
On the slave :
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; |
linux 에 plugin 설치시 다음과 같은 에러메시지를 확인하면 libimf 의 설치가 필요하다.
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22 libimf.so: cannot open shared object file: No such file or directory) |
semisynchronous replication plugin 이 설치되면 disabled 상태이다.
plugin 을 활성화 시키기 위해서는 system variables 셋팅해야 한다. 이는 runtime 에 set global 을 사용해 가능하다. (option file + restart 도 가능)
<Runtime 시>
On the Master :
mysql> SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; mysql> SET GLOBAL rpl_semi_sync_master_timeout = N; |
On each slave :
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = {0|1}; |
위 작업 후 slave io thread 를 정지했다 기동해야한다. 이 과정을 생략하면 replication 은 asynchronous 로 동작한다.
On each slave :
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; |
<Runtim 이 아닌경우 : optionfile + restart>
On the master’s option file
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second |
On each slave’s option file
[mysqld] rpl_semi_sync_slave_enabled=1 |
4. Semisynchronous Replication Monitoring
다음의 명령을 통해 semi synchronous replication 구성을 확인할 수 있다.
<system variables>
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; |
<slave status>
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; |
5. Practice
기존에 Replication 구성이 되어 있음을 가정한다.
<DG1> IP : 192.168.137.201 MySQL Port : 3306 <DG2> IP : 192.168.137.202 MySQL Port : 3306 |
DG1 ,DG2 의 Semisynchronous Replication 조회를 한 결과 아무 결과가 나오지 않았다.
mysql> show variables like 'rpl_semi%'; Empty set (0.00 sec) mysql> show status like 'Rpl_semi%'; Empty set (0.00 sec) |
Semisynchronous Replication 사용을 위해 Plugin 위치를 조회했다.
mysql> show variables like 'plugin_dir'; +---------------+------------------------------+ | Variable_name | Value | +---------------+------------------------------+ | plugin_dir | /home/mysql/mysql/lib/plugin | +---------------+------------------------------+ 1 row in set (0.00 sec) |
사실 설치에 사용한 5.5 binary 버전 자체가 플러그인을 가지고 있는 상태로 위 조회는 plugin 을 수동으로 다운 받아 위치시킬때나 필요하다.
<on the master side>
mysql> show variables like 'plugin_dir'; +---------------+------------------------------+ | Variable_name | Value | +---------------+------------------------------+ | plugin_dir | /home/mysql/mysql/lib/plugin | +---------------+------------------------------+ 1 row in set (0.00 sec) mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_master_enabled=1; Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_master_timeout=100; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'rpl_semi_sync%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 100 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ 4 rows in set (0.00 sec) |
PLUGIN 설치 후 Global Variable 변경을 통해 활성화 하였다.
위 과정 이후 Variables 조회를 하자 Semisynchronous 와 관련된 파라미터가 나왔다.
<on each slave>
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_slave_enabled=1; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.137.201 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: dg2-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 407 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) mysql> stop slave io_thread; Query OK, 0 rows affected (0.00 sec) mysql> start slave io_thread; Query OK, 0 rows affected (0.00 sec) mysql> show status like 'Rpl_semi_sync%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.00 sec) |
Slave 에도 Semisynchronous Replication 사용을 위해 Plugin 설치와 Variable 설정을 했다. 다만 셋팅 전이나 셋팅 후나 show slave status\G 의 결과는 변함이 없었다.
DG2 (Slave) 의 slave status (start / slave) 에 따라 Master 에서 변하는 값이 있는데 이는 show status 명령을 통해 관찰할 수 있었다. ( show variables like ‘rep%’ 로는 변함이 없었다.)
<on the Master side>
mysql> show status like 'rpl%'; +--------------------------------------------+-------------+ | Variable_name | Value | +--------------------------------------------+-------------+ | Rpl_semi_sync_master_clients | 1 | à slave stop 인 경우 0 으로 나온다. | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_status | AUTH_MASTER | +--------------------------------------------+-------------+ |
6. References
A. MySQL 5.5 Reference Manual :: 15 Replication :: 15.3 Replication Solutions :: 15.3.8 Semisynchronous Replication | http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
B. MySQL 5.5 Reference Manual :: 15 Replication :: 15.3 Replication Solutions :: 15.3.8 Semisynchronous Replication :: 15.3.8.1 Semisynchronous Replication Administrative Interface | http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-interface.html
C. MySQL 5.5 Reference Manual :: 15 Replication :: 15.3 Replication Solutions :: 15.3.8 Semisynchronous Replication :: 15.3.8.2 Semisynchronous Replication Installation and Configuration | http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-installation.html
D. MySQL 5.5 Reference Manual :: 15 Replication :: 15.3 Replication Solutions :: 15.3.8 Semisynchronous Replication :: 15.3.8.3 Semisynchronous Replication Monitoring |
http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-monitoring.html
'연구개발 > MYSQL' 카테고리의 다른 글
파티션 삭제시 Exchange Partition 기능 활용 (0) | 2014.12.11 |
---|---|
SHOW PROCESSLIST (0) | 2014.12.11 |
Buffer Cache 초기화 후, Data Caching 을 위한 Script (0) | 2014.12.10 |
Warm-up InnoDB Buffer Pool (0) | 2014.12.10 |
Use login-paths (.mylogin.cnf) (0) | 2014.12.10 |