MySQL 5.5 Semisynchronous Replication v1.0
11.09.05 |
v1.0 |
|
|
|
|
|
|
|
* 이 문서는 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