티스토리 뷰


MHA 개념


MHA란?

Master DB 장애로 서비스가 불가능한 상태가 되면, 자동으로 failover 수행하여 slave DB master DB 승격시켜 비스 다운타임을 최소화 auto failover 솔루션입니다.


MHA 서버 구성

MHA Manager, Masrer, Slave 서버 총 3개가 기본 구성이며 상황에 따라서는 1개의 Master와 N개의 Salve 최소 2대 까지 사용할 수 있습니다. (Activity, Standby 구조)

    Master와 Slave에서는 하나의 VIP를 공유하며 DB접속은 해당 VIP를 이용하며 장애발생시 VIP를 이용하여 절제를 진행합니다.

-해당 포스트에서는 2대의 서버 구성을 가지고 테스트합니다. (2대로 구성시 MHA Manager는 Slave장비에 설치)


MHA 의 장점

1. 최소한의 Down Time으로 Master의 장애 처리 및 Slave의 새로운 Master로 변경 수행 가능

2. Master의 장애로 각 노드(Master 및 Slave)의 데이터 불일치가 발생하지 않음

3. 현재 MySQL 서버의 설정을 변경 할 필요가 없음 (MySQL 5.0이상)

4. 서버를 많이 늘릴 필요가 없음 (MySQL Cluster 대비)

5. 스토리지 엔진에 제약을 받지 않음

6. MySQL 성능에 전혀 제약 사항이 없음


MHA의 장애 체크

MHA Manager가 3초마다 마스터 DB를 CONNECT / SELECET / INSERT 체크하며 3회 실패시 장애로 인식하고 Failover를 수행합니다


MHA 의 Replication

1. Mysql에서는 Lossless Replication은 지원 하는데 이는 Master에서 데이터 변경이 되면 Slave 어딘가에 반드시 변경이력(relay log)이 남아있다는 것을 보장 합니다.

2. MHA에서는 장애 발생시 가장 최근에 변경된 Slave를 Master DB로 승격 시킨 후 Lossless Replication 를 통한 relay log로 데이터 복구를 수행합니다.

3. 장애 발생부터 Master DB 승격, 데이터 복구 까지 걸리는 시간은 통상 10~30초 입니다.


   MHA 의 FailOver

    Master DB에 장애가 발생하면 MHA Manager는 Master장비의 VIP를 down시킵니다. 

    이후 Replication을 진행 후 down 시킨 VIP를 Slave장비에서 올려 FailOver를 진행합니다.



MHA 설치



1. MHA설치 - 의존성 패키지 설치


Master 장비

         명령어

         yum -y install perl-CPAN perl-DBD-MySQL perl-Module-Install


Slave 장비

         명령어

         yum -y install perl-CPAN perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-      ForkManager perl-Module-Install



2. MHA설치 - 소스코드 컴파일


Master 장비

         명령어

         tar xvzf mha4mysql-node-0.57.tar

         cd mha4mysql-node-0.57.tar

         perl Makefile.PL 

         make

         make install


Slave 장비

         명령어 

       tar xvzf mha4mysql-node-0.57.tar

       cd mha4mysql-node-0.57.tar

       perl Makefile.PL 

       make

       make install

       tar xvzf mha4mysql-manager-0.57.tar

       cd mha4mysql-manager-0.57.tar

       perl Makefile.PL

       make

       make install



3. MHA설치 - MHA 접속계정 생성


Master 장비

         명령어

         GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%' IDENTIFIED BY 'mha123';

         FLUSH PRIVILEGES;


Slave 장비

         명령어

         GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%' IDENTIFIED BY 'mha123';

         FLUSH PRIVILEGES;



4. MHA설치 - 설정파일 생성


Slave 장비

         vim /etc/masterha-default.cnf

         [server default]


          user=mha

          password=mha123

      

          manager_workdir=/install/log/masterha

          manager_log=/install/log/masterha/MHA.log

          remote_workdir=/install/log/masterha

          master_ip_failover_script=/mha4mysql-manager-0.57/samples/scripts/master_ip_failover

          master_ip_online_change_script=/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change


          [server1]

          hostname=192.xxx.xxx.xxx  (Master Host)

          master_binlog_dir=/install/data/mysql_binlog (Master binlog가 저장되는 경로)

          candidate_master=1


          [server2]

          hostname=192.yyy.yyy.yyy (Slave Host)

          master_binlog_dir=/install/data/mysql_binlog (Slave binlog가 저장되는 경로)

          candidate_master=1


         ※[server1], [server2] 의 IP는 Master장비와 Slave장비의 ssh 접속용 IP로 작성


5. MHA설치 - Failover 및 원복 스크립트 적용


Slave 장비

         vim mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh

         ifup eth1

         ssh root@192.xxx.xxx.xxx /sbin/ifconfig eth1 down (Master DB의 접속 IP)

Master FailoverMasterDatabase 접속 IP를 내리고 Slave Database 접속 IP를 올리는 스크립트 


         vim /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh

         ifdown eth1

         ssh root@192.yyy.yyy.yyy /sbin/ifup eth1

※Slave -> Master DB로 복구 할때 Slave Database 접속 IP를 내리고 Master Database IP를 올리는 스크립트


         vim /mha4mysql-manager-0.57/samples/scripts/master_ip_failover

         ## Set read_only=0 on the new master

         $new_master_handler->disable_log_bin_local();

         print "Set read_only=0 on the new master.\n";

         $new_master_handler->disable_read_only();


         ## Creating an app user on the new master

         ## print "Creating app user on the new master..\n";

         ##FIXME_xxx_create_user( $new_master_handler->{dbh} );

         ##$new_master_handler->enable_log_bin_local();

         ##$new_master_handler->disconnect();   


         ## Update master ip on the catalog database, etc

         ##FIXME_xxx;

         #VIP migration

         if($new_master_ip eq "192.xxx.xxx.xxx"){

          system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh");

           }  

         elsif($new_master_ip eq "192.yyy.yyy.yyy"){      

          system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh");

          }

          $exit_code = 0;

          };


     ※ Master 장애발생시 MHA Manager에서 해당 스크립트를 실행 할 수 있도록 해당 스크립트 부분을 다음과 같이 수정

       ※192.xxx.xxx.xxx -> Master Database 접속 IP 192.yyy.yyy.yyy -> Slave Databases 접속 IP


          vim /mha4mysql-manager-0.57/samples/scripts/master_ip_online_change

         ##FIXME_xxx_drop_app_user($orig_master_handler); 

         ...

         ...

         ## Creating an app user on the new master

         ## print current_time_us() . " Creating app user on the new master..\n";

         ##FIXME_xxx_create_app_user($new_master_handler);

         ##$new_master_handler->enable_log_bin_local();

         ##$new_master_handler->disconnect();


         ## Update master ip on the catalog database, etc

         if($new_master_ip eq "192.xxx.xxx.xxx"){

          system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh");

          }

         elsif($new_master_ip eq "192.yyy.yyy.yyy"){

          system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh");

          }

        ※ Slave 서비스 중 Master로 Databases로 원복을 할 수 있도록 스크립트 작성

       ※192.xxx.xxx.xxx -> Master Database 접속 IP 192.yyy.yyy.yyy -> Slave Databases 접속 IP



6. MHA설치 - 심볼릭 링크 생성


Slave 장비

         명령어

         ln -s /install/software/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqlbinlog /usr/bin/mysqlbinlog

       ※ln -s 설치되어있는 mysqlbinlog 위치 /usr/bin/mysqlbinlog



7. MHA설치 - SSH 접속 설정

   

    Master 장비

         명령어

         ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""

         ssh-keygen -t rsa

           ls -al ~/.ssh/     <-키가 정상적으로 생성되었는지 확인
          chmod 700 ~/.ssh 
          chmod 600 ~/.ssh/id_rsa
          chmod 644 ~/.ssh/id_rsa.pub
          chmod 600 ~/.ssh/id_dsa
          chmod 644 ~/.ssh/id_dsa.pub 
          chmod 644 ~/.ssh/authorized_keys
          chmod 644 ~/.ssh/known_hosts
          scp $HOME/.ssh/id_rsa.pub root@192.hhh.hhh.hhh:id_rsa.pub  <- Slave 장비에 Master IP 접속 키 전송

       ※192.hhh.hhh.hhh는 Slave장비 Database 접속 ip가 아닌 ssh 접속 용 ip로 설정


    Slave 장비

         명령어

         ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""

         ssh-keygen -t rsa

           ls -al ~/.ssh/     <-키가 정상적으로 생성되었는지 확인
          chmod 700 ~/.ssh 
          chmod 600 ~/.ssh/id_rsa
          chmod 644 ~/.ssh/id_rsa.pub
          chmod 600 ~/.ssh/id_dsa
          chmod 644 ~/.ssh/id_dsa.pub 
          chmod 644 ~/.ssh/authorized_keys
          chmod 644 ~/.ssh/known_hosts
          scp $HOME/.ssh/id_rsa.pub root@192.zzz.zzz.zzz:id_rsa.pub  <- Master장비에 Master IP 접속 키 전송

       ※192.zzz.zzz.zzz는 Master장비 Database 접속 ip가 아닌 ssh 접속 용 ip로 설정


    Master 장비

         명령어

         cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys

         cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys

       ※Slave장비에서 전송한 Key를 Master 장비 Key에 저장


    Slave장비

         명령어

         cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys

         cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys

       ※Master장비에서 전송한 Key를 Slave 장비 Key에 저장


    Slave장비 - ssh접속 Test

         명령어

         masterha_check_ssh --conf=/etc/masterha-default.cnf


 

       ※ 다음과 같은 화면이 나온다면 ssh 설정 완료


  8. MHA설치 - Master/Slave my.cnf 수정

   

   Master 장비

         /etc/my.cnf

        [client]

        port=3306

         socket=/install/data/mysql/mysqld.sock


         [mysql]

         default-character-set=utf8

         no-auto-rehash


         [mysqld]

         basedir=/install/software/mysql-5.7.19-linux-glibc2.12-x86_64

         binlog_format=STATEMENT

         character-set-server=utf8

         collation-server=utf8_general_ci

         datadir=/install/data/mysql

         default-storage-engine=InnoDB

         event-scheduler=OFF

         expire_logs_days=3

         innodb_data_home_dir=/install/data/mysql

         innodb_log_group_home_dir=/install/data/mysql

         log-bin=/install/data/mysql_binlog/mysql-bin

         log-error=/install/log/mysql/error.log

         log-slave-updates

         long_query_time=3

         max_allowed_packet=16M

         max_connections=1024

         pid-file=/install/data/mysql/mysqld.pid

         port=3306

         relay-log-purge=1

         relay-log=/install/data/mysql_binlog/mysql-relay-bin

         server-id=1

         skip-external-locking

         skip-name-resolve

         slow_query_log=1

         slow_query_log_file=/install/log/mysql/slow.log

         socket=/install/data/mysql/mysqld.sock

         tmpdir=/install/data/mysql_tmp



    Slave장비

         /etc/my.cnf

         [client]

          port=3306

          socket=/install/data/mysql/mysqld.sock


          [mysql]

          default-character-set=utf8

          no-auto-rehash


          [mysqld]

          basedir=/install/software/mysql-5.7.19-linux-glibc2.12-x86_64

          binlog_format=STATEMENT

          character-set-server=utf8

          collation-server=utf8_general_ci

          datadir=/install/data/mysql

          default-storage-engine=InnoDB

          event-scheduler=OFF

          expire_logs_days=3

          innodb_data_home_dir=/install/data/mysql

          innodb_log_group_home_dir=/install/data/mysql

          log-bin=/install/data/mysql_binlog/mysql-bin

          log-error=/install/log/mysql/error.log

          log-slave-updates

          long_query_time=3

          max_allowed_packet=16M

          max_connections=1024

          pid-file=/install/data/mysql/mysqld.pid

          port=3306

          read_only=1

          relay-log-purge=1

          relay-log=/install/data/mysql_binlog/mysql-relay-bin

          server-id=2

          skip-external-locking

          slow_query_log=1

          skip-name-resolve

          slow_query_log_file=/install/log/mysql/slow.log

          socket=/install/data/mysql/mysqld.sock

          tmpdir=/install/data/mysql_tmp


       ※해당 설정에서 중요한 것은 Master DB의 Server-id=1 Slave DB의 Server-id=2 그리고 Slave 장비의 read_only=1 설정이다.


  9. MHA설치 - Master/Slave Replication 구성

   

    Master 장비

         mysql -uroot -pxxxx (db접속)

         show master status\G;


        


    Slave 장비

         mysql -uroot -pxxxx (db접속)

         CHANGE MASTER TO MASTER_HOST='192.168.0.13', (Master로 지정할 Host - ssh접속용 IP)

          MASTER_PORT=3306, 

          MASTER_LOG_FILE='mysql-bin.000034', (1번장비서 확인한 binlog File명)

          MASTER_LOG_POS=5703562, (1번장비에서 확인한 Position Number)

          MASTER_USER='mha', 

          MASTER_PASSWORD='mha123';


           start slave;

           Show slave status\g;


        

       ※Watinf for master to send event 가 나오면 정상적으로 Slave상태가 된 것 



  10. MHA설치 - replication 체크

    

    Slave 장비

         명령어

         masterha_check_repl --conf=/etc/masterha-default.cnf

     

        

       ※해당 로그가 나온다면 Replication Test 성공


  11. MHA설치 - MHA 구동

    Slave 장비

         명령어

         nohup masterha_manager --conf=/etc/masterha-default.conf &

     

     

       ※해당 로그가 나온다면 MHA가 정상적으로 구동 된 것이다.


        TIP : MHA Manager에서는 정상 구동중에는 masterha-default.master_status.health 파일을 남겨 둔다. 

         만약 Slave 장비가 Master로 승격되고 남은 Slave 장비가 없을 때 masterha-default.master_status.health 파일은 

         health.complete 파일로 바뀌게 되며 해당 파일을 이용하여 장애 알람 및 MHA Manager 상태 알람을 등록할 수 있다.



MHA FailOver 확인 및 이후 원복 절차

http://khj93.tistory.com/entry/MHA-mysql-MHA-FailOver-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%9D%B4%ED%9B%84-%EC%9B%90%EB%B3%B5-%EC%A0%88%EC%B0%A8


댓글
  • 프로필사진 낭랑24세 master_ip_failover_script=/mh는 경로) <<이 부분이 잘못된것 같아요 ㅠ 2019.03.07 15:43 신고
  • 프로필사진 사용자 히진 감사합니다~ 수정완료했습니다~ 2019.03.07 15:47 신고
  • 프로필사진 낭랑24세 원래 심볼릭 링크 생성할 때 ln -s (원본 파일이나 폴더 경로) (심볼릭 링크가 저장될 경로)인데 ln -s /install/software/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqlbinlog /usr/bin/mysqlbinlog 이부분에서는 어느부분이 원본 파일이고 어느 부분이 심볼릭 링크인지 잘모르겠어요 ㅠ 그리고 /install/software/mysql-5.7.19-linux-glibc2.12-x86는 다른 곳에서 다운받아야 하는 건가요? 질문 많아서 죄송합니다 ㅠ
    2019.03.08 13:00 신고
  • 프로필사진 사용자 히진 (원본 파일이나 폴더 경로) = /install/software/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqlbinlog
    (심볼릭 링크가 저장될 경로) = /usr/bin/mysqlbinlog

    mysql-5.7.19-linux-glibc2.12-x86는 다른곳에서 받으셔도되고 필요하시면 메일주소 주시면 보내드리겠습니다.
    2019.03.08 13:02 신고
  • 프로필사진 낭랑24세 아 xotmfrlox@naver.com 입니다 감사합니다!! 2019.03.08 13:03 신고
  • 프로필사진 사용자 히진 메일보내드렸습니다~ 2019.03.08 13:16 신고
  • 프로필사진 낭랑24세 고맙습니당~~ 2019.03.08 13:17 신고
  • 프로필사진 낭랑24세 저 궁금한게.. DB접속 IP와 SSH 접속 IP는 다른건가요? 그리고 /install/data/라는 폴더는 수동으로 만들어지는지.. 어떤 특정한 쉘 스크립트를 실행하면 만들어지는지 궁금합니다.. 고맙습니다 ㅠ 2019.03.11 11:36 신고
  • 프로필사진 사용자 히진 /install/data/ 는 직접 만든 디렉토리입니다~
    DP 접속 IP와 SSH 접속 IP는 다릅니다. ssh 접속 IP는 Manager 에서 Master/Slave를 컨트롤 할 때 사용합니다~ DP 접속 IP는 VIP로 설정하여 사용도 가능합니다~
    2019.03.11 13:07 신고
  • 프로필사진 안녕하세요 안녕하세요. mariadb 이중화 작업을 하고 있는 학생입니다. 심볼릭 링크 부분이 잘 이해가 안가서 여쭤봅니다. 지금 현재 /usr/bin/mysqlbinlog는 있지만 다른 어디에도 mysqlbinlog는 있지 않은 상태입니다. 이럴 경우 심볼릭 링크를 어떻게 설정해야 하나요?ㅠㅠ mariadb를 쓰는데 윗 분처럼 mysql-5.7.19-linux-glibc2.12-x86_64을 따로 다운을 받아서 진행하면 되는건가요? 2019.12.18 11:45
  • 프로필사진 문서잘보고있습니다 안녕하세요 디비 이중화 작업 중입니다. 심볼릭 링크 부분에 대해 문의 드립니다. mysql-5.7.19-linux-glibc2.12-x86_64 을 따로 다운받으려고 하는데 마땅한 방법을 찾지 못했습니다. 제 mysql 버전은 8.0.22입니다. 심볼링 링크를 꼭 mysql-5.7.19-linux-glibc2.12-x86_64 경로로 해야하는 이유가 있을까요? 만약 꼭 해당 경로를 사용해야 한다면 리눅스 내에서 cmd 설치 가능한 방법 안내 가능하신지요 2020.12.11 17:47
댓글쓰기 폼