목차
1. 개요
MySQL MHA(Master High Availability)는 마스터 장애 발생 시 자동으로 슬레이브 중 하나를 새로운 마스터로 승격시키는 고가용성(HA) 솔루션 중 하나입니다.
운영중인 마스터가 다운되면, MHA 매니저는 슬레이브 중 하나를 새로운 마스터로 자동 승격시키고 나머지 슬레이브는 새로운 마스터를 바라보도록 조정합니다.
MHA 환경 구축 시에는 각각의 Manager와 Node(MySQL 서버)가 요구됩니다.
- MHA Manager
장애를 감지하고 마스터 스위치를 수행한다. - MHA Node
MySQL 마스터 및 슬레이브
위 그림과 같이 MHA 환경을 구성했다면, 각 서버별 역할은 다음과 같습니다.
역할 | IP | |
Manager | MHA Manager | 192.168.1.10 |
Node A | Master DB | 192.168.1.11 |
Node B | Slave DB | 192.168.1.12 |
Node C | Slave DB | 192.168.1.13 |
2. 설치
- OS : Ubuntu 22.04
- MySQL : 8.0
MHA Wiki 공식문서에서 더 자세한 내용을 확인할 수 있습니다.
1) Manager 서버에 mha4mysql-manager 설치
# 필수 라이브러리 설치
sudo apt-get update
sudo apt-get install -y gcc make libdbi-perl libdbd-mysql-perl libio-socket-ssl-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl
# MHA Manage 패키지 설치
cd /usr/local/src
sudo wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
tar -xvf mha4mysql-manager-0.58.tar.gz
# mha4mysql-manager 컴파일 및 빌드
cd mha4mysql-manager-0.58
perl Makefile.PL
make && sudo make install
# 설치된 mha4mysql-manager 확인
masterha_manager --version
2) Node (Master/Slave) 서버에 mha4mysql-node 설치
# 필수 라이브러리 설치
sudo apt-get update
sudo apt-get install -y gcc make libdbi-perl libdbd-mysql-perl libio-socket-ssl-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl
# MHA Node 패키지 설치
cd /usr/local/src
sudo wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
tar -xvf mha4mysql-node-0.58.tar.gz
# mha4mysql-node 컴파일 및 빌드
cd mha4mysql-node-0.58
perl Makefile.PL
make && sudo make install
3) ssh 설정
매니저와 모든 노드, 그리고 노드와 모든 노드가 비밀번호 없이 SSH 접속이 가능해야 합니다.
# Manager (192.168.1.10)에서 명령어 실행
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.11
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13
# Node A (192.168.1.11)에서 명령어 실행
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.10
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13
# Node B (192.168.1.12)에서 명령어 실행
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.10
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.11
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13
# Node C (192.168.1.13)에서 명령어 실행
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.10
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.11
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12
3. cnf 파일 구성
.cnf 파일의 필수 구성요소는 아래와 같습니다.
[server default]
manager_workdir=/var/log/mha # MHA 매니저가 작업할 디렉터리
manager_log=/var/log/mha/mha.log # MHA 매니저 로그 위치
ssh_user=root # ssh 계정
user=root # MySQL 서버 계정
password="nS3H7CR_$aMnva_" # MySQL 서버 패스워드
repl_user=repl # MySQL 리플리케이션 설정 계정
repl_password="pwpw" # MySQL 리플리케이션 설정 패스워드
ping_interval=2 # MHA Manager가 서버 상태를 점검하는 간격(초)
log_level=debug # 로그 단계
master_binlog_dir=/dblog/mysql_log # MySQL bin로그 저장 위치
master_ip_failover_script=/usr/local/src/mha4mysql-manager-master/samples/scripts/master_ip_failover # 마스터 failover 발생 시 실행할 스크립트
[server1]
hostname=192.168.1.11
port=3306
[server2]
hostname=192.168.1.12
port=3306
candidate_master=1 # 마스터 후보 가능
[server3]
hostname=192.168.1.13
port=3306
cnf에 정의할 수 있는 파라미터는 공식문서를 통해 확인할 수 있습니다. raw.githubusercontent.com/wiki/yoshinorim/mha4mysql-manager/Parameters.md
4. 사용
1) 체크
# ssh 체크
masterha_check_ssh --conf=/etc/mha.cnf
# 리플리케이션 헬스 체크
masterha_check_repl --conf=/etc/mha.cnf
2) 실행
# Manager 실행
masterha_manager --conf=/etc/mha.cnf
# MHA Manager 모니터링 출력
masterha_check_status --conf=/etc/mha.cnf
3) 페일오버 테스트
# Master에 커널패닉 일으키기
echo c > /proc/sysrq-trigger
# MHA Manager 모니터링 출력
masterha_check_status --conf=/etc/mha.cnf
+ 에러 발생 시
1) 에러1
[error][/usr/local/share/perl/5/MHA/MasterMonitor.pm, ln425] Error happened on checking configurations.
Redundant argument in sprintf at /usr/share/perl5/MHA/NodeUtil.pm line 190.
[error][/usr/local/share/perl/5.22.1/MHA/MasterMonitor.pm, ln524] Error happened on monitoring servers.
193 sub parse_mysql_version($) {
194 my $str = shift;
195 ($str) = $str =~ m/^[^-]*/g;
196 my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
197 return $result;
198 }
199
200 sub parse_mysql_major_version($) {
201 my $str = shift;
202 ($str) = $str =~ m/^[^-]*/g;
203 my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g ); ## 수정
204 return $result;
205 }
2) 에러2
[error] [/usr/local/share/perl/5.34.0/MHA/ServerManager.pm, ln229] Failed to get master_ip_failover_script status with return code 255 : 0.
[error] [/usr/local/share/perl/5.34.0/MHA/ServerManager.pm, ln427] Error happened on checking configurations. at /usr/local/bin/masterha_check_repl line 48.
[error] [/usr/local/share/perl/5.34.0/MHA/ServerManager.pm, ln525] Error happened on monitoring servers.
해결방법 : master_ip_failover_script 의 FIXME로 시작되는 코드를 주석처리 해주기
'Database > MySQL' 카테고리의 다른 글
[MySQL] InnoDB Cluster 3부작 : 2. Group Replication (2) - 구성하기 (0) | 2025.03.19 |
---|---|
[MySQL] InnoDB Cluster 3부작 : 1. Group Replication (1) - 개념 이해하기 (0) | 2025.03.17 |
[MySQL] binlog_format (0) | 2025.03.12 |
[MySQL] innodb_flush_method (O_DIRECT, O_DSYNC, fsync) (0) | 2025.03.11 |
[MySQL] InnoDB I/O Capacity 설정 (0) | 2025.03.11 |