티스토리 뷰

Database

MariaDB Replication

초보의 CHOMAN 2018. 8. 20. 18:58

리플리케이션 하는 이유

읽기 부하 분산 (슬레이브)

데이터 분석 (슬레이브)

백업지원 (슬레이브)

* 마스터에 영향을 주지 않고 슬레이브에서 백업하기 위함 (안정성?)

데이터 분산 (마스터에 연결하지 않고 로컬에서 작업)

MariaDB 10.0 introduced replication with global transaction IDs. These have a number of benefits, and it is generally recommended to use this feature from MariaDB 10.0.

마리아DB 10버전 이후부터 GTID 라는것을 지원하는데 사용하는것을 추천한다고 함

마스터와 슬레이브간 버전이 다를때 마스터의 버전이 낮은것 (older) 을 권고  
계속 리플레케이션을 연결할 필요 없으며 연결끊고 다시 연결 가능
백업
슬레이브 서버에서 백업시 데이터 동기화를 유지하는것이 중요

Note that when backing up off a slave server, it is important to ensure that the servers keep the data in sync. See for example Replication and Foreign Keys for a situation when identical statements can result in different data on a slave and a master.

바이너리 로그를 이용한 데이터베이스 복제 (비동기식)

리플리케이션 설정한 데이터베이스가 정보가 불일치 가능성 존재  
불일치시 수동으로 일치시키는 작업이 필요함

마스터의 바이너리 로그 (binlog)

슬레이브의 중계로그는 바이너리 로그는 동일한 포맷이며 복제에 사용되며 필요없으면 자동 삭제

일반적으로는 master - slave 구성하여 master 는 write, slave 는 read 하게끔 구성

여기서는 master1 - master2 로 구성하여 둘다 write 가 가능한 구조로 설정한다.

우선 현재 운영중인 데이터 베이스이면 최초 리플리케이션 구성할 서버간 동기화 작업 필요

마스터1 을 운영하다가 마스터2 를 추가하면서 리플리케이션 하는것으로 가정한다.

데이터 베이스 동기화

마스터1 (원본)

mysqldump -uroot --all-databases > all.sql

-   all.sql 파일을 마스터2로 복사 (scp 등)

마스터2 (복제본)

mysql -uroot -p {password} < all.sql

마스터1

/etc/my.cnf.d/server.cnf

[mariadb]
log-bin  
server_id=1  
log-basename=master1

마스터2

/etc/my.cnf.d/server.cnf

[mariadb]
log-bin  
server_id=2  
log-basename=master2

마스터1, 2 (데몬재시작)

service mariadb restart

마스터 1,2

리플리케이션에서 사용할 데이터베이스 계정 생성

CREATE USER 'repl'@'%' IDENTIFIED BY '패스워드';  
GRANT REPLICATION SLAVE ON _._ TO repl;  
FLUSH PRIVILEGES;

마스터1 상태 확인

MariaDB [(none)]> show master status;  
+--------------------+----------+--------------+------------------+  
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
+--------------------+----------+--------------+------------------+  
| master1-bin.000004 | 245 | | |  
+--------------------+----------+--------------+------------------+  
1 row in set (0.00 sec)

로그파일과 master1-bin.000004 와 로그 위치 245

마스터2 상태 확인

MariaDB [(none)]> show master status;  
+--------------------+----------+--------------+------------------+  
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
+--------------------+----------+--------------+------------------+  
| master2-bin.000004 | 245 | | |  
+--------------------+----------+--------------+------------------+  
1 row in set (0.00 sec)

로그파일과 master2-bin.000004 와 로그 위치 245

  • 위 설정에서는 마스터1과 2의 파일 이름과 위치과 유사하거나 동일하게 나왔지만 다르게 출력될수 있음

총 설정은 2번이 필요 (개념)

마스터1 (마스터) - 마스터2 (슬레이브) 설정 1개
마스터2 (마스터) - 마스터1 (슬레이브) 설정 1개

정확하게는 리플리케이션에서 마스터 - 마스터 설정은 존재하지 않음

마스터1 (슬레이브) 설정

