MySQL MHA method 추가하기

지난 event 관련 글에서 보았던 것 처럼 MHA 구성 환경에서 failover 발생 시
slave->master db로 승격은 되지만 그에 따라 event의 status는 변경이 되지 않았고 수동으로 상태를 설정해야 합니다.
현재 운영하는 maria db들은 모두 master에서만 event를 수행하고 있기 때문에
MHA failover 발생 시 event status도 enable 시키는 기능이 있으면 좋겠다는 생각에 MHA 스크립트를 수정해보았습니다.
이번 글 내용은 event 자동 enable 설정 관련 내용이지만 아래와 같은 방식으로 원하는 기능을 추가하시면 됩니다.

Failover 발생 시 MHA 작동 순서

  1. MHA Manager 서버의 masterha_manager 가 master db down 감지
    if ( $exit_code && $exit_code != $MHA::ManagerConst::MASTER_DEAD_RC ) {
      exit $exit_code;
    }
  1. 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
  1. master_ip_failover script 수정 (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();

DBHelper.pm 수정

master_ip_failover script 의 connect,set read_only 등 db에 붙어서 수행하는 기능은
DBHelper 클래스의 method 로 구현되어있으므로 DBHelper에 추가하려는 기능을 구현해야함

  • vi /home/masvc01/perl5/lib/perl5/MHA/DBHelper.pm (perl 설치 경로 아래에 있음)
.
.
use constant change_event_enable => "update mysql.event set status= 'enabled' wherestatus='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를 정의함

동작 확인

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.108151:3310) succeeded
.
.

master DB shutdown 후 mha log를 살펴보면

Set event enable on the new master.

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

mysql> select db,name,status from mysql.event;
+------+------------+---------+
| db   | name       | status  |
+------+------------+---------+
| test | test_event | ENABLED |
+------+------------+---------+
1 row in set (0.00 sec)

db에서도 자동으로 enabled 가 되었음을 확인