OS : CentOS 7.9 64bit
MySQL : 8.0.25 - commercial
1 Master : 1 Slave Replication
Server : Localhost
MHA 구성
MHA Manager, Master, Slave 서버 총 3개가 기본 구성이며, 상황에 따라서는 1개의 Master와 N개의 Slave 최소 2대 까지 사용할 수 있습니다. (Active, StandBy 구조)
해당 포스트는 2대의 서버 구성입니다. (MHA Manager를 Slave 장비에 설치합니다.)
MHA 원리
MHA Manager가 n초마다 master DB에 Ping을 보내 이상 유무를 확인하며, 지정한 횟수 실패 시 장애로 인식하고 Failover를 수행합니다.
기존 MHA4MySQL 설치법과의 차이점
구글에 나와있는 대부분의 매뉴얼은 OS 계정 root로 진행하거나, 계정을 따로 만들어 진행합니다.
root로 구성 시, 보안성에 취약하다고 생각하며, MHA만을 위해 따로 계정을 만드는것은 불필요합니다.
그리하여, 데이터베이스의 기존 OS 계정(mysql)으로 진행합니다.
MHA의 FailOver
Master DB에 장애가 발생하면, MHA Manager는 Mater 장비의 VIP를 down 시킵니다.
이후 Replication 진행 후, down 시킨 VIP를 Slave 장비에서 올려 Failover를 진행합니다.
Replication 유저의 권한 추가사항
MHA가 수행되도록, replication slave 외의 아래의 권한을 추가합니다.
GRANT RELOAD, SUPER ON . TO 'mha'@'%' ;
GRANT SELECT ON mysql. TO 'mha'@'%';
GRANT ALL PRIVILEGES ON mysql.apply_diff_relay_logs TO 'mha'@'%';
GRANT ALL PRIVILEGES ON mysql.apply_diff_relay_logs_test TO 'mha'@'%';
GRANT REPLICATION SLAVE ON .* to 'mha'@'%';
FLUSH PRIVILEGES;
MHA 기본 패키지 추가사항
의존성이 요구되는 perl 패키지를 제외, 기본적으로 서버(Minimal Server 기준)에 구성되어야 할 패키지는 아래와 같습니다.
createrepo
net-tools
epel-release
perl
MHA 패키지를 설치하기 위해서는, 이에 관련된 의존성 패키지 설치가 필요합니다.
마찬가지로, 몇 개의 의존성 패키지는, 또 그에 관련된 의존성 패키지 설치가 필요합니다.
아래는, MHA 의존성 패키지와 관련된 이미지입니다. (반드시 순서대로 설치해야 원활하게 진행할 수 있습니다.)
이번 포스트는 온라인 레포지토리가 불가능한 폐쇄망을 기준으로, 의존성 패키지를 모두 가져와야 합니다. (폐쇄망이 아닐 경우, 온라인 레포지토리로 간단하게 설치하여 진행할 수 있습니다.)
설치 전, 기본적인 패키지가 필요합니다. (yum install perl createrepo)
Master, Slave 모두 수행
복잡한 의존성 패키지를 로컬 레포지토리를 생성하여, 의존성 순서에 관계없이 설치할 수 있습니다. (Dependency 파일은 공개하지 않습니다.)
OS에 기본적인 perl 패키지가 설치되었다고 가정, 아래 작업을 수행합니다. (yum install perl)
1-1. 기존 레포지토리 문서를 backup합니다. (백업 전, createrepo 패키지가 없을 시, 설치합니다. - yum install createrepo)
1-4. 만들어진 repository로 관련 의존성 패키지들을 설치합니다. (관련 패키지들이 의존성 여부를 고려해 자동으로 설치합니다.)
중략...
MHA는 SSH를 기준으로 대상 서버에 접속해, binlog, Server Health Check 등을 진행합니다.
SSH 구성은, 상대 서버 뿐만 아니라, 자신 서버와도 SSH로 접근이 가능해야합니다. (Master, Slave 모두 수행)
2-1. root 계정으로 sshd_config 파일을 수정합니다. (public key로 ssh접근이 가능해야 하기 때문입니다.)
PubkeyAuthentication의 주석을 해제합니다. (/etc/ssh/sshd_config)
ssh 데몬을 재실행합니다. (systemctl restart sshd)
sshd_config 파일을 살펴보겠습니다.
AuthorizedKeysFile의 기본값이, 홈 디렉토리의 .ssh 디렉토리 안에 'authorized_keys'파일로 저장되어 있습니다.
이것은, 임의로 작성한 것이 아닌, OS 기본 설정이므로, 똑같은 이름으로 key 파일을 생성합니다.
사실, 다른 서버의 접근을 위해서는 해당 서버 키를 authorized_keys에 입력할 필요가 없습니다, 하지만 MHA 수행에서는 해당 서버 또한 SSH로 접근이 가능해야합니다.
다른 서버 테스트는 물론, 자신의 호스트를 입력해 비밀번호 '없이' SSH 연결이 수행되는지 확인합니다.
3.1 기존 IP 구성을 확인합니다. (/etc/sysconfig/network-scripts/ifcfg-[CableType]N)
해당 서버는, 정적 IP할당이 아닌, DHCP로 동적 IP를 할당받을 수 있음을 알 수 있고, 아이피는 192.168.79.129입니다.
VIP를 UP, DOWN 시키기 위해서는 sudo 권한이 필요합니다. 절체 과정을 mysql로 진행하는데, 유저가 sbin 디렉토리의 명령어 권한이 없을 경우, VIP 할당 혹은 다운이 불가능합니다.
visudo 명령을 입력해, sudo 권한 구성 파일을 엽니다.
가장 아래부분에, 아래와 같이 입력 후, 저장합니다.
→ mysql 유저가 비밀번호 없이 sbin 명령을 실행하도록 함
ifup
ifdown
4.1 MHA 관련 디렉토리를 생성합니다.
[server default]
log_level=debug
user=mha
password=123
ssh_user=mysql
#working directory on the manager
manager_workdir=/mha/manager
#manager log file
manager_log=/mha/log/mha.log
#working directory on MySQL servers
remote_workdir=/mha/remote
repl_user=mha
repl_password=123
master_binlog_dir=/mysql_data/log
#ping interval, 3 times trial
ping_interval=5
#custom scripts for master ip failover
master_ip_failover_script=/mha/scripts/master_ip_failover
#custom scripts for shutdown using fencing network custom script
#shutdown_script=/mha/scripts/power_manager
#custom scripts for manual master switch
master_ip_online_change_script=/mha/scripts/master_ip_online_change
[server1]
hostname=dydb1
port=3306
ignore_fail=1
[server2]
hostname=dydb2
port=3306
ignore_fail=1
master_ip_failover:
SSH :
Replication :
...중략
...중략
(MHA 로그)
...
→ 마스터 DB에 Ping을 지정한 횟수 만큼 보내고, 반응이 없자, Failover를 진행합니다.
중략...
절체가 완료됐습니다.
(기존 슬레이브 서버의 상태)
(절체 후)
(기존 Master VIP의 자동 DOWN)
(Slave VIP의 자동 UP)