[MySQL] [MHA] 02. MHA 환경설정 및 설치

■ MHA 구성 요소

▶ Manager 패키지

매니저 노드에 설치되며 복제 그룹을 모니터링하는 패키지와 장애조치 스크립트들이 포함되어 있습니다.

 

노드 패키지

매니저 노드를 제외한 모든 노드에 설치되며 바이너리 로그, 릴레이 로그등을 관리하기 위한 패키지와 스크립트들이 포함되어 있습니다.

 

실습환경

호스트명 IP ROLE
mhamgr 192.168.0.100 MHA Manager
db1 192.168.0.101 Master
db2 192.168.0.102 Slave 1
db3 192.168.0.103 Slave 2
VIP 192.168.0.105 VIP

Keep alived 이용한 가상 IP관리 방법도 있으나 추후 알아보겠습니다.

여기서는 ifconfig 이용하여 가상 IP 관리해보도록 하겠습니다.

 

 

■ MHA 사전 준비사항

▶ MySQL 복제 설정

MHA 구성하기 위해선 Master 1 - Slave 2대로 구성된 복제 그룹이 필요합니다.

다음 링크를 참고하여 복제를 설정합니다.

https://myinfrabox.tistory.com/22

 

[MySQL][Master-Slave] 복제소개 및 사용방법

MySQL은 여러형태의 복제 솔루션과 HA, 분산기능, 그리고 클러스터링을 지원합니다. Master-Slave구조 + MHA, Multi Master for MySQL, Galera Cluster, MaxScale(MariaDB), Sharding등 참 많은 기능들을 제공한다는 것을 알

myinfrabox.tistory.com

 

추가 복제 환경 설정

복제에서 설정한 파라미터외에 다음과 같은 추가적인 파라미터가 더 필요합니다. 마스터, 슬레이브 모두 추가합니다.

Master 서버

슬레이브로 ROLE이 바뀌었을경우를 대비하여 슬레이브 역활도 할 수 있도록 설정합니다.

relay-log=/usr/local/mysql/logs/relay_log
relay-log-index=/usr/local/mysql/logs/relay_log.index
relay_log_purge=off
expire_logs_days=7
log_slave_updates=ON

 

슬레이브 서버

마스터로 ROLE이 바뀌었을경우를 대비하여 슬레이브 역활도 할 수 있도록 설정합니다.

log-bin=/usr/local/mysql/logs/binlog
max_binlog_size=512M
expire_logs_days=7
log_slave_updates=ON

 

 

서버간 SSH 설정

▶ /etc/hosts 설정

vi /etc/hosts 서버 IP 호스트명을 설정합니다. 모든 서버에 설정합니다.

192.168.0.100 mhamgr
192.168.0.101 db1
192.168.0.102 db2
192.168.0.103 db3
192.168.0.105 vip

 

 

▶ mha 계정 생성

모든 서버에 생성. root 유저로 실행. 암호 설정

root@mhamgr:/root# useradd -m -s /bin/bash mha
root@mhamgr:/root# passwd mha
암호 2번 입력

 

root@db1:/root# useradd -m -s /bin/bash -g mysql mha
root@db1:/root# passwd mha
암호 2번 입력

 

root@db2:/root# useradd -m -s /bin/bash -g mysql mha
root@db2:/root# passwd mha
암호 2번 입력

 

root@db3:/root# useradd -m -s /bin/bash -g mysql mha
root@db3:/root# passwd mha
암호 2번 입력

 

계정 만료 확인

root@mhamgr:/root# chage -l mha
Last password change                                    : Jul 22, 2022
Password expires                                        : never              <-- 이부분 확인.
Password inactive                                       : never 
Account expires                                         : never               <-- 이부분 확인.
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

 

만약 계정만료 설정되어 있을시 다음과 같이 입력

root@mhamgr:/root# chage -E -1 -I 0 -m 0 -M 99999 mha

 

 

▶ mha 대한 ssh 생성

질문에는 아무 입력도 하지 말고 엔터키 입력

