티스토리 뷰

데이터베이스

MariaDB Replication

초보의 CHOMAN 2018.08.20 18:58

 

MariaDB Replication

 


 

리플리케이션 하는 이유



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


데이터 분석 (슬레이브)


백업지원 (슬레이브)

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


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

 




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 'speed99';
GRANT REPLICATION SLAVE ON *.* TO repl;
FLUSH PRIVILEGES;

 

 

: repl 이라는 아이디와 speed99 라는 패스워드 지정

 

 

 

마스터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 사용)


 

 

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

 

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

 

 

'데이터베이스' 카테고리의 다른 글

트랜잭션 (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
댓글
댓글쓰기 폼