1. 구성 및 시나리오
(1). 목적
Master DB의 장애 발생 시 Failover를 수행하여 Slave DB를 Master DB로 자동 승격하여 DB 다운타임을 최소화
(2). 동작
3초마다 Master DB의 상태를 MHA Manager가 Connect / Select / Insert 하여 확인 -> 3회 실패 시 Failover 수행
(3). 아래 모든 설정은 위의 구성에 따름.
2. 가상 IP 설정(멀티 IP 설정)
(1) 하나의 랜카드에 WEBSERVER 접근용 IP 및 MHA용 IP를 추가
- Master / Slave
- 추가할 이더넷 명칭은 eth3으로 설정
- 현재 Master eth3은 192.168.0.13, Slave eth3은 192.168.0.23으로 설정, 여기에 192.168.0.30 추가함
- 디렉터리 이동
cd /etc/sysconfig/network-scripts/
- 설정 파일 복사
cp ifcfg-eth3 ifcfg-eth3:0
- 설정 파일 수정
vi ifcfg-eth3:0
--아래 내용 수정
DEVICE="eth3:0"
NAME="eth3:0"
IPADDR="192.168.0.30"
--slave는 eth3:0가 내려가야 하므로 onboot를 no로 설정하고 IPADDR은 IPADDR=""처럼 IP를 제거한 상태로 둠.
- 설정 적용 (Slave는 ifdown)
ifup ifcfg-eth3:0
- 상태 확인
ip a s eth3:0
-> 가상 IP가 나오면 현재 활성화(up)상태
3. MHA 설치
(1) 작업할 디렉터리를 임의로 만듦.
- Master / Slave
mkdir mha
(2) 의존성 패키지 설치
- Master
yum -y install perl-CPAN perl-DBD-MySQL perl-Module-Install
- Slave
yum -y install perl-CPAN perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Module-Install
(3) perl 환경설정
- 아래 설정이 없으면 MHA설치 시 오류가 발생
- /etc/environment 파일을 아래와 같이 수정
- Master / Slave
vi /etc/environment
LANGUAGE=en_US.utf8
LC_ALL=en_US.utf8
LANG=en_US.utf8
LC_TYPE=en_US.utf8
- 저장 후 재부팅 혹은 로그아웃/로그인 -> 그래야 설정이 다시 로드됨.
(4) MHA 설치
- Master
tar xvzf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make
make install
- Slave
tar xvzf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make
make install
tar xvzf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57.tar
perl Makefile.PL
make
make install
(5) Replication 계정 생성(DB)
- Master / Slave
Grant All Privileges On *.* To 'mha'@'%' Identified By '!mha123';
Flush Privileges;
(6) Failover와 원상태 복구 스크립트 작성
- Slave
vi /mha/mha4mysql-manager-0.57/samples/scripts/change_master_to_slave.sh
--아래 내용저장
ssh root@192.168.0.10 /sbin/ifdown ifcfg-eth3:0
ifconfig eth3:0 192.168.0.30 up
slave에서 운영체제 부팅시 eth3:0 이더넷이 up상태로 되는 현상이 발견됨. onboot나 기타 다른 설정을 적용해 보았으나 up상태로 시작되는 현상을 막을 수 없어서 아예 slave의 eth3:0 의 ip를 제거한 상태로 시작함.
따라서 slave의 eth3:0을 up할땐 ip주소를 할당시켜야함.
vi /mha/mha4mysql-manager-0.57/samples/scripts/change_slave_to_master.sh
--아래 내용 저장
ifdown ifcfg-eth3:0
ssh root@192.168.0.10 /sbin/ifup ifcfg-eth3:0
vi /mha/mha4mysql-manager-0.57/samples/scripts/master_ip_failover
--$command eq "stop" || $command eq "stopssh"
--#updating global catalog, etc밑에 내용 추가
system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_master_to_slave.sh");
--$command eq "start"
--아래와 같이 변경
## 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();
...생략
##FIXME_xxx;
#if($new_master_ip eq "192.168.0.10") {
# system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_slave_to_master.sh");
#}
#elsif($new_master_ip eq "192.168.0.20") {
system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_master_to_slave.sh");
#}
$exit_code = 0;
설정파일 내용상 change_master_to_slave.sh를 실행하는 구문을 2군데에 걸쳐서 넣은 이유는 테스트 시 한 군데만 구문이 존재할 때 가상 IP업/다운 동작이 제대로 처리되지 않았기 때문임.
모든 환경과 설정이 같은데 제대로 되는 경우도 있고 안 되는 경우도 있는 다소 불안한 동작을 보이는 탓에 아예 위에서 처럼 if문을 기준으로 2군데에 모두 스크립트를 실행하는 구문을 추가하였음. (위에서 처럼 처리 후에는 가상 IP처리가 안 되는 경우는 없었음.)
상기 내용은 설정 파일을 어떻게 세팅해야 되는지에 대한 내용을 제대로 파악하지 못한 경우일 수 있기 때문에 확인이 필요함.
두 번째 system... 에서는 $new_master_ip를 판단하여 각기 다른 스크립트를 실행하도록 해놓았는데 change_master_to_slave.sh를 실행하는 영역을 제외하고 모두 주석 처리함.
IP를 구분하여 처리하는 경우는 추측컨데 failover를 수행한 뒤 다시 failover동작을 해야 하는 경우 필요한 내용으로 보임. 추측이 맞다는 가정하에 failover를 수행한 뒤 원복 처리를 할 것이므로 ip에 따른 분기는 필요 없다고 판단하였음.
vi /mha/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change
--$command eq "stop"영역의 $orig_master_handler->disconnect(); 밑 아래내용 추가
system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_slave_to_master.sh");
--아래 내용 수정
##FIXME_xxx_drop_app_user($orig_master_handler);
....
## 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();
--## Update master ip on the catalog database, etc 이하 아래 부분 변경및 추가
## Update master ip on the catalog database, etc
#if ($new_master_ip eq "192.168.0.12") {
system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_slave_to_master.sh");
#}
#elsif ($new_master_ip eq "192.168.0.22") {
# system("/bin/sh /mha/mha4mysql-manager-0.57/samples/scripts/change_master_to_slave.sh");
#}
ip분기문은 주석 처리함. 사유는 위와 같음.
(7) MHA 설정 파일 생성
- Slave
vi /etc/mha.cnf
--아래 내용추가
[server default]
user=mha --Replication 아이디
password=!mha123 --Replication 비밀번호
manager_workdir=/var/log/mha
manager_log=/var/log/mha.log
remote_workdir=/var/log/mha
master_ip_failover_script=/mha/mha4mysql-manager-0.57/samples/scripts/master_ip_failover
master_ip_online_change_script=/mha/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change
[server1]
hostname=192.168.0.12 --Replication IP (Master)
[server2]
hostname=192.168.0.22 --Replication IP (Slave)
(8) ssh 접속 설정
- Master
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
ssh-keygen -t rsa (엔터3번)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/id_dsa
chmod 644 ~/.ssh/id_dsa.pub
scp $HOME/.ssh/id_rsa.pub root@192.168.0.20:id_rsa.pub
- Slave
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
ssh-keygen -t rsa (엔터3번)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/id_dsa
chmod 644 ~/.ssh/id_dsa.pub
scp $HOME/.ssh/id_rsa.pub root@192.168.0.10:id_rsa.pub
- Master / Slave
cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys
(9) ssh 접속 테스트
- Slave
yum install -y epel-release
yum install -y perl-Log-Dispatch perl-Parallel-ForkManager
만약 아래 테스트를 먼저 수행해 이상이 없다면 위 작업은 필요 없음.
masterha_check_ssh --conf=/etc/mha.cnf
- 테스트 실패 시
다음 실패오류시 slave에서 slave쪽으로 ssl 인증서를 복사함
ssh-copy-id root@192.168.10.102
[error][/usr/local/share/perl5/MHA/SSHCheck.pm, ln63]
- 테스트 성공 시
5. Replication 구성
(1) Master
vi /etc/my.cnf
-> 다음과 같이 수정
[mysqld]
log-bin=mysql-bin
server-id=1
- Master 서비스 재시작
service mysqld restart
- 상태 확인 (DB에서)
show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 328
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)
ERROR: No query specified
(2) Slave
- /var/log에 mysql 디렉터리 생성 후 chown -R mysql:mysql /var/log/mysql 명령 내림
vi /etc/my.cnf
-> 아래와 같이 수정
[mysqld]
server-id=2
read_only=1
log-bin=/var/log/mysql/mysql-bin
relay_log_purge=0
- Slave 서비스 재시작
service mysqld restart
- Replication 설정 (DB에서)
change master to master_host='192.168.0.12', master_user='mha', master_password='!mha123',
master_log_file='[Master 에서 확인된 Log파일명]',
master_log_pos=[Master 에서 확인된 Position번호];
- Slave 상태 확인
show slave status\G;
- 안되면 start slave; 를 한번 내려줌
(3) Replication 상태 확인
masterha_check_repl --conf=/etc/mha.cnf
(4) MHA 구동
masterha_manager --conf=/etc/mha.cnf &
'System > 작업LOG' 카테고리의 다른 글
[2020-02-19] CentOS-MariaDB MHA 원복하기 (0) | 2020.03.03 |
---|---|
[2020-02-19] CentOS-MariaDB MHA 테스트 (0) | 2020.02.28 |
[2020-01-28] MySQL Replication - DBMS 단방향 이중화 (0) | 2020.01.28 |
[2020-01-23] RPM과 Yum의 이해 / MariaDB 설치 (0) | 2020.01.23 |
[2020-01-22] Cent OS 설치및 ssh, 네트워크 설정 / WSL 설치 (0) | 2020.01.22 |