root@mhamgr:/root# su - mha
[mha@mhamgr ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mha/.ssh/id_rsa): 
Created directory '/home/mha/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/mha/.ssh/id_rsa.
Your public key has been saved in /home/mha/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MrzbtN9JcB9aNijSiJ5pckzLIqVV6fIgR53ZMz62R70 mha@mhamgr
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     . =         |
|    . * +        |
|   . + o = . .   |
|  . * B S = + =  |
|   * O O = + * o |
|  o o % o . E .  |
|   . = + o o .   |
|      . o.. o    |
+----[SHA256]-----+

 

▶ mha계정에 대한 ssh 복사

모든 서버에 복사

[mha@mhamgr ~]$ ssh-copy-id mha@db1
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/mha/.ssh/id_rsa.pub"
The authenticity of host 'db1 (192.168.0.101)' can't be established.
ECDSA key fingerprint is SHA256:rSv+czYJKbhSQ9YzukZ+Uw0GPdmc/Smz6FHvEj89ssM.
ECDSA key fingerprint is MD5:1b:ff:0a:e8:a0:b8:21:88:38:22:b2:d5:5d:e1:d1:e9.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/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@db1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'mha@db1'"
and check to make sure that only the key(s) you wanted were added.

 

 

위와 같은 방법으로 db2, db3 서버에 ssh key 복사.

[mha@mhamgr ~]$ ssh-copy-id mha@db2
[mha@mhamgr ~]$ ssh-copy-id mha@db3

 

▶ mha계정에 대한 ssh 접속 테스트

ssh 로그인을 하는데 암호를 물어보면 안됨. 로그인 시도시 바로 대상 서버로 로그인이 되어야 .

[mha@mhamgr ~]$ ssh mha@db1
Last login: Thu Sep 15 09:03:38 2022
[mha@db1 ~]$       <-- DB1 서버로 암호없이 로그인 완료
[mha@db1 ~]$

 

▶ DB2, DB3 서버 로그인 테스트

[mha@mhamgr ~]$ ssh mha@192.168.0.102
[mha@mhamgr ~]$ ssh mha@192.168.0.103

 

모든 서버의 ssh key 복사.

모든 서버가 위와같이 암호없이 로그인이 되어야 한다. 공개키 생성(ssh-keygen - t rsa) ssh-copy-id  이용하여 서버마다 복사후 로그인 테스트를 해본다.

 

db1 서버

su - mha
ssh-keygen -t rsa
ssh-copy-id mha@mhamgr
ssh-copy-id mha@db2
ssh-copy-id mha@db3
db1 서버에서 각 서버로 ssh 로그인 테스트

 

db2 서버

su - mha
ssh-keygen -t rsa
ssh-copy-id mha@mhamgr
ssh-copy-id mha@db1
ssh-copy-id mha@db3
db2 서버에서 각 서버로 ssh 로그인 테스트

 

db3 서버

su - mha
ssh-keygen -t rsa
ssh-copy-id mha@mhamgr
ssh-copy-id mha@db1
ssh-copy-id mha@db2
db3 서버에서 각 서버로 ssh 로그인 테스트

 

 

■ OS USER - MHA USER 환경설정

▶ OS 환경설정

Virtual IP 올리고 내릴 있는 권한을 MHA User 부여.

모든 DB서버 - DB1, DB2, DB3 설정

먼저 ifconfig 명령어 위치를 알아냄

[root@db1 ~]# which ifconfig
/usr/sbin/ifconfig

 

root유저로  아래 명령어 실행

[root@db1 ~]# visudo
mha ALL=(ALL) NOPASSWD:/usr/sbin/ifconfig

 

 

▶ VIP 테스트

ifconfig -a 입력하여 현재 어댑터 확인

