MySQL & MHA 기반 RDB의 자동 페일오버 클러스터링 시스템

1. 요약


본고는 MySQL & MHA가 RDB의 자동 장애 조치 클러스터 시스템을 설계하고 구축하는 예시를 발표했다.

2. 소개


특히 비즈니스 핵심 RDB시스템에서 SLA는 매우 중요한 요소라고 할 수 있다.
그러나 RDB의 마스터 노드가 고장날 가능성은 0이 아니며 제 경험에 의하면 의외의 원인(OSS의 오류 등)으로 인해 발생한 경우도 있습니다.
장애가 발생하면 복구가 완료되기 전 시간 내에 기회 손실이 발생하기 때문에 업무에 큰 영향을 미친다.
본고는 MySQL & MHA의 RDB자동고장전이군집시스템의 설계와 구축을 예로 삼아 이러한 영향과 기회 손실을 최대한 줄이는 해결 방안 중 하나로 삼을 것이다.
이 클러스터 시스템에는 호스트 1대, 보조 서버 2대, 모니터링 노드 (예: 리버스 프록시) 등 최소 4개의 서버 구성이 필요합니다.
그리고 그 구조는 감시 노드에서 호스트 고장을 자동으로 검출하고 1호기에서 호스트로 승격하고 2호기에서 1호기로 전환하며 고장난 호스트를 차단하는 토대에서 반복제를 재구성하는 것이다발생할 수 있는 데이터 손상 등을 자동으로 복구해 볼 수도 있다.
페일오버에 소요되는 시간은 당연히 모니터링 재시도 등 임계값에 달려 있지만, 동작만 전환하면 수초 단위로 완료됩니다.
이것은 주 고장 시 기회 손실과 업무 영향 범위를 최소화할 수 있다.
프로젝트에서 운영 서버, 보조 서버, 볼륨 서버, 리버스 프록시, 모니터링 서버, 백업 서버 및 RDB시스템 실행과 관련된 서버만 수백 대가 순조롭게 실행됩니다.