MariaDB [(none)]> CHANGE MASTER TO  
-> MASTER_HOST='마스터2아이피',  
-> MASTER_USER='repl',  
-> MASTER_PASSWORD='speed99',  
-> MASTER_PORT=3306,  
-> MASTER_LOG_FILE='master2-bin.000004',  
-> MASTER_LOG_POS=407,  
-> MASTER_CONNECT_RETRY=10;  
Query OK, 0 rows affected (0.02 sec)

MariaDB \[(none)\]> start slave;  
Query OK, 0 rows affected, 1 warning (0.00 sec)

마스터2 (슬레이브) 설정

MariaDB [(none)]> CHANGE MASTER TO  
-> MASTER_HOST='마스터1아이피',  
-> MASTER_USER='repl',  
-> MASTER_PASSWORD='speed99',  
-> MASTER_PORT=3306,  
-> MASTER_LOG_FILE='master1-bin.000004',  
-> MASTER_LOG_POS=407,  
-> MASTER_CONNECT_RETRY=10;  
Query OK, 0 rows affected (0.01 sec)

MariaDB \[(none)\]> start slave;  
Query OK, 0 rows affected (0.00 sec)

마스터1, 2 슬레이브 상태 확인

show slave status;

별 다른 메세지가 출력되지 않으면 정상적으로 연결된 상태

마스터1에서 
create databases kek1; 실행

마스터2에서 
create databases kek2; 실행
  • 마스터1, 2 에서 아래와 같이 kek1, kek2 가 다 보여야 리플리케이션 (마스터 - 마스터) 정상 설정 완료된것!
MariaDB [(none)]> show databases;  
+--------------------+  
| Database |  
+--------------------+  
| information_schema |  
| kek1 |  
| kek2 |  
| mysql |  
| performance_schema |  
| test |  
+--------------------+  
6 rows in set (0.00 sec)

장애복구 이슈

master - slave 의 경우 장애시 master 가 원본이므로 master 데이터베이스를 기준점으로 잡고 처리

master - master 의 경우 장애시 master 원본이 2개 이므로 서로 참조하여 데이터베이스를 맞춰야 함

slave -> master 로 승격,

새로운 slave 세팅 -> 운영중 slave 구성 가능 (Percona XtraBackup 사용)

ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log

(마스터쪽에 정보가 변경되었음)

reset slave;

후에 다시

리플리케이션 잡아준다

processlist

mysql> show processlist\\G

*************************** 1. row ***************************


 Id: 1


User: system user

Host:

 db: NULL


Command: Connect

Time: 66487103

State: Waiting for master to send event

Info: NULL

*************************** 2. row ***************************


 Id: 2


User: system user

Host:


 db: NULL


Command: Connect

Time: 2849

State: Has read all relay log; waiting for the slave I/O thread to update it

Info: NULL

*************************** 3. row ***************************


 Id: 156292375


User: repl_slave1

Host: 219.252.53.166:40516


 db: NULL


Command: Binlog Dump

Time: 133450

State: Has sent all binlog to slave; waiting for binlog to be updated

Info: NULL

1번과 2번은 슬레이브로 동작하는 DB 서버에서 찾을수 있음1 - 마스터와 통신하는 프로세스 2- 릴레이 로그를 읽어서 쿼리를 실행하는 프로세스
3번은 마스터 서버에서 볼수 있는 프로세스

원문 참고

[http://mytalkhome.tistory.com/840](http://mytalkhome.tistory.com/840)  
[https://zetawiki.com/wiki/MariaDB\_%EB%A6%AC%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98\_%EC%84%A4%EC%A0%95](https://zetawiki.com/wiki/MariaDB_%EB%A6%AC%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98_%EC%84%A4%EC%A0%95)  

'Database' 카테고리의 다른 글

트랜잭션 (Transaction)  (0) 2018.08.21
storage engine  (0) 2018.08.21
데이터베이스 엔진  (0) 2018.08.21
MariaDB Replication  (0) 2018.08.20
mysql 쿼리 정리 (mariadb)  (0) 2015.06.11
mysql replication 리플리케이션  (0) 2015.06.10
댓글
댓글쓰기 폼
공지사항
Total
754,767
Today
112
Yesterday
93
링크
«   2020/05   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함