본문 바로가기
Database/MySQL

[MySQL] MHA 구성

by db.sry.22 2025. 3. 10.

 


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로 시작되는 코드를 주석처리 해주기