3. 환경

  • RHEL7 계통
  • MySQL 5.6
  • MHA 0.57
  • Keepalived 1.2.13
  • IPVS 1.27
  • firewalld 0.3.9
  • GlusterFS 4.1.7
  • 4. 디자인


  • 로드 밸런서 2대
    (모니터링 서버 2대)
  • RDB 마스터 서버 1대
  • RDB보조서버 2대
  • 볼륨 서버 4대
  • 5. 볼륨 서버 구축


    볼륨 서버의 구축 예는 분산용·복제용으로 모두 4대로 구성되어 있다.
    구성을 적절히 조정하려면 GlusterFS를 사용하여 웹 서버 동기화 직위의 GlusterFS 서버 섹션을 참조하십시오.

    6. MySQL 서버 구축


    MySQL 서버의 구축 예는 호스트 1대, 종기 2대의 준동기화로 구성되어 있다.
    구축 방법은 일반적인 예를 참고하십시오.

    7. 부하 평형기 구축


    부하 평형기(역방향 에이전트)의 구축 예는 부하 평형기 x2대로 구성된다.
    메일박스의 웹 서버 섹션을 참조하여 RDB 서버로 교체하십시오.

    8.MHA 노드 구축


    HA에서 모니터링 서버를 관리자라고 하고 각 MySQL 서버를 노드라고 합니다.
    공식 문서는 여기 있습니다.
    LVS&firewalld 기반 DSR 로드 밸런서

    8-1. 전자 저장소 설치


    @MySQL 서버 1,2,3
    epel 저장소가 없으면 설치하십시오.$ sudo cd /etc/yum.repos.d $ sudo yum -y install epel-releaseenabled를 1에서 0으로 변경합니다.$ sudo vim epel.repo/etc/yum.repos.d/epel.repo
    enabled = 0
    

    8-2. HA 노드 패키지 다운로드


    @MySQL 서버 1,2,3$ sudo mkdir /usr/local/src/mha $ sudo cd /usr/local/src/mha $ sudo wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-node-0.57-0.el7.noarch.rpm상술한 죽은 링크이기 때문에 아래에 다시 분포되었다.(GPL-2.0)
    $ sudo wget https://github.com/KyojiOsada/mha4mysql/raw/master/mha4mysql-node-0.57-0.el7.noarch.rpm

    8-3. HA 노드 패키지 설치


    @MySQL 서버 1,2,3$ sudo yum --enablerepo=epel -y localinstall mha4mysql-node-0.57-0.el7.noarch.rpm

    8-4. HA 노드 작업 디렉토리 생성


    @MySQL 서버 1,2,3
    HA용 작업 디렉토리를 만듭니다.$ sudo mkdir /var/mha

    8-5. SSH 설정


    @MySQL 서버 1
    각 MySQL 서버 간 및 각 모니터링 서버에서 각 MySQL 서버에 대한 관리자 권한 SSH 연결을 위한 환경을 구축합니다.$ sudo mkdir /root/.ssh $ sudo cd /root/.ssh $ sudo ssh-keygen -t rsa $ sudo chmod 0600 id_rsa $ sudo cp -a id.rsa.pub authorized_keys@MySQL 서버 2,3
    각 MySQL 서버의/root/.ssh에도 MySQL 서버 1에서 생성된 id_ 포함rsa 및 authorized_키와 같은 물건을 설치하다.

    9. MHA 관리자 구축


    HA에서 모니터링 서버를 관리자라고 하고 각 MySQL 서버를 노드라고 합니다.

    9-1. 전자 저장소


    @ 서버 1, 2 모니터링
    epel 저장소가 없으면 설치하십시오.$ cd /etc/yum.repos.d $ yum -y install epel-releaseenabled를 1에서 0으로 변경합니다.$ vim epel.repo/etc/yum.repos.d/epel.repo
    enabled = 0
    

    9-2. HA 다운로드


    @ 서버 1, 2 모니터링$ sudo mkdir /usr/local/src/mha $ sudo cd /usr/local/src/mha모니터 서버에 관리자 패키지를 다운로드합니다.$ sudo wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-manager-0.57-0.el7.noarch.rpm상술한 죽은 링크이기 때문에 아래에 다시 분포되었다.(GPL-2.0)
    $ sudo wget https://github.com/KyojiOsada/mha4mysql/raw/master/mha4mysql-manager-0.57-0.el7.noarch.rpm노드 패키지를 모니터링 서버에 다운로드합니다.$ sudo wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-node-0.57-0.el7.noarch.rpm상술한 죽은 링크이기 때문에 아래에 다시 분포되었다.(GPL-2.0)
    $ sudo wget https://github.com/KyojiOsada/mha4mysql/raw/master/mha4mysql-node-0.57-0.el7.noarch.rpm

    9-3. HA 설치


    @ 서버 1, 2 모니터링
    모니터링 서버에 관리 패키지와 노드 패키지를 설치합니다.$ sudo yum --enablerepo=epel -y localinstall mha4mysql-manager-0.57-0.el7.noarch.rpm mha4mysql-node-0.57-0.el7.noarch.rpm

    9-4. HA 작업 디렉토리 생성


    @ 서버 1, 2 모니터링
    HA용 작업 디렉토리를 만듭니다.$ sudo mkdir /var/mha

    9-5. SSH 설정


    @ 서버 1, 2 모니터링
    8-5. 에서 생성된 id_rsa 및 authorized_keys를 설정합니다.

    9-6. HA 관리자 설정


    @ 서버 1, 2 모니터링$ sudo cp -a /etc/masterha_default.cnf /etc/masterha_default.cnf.org $ sudo vim /etc/masterha_default.cnf/etc/masterha_default.cnf
    [server default]
    # MySQL User Password
    ## 予め MySQL にMHA 用アカウントを作成しておき、ここで指定しておきます。
    user = ユーザー名
    password = パスワード
    
    # SSH
    ## SSH 用ユーザーを指定します。ここでは root を指定しています。
    ssh_user = root
    
    # MySQL Replication User
    # MySQL レプリケーション時に作成したユーザーを指定します。
    repl_user = レプリケーション用 MySQL ユーザー
    repl_password = レプリケーション用 MysQLパスワード
    
    # Manager Working Directory
    ## 監視サーバーに、予めマネージャー用のワーキングディレクトリを作成し、ここで指定します。
    manager_workdir = /var/mha
    manager_log = /var/mha/manager.log
    
    # Node Working Directory
    ## 各 RDB サーバーに、予めノード用のワーキングディレクトリを作成し、ここで指定します。
    remote_workdir = /var/mha
    
    # MySQL Working Directory
    ## RDB サーバーのワーキングディレクトリを指定します。
    ## もし RDB サーバーにボリュームサーバーを別立てする場合には、そのマウントポイントを指定します。
    master_binlog_dir = /var/mysql,/var/mysql,/var/mysql
    ## もし RDB サーバーにボリュームサーバーを別立てする場合には、PID ファイルは RDB 起動後ロックし続けるため、ボリュームサーバーに置いてはなりません。
    master_pid_file = /var/mysql/mysql.pid,/var/mysql/mysql.pid,/var/mysql/mysql.pid
    
    # Faliover Script
    ## 適宜使用するスクリプトを指定します。
    master_ip_failover_script = /srv/mha/master_ip_failover.sh
    #master_ip_online_change_script = /data/mha/master_ip_failover.sh
    
    # Report Script
    ## 適宜使用するスクリプトを指定します。
    #report_script = /data/mha/report.sh
    
    # MySQL Configurration
    [server1]
    hostname = 10.0.0.1
    
    [server2]
    hostname = 10.0.0.2
    candidate_master = 1
    
    [server3]
    hostname = 10.0.0.3
    no_master = 1
    

    9-7. SSH 연결 테스트


    @ 서버 1, 2 모니터링$ sudo masterha_check_ssh --conf=/etc/masterha_default.cnf

    9-8. ySQL 연결 및 복제 검사


    @ 서버 1, 2 모니터링$ sudo masterha_check_repl --conf=/etc/masterha_default.cnf

    9-9. HA 관리자 시작 / 테스트 중지


    @ 서버 1, 2 모니터링
    프론트 데스크 가동$ sudo masterha_manager --conf=/etc/masterha_default.cnf $ sudo ps aux | grep masterha_manager $ sudo tail -f /var/mha/manager.log다음 내용이 출력되면 성공합니다
    FriJan 24 23:35:09 20xx - [info] Ping(CONNECT) succeeded, waiting until MySQL doesn't respond..
    
    프론트 스톱
    [Ctrl + c]
    백그라운드 시작$ sudo nohup masterha_manager --conf=/etc/masterha_default.cnf < /dev/null > /var/mha/manager.log 2>&1 & $ sudo ps aux | grep masterha_manager $ sudo tail -f /var/mha/manager.log
    FriJan 24 23:35:09 20xx - [info] Ping(CONNECT) succeeded, waiting until MySQL doesn't respond..
    
    배경 정지$ sudo masterha_stop --conf=/etc/masterha_default.cnf

    9-10. 관리자 상태 확인

    $ sudo masterha_check_status --conf=/etc/masterha_default.cnf

    10. MySQL 실행 테스트

  • 호스트에 업데이트 클래스 조회를 제출하고 호스트와 보조 장치에 등록되었는지 확인하십시오.
  • 참조계 조회를 호스트에 제출하여 참조할 수 있는지 확인하십시오.
  • 참조계 조회를 종속에 제출하여 참조할 수 있는지 확인하십시오.
  • 업데이트 클래스 조회를 종속에 제출하여 조회가 막혔는지 확인하십시오.
  • 11. 자동 페일오버 테스트


    11-1. Stop MySQL service


    사장님의 MySQL 서비스를 끊겠습니다.
    @MySQL 서버 1$ sudo systemctl stop mysql@ 서버 1 로그 모니터링$ sudo tail -f -n 100 /var/mha/master_manager.log

    11-2. Kill MySQL process


    마스터 MySQL 프로세스를 모두 제거합니다.
    @MySQL 서버 1$ sudo killall -9 mysqld mysqld_safe@ 서버 1 로그 모니터링$ sudo tail -f -n 100 /var/mha/master_manager.log

    11-3. Drop MySQL port


    호스트 MySQL3306 포트를 차단합니다.
    @MySQL 서버 1$ sudo firewall-cmd --remove-port=3306/tcp@ 서버 1 로그 모니터링$ sudo tail -f -n 100 /var/mha/master_manager.log

    11-4. Change MySQL permission to unwritable


    마스터 MySQL 작업 디렉토리에 대한 쓰기 권한을 박탈합니다.
    @MySQL 서버 1$ sudo cd /var/mysql $ sudo chown -R root:mysal ./ $ sudo find ./ -type d | xargs chmod 2750 $ sudo find ./ -type f | xargs chmod 0640@ 서버 1 로그 모니터링$ sudo tail -f -n 100 /var/mha/master_manager.log

    12. 총결산


    이 글에서 우리는 RDB의 자동 고장 전이 군집 시스템을 설계하고 구축하는 예시를 발표했다. 이 시스템은 최소 설정의 MySQL & MHA로 진행된다.
    상기 테스트에서 보듯이 주 고장이 발생하면 자동으로 페일오버가 진행되는 것을 볼 수 있습니다.
    그러나 상기 테스트 외에도 주 고장 원인은 매우 많지만 너무 극단적인 한도값을 설정하면 시계 잠금 시간 대기로 인한 고장 오류 검출로 인해 의외의 고장 전환이 발생할 수 있다.
    RDB시스템은 규모가 클수록'움직인다'는 것이 성립되기 어려운 것이기 때문에 모든 고장 상황을 반복적으로 검증하고 사활적인 감시 모드를 늘리는 것을 권장한다.
    또한 이 사활적인 감시에 관해서는 MHA뿐만 아니라 LVS로부터의 처리도 가능하다.

    좋은 웹페이지 즐겨찾기