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