본문 바로가기

카테고리 없음

MySQL 5.5 Semisynchronous Replication v1.0

MySQL 5.5 Semisynchronous Replication v1.0

 

Date

Ver

Etc.

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 가 발생했음.
0 : plugin
이 사용가능하지 않거나 commit acknowledgement timeout 으로 asynchronous replication 으로 변경됨

rpl_semi_sync_master_no_tx

slave 로부터 승인받지 못한 수

rpl_semi_sync_masger_yes_tx

slave 로부터 승인받은 수

rpl_semi_sync_slave_status

slave 상태를 조회하는 것으로
1 : pugin
enabled 상태이며 I/O Thread 가 수행중

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