[MariaDB] 이중화 고장/ 운영 에러 발생시 처리
이중화 설정 ( Master - Slave )을 하고 서버를 운영하다 보면 MasterDB가 과부하가 걸리거나 에러가 뜨는 경우가 생겨 이중화 설정이 깨지는 경우가 있다. 이런 경우 Was에서 MasterDB와 주고받던 것들을 SlaveDB가 대신 처리할 수 있도록 바꾸어 주어야 한다. 이때 과정들은 다음과 같다.
1. 이중화 중지 ( 에러가 난다면 대부분 자동으로 중지되어 있음 )
2. SlaveDB의 Read_only 설정 해제
3. Was 설정 변경
4. 운영시간이 지나거나 운영 정지가 된 후 기존 MasterDB 백업/복구
5. 기존 MasterDB를 SlaveDB로 설정할 것
- Master와 Slave의 성능이 차이가 난다면 Slave데이터를 Master에 복구시키고 기존 Master-slave구조를 다시설정
- 차이가 없다면 Slave를 Master로 설정
이러한 과정들을 실제 코드로 보면 다음과 같다.
# 이중화 중지
mysql -uroot -p
stop slave
우선 이중화를 중지하고, read_only설정을 해제한다.
5.5 버전 이상에서는 /etc/my.cnf.d/server.cnf 위치에 설정 파일이 있다.
vi /etc/my.cnf
# read_only 제거/주석 처리
# server_id 1로 변경 ( 추후 마스터로 변경하기 위하여 )
# 설정파일 적용을 위해 재시작
systemctl restart mariadb
다음 명령어로 read_only가 해제되었는지 확인한다.
MariaDB [(none)]> show variables like '%read_only%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | OFF |
| read_only | OFF |
| tx_read_only | OFF |
+------------------+-------+
다음은 Was의 설정 파일을 변경한다. 이건 각 프로그램마다 설정 위치가 다르다.
각 프로그램의 DB ip주소를 변경하는 곳을 찾아 변경해주면 된다.
Was마다의 설정 파일에서 MasterDB로 설정된 ip주소를 2번 SlaveDB로 변경해주면 된다.
그리고 적용을 하기 위해 Was 내 프로그램은 재시작을 해준다.
이후 운영시간이 지나면 MasterDB에 복구작업과 Slave설정을 해준다. 다음은 이전 글과 동일하다 ( 이중화 설정 )
# 기존 슬레이브DB
# 백업파일 생성 후 scp통신을 통한 파일 전송
mysqldump -u root -p --all-databases -v > all2_dump.sql
scp all2_dump.sql root@마스터DB의ip:/home/
# Slave전용 아이디 생성, 마스터 상태, 포지션 확인
mysql -uroot -p
grant replication slave on *.* to 'repli_user'@'마스터DB의 ip' IDENTIFIED BY '비밀번호';
flush privileges;
quit
systemctl restart mariadb
mysql -uroot -p
show master status \G;
# 이때 나오는 Position번호,File(바이너리파일 이름) 기억하기
# 기존 마스터DB
vi /etc/my.cnf
[내용추가]
[mysqld]
log-bin=mysql-bin
server-id=3
# 읽기전용
read_only=1
systemctl restart mariadb;
기존의 마스터 DB를 슬레이브 DB로 설정 / 데이터 복구시키기 작업
# slaveDB에서 가져온 DB데이터로 복구
mysql -u root -p < all2_dump.sql
# 백업확인
show databases;
show tables;
select count(*) 테이블;
슬레이브 모드 활성화 전 MasterDB 설정
change master to
master_host = (마스터IP),
master_user='repli_user',
master_log_file='(바이너리파일이름)',
master_password='비밀번호',
master_log_pos=(포지션번호),
Master_connect_retry=10;
슬레이브 모드 시작 및 상태 확인
start slave;
show slave status \G;
# 두가지가 제대로 나온다면 성공
Slave_IO_Running: Yes
Slave_SQL_Running: Yes