System/작업LOG

[2020-02-07] CentOS-MariaDB Replication / MHA 설치및 설정

클리엘 2020. 2. 28. 18:00
728x90

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;

Slave_IO_State에 Waiting for master to send event 라고 나오면 정상

- 안되면 start slave; 를 한번 내려줌

 

(3) Replication 상태 확인

masterha_check_repl --conf=/etc/mha.cnf

 

(4) MHA 구동

masterha_manager --conf=/etc/mha.cnf &

 

728x90