--1. 개요

지난 event 관련 글에서 보았던 것 처럼 MHA 구성 환경에서 failover 발생 시

slave->master db로 승격은 되지만 그에 따라 event의 status는 변경이 되지 않았고 수동으로 상태를 설정해야 합니다.

현재 운영하는 maria db들은 모두 master에서만 event를 수행하고 있기 때문에

MHA failover 발생 시 event status도 enable 시키는 기능이 있으면 좋겠다는 생각에 MHA 스크립트를 수정해보았습니다.

이번 글 내용은 event 자동 enable 설정 관련 내용이지만 아래와 같은 방식으로 원하는 기능을 추가하시면 됩니다.

 

--2.  Failover 발생 시 MHA 작동 순서

1) MHA Manager 서버의 masterha_manager 가 master db down 감지

if ( $exit_code && $exit_code != $MHA::ManagerConst::MASTER_DEAD_RC ) {
  exit $exit_code;
}
 

2)  MHA::MasterFailover::main 함수 실행 및 master_ip_failover_script 수행

 if ( $dead_master->{master_ip_failover_script} ) {
    my $command =
"$dead_master->{master_ip_failover_script} --orig_master_host=$dead_master->{hostname} --orig_master_ip=$dead_master->{ip} --orig_master_port=$dead_master->{port}";
 
master_ip_failover_script는 mha 설정파일인 mha.cnf에서 지정함.
예시 ) master_ip_failover_script=/engn001/masvc01/mha/mha4mysql-manager-0.57/bin/master_ip_failover
 
 

--3.  master_ip_failover script 수정

vi /engn001/masvc01/mha/mha4mysql-manager-0.57/bin/master_ip_failover  ( mha manager 압축해제, samples 디렉토리에서 제공)

 

eval {

  my $new_master_handler = new MHA::DBHelper();


      # args: hostname, port, user, password, raise_error_or_not

      $new_master_handler->connect( $new_master_ip, $new_master_port,

        $new_master_user, $new_master_password, 1 );


      ## 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();

 

 

스크립트를 대략 살펴보면, 
$new_master_handler 라는 MHA::DBHelper() 객체를 생성하고 
새로운 마스터 DB에 접속한 뒤 , read_only off 설정을 하는 method 등이 실행됨.
아래와 같이 추가하려는 새로운 기능인 change_event() method를 추가
 
  ## Set event enable on the new master    
  print "Set event enable on the new master.\n";     
  $new_master_handler->change_event();

--4. DBHelper.pm 수정

master_ip_failover script 의 connect , set read_only 등의 기능은 모두

DBHelper 클래스의 method 라고 볼 수 있으므로 DBHelper에 추가하려는 기능을 구현해야함.

vi /home/masvc01/perl5/lib/perl5/MHA/DBHelper.pm  (perl 설치 경로 아래에 있음)

 
use constant change_event_enable => "update mysql.event set status= 'enabled' where status='slaveside_disabled'";

.

.

.

sub change_event($) {

  my $self = shift;

  if ( $self->is_read_only() eq "1" ) {

    return 0;

  }

  else {

    return $self->execute(change_event_enable);

  }

}

 

db에서 수행할 쿼리를 담은 change_event_enable 상수를 선언 후

추가하려는 method 인 change_event를 정의함.

is_read_only 함수는 default 로 정의되어 있는 method.

 

--5. 동작 확인

Sun Oct  8 15:35:57 2017 - [info]   /engn001/masvc01/mha/mha4mysql-manager-0.57/bin/master_ip_failover --command=start --ssh_user=masvc01 --orig_master_host=ip-172-31-13-44 --orig_master_ip=52.78.212.75 --orig_master_port=3310 --new_master_host=ip-172-31-8-190 --new_master_ip=52.78.108.151 --new_master_port=3310 --new_master_user='root'   --new_master_password=xxx


Set read_only=0 on the new master.

Set event enable on the new master.

Creating app user on the new master..

Sun Oct  8 15:35:57 2017 - [error][/home/masvc01/perl5/lib/perl5/MHA/MasterFailover.pm, ln1589]  Failed to activate master IP address for ip-172-31-8-190(52.78.108.151:3310) with return code 10:0

Sun Oct  8 15:35:57 2017 - [warning] Proceeding.

Sun Oct  8 15:35:57 2017 - [info] ** Finished master recovery successfully.

Sun Oct  8 15:35:57 2017 - [info] * Phase 3: Master Recovery Phase completed. . . .

----- Failover Report -----


mha: MySQL Master failover ip-172-31-13-44(52.78.212.75:3310) to ip-172-31-8-190(52.78.108.151:3310) succeeded

.

.
 

 

 

 
master DB shutdown 후 mha log를 살펴보면
Set event enable on the new master.

위에서 설정한대로 로그가 남고 

 

mysql> select db,name,status from mysql.event;
+------+------------+---------+
| db   | name       | status  |
+------+------------+---------+
| test | test_event | ENABLED |
+------+------------+---------+
1 row in set (0.00 sec)
 
db에서도 자동으로 enabled 가 되었음을 확인.