MariaDB mha 이중화
1. 설치
1) 장비 구성
A. 기본 장비 구성
I. Manager : 모든 MariaDB의 Alive를 체크하고 Failover, Master Change 등을 처리
II. Master : 데이터의 write, read가 모두 발생되는 메인 DB
III. Slave : Marster의 부하 분산을 위해 read-only된 DB
B. 해당 문서의 장비
I. 해당 문서의 4개의 장비로 구성한다.
II. VIP : virtual IP(가상 아이피) 외부에서 1개의 IP로 접근하여 HA되어 Master가 변경되어도 write 작업을 APP의 변경 없이 진행할 수 있다.
III. 현재 테스트는 VIP로 문서가 작업되었으나 기업의 지원이 있다면 DNS로 작업되는 것이 대표적이다.
IV. https://www.slideshare.net/NHNFORWARD/mysql-nhn-forward-2018
2) 장비 설정
A. Hots 파일 설정
192.168.80.4 mgr -- Manager IP
192.168.80.2 master -- Master IP
192.168.80.6 slave1 -- Slave1 IP
192.168.80.5 slave2 -- Slave2 ip
192.168.80.50 mha-master-vip -- VIP
I. 해당 아이피는 ifconfig를 통해 확인하여 연결
II. Ifconfig 가 없을 시 net-tools 패키지를 설치한다.
B. Mariadb 복제
I. MHA는 semi-sync 방식의 복제를 권장한다.
II. Mariadb 복제의 기본 설정은 Async 로 되어있다.
< ASync >
< Semi Sync >
III. Semi-Sync 설정
(ㄱ) 10.3.3 이전의 버전은 따로 Plugin을 설치 해 주어야 한다.
(ㄴ) 글로벌 옵션 쿼리로 변경 방법
-- Master 장비
SET GLOBAL rpl_semi_sync_master_enabled=ON;
SET GLOBAL rpl_semi_sync_master_timeout=5000; -- timeout 설정 default 10초
show variables like '%semi%'; -- 확인
-- Slave 장비
SET GLOBAL rpl_semi_sync_slave_enabled=1;
show variables like '%semi%'; -- 확인
(ㄷ) my.cnf(50-server.cnf) 수정으로 영구 설정 변경
-- Master 장비
[mariadb]
...
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=5000
mariadb restart -- Mariadb 재시작
show variables like '%semi%'; -- 확인
-- Slave 장비
[mariadb]
...
rpl_semi_sync_slave_enabled=ON
mariadb restart -- Mariadb 재시작
show variables like '%semi%'; -- 확인
IV. 복제 설정
(ㄱ) my.cnf (50-server.cnf) 수정
-- Master 설정
...
server-id=1 # -> server-id는 master와 slave가 달라야 합니다
log_bin = /var/log/mysql/mysql-bin.log # Binlog의 파일명을 기재 합니다.
sync_binlog = 1
expire_logs_days = 7
binlog_cache_size = 2M
max_binlog_size = 512M
log-bin-trust-function-creators = 1 # function 및 SP 생성도 가능 여부
report-host = master # 각 DB 호스트네임 show slave hosts 에서 정보로 활용
relay-log = /var/log/mysql/relay_log
relay-log-index = /var/log/mysql/relay_log.index
relay_log_purge=true
expire_logs_days = 7
log_slave_updates = ON
...
-- Slave 설정
...
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
sync_binlog = 1
expire_logs_days = 7
binlog_cache_size = 2M
max_binlog_size = 512M
log-bin-trust-function-creators = 1
report-host = slave1
relay-log = /var/log/mysql/relay_log
relay-log-index = /var/log/mysql/relay_log.index
relay_log_purge = true
expire_logs_days = 7
log_slave_updates = ON
read_only
...
(ㄴ) Mariadb 재시작
(ㄷ) 복제 계정 생성
-- Master 및 모든 Slave에 생성
create user 'repl_user'@'%' identified by 'epdlxjxla';
grant replication slave on *.* to 'repl_user'@'%';
flush privileges;
(ㄹ) 마스터 정보 확인
show master status\G;
# 다음과 같이 결과 발생
# *************************** 1. row ***************************
# File: mysql-bin.000001 -- Slave 에서 필요한 정보
# Position: 777 -- Slave 에서 필요한 정보
# Binlog_Do_DB:
# Binlog_Ignore_DB:
# 1 row in set (0.000 sec)
(ㅁ) Slave 에서 복제 시작
CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl_user',
MASTER_PASSWORD='epdlxjxla',
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=777;
start slave;
(ㅂ) Slave에서 복제 확인
show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master # host 확인
Master_User: repl_user # 계정 확인
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001 # 로그 파일 확인
Read_Master_Log_Pos: 777 # 포지션 확인
Relay_Log_File: relay_log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
...
(ㅅ) Master 에서 복제 확인
show slave hosts\G
*************************** 1. row ***************************
Server_id: 3
Host: slave2
Port: 3306
Master_id: 1
*************************** 2. row ***************************
Server_id: 2
Host: slave1
Port: 3306
Master_id: 1
3) MHA 사전 구성
A. mha 계정 생성 : 이미 복제가 완료되었다면 Master에서만 실행해도 slave에 자동 복제
create user 'mha'@'%' identified by 'epdlxjxla';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'%';
flush privileges;
B. OS 에 mha 용 계정 생성 – 4개 모든 장비
[root]# useradd -g mysql mha
[root]# passwd mha
Changing password for user test.
New password: [패스워드 입력]
Retype new password: [패스워드 입력]
C. ssh 연결(4개 서버 모두 작업되어야 함)
I. sshd가 설치되어 있지 않다면 openssh-server 패키지 설치
II. 공개키로 접근하기 위한 설정 변경 (sshd_config 파일 수정)
...
Port 22 # 주석 제거
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...
#LoginGraceTime 2m
PermitRootLogin yes # 주석 제거 및 yes로 변경
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
...
ssh 서비스 restart
III. mha 계정의 공개키 생성
[root]# su - mha
[mha]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [엔터]
Enter passphrase (empty for no passphrase): [엔터]
Enter same passphrase again: [엔터]
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:8//1111111111111 root@acs
The key's randomart image is:
+---[RSA 4096]----+
| . .oooooooooo+|
| . . oooooo o|
| . ooo000000.+o|
| . .. . ..*..|
| E.000000000o. |
| 0000000000. |
| . . o .. |
| . .. |
| .o.o+|
+----[SHA256]-----+
IV. 공개키를 복사
(ㄱ) 매니저 서버에서 -> master, slave1, slave2 서버로
(ㄴ) master 서버에서 -> 매니저 서버, slave1, slave2 서버로
(ㄷ) slave1 서버에서 -> 매니저 서버, master, slave2 서버로
(ㄹ) slave2 서버에서 -> 매니저 서버, master, slave1 서버로
(ㅁ) 아래 명령어를 통해 복사 가능
[mha]$ ssh-copy-id -i master
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/mha/.ssh/id_rsa.pub"
The authenticity of host 'master (192.168.80.2)' can't be established.
ECDSA key fingerprint is SHA256:xoIzWmyrIMNAmxYuNJE7Yzi/xqQrboszAkYJgMdzonU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? [yes 입력]
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
mha@master's password: [패스워드입력]
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'master'"
and check to make sure that only the key(s) you wanted were added.
(ㅂ) 연결 확인
[mha]$ ssh master
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.39-linuxkit x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
[mha@master ~]$ hostname
master
[mha@master ~]$ exit
D. VIP 에 대한 failover 및 IP assign 을 위해 필요 시 mha 유저가 root 권한을 수행 할 수 있도록 sudouser 를 설정
[root]# visudo
...
mha ALL=(ALL) NOPASSWD:/sbin/ifconfig #해당 라인 추가
...
[root]# su – mha
[mha]# ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.80.4 netmask 255.255.240.0 broadcast 192.168.95.255
E. 가상 아아피 설정 확인
sudo ifconfig eth0:0 192.168.80.50 up
sudo ifconfig eth0:0 192.168.80.50 down
4) MHA 설치
A. 관련 패키지 설치
apt -y install make libdbd-mysql-perl libdbd-mariadb-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl libperl5.30 libcpan-perl-releases-perl libmodule-install-perl
B. maridb 10.5.8 까지는 아직 mysql 의 super_read_only 옵션을 사용하지 못함.
따라서 mha 버전의 0.58은 사용하지 못 해 소스를 따로 다운받아 설치
apt 패키지는 0.58부터 시작되어 0.56의 repo 가 없음
C. https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads 에서
MHA Manager 0.56 tarball , MHA Node 0.56 tarball 다운로드
D. 매니져 서버에 설치
[root]# mkdir -p /root/pkg #패키지 다운로드한 위치
[root]# cd /root/pkg #해당 폴더로 이동
해당 폴더로 다운로드한 파일이동
[root]# cp /home/mariadb/mha4mysql-manager-0.56.tar.gz ./
[root]# tar zxvf mha4mysql-manager-0.56.tar.gz # 압축해제
[root]# cd mha4mysql-manager-0.56
[root]# perl Makefile.PL
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- DBI ...loaded. (1.643)
- DBD::mysql ...loaded. (4.050)
- Time::HiRes ...loaded. (1.976)
- Config::Tiny ...loaded. (2.24)
- Log::Dispatch ...loaded. (2.69)
- Parallel::ForkManager ...loaded. (2.02)
- MHA::NodeConst ...missing.
==> Auto-install the 1 mandatory module(s) from CPAN? [y] [y 입력]
[root]# make;make install # 빌드 및 설치
E. 모든 서버에 노드 설치
[root]# mkdir -p /root/pkg #패키지 다운로드한 위치
[root]# cd /root/pkg #해당 폴더로 이동
해당 폴더로 다운로드한 파일이동
[root]# cp /home/mariadb/mha4mysql-node-0.56.tar.gz ./
[root]# tar zxvf mha4mysql-node-0.56.tar.gz # 압축해제
[root]# cd mha4mysql-node-0.56
[root]# perl Makefile.PL
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- DBI ...loaded. (1.643)
- DBD::mysql ...loaded. (4.050)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for mha4mysql::node
Writing MYMETA.yml and MYMETA.json
[root]# make;make install # 빌드 및 설치
F. 매니져 서버에서 mha 설정 파일 및 mha 스크립트 복사
[root]# mkdir -p /etc/masterha
[root]# mkdir -p /masterha/scripts
[root]# cd /root/pkg/mha4mysql-manager-0.56/samples
[root]# cp conf/* /etc/masterha/
[root]# cp scripts/* /masterha/scripts/
[root]# mkdir -p /masterha/app1
[root]# chown -R mha:mysql /masterha
G. 모든 디비 서버에 cnf 폴더 설정하고 log 폴더에 mysql 그룹 권한이 가능하도록 설정
[root]# mkdir -p /masterha/app1
[root]# chown -R mha:mysql /masterha
[root]# chown -R mysql:mysql /var/log/mysql/
2. MHA 설정
1) MHA 설정의 예시
A. 매니저 서버에서 모니터링 하고 장애 조치가 되는 MySQL의 Replication Group 은 1개 이상이 될 수도 있음
B. 공통적인 설정은 /etc/masterha_default.cnf 에 설정하여 사용 가능
C. 각각의 설정은 /etc/masterha/app1.cnf에 선언하여 따로 사용 가능
2) 매니져 서버 설정
A. app1.cnf 파일 수정
[root]# cd /etc/masterha/
[root]# cp app1.cnf app1.cnf.ori #기존 파일 백업
[root]# chown root:mysql app1.cnf
[root]# chmod 775 app1.cnf # 권한 설정
[root]# vi app1.cnf
[server default]
user = mha
password = epdlxjxla
ssh_user = mha
repl_user = repl_user
repl_password = epdlxjxla
manager_workdir = /masterha/app1
manager_log = /masterha/app1/app1.log
remote_workdir = /masterha/app1
master_binlog_dir = /var/log/mysql
secondary_check_script = /usr/local/bin/masterha_secondary_check -s master -s slave1 -s slave2 --user=mha --master_host=master --master_ip=master --master_port=3306
# --user=mha 는 DB유저를 의미
master_ip_failover_script=/masterha/scripts/master_ip_failover
master_ip_online_change_script=/masterha/scripts/master_ip_online_change
[server1]
hostname=master
candidate_master=1
[server2]
hostname=slave1
candidate_master=1
[server3]
hostname=slave2
candidate_master=1
B. VIP를 사용하기 위해 스크립트 수정
I. VIP 변경 shell script 생성
[root]$ su - mha
[mha]$ cd /masterha/scripts
[mha]$ vi mha_change_vip.sh
#!/bin/bash
## Fail-Over VIP Change
V_NEW_MASTER=cat /etc/hosts | grep $1 | awk '{print $2}'
V_EXIST_VIP_CHK=ping -c 1 -W 1 mha-master-vip | grep "packet loss" | awk '{print $6}'
V_VIP_IP=cat /etc/hosts | grep mha-master-vip | awk '{print $1}'
if [ $V_EXIST_VIP_CHK = "0%" ]
then
echo "VIP IS Alive, VIP Relocate $V_NEW_MASTER "
/bin/ssh mha-master-vip /bin/sudo /sbin/ifconfig eth0:0 down &
ssh $V_NEW_MASTER /bin/sudo /sbin/ifconfig eth0:0 $V_VIP_IP
ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I eth0 -s $V_VIP_IP $V_VIP_IP
VIP_NOHUP_PS=ps -ef| grep "ifconfig eth0:0" | grep ssh | grep -v grep | awk '{print $2}' && kill -9 $VIP_NOHUP_PS
elif [ $V_EXIST_VIP_CHK = "100%" ]
then
echo "VIP IS dead, VIP Relocate $V_NEW_MASTER "
/bin/ssh $V_NEW_MASTER /bin/sudo /sbin/ifconfig eth0:0 $V_VIP_IP
/bin/ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I eth0 -s $V_VIP_IP $V_VIP_IP
fi
II. master_ip_failover 수정
[root]$ su - mha
[mha]$ cd /masterha/scripts/
[mha]$ cp -ar master_ip_failover master_ip_failover.ori #기존 파일 백업
[mha]$ vi master_ip_failover
== 변경 전 - 86 라인
## Creating an app user on the new master
print "Creating app user on the new master..\n";
FIXME_xxx_create_user( $new_master_handler->{dbh} );
$new_master_handler->enable_log_bin_local();
$new_master_handler->disconnect();
## Update master ip on the catalog database, etc
FIXME_xxx;
== 변경 후
## Creating an app user on the new master
## print "Creating app user on the new master..\n";
## FIXME_xxx_create_user( $new_master_handler->{dbh} );
## $new_master_handler->enable_log_bin_local();
## $new_master_handler->disconnect();
## Update master ip on the catalog database, etc
## FIXME_xxx;
== mha_change_vip.sh 추가
## Update master ip on the catalog database, etc
## FIXME_xxx;
system("/bin/bash /masterha/scripts/mha_change_vip.sh $new_master_ip"); # 추가
# VIP를 변경하는 Shell 스크립트
$exit_code = 0;
III. master_ip_online_change 수정
[root]$ su - mha
[mha]$ cd /masterha/scripts
[mha]$ cp -ar master_ip_online_change master_ip_online_change.ori #기존 파일 백업
[mha]$ vi master_ip_online_change
= 변경 전 - 149 라인
## Drop application user so that nobody can connect. Disabling per-session binlog beforehand
$orig_master_handler->disable_log_bin_local();
print current_time_us() . " Drpping app user on the orig master..\n";
FIXME_xxx_drop_app_user($orig_master_handler);
= 변경 후 , 주석 처리
## Drop application user so that nobody can connect. Disabling per-session binlog beforehand
## $orig_master_handler->disable_log_bin_local();
## print current_time_us() . " Drpping app user on the orig master..\n";
## FIXME_xxx_drop_app_user($orig_master_handler);
= 변경 전 - 244 라인
## Creating an app user on the new master
print current_time_us() . " Creating app user on the new master..\n";
FIXME_xxx_create_app_user($new_master_handler);
$new_master_handler->enable_log_bin_local();
$new_master_handler->disconnect();
= 변경 후 , 주석 처리
## Creating an app user on the new master
## print current_time_us() . " Creating app user on the new master..\n";
## FIXME_xxx_create_app_user($new_master_handler);
## $new_master_handler->enable_log_bin_local();
## $new_master_handler->disconnect();
== mha_change_vip.sh 추가
## Update master ip on the catalog database, etc
system("/bin/bash /masterha/scripts/mha_change_vip.sh $new_master_ip"); <-- 추가
$exit_code = 0;
};
C. OS 버전에 – 기호가 들어가 체크 스크립트가 제대로 작동하지 않는다.
따라서 해당 스크립트 수정
[root]$ cd /usr/local/share/perl/5.30.0/MHA/
[root]$ cp NodeUtil.pm NodeUtil.pm.ori
[root]$ vi /usr/local/share/perl/5.30.0/MHA/NodeUtil.pm
= 변경 전 - 182 라인
sub parse_mysql_version($) {
my $str = shift;
my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
return $result;
}
sub parse_mysql_major_version($) {
my $str = shift;
my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );
return $result;
}
= 변경 후 , 문자열 파싱 정규식 처리 추가
sub parse_mysql_version($) {
my $str = shift;
##editied by kimdohee
($str) = $str =~ m/^[^-]*/g;
my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
return $result;
}
sub parse_mysql_major_version($) {
my $str = shift;
($str) = $str =~ m/^[^-]*/g;
my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
# my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );
return $result;
}
3. MHA 사용법
1) 모니터링 및 체크
A. 사용 가능 명령어
I. masterha_check_ssh : SSH 접속 체크
II. masterha_manager Manager 실행(모니터링 시작) - 장애 발생시 failover 수행됨
III. masterha_stop : Manager 중지
IV. masterha_master_switch : TakeOver(relocate) 수행
V. masterha_check_repl : 복제 현황(Master/Slave 노드 정보등)
VI. masterha_check_status : Status 확인하기
B. masterha_check_ssh (SSH 접속 체크)
[mha]$ masterha_check_ssh --conf=/etc/masterha/app1.cnf
Fri Jan 8 06:28:25 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 8 06:28:25 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:28:25 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:28:25 2021 - [info] Starting SSH connection tests..
Fri Jan 8 06:28:26 2021 - [debug]
Fri Jan 8 06:28:25 2021 - [debug] Connecting via SSH from mha@master(192.168.80.2:22) to mha@slave1(192.168.80.5:22)..
Fri Jan 8 06:28:25 2021 - [debug] ok.
Fri Jan 8 06:28:25 2021 - [debug] Connecting via SSH from mha@master(192.168.80.2:22) to mha@slave2(192.168.80.6:22)..
Fri Jan 8 06:28:25 2021 - [debug] ok.
Fri Jan 8 06:28:26 2021 - [debug]
Fri Jan 8 06:28:26 2021 - [debug] Connecting via SSH from mha@slave1(192.168.80.5:22) to mha@master(192.168.80.2:22)..
Fri Jan 8 06:28:26 2021 - [debug] ok.
Fri Jan 8 06:28:26 2021 - [debug] Connecting via SSH from mha@slave1(192.168.80.5:22) to mha@slave2(192.168.80.6:22)..
Fri Jan 8 06:28:26 2021 - [debug] ok.
Fri Jan 8 06:28:27 2021 - [debug]
Fri Jan 8 06:28:26 2021 - [debug] Connecting via SSH from mha@slave2(192.168.80.6:22) to mha@master(192.168.80.2:22)..
Fri Jan 8 06:28:26 2021 - [debug] ok.
Fri Jan 8 06:28:26 2021 - [debug] Connecting via SSH from mha@slave2(192.168.80.6:22) to mha@slave1(192.168.80.5:22)..
Fri Jan 8 06:28:26 2021 - [debug] ok.
Fri Jan 8 06:28:27 2021 - [info] All SSH connection tests passed successfully.
C. masterha_check_repl : Replication 에 대해서 Master/Slave 노드 정보 등을 체크
[mha]$ masterha_check_repl --conf=/etc/masterha/app1.cnf
Fri Jan 8 06:41:38 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 8 06:41:38 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:41:38 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:41:38 2021 - [info] MHA::MasterMonitor version 0.56.
Fri Jan 8 06:41:40 2021 - [info] GTID failover mode = 0
Fri Jan 8 06:41:40 2021 - [info] Dead Servers:
Fri Jan 8 06:41:40 2021 - [info] Alive Servers:
Fri Jan 8 06:41:40 2021 - [info] master(192.168.80.2:3306)
Fri Jan 8 06:41:40 2021 - [info] slave1(192.168.80.5:3306)
Fri Jan 8 06:41:40 2021 - [info] slave2(192.168.80.6:3306)
Fri Jan 8 06:41:40 2021 - [info] Alive Slaves:
...
Fri Jan 8 06:41:42 2021 - [warning] shutdown_script is not defined.
Fri Jan 8 06:41:42 2021 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
D. masterha_check_status : 매니저 프로세스 체크
I. 구동 중이지 않을 경우
masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
II. 구동 중 일 경우
masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:2073) is running(0:PING_OK), master:master
E. masterha_manager : 매니저 기동 및 모니터링 시작
[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &
# MHA가 마스터 DB 모니터링 중에 장애가 감지되어 failover 가 발생 된 이후 일정 시간내에 장애에 대해서는 failover 가 진행 되지 않음.
# failover 가 한번 처리 된 후 일정 시간안에는 failover가 되지 않으며 기본 값은 8시간
# last_failover_minute으로 8시간을 1분으로 변경
F. 로그 확인
[mha]$ cd /masterha/app1
[mha]$ tail -100f app1.log
Fri Jan 8 06:48:21 2021 - [info] MHA::MasterMonitor version 0.56.
Fri Jan 8 06:48:22 2021 - [info] GTID failover mode = 0
Fri Jan 8 06:48:22 2021 - [info] Dead Servers:
Fri Jan 8 06:48:22 2021 - [info] Alive Servers:
Fri Jan 8 06:48:22 2021 - [info] master(192.168.80.2:3306)
Fri Jan 8 06:48:22 2021 - [info] slave1(192.168.80.5:3306)
Fri Jan 8 06:48:22 2021 - [info] slave2(192.168.80.6:3306)
Fri Jan 8 06:48:22 2021 - [info] Alive Slaves:
...
G. Master 장비 VIP UP
[root]$ su - mha
[mha]$ sudo ifconfig eth0:0 192.168.80.50 up
2) 장애 상황 테스트 및 복구
A. 매니져에서 모니터링 프로세스 확인
[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:2073) is running(0:PING_OK), master:master
B. Master 장비에서 DB 서버 종료
C. MHA 모니터링 상황 확인
[mha]$ masterha_check_repl --conf=/etc/masterha/app1.cnf
Fri Jan 8 06:59:43 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 8 06:59:43 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:59:43 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Fri Jan 8 06:59:43 2021 - [info] MHA::MasterMonitor version 0.56.
Fri Jan 8 06:59:44 2021 - [info] GTID failover mode = 0
Fri Jan 8 06:59:44 2021 - [info] Dead Servers:
Fri Jan 8 06:59:44 2021 - [info] master(192.168.80.2:3306)
Fri Jan 8 06:59:44 2021 - [info] Alive Servers:
Fri Jan 8 06:59:44 2021 - [info] slave1(192.168.80.5:3306)
Fri Jan 8 06:59:44 2021 - [info] slave2(192.168.80.6:3306)
Fri Jan 8 06:59:44 2021 - [info] Alive Slaves:
Fri Jan 8 06:59:44 2021 - [info] slave2(192.168.80.6:3306) Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled
Fri Jan 8 06:59:44 2021 - [info] Replicating from slave1(192.168.80.5:3306)
Fri Jan 8 06:59:44 2021 - [info] Primary candidate for the new Master (candidate_master is set)
Fri Jan 8 06:59:44 2021 - [info] Current Alive Master: slave1(192.168.80.5:3306)
Fri Jan 8 06:59:44 2021 - [info] Checking slave configurations..
...
D. MHA 로그 확인
[mha]$ tail -100f app1.log
...
----- Failover Report -----
app1: MySQL Master failover master(192.168.80.2:3306) to slave1(192.168.80.5:3306) succeeded
Master master(192.168.80.2:3306) is down!
Check MHA Manager logs at mgr:/masterha/app1/app1.log for details.
Started automated(non-interactive) failover.
Invalidated master IP address on master(192.168.80.2:3306)
The latest slave slave1(192.168.80.5:3306) has all relay logs for recovery.
Selected slave1(192.168.80.5:3306) as a new master.
slave1(192.168.80.5:3306): OK: Applying all logs succeeded.
slave1(192.168.80.5:3306): OK: Activated master IP address.
slave2(192.168.80.6:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
slave2(192.168.80.6:3306): OK: Applying all logs succeeded. Slave started, replicating from slave1(192.168.80.5:3306)
slave1(192.168.80.5:3306): Resetting slave info succeeded.
Master failover to slave1(192.168.80.5:3306) completed successfully.
E. 장애가 발생되어 failover가 되게 되면 매니저서버에서 구동중인 매니저 프로세스(모니터링) 은 종료되게 됨
다시 모니터링을 하기 위해서는 마스터 서버의 정상화 후 설정을 해야 함.
다시 정상화를 위해서 1번 서버를 현재 마스터 서버인 2번 서버로 설정하여 정상적으로 replication 설정
F. 현재 Master가 된 Slave1의 정보 확인
MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 2047
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)
MariaDB [(none)]> show slave hosts\G
*************************** 1. row ***************************
Server_id: 3
Host: slave2
Port: 3306
Master_id: 2
G. Slave2의 정보 확인
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: slave1
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 2047
Relay_Log_File: relay_log.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
H. 기존의 Master 였던 서버 복구 시작
I. Master 서버의 디비 서비스 시작
II. 현재 Master인 Slave1 서버의 복제 시작
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='slave1', MASTER_USER='repl_user', MASTER_PASSWORD='epdlxjxla', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=2047;
MariaDB [(none)]> start slave;
# 복제 설정 여부 확인
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: slave1
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 2047
Relay_Log_File: relay_log.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
III. Slave1 에서 설정 확인
MariaDB [(none)]> show slave hosts\G
*************************** 1. row ***************************
Server_id: 1
Host: master
Port: 3306
Master_id: 2
*************************** 2. row ***************************
Server_id: 3
Host: slave2
Port: 3306
Master_id: 2
I. 매니져에서 모니터링 다시 시작
[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &
J. 모니터링 상황 확인
I. 매니져 실행 여부 확인
[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:2073) is running(0:PING_OK), master:master
II. 로그 확인
[mha]$ cd /masterha/app1
[mha]$ tail -100f app1.log
...
Fri Jan 8 07:17:18 2021 - [info] MHA::MasterMonitor version 0.56.
Fri Jan 8 07:17:19 2021 - [info] GTID failover mode = 0
Fri Jan 8 07:17:19 2021 - [info] Dead Servers:
Fri Jan 8 07:17:19 2021 - [info] Alive Servers:
Fri Jan 8 07:17:19 2021 - [info] master(192.168.80.2:3306)
Fri Jan 8 07:17:19 2021 - [info] slave1(192.168.80.5:3306)
Fri Jan 8 07:17:19 2021 - [info] slave2(192.168.80.6:3306)
Fri Jan 8 07:17:19 2021 - [info] Alive Slaves:
Fri Jan 8 07:17:19 2021 - [info] master(192.168.80.2:3306) Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled
Fri Jan 8 07:17:19 2021 - [info] Replicating from slave1(192.168.80.5:3306)
Fri Jan 8 07:17:19 2021 - [info] Primary candidate for the new Master (candidate_master is set)
Fri Jan 8 07:17:19 2021 - [info] slave2(192.168.80.6:3306) Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled
Fri Jan 8 07:17:19 2021 - [info] Replicating from slave1(192.168.80.5:3306)
Fri Jan 8 07:17:19 2021 - [info] Primary candidate for the new Master (candidate_master is set)
Fri Jan 8 07:17:19 2021 - [info] Current Alive Master: slave1(192.168.80.5:3306)
...
3) Master 서버 스위치
A. switch 시 매니저의 모니터링을 중지 해야 함.
[mha]$ masterha_stop --conf=/etc/masterha/app1.cnf
[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
B. Switch 명령어로 Master 서버 변경
masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf --new_master_host=master --interactive=0
#--master_state=alive | dead
#master 서버가 장애로 인하여 수동적인 failover 를 하는 것이라면 --master_state=dead #라고 옵션을 사용해야 합니다.
#master 서버가 정상이라면 alive 라고 입력 합니다.
#--new_master_host=호스트명
#새로운 마스터가 될 호스트명 입력
#--interactive=0 | 1
#1번은 대화형으로 진행(default) 이며, 0번은 비대화식
...
From:
slave1(192.168.80.5:3306) (current master)
+--master(192.168.80.2:3306)
+--slave2(192.168.80.6:3306)
To:
master(192.168.80.2:3306) (new master)
+--slave2(192.168.80.6:3306)
...
Fri Jan 8 07:52:09 2021 - [info] master: Resetting slave info succeeded.
Fri Jan 8 07:52:09 2021 - [info] Switching master to master(192.168.80.2:3306) completed successfully.
C. Master 서버에서 승격 여부 확인
MariaDB [(none)]> show slave hosts\G
*************************** 1. row ***************************
Server_id: 3
Host: slave2
Port: 3306
Master_id: 1
# 기존의 Master 였던 Slave1 이 연결이 끊어진 것을 볼 수 있음
D. Slave1을 다시 Master를 복제하도록 함
I. Master 정보 확인
MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 563
Binlog_Do_DB:
Binlog_Ignore_DB:
II. Slave1 에서 복제 시작
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl_user', MASTER_PASSWORD='epdlxjxla', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=563;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
III. Master에서 연결 정보 확인
MariaDB [(none)]> show slave hosts\G
*************************** 1. row ***************************
Server_id: 2
Host: slave1
Port: 3306
Master_id: 1
*************************** 2. row ***************************
Server_id: 3
Host: slave2
Port: 3306
Master_id: 1
E. 모니터링 재시작
[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &
4. 참조
A. https://mariadb.com/kb/en/semisynchronous-replication/#enabling-semisynchronous-replication
B. https://sarc.io/index.php/mariadb/1427-mha-nodeutil-pm-version
C. https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
D. https://hoing.io/archives/3111
E. https://hoing.io/archives/3633
'Database > Mysql & Mariadb' 카테고리의 다른 글
MySQL 8 계정 이슈 (0) | 2021.10.06 |
---|---|
Mysql JDBC Connector TimeZone 에러 (0) | 2021.10.05 |
Visual code on Mysql (Mariadb) (0) | 2021.07.02 |
재귀 쿼리를 이용한 전년도 같은 주차 조회 (0) | 2021.06.02 |
Mariadb Connect Engine (0) | 2021.04.13 |
최근댓글