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 작동 순서
- MHA Manager 서버의 masterha_manager 가 master db down 감지
if ( $exit_code && $exit_code != $MHA::ManagerConst::MASTER_DEAD_RC ) {
exit $exit_code;
}
- 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
- 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 가 되었음을 확인