Mysq repalication(Master-slave)
Myql 은 데이터의 Slace-out 과 데이터의 안정성을 위하여 replication 을 지원 한다.
기본적인 master slave 구조는 master 에서 데이터에 대하여 read/write ,salve 에서는 read 만 하는구조로서
아래 그림과 같이 master 에서 DB에 바이너리 로그를 생성후 바이너리 로그 덤프 쓰레드에 의하여 slave 로 전달 되고
slave 에서는 I/O쓰레드에 의하여 릴레이 로그로 저장 된다 . 이 릴레이 로그는 SQL쓰레드의 의하여 DB에 반영 된다.
이러한 3개의 쓰레드에 의하여 replication 이 구성된다.
전통적인 replication 은 기본적으로 비동기 방식으로 진행 된다. 즉 master 에서 트랜젝션이 실행되면 slave 에도 동일한 작업이 완료 됐다는 것을 보장하지 않는다.
하지만 이러한 비동기 방식은 slave 의 연결이 끊어 지더라도 master 에 영향을 주지 않는 장점이 있다.
동기화 방식으로 진행 하기 위해서는 반동기 방식으로도 구성이 가능 하다.
centos7 mysql 5.6 master-slave replication 설정
- master (node202) 192.168.110.202 centos 7.2 mysql 5.6
- slave (node203) 192.168.110.203 centos 7.2 mysql 5.6
## mater 에서 server 아이디를 지정 해주며 이때 slave 와는 다른 고유한 번호로 입력 한다., 바이너리 로그 생성을 위하여 log_bin 지시자를 사용 mysql_bin 이라는
## 바이너리 로그를 생성 할 수 있도록 한다. (경로 지정 하지 않는 경우 data 디렉토리로 생성 된다)
[root@node202 ~]# vi /etc/my.cnf [mysqld] server_id = 1 log_bin=mysql-bin [root@node202 ~]# systemctl restart mysqld## master 에서 repl 이라는 계정 비밀번호 12345 로 계정설정하여 slave 에서 master 에 겁근 할 수 있는 계정을 추가해준다.
[root@node202 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.30-log Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> grant replication slave, replication client on *.* to repl@'192.168.110.%' identified by '12345'; Query OK, 0 rows affected (0.03 sec)## master DB의 상태를 확인 하여 포지션과 바이너리 로그 파일을 확인 한다.
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 350 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)## master 의 DB를 백업 한다. 이때 lock 을 하여 dump 중 write 가 안되게 하여 데이터의 무결성을 보장 한다.
[root@node202 ~]# mysqldump --lock-all-tables --all-databases --master-data=1 -p > my.sql Enter password: [root@node202 ~]# ls anaconda-ks.cfg firewalld_iptables_rules my.sql## SCP 명령어로 덤프된 데이터를 전달 한다.
[root@node202 ~]# scp my.sql 192.168.110.203:~ The authenticity of host '192.168.110.203 (192.168.110.203)' can't be established. ECDSA key fingerprint is a1:35:e2:c6:b7:f0:b4:fd:a7:20:7c:79:99:8e:d4:bb. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.110.203' (ECDSA) to the list of known hosts. root@192.168.110.203's password: my.sql## slave 에서는 serverid 설정 및 릴레이로그 설정을 한다. 그리고 read 만 가능 하도록 read only 설정을 한뒤 mysql 를 재시작한다.
[root@node203 ~]# vi /etc/my.cnf [mysqld] server_id = 2 read_only relay-log=mysqld_relay_bin [root@node203 ~]# systemctl restart mysqld## slave 에서 master 에 대하여 접속 할 수 있도록 master host 및 접속 계정을 추가 한다.
[root@node203 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.30 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CHANGE MASTER TO MASTER_HOST = '192.168.110.202', MASTER_USER='repl', MASTER_PASSWORD = '12345'; Query OK, 0 rows affected, 2 warnings (0.26 sec)## master 에서 덤프된 데이터를 slave 로 삽입 한다.삽입후 slave 를 실행 한다.
[root@node203 ~]# mysql -uroot -p < my.sql Enter password: [root@node203 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.30 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec)## 만약 slabe status 가 아래와 같이 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. ## 일 경우 data 디렉토리에 auto.cnf 를 삭제후 mysql 를 재시작 한다.
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.110.202 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 344692 Relay_Log_File: mysqld_relay_bin.000002 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: No 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: 344692 Relay_Log_Space: 120 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: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 160604 07:55:34 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec) [root@node203 ~]# cd /usr/local/mysql/data/ [root@node203 data]# mv auto.cnf /tmp/ [root@node203 data]# systemctl restart mysqld; [root@node203 data]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.30 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.110.202 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 344922 Relay_Log_File: mysqld_relay_bin.000004 Relay_Log_Pos: 513 Relay_Master_Log_File: mysql-bin.000002 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: 344922 Relay_Log_Space: 687 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 Master_UUID: e84f4d34-29c6-11e6-a347-000c297b6abe Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec) ERROR: No query specified## Slave 에서 릴레이 로그가 정상적으로 발생 된것을 확인 할 수 있다.
[root@node203 data]# ls -al /usr/local/mysql/data/mysqld_relay_bin.* -rw-rw----. 1 mysql mysql 174 6월 4 07:58 /usr/local/mysql/data/mysqld_relay_bin.000003 -rw-rw----. 1 mysql mysql 513 6월 4 07:58 /usr/local/mysql/data/mysqld_relay_bin.000004 -rw-rw----. 1 mysql mysql 52 6월 4 07:58 /usr/local/mysql/data/mysqld_relay_bin.index
## 정상적으로 구성이 되었다면 slave 에서 master의 mysql 3306 포트 로 tcp 세션이 연결되어 있는 것을 확인 할 수 있다.
[root@node203 data]# netstat -atunp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 967/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2233/master tcp 0 52 192.168.110.203:22 192.168.110.1:11920 ESTABLISHED 2779/sshd: root@pts tcp 0 0 192.168.110.203:52743 192.168.110.202:3306 ESTABLISHED 3223/mysqld tcp 0 0 192.168.110.203:22 192.168.110.1:12368 ESTABLISHED 2522/sshd: root@pts tcp 0 0 192.168.110.203:22 192.168.110.1:12238 ESTABLISHED 2306/sshd: root@pts tcp6 0 0 :::3306 :::* LISTEN 3223/mysqld tcp6 0 0 :::22 :::* LISTEN 967/sshd tcp6 0 0 ::1:25 :::* LISTEN 2233/master
## 만약 master 에 변경된 사항이 있으면 master 가 slvae 로 push,ack 으로 변경된 사항을 전달하고
## slave 가 ack 를 보냄으로 통신 되는 것을 확인 할 수 있다.
반응형
'database > mysql' 카테고리의 다른 글
Mysq-5.6 MHA 구성 (0) | 2016.08.15 |
---|---|
pt-table-checksum,sync 를 통한 mysql replication sync 체크 및 조절 (1) | 2016.06.05 |
centos7 mysql 5.6 install (0) | 2016.06.04 |
mysqldump 를 통한 mysql 백업,복구 (0) | 2016.05.23 |
XtraBackup install ,full backup (0) | 2016.05.14 |