티스토리 뷰
리플리케이션 하는 이유
읽기 부하 분산 (슬레이브)
데이터 분석 (슬레이브)
백업지원 (슬레이브)
* 마스터에 영향을 주지 않고 슬레이브에서 백업하기 위함 (안정성?)
데이터 분산 (마스터에 연결하지 않고 로컬에서 작업)
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)
예시
CHANGE MASTER TO MASTER_HOST='아이피',MASTER_USER='아이디',MASTER_PASSWORD='비밀번호',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.001653', MASTER_LOG_POS=3655087,MASTER_CONNECT_RETRY=10;
마스터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)
리플리케이션 필터 (Replication Filters)
https://mariadb.com/kb/en/replication-filters/#replicate_do_table
특정 디비 혹은 테이블만 받는 등의 조건 설정
STOP SLAVE;
SET GLOBAL replicate_do_db='디비';
SET GLOBAL replicate_do_table='디비.테이블';
START SLAVE;
특정디비의 특정테이블만 리플리케이션 받는 필터 예시
장애복구 이슈
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 |
mysql 쿼리 정리 (mariadb) (0) | 2015.06.11 |
mysql replication 리플리케이션 (0) | 2015.06.10 |
- Total
- Today
- Yesterday
- galera
- SSL
- L2TP
- softether
- GeoIP
- OpenVPN
- glusterfs
- php
- NGINX
- gitlab
- 리눅스
- 인증서
- WAF
- centos8
- 베이어다이나믹
- yum
- cURL
- virtualbox
- kvm
- Apache
- IPSEC
- iptables
- MySQL
- HAProxy
- ntp
- ssh
- centOS7
- pptp
- mariadb
- mod_security
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |