ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MHA] Mysql MHA 구성 및 설치 DB이중화 테스트
    Database/MHA 2018. 9. 2. 15:33
    반응형


    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


    반응형

    'Database > MHA' 카테고리의 다른 글

    [MHA] Mysql MHA FailOver 확인 및 이후 원복 절차  (0) 2018.09.02
Designed by Tistory.