이중화 방식 구성방식 비고
Asynchronous(비동기) M-S
M(write/read), S(read)
Semi-synchronous(반동기) M-S
M(write/read), S(read)
synchronous M-M
M(write/read),M(write/read) Mysql-cluster,galera cluster ...
M: mater / S:slave
MYSQL asynchronous , semi-synchronous 구현 방법
<async>
MySQL의 Replication은 보통 비동기 방식으로 운영한다. 비동기 방식은 마스터 측은 슬레이브를 업데이트했는지 여부 및 업데이트 로그가 전송되었는지 여부는 신경쓰지 않는 방식이다. 만약 마스터의 장애나, 슬레이브 간의 네트워 장애가 발생하면 마스터 측과 슬레이브와의 데이터 차이는 커질 것이다.
<semi-sync>
마스터 업데이트 및 슬레이브 릴레이 로그 기록까지룰 "동기화" 범주로 보고 슬레이브 릴레이 로그에서 데이터베이스의 업데이트까지는 비동기이므로, "준 동기 (Semi-Synchronous)"라고 불린다.
여기서도 구체적으로 "슬레이브에 업데이트하는데 걸리는 시간 + α"시간이 지연된다고 볼 수 있다.
1) 구성하기
MASTER SERVER 설정하기
[my.cnf 파일에]
Server -id =1
mysql>CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123!@#';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Mysql> flush privileges ;
mysql> flush logs; ### 메모리에 남아있는 bin log 파일에 쓰기
mysql> flush tables with read lock ; ### 테이블 락 걸기 데이터 베이스 변경금지
mysql> show master status ; , ### 파일 명 포지션과 파일 확인
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB
+------------------+----------+--------------+------------------+
| mysql-bin.000019 | 1607 | |
+------------------+----------+--------------+------------------+
[root@adb1 ~]# mysqldump -uroot -proot --master-data --databases mysql --socket=/MYSQL_DATA/db01/mysql.sock > mysql.sql
[root@adb1 ~]# cat mysql.sql (--master-data 옵션을 사용하면 아래와 같은 내용이 추가된다)
--
-- Position to start replication or point-in-time recovery from
--
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=1607;
mysql> unlock table ;
1) 슬레이브=> 마스터 접근권한계정생성
2) 생성 계정에 리플리케이션 권한 부여
3) 테이블 락 설정 파일 dump
SLAVE SERVER 설정하기
[root@adb1 ~]# mysql -uroot -proot --socket=/MYSQL_DATA/db01/mysql.sock < mysql.sql
[my.cnf 파일에]
Server -id =2 ##### MASTER server-id 와 다른 것을 지정해야 함
mysql>CHANGE MASTER TO
mysql>MASTER_HOST='IP ADDRESS',
mysql>MASTER_USER='repl',
mysql>MASTER_PASSWORD='repl123!@#',
mysql>MASTER_LOG_FILE= 'mysql-bin.000019', # --master-data 사용시 생략 가능
mysql>MASTER_LOG_POS=1607; # --master-data 사용시 생략 가능
mysql>CHANGE MASTER TO MASTER_HOST = '192.168.229.236', MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=245, MASTER_PORT=3301 , MASTER_USER='repl' , MASTER_PASSWORD='repl';
mysql>START SLAVE;
1) MASTER data dump 데이터 slave 에 넣기
2) 접속 IP , 유저 , 패스워드 , 파일, 포지션(check point) 설정
3) 슬레이브 시작
확인 하기 (CHECK)
Master SERVER
mysql> show processlist ;
+-------+------+---------------+------+-------------+---------+----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+---------------+------+-------------+---------+----------------------------------------------------------------+------------------+
| 232 | repl | 10.1.5.6:5593 | NULL | Binlog Dump | 1722960 | Has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 53057 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+-------+------+---------------+------+-------------+---------+----------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
######### repl 계정 접속(슬레이브에서 접속 확인)
Mysql > 데이터 인서트 후 slave 에서 데이터 조회
조회 가능하면 문제 없음
SLAVE SERVER
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.5.5
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000006
Read_Master_Log_Pos: 947838124
Relay_Log_File: mysqld-relay-bin.000064
Relay_Log_Pos: 947838270
Relay_Master_Log_File: mysqld-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Exec_Master_Log_Pos: 947838124
Relay_Log_Space: 947838470
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
ERROR:
No query specified
Error 사항이 있는지 확인 없으면 이상 없음 ( master 데이터 인서트해서 확인해볼것)
semi_sync 플러그인 적용
mysql> show plugins ;
+--------------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+--------------------------------+----------+--------------------+--------------------+---------+
| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+--------------------------------+----------+--------------------+--------------------+---------+
44 rows in set (0.00 sec)
아래 두개의 모듈을 MASTER , 슬레이블에 설치
Mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
My.cnf
아래 2개 설정 추가
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
MASTER , SLAVE 서버 재시작
재 시작시 master slave 서버에서 아래 로그 확인되면 정상
131203 12:14:09 [Note] Semi-sync replication initialized for transactions.
131203 12:14:09 [Note] Semi-sync replication enabled on the master.
'DB - MySQL' 카테고리의 다른 글
MySQL my.cnf 파일 설정 (0) | 2017.03.23 |
---|---|
MySQL Isolation LEVEL (0) | 2017.03.22 |
MySQL 모니터링 툴 (0) | 2017.03.06 |
MySQL DB 리소스 사용량 (0) | 2017.03.06 |
MySQL 이중화 방식 - MHA 구성 방법 (0) | 2017.03.06 |