--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 감지
2) MHA::MasterFailover::main 함수 실행 및 master_ip_failover_script 수행
--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();
## 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 . .
Set event enable on the new master.
위에서 설정한대로 로그가 남고