[MySQL] [MHA] 02. MHA 환경설정 및 설치
- Databases/MySQL
- 2022. 10. 2.
■ 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
▶ 추가 복제 환경 설정
복제에서 설정한 파라미터외에 다음과 같은 추가적인 파라미터가 더 필요합니다. 마스터, 슬레이브 모두 추가합니다.
• 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
https://myinfrabox.tistory.com/269
※ 도움이 되셨다면 광고클릭 한번 부탁드립니다. ※
'Databases > MySQL' 카테고리의 다른 글
[MySQL][Parameter] 다양한 Read Only 파라미터 (0) | 2023.02.16 |
---|---|
[MySQL] [MHA] 03. MHA 테스트 및 Failover (0) | 2022.10.02 |
[MySQL] [MHA] 01. MHA 이론 (0) | 2022.10.02 |
[MySQL][Replication] Semi Sync 기능과 설정방법 (0) | 2022.08.07 |
[MySQL][Replication] MSR - Multi Source Replication 개념과 구성방법 (0) | 2022.07.09 |