shell> ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::e1ef:da0:5f8d:e3b7  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::76a6:8bdb:ce05:4232  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b5a1:f0a2:3b44:56a4  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:26:dd:c0  txqueuelen 1000  (Ethernet)
        RX packets 13167  bytes 19307184 (18.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3599  bytes 246358 (240.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32  bytes 2592 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 2592 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

 

여기에서 네트워크 어댑터 이름은 ens33입니다. 네트워크 벤더사 혹은 기타 이유로 네트워크 어댑터 이름은 달라질 있지만 대부분 위와 같습니다.

ens33 어댑터를 이용하여 가상 어댑터와 IP 만드는데 가상 어댑터 이름은 ens33:0으로 합니다. 기존 어댑터 이름에 :0 붙여준다고 생각하면 됩니다.

IP 실습환경에서 얘기했던 192.168.0.105 이용하여 네트워크를 활성화 시킵니다.

 

db1, db2, db3 대해 모두 테스트를 합니다. MHA 서버를 제외한 DB서버 모두 대상입니다.

 

가상어댑터 테스트

가상어댑터 올리는 방법

[root@db1 ~]# su - mha
Last login: Wed Sep  7 09:43:48 EDT 2022 on pts/0
[mha@db1 ~]$ sudo ifconfig ens33:0 192.168.0.105 netmask 255.255.255.0 up
[mha@db1 ~]$ ifconfig -a
...
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.105  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:50:56:22:e0:54  txqueuelen 1000  (Ethernet)
...

 

위와같이 네트워크 어댑터가 올라오는것을 확인.

모든 DB서버 - db1, db2, db3 서버 모두 확인

 

확인이 끝났으면 DB서버 VIP 내림. 모든 DB서버 - db1, db2, db3 모두 내림

[mha@db1 ~]$ sudo ifconfig ens33:0 192.168.0.105 down

 

그리고 ens33:0 어댑터가 내려갔는지 확인.

[mha@db1 ~]$ ifconfig -a    <-- 이후 위에서 보였던 어댑터(ens33:0)이 없어야 함.

 

 

 

패키지 설치

모든 노드에 EPEL 추가

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum list

 

 

노드 공통 필수 패키지 설치

root 계정으로 설치합니다.

yum install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-Time-HiRes \
perl-CPAN \
perl-Module-Install

 

노드 패키지 설치

매니저 노드와 DB노드 모두 설치합니다. root 계정으로 설치합니다.

[root@ mhamgr ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
[root@ mhamgr ~]# tar -zxvf mha4mysql-node-0.58.tar.gz
[root@ mhamgr ~]# cd mha4mysql-node-0.58
[root@ mhamgr mha4mysql-node-0.58]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
Writing MYMETA.yml and MYMETA.json

[root@mhamgr mha4mysql-node-0.58]# make;make install
cp lib/MHA/BinlogManager.pm blib/lib/MHA/BinlogManager.pm
cp lib/MHA/BinlogPosFindManager.pm blib/lib/MHA/BinlogPosFindManager.pm
cp lib/MHA/BinlogPosFinderXid.pm blib/lib/MHA/BinlogPosFinderXid.pm
cp lib/MHA/BinlogHeaderParser.pm blib/lib/MHA/BinlogHeaderParser.pm
cp lib/MHA/BinlogPosFinder.pm blib/lib/MHA/BinlogPosFinder.pm
cp lib/MHA/BinlogPosFinderElp.pm blib/lib/MHA/BinlogPosFinderElp.pm
cp lib/MHA/NodeUtil.pm blib/lib/MHA/NodeUtil.pm
cp lib/MHA/SlaveUtil.pm blib/lib/MHA/SlaveUtil.pm
cp lib/MHA/NodeConst.pm blib/lib/MHA/NodeConst.pm
cp bin/filter_mysqlbinlog blib/script/filter_mysqlbinlog
/usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/filter_mysqlbinlog
cp bin/apply_diff_relay_logs blib/script/apply_diff_relay_logs
/usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/apply_diff_relay_logs
cp bin/purge_relay_logs blib/script/purge_relay_logs
/usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/purge_relay_logs
cp bin/save_binary_logs blib/script/save_binary_logs
/usr/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/save_binary_logs
Manifying blib/man1/filter_mysqlbinlog.1
Manifying blib/man1/apply_diff_relay_logs.1
Manifying blib/man1/purge_relay_logs.1
Manifying blib/man1/save_binary_logs.1
Installing /usr/local/share/perl5/MHA/BinlogManager.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFindManager.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinderXid.pm
Installing /usr/local/share/perl5/MHA/BinlogHeaderParser.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinder.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinderElp.pm
Installing /usr/local/share/perl5/MHA/NodeUtil.pm
Installing /usr/local/share/perl5/MHA/SlaveUtil.pm
Installing /usr/local/share/perl5/MHA/NodeConst.pm
Installing /usr/local/share/man/man1/filter_mysqlbinlog.1
Installing /usr/local/share/man/man1/apply_diff_relay_logs.1
Installing /usr/local/share/man/man1/purge_relay_logs.1
Installing /usr/local/share/man/man1/save_binary_logs.1
Installing /usr/local/bin/filter_mysqlbinlog
Installing /usr/local/bin/apply_diff_relay_logs
Installing /usr/local/bin/purge_relay_logs
Installing /usr/local/bin/save_binary_logs
Appending installation info to /usr/lib64/perl5/perllocal.pod

 

위와 같은 절차로 나머지 노드인 DB1, DB2, DB3에도 설치합니다.

 

▶ MHA매니저 설치 패키지 설치

매니저 노드에만 설치합니다.  root 계정으로 설치합니다.

[root@mhamgr ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[root@mhamgr ~]# tar -zxvf mha4mysql-manager-0.58.tar.gz
[root@mhamgr ~]# cd mha4mysql-manager-0.58
[root@mhamgr mha4mysql-manager-0.58]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...missing.
==> Auto-install the 1 mandatory module(s) from CPAN? [y] y
*** Dependencies will be installed the next time you type 'make'.
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Warning: prerequisite MHA::NodeConst 0 not found.
Writing Makefile for mha4mysql::manager
Writing MYMETA.yml and MYMETA.json

 

맨아래 missing 부분은 무시하고 그냥 y 입력합니다.

원래 노드를 체크하는것으로 mha 설정에 참가할 노드를 확인하는 작업인데 설차히였으므로 무시하고 넘어가셔도 됩니다.

keep alived 이용하여 설치를 진행하면 NodeConst 인식이 되는것으로 알고 있습니다. 이부분은 위에서 설명했듯이 추후 알아보도록 하겠습니다.

 

 

추가 설정

db1, db2, db3서버에만 다음과 같은 파일을 확인하고 없을시 다음과 같은 심볼릭 링크를 설정합니다.

파일 확인

[root@db1 ~]# ls -al /usr/bin/mysqlbinlog
[root@db1 ~]# ls -al /usr/local/bin/mysql

 

심볼릭 링크 설정

[root@db1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

 

db1, db2서버에서도 파일과 링크를 확인하고 없을시 생성합니다.

 

 

■ MHA 환경 설정

▶ MHA서버에서 사용할 DB유저 생성

마스터 서버에서만 실행합니다. 모든 슬레이브서버에 복제되어 자동으로 유저가 생성됩니다.

[root@db1 ~]# mysql -uroot -p'admin1234
mysql> CREATE USER 'dbmha'@'%' IDENTIFIED BY 'dbmha1234';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'dbmha'@'%';
mysql> FLUSH PRIVILEGES;

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'admin1234';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%';
mysql> FLUSH PRIVILEGES;

 

 

매니저 노드

디렉토리 생성 소유권 변경

[root@mhamgr ~]# mkdir -p /mysqlha/scripts
[root@mhamgr ~]# mkdir -p /mysqlha/conf
[root@mhamgr ~]# mkdir -p /mysqlha/app1
[root@mhamgr ~]# chown -R mha:mysql /mysqlha

 

예제 환경파일 복사

압축을 디렉토리의 samples 디렉토리로 이동합니다.

[root@mhamgr ~]# cd /root/downloads/mha4mysql-manager-0.58/samples
[root@mhamgr ~]# cp conf/* /mysqlha/conf
[root@mhamgr ~]# cp scripts/* /mysqlha/scripts

 

• MHA 설정

/mysqlha/conf/masterha_default.cnf 파일은 글로벌 환경설정(전체 환경) 파일입니다. DB서버들의 공통적인 환경부분(바이너리 로그 디렉토리, 아이디-패스워드등) 많으면 많을수록 유리합니다. 공통적인 부분으로 묶어 관리할 있기 때문입니다. 먼저 masterha_default.cnf app1 파일을 백업 복사 사용하도록 하겠습니다.

[root@mhamgr ~]# cd /mysqlha/conf
[root@mhamgr conf]# cp masterha_default.cnf masterha_default.cnf.original
[root@mhamgr conf]# cp app1.cnf app1.cnf.original

 

vi app1파일을 오픈하면 환경설정을 할수 있는 내용들이 나옵니다.

알맞게 입력합니다.

 

[root@mhamgr conf]# vi app1.cnf
[server default]
# DB 유저
user=dbmha
# DB 유저의 암호
password=mha1234
# OS User입니다.
ssh_user=mha
# DB 복제 유저
repl_user=repl_user
# DB 복제 유저 암호
repl_password=repl_user


# MHA 디렉토리 설정
manager_workdir=/mysqlha/app1
manager_log=/mysqlha/app1/app1.log
remote_workdir=/mysqlha/app1


# MySQL의 바이너리 로그 파일 위치
master_binlog_dir=/usr/local/mysql/logs


# SLAVE DB서버 와 마스터 서버 SSH 통신 체크
secondary_check_script=/usr/local/bin/masterha_secondary_check -s db1 -s db2 -s db3 --user=mha --master_host=db1 --master_ip=acs --master_port=3306


master_ip_failover_script=/mysqlha/scripts/master_ip_failover
master_ip_online_change_script=/mysqlha/scripts/master_ip_online_change


[server1]
hostname=db1
candidate_master=1


[server2]
hostname=db2
candidate_master=1


[server3]
hostname=db3
candidate_master=1​

Candidate_master 1 설정하면 서버가 마스터가 되기 위한 조건(, 바이너리 로그가 활성화되고 복제가 크게 지연되지 않는 ) 충족하면 마스터에 대한 우선 순위가 부여됩니다. 따라서 candidate_master=1 현재 마스터가 충돌할 지정된 호스트가 항상 마스터가 된다는 것을 의미하지는 않지만 우선 순위를 설정하는 도움이 됩니다.

여러 서버에서 candidate_master=1 설정하면 블록 이름(`[server_xxx]`) 정렬 순서에 따라 우선 순위가 결정됩니다. `[server_1]` `[server_2]`보다 우선순위가 높습니다.

 

• master_ip_failover 스크립트 수정

[root@mhamgr ~]# su - mha
[mha@mhamgr ~]$ cd /mysqlha/scripts
[mha@mhamgr scripts]$ cp master_ip_failover master_ip_failover.original
[mha@mhamgr scripts]$ vi master_ip_failover
86 라인으로 이동 후 변경전 내용
     86       ## Creating an app user on the new master
     87       print "Creating app user on the new master..\n";
     88       FIXME_xxx_create_user( $new_master_handler->{dbh} );
     89       $new_master_handler->enable_log_bin_local();
     90       $new_master_handler->disconnect();
     91 
     92       ## Update master ip on the catalog database, etc
     93       FIXME_xxx;


변경 후 내용(모두 주석 처리)
그리고 아래 system으로 시작되는  내용 추가
     86       ## Creating an app user on the new master
     87       ## print "Creating app user on the new master..\n";
     88       ## FIXME_xxx_create_user( $new_master_handler->{dbh} );
     89       ## $new_master_handler->enable_log_bin_local();
     90       ## $new_master_handler->disconnect();
     91 
     92       ## Update master ip on the catalog database, etc
     92       ## Update master ip on the catalog database, etc
     93       ## FIXME_xxx;
     94 
     95       system("/bin/bash /mysqlha/scripts/mha_change_vip.sh $new_master_ip");  <-- 추가 내용
     96 
     97       $exit_code = 0;

저장 종료

 

• master_ip_online_change 스크립트 수정

[mha@mhamgr scripts]$ cp master_ip_online_change master_ip_online_change.original
[mha@mhamgr scripts]$ vi master_ip_online_change
149 라인으로 이동후 변경전 내용
    149       ## Drop application user so that nobody can connect. Disabling per-session binlog beforehand
    150       $orig_master_handler->disable_log_bin_local();
    151       print current_time_us() . " Drpping app user on the orig master..\n";
    152       FIXME_xxx_drop_app_user($orig_master_handler);


변경후 내용
    149       ## Drop application user so that nobody can connect. Disabling per-session binlog beforehand
    150       ## $orig_master_handler->disable_log_bin_local();
    151       ## print current_time_us() . " Drpping app user on the orig master..\n";
    152       ## FIXME_xxx_drop_app_user($orig_master_handler);


244 라인으로 이동후 변경전 내용
    244       ## Creating an app user on the new master
    245       print current_time_us() . " Creating app user on the new master..\n";
    246       FIXME_xxx_create_app_user($new_master_handler);
    247       $new_master_handler->enable_log_bin_local();
    248       $new_master_handler->disconnect();
    249 
    250       ## Update master ip on the catalog database, etc
    251       $exit_code = 0;


변경후 내용(모두 주석처리)
그리고 아래 system으로 시작되는  내용 추가
    244       ## Creating an app user on the new master
    245       ## print current_time_us() . " Creating app user on the new master..\n";
    246       ## FIXME_xxx_create_app_user($new_master_handler);
    247       ## $new_master_handler->enable_log_bin_local();
    248       ## $new_master_handler->disconnect();
    249 
    250       ## Update master ip on the catalog database, etc
    251       
    252       system("/bin/bash /mysqlha/scripts/mha_change_vip.sh $new_master_ip");
    253       
    254       $exit_code = 0;

 

 

• mha_change_vip.sh 파일 작성

위의 가상 어댑터에서 확인한 자신의 어댑터명 확인합니다. 어댑터를 이용하여 아래의 스크립트 작성시 입력합니다.

 

[mha@mhamgr scripts]$ vi mha_change_vip.sh
#!/bin/bash


# 자신의 NIC 어댑터명으로 변경
NIC="ens33"


## Fail-Over VIP Change
V_NEW_MASTER=`cat /etc/hosts | grep $1 | awk '{print $2}'`
V_EXIST_VIP_CHK=`ping -c 1 -W 1 vip | grep "packet loss" | awk '{print $6}'`
V_VIP_IP=`cat /etc/hosts | grep vip | awk '{print $1}'`


if [ $V_EXIST_VIP_CHK = "0%" ]
then
    echo "VIP IS Alive, VIP Relocate $V_NEW_MASTER "
    /bin/ssh vip /bin/sudo /sbin/ifconfig ens33:0 down &
    ssh $V_NEW_MASTER /bin/sudo /sbin/ifconfig ens33:0 $V_VIP_IP netmask 255.255.255.0
    ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I ens33 -s $V_VIP_IP $V_VIP_IP
    ## 수행중 에러시 kill합니다.
    VIP_NOHUP_PS=`ps -ef | grep "ifconfig ens33: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 ens33:0 $V_VIP_IP netmask 255.255.255.0
    /bin/ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I ens33 -s $V_VIP_IP $V_VIP_IP
fi​

 

스크립트 작성 권한을 부여합니다.

[mha@mhamgr scripts]$ chmod 755 mha_change_vip.sh

 

• vip 변경 체크

vip 회수 가동 여부 확인을 위해 db node 한번씩 수행을 해서 테스트를 봅니다. 스크립트 수행은 MHA서버에서 하고 가상 IP 올라왔는지 여부는 해당 DB서버에서 확인을 합니다.

 

참고

아래 테스트 수행시 아래와 같은 메세지가 나올 있습니다.

[mha@mhamgr scripts]$ ./mha_change_vip.sh 192.168.0.102
VIP IS Alive, VIP Relocate db2 
The authenticity of host 'vip (192.168.0.105)' can't be established.
ECDSA key fingerprint is SHA256:rSv+czYJKbhSQ9YzukZ+Uw0GPdmc/Smz6FHvEj89ssM.
ECDSA key fingerprint is MD5:1b:ff:0a:e8:a0:b8:21:88:38:22:b2:d5:5d:e1:d1:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'vip,192.168.0.105' (ECDSA) to the list of known hosts.
ARPING 192.168.0.105 from 192.168.0.105 ens33
Sent 5 probes (5 broadcast(s))
Received 0 response(s)

위의 메세지는 최초 접속할 나오는 메세지입니다. yes 입력하여 추가해 주면 다음부터는 묻지 않습니다. 접속하는 해당 IP 영구적으로 추가한다는 내용입니다.

 

> mha 서버
[mha@mhamgr scripts]$ ./mha_change_vip.sh 192.168.0.101
VIP IS dead, VIP Relocate db1 
ARPING 192.168.0.105 from 192.168.0.105 ens33
Sent 5 probes (5 broadcast(s))
Received 0 response(s)


[mha@mhamgr scripts]$ ping -c 5 vip
PING vip (192.168.0.105) 56(84) bytes of data.
64 bytes from vip (192.168.0.105): icmp_seq=1 ttl=64 time=0.434 ms
64 bytes from vip (192.168.0.105): icmp_seq=2 ttl=64 time=0.373 ms
^C
--- vip ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.373/0.403/0.434/0.036 ms


> db1 서버
mha 유저로 수행합니다. 어댑터가 실제로 올라왔는지 확인해 봅니다.
[mha@db1 ~]$ ifconfig -a
......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.105  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:50:56:22:e0:54  txqueuelen 1000  (Ethernet)
......

 

> mha 서버
[mha@mhamgr scripts]$ ./mha_change_vip.sh 192.168.0.102
VIP IS dead, VIP Relocate db2 
ARPING 192.168.0.105 from 192.168.0.105 ens33
Sent 5 probes (5 broadcast(s))
Received 0 response(s)


[mha@mhamgr scripts]$ ping -c 5 vip
PING vip (192.168.0.105) 56(84) bytes of data.
64 bytes from vip (192.168.0.105): icmp_seq=1 ttl=64 time=0.434 ms
64 bytes from vip (192.168.0.105): icmp_seq=2 ttl=64 time=0.373 ms
^C
--- vip ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.373/0.403/0.434/0.036 ms




> db2 서버
mha 유저로 수행합니다. 어댑터가 실제로 올라왔는지 확인해 봅니다.
[mha@db2 ~]$ ifconfig -a
......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.105  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:50:56:22:e0:54  txqueuelen 1000  (Ethernet)
......
> mha 서버
[mha@mhamgr scripts]$ ./mha_change_vip.sh 192.168.0.103
VIP IS dead, VIP Relocate db3 
ARPING 192.168.0.105 from 192.168.0.105 ens33
Sent 5 probes (5 broadcast(s))
Received 0 response(s)


[mha@mhamgr scripts]$ ping -c 5 vip
PING vip (192.168.0.105) 56(84) bytes of data.
64 bytes from vip (192.168.0.105): icmp_seq=1 ttl=64 time=0.309 ms
64 bytes from vip (192.168.0.105): icmp_seq=2 ttl=64 time=0.396 ms
^C
--- vip ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.309/0.352/0.396/0.047 ms




> db3 서버
mha 유저로 수행합니다. 어댑터가 실제로 올라왔는지 확인해 봅니다.
[mha@db3 ~]$ ifconfig -a
......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.105  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:50:56:22:e0:54  txqueuelen 1000  (Ethernet)
......

 

 관련 링크

https://myinfrabox.tistory.com/267

 

[MySQL] [MHA] 01. MHA 이론

■ MHA 소개 MHA는 MySQL High Available의 약자로 MySQL의 HA솔루션중에 하나입니다. 구글에서 오픈소스로제공되었으나 현제는 중단되고 다른 개발자가 업데이트를 해오다 2018년도부터 중단

myinfrabox.tistory.com

 

https://myinfrabox.tistory.com/269

 

[MySQL] [MHA] 03. MHA 테스트 및 Failover

■ MHA 체크 방법 먼저 MHA 설치 및 환경설정까지는 완료가 되었습니다. 이제 MHA 설정에 이상이 없는지 체크를 진행합니다. ▶ MHA 주요 명령어 확인 Script명 설명 masterha_check_ssh SSH 접속 체크 masterha_

myinfrabox.tistory.com

 

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.

Designed by JB FACTORY