环境及软件版本: CentOS6.5x86_64 MySQL5.6.34编译安装版 MHA版本:mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm节点角色: node93:10.1.20.93 默认主库 node94:10.1.20.94 从库1,原先主库宕机后可提升为主库【mha管理节点也部署在这台机器上】 node95:10.1.20.95 从库2,不允许提升为主库 准备的VIP是 10.1.20.100/24
node93的/etc/my.cnf配置文件部分关键地方:[mysqld]port = 3306socket = /tmp/mysql.sockdatadir = /bdata/data/nowdb2innodb_file_per_table=ONcharacter-set-server = utf8default_storage_engine = InnoDBskip-innodb_adaptive_hash_indexmaster_info_repository = TABLErelay_log_info_repository = TABLErelay_log_recovery = 1 #crash safelog-bin=mysql-binbinlog_format=rowsync_binlog =1 #确保事务提交的时候BINLOG落盘log-slave-updateslog_bin_trust_function_creators =1binlog_rows_query_log_events=ON #记录执行的语句到BINLOG query eventserver-id=1020093relay_log_purge=0read_only=1node94的/etc/my.cnf配置文件部分关键地方:[mysqld]port = 3306socket = /tmp/mysql.sockdatadir = /bdata/data/nowdb2innodb_file_per_table=ONcharacter-set-server = utf8default_storage_engine = InnoDBskip-innodb_adaptive_hash_indexmaster_info_repository = TABLErelay_log_info_repository = TABLErelay_log_recovery = 1 #crash safelog-bin=mysql-binbinlog_format=rowsync_binlog =1 #确保事务提交的时候BINLOG落盘log-slave-updateslog_bin_trust_function_creators =1binlog_rows_query_log_events=ON #记录执行的语句到BINLOG query eventserver-id=1020094relay_log_purge=0read_only=1node95的/etc/my.cnf配置文件部分关键地方:[mysqld]port = 3306socket = /tmp/mysql.sockdatadir = /bdata/data/nowdb2innodb_file_per_table=ONcharacter-set-server = utf8default_storage_engine = InnoDBskip-innodb_adaptive_hash_indexmaster_info_repository = TABLErelay_log_info_repository = TABLErelay_log_recovery = 1 #crash safelog-bin=mysql-binbinlog_format=rowsync_binlog =1 #确保事务提交的时候BINLOG落盘log-slave-updateslog_bin_trust_function_creators = 1binlog_rows_query_log_events=ON #记录执行的语句到BINLOG query eventserver-id=1020095relay_log_purge=0read_only=1在node93上创建复制权限的账号,GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.* TO ‘rpl’@’10.1.%.%’ IDENTIFIED BY ‘rpl’;然后配置1主2从,(具体步骤略过)。注意:我们要确保能成为主库的节点(node93、node94)都存在主从同步账号,如果node94上不存在rpl账号,就到node94节点去手工添加即可。主从关系建立好后,我们在master上创建个mha管理账号,后期会用到:grant all on *.* to ‘mhauser’@’10.1.%.%’ identified by ‘Abcd@1234’;(管理账号要在node93、node94、node95所有节点都存在)因为MHA依赖于SSH,因此需要在3台主机之间建立SSH免秘钥登陆。步骤略过。3个节点都安装perl包:yum install perl perl-DBD-MySQL perl-CPAN perl-devel perl-Time-HiResnode93-node95上都安装node包:rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpmnode94上安装Manager包(当然,我们在3个节点都安装上Manager包也没问题):rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm在node94初始化MHAmkdir /etc/masterha/vim /etc/masterha/app1.cnf 内容如下:[server default]user=mhauserpassword=Abcd@1234manager_workdir=/data/masterha/app1manager_log=/data/masterha/app1/manager.logremote_workdir=/data/masterha/app1ssh_user=rootrepl_user=rplrepl_password=rplping_interval=1master_binlog_dir=/bdata/data/nowdb2/ # 这个路径和你的mysql的binlog存放路径要一致master_ip_failover_script=/etc/masterha/master_ip_failoverreport_script=/etc/masterha/send_report#通过第三方机器确认目标主库是否存活,不是必须的,就算没有也是能用#secondary_check_script=masterha_secondary_check -s remote_host1 -s remote_host2#故障发生后关闭主机的脚本,不是必须的,但是你要设置为空# shutdown_script=””#手动在线切换VIP脚本,不是必须的,就算没有开发云主机域名也是能用,#如果你有keepalived这种来做切换VIP就可以直接不用了master_ip_online_change_script==/etc/masterha/master_ip_online_change[server1]hostname=10.1.20.93candidate_master=1[server2]hostname=10.1.20.94candidate_master=1[server3]hostname=10.1.20.95no_master=1 # 禁止在node94上添加脚本/etc/masterha/master_ip_failover (里面填写上相关的VIP的信息)#!/usr/bin/env perluse strict;use warnings FATAL => ‘all’;use Getopt::Long;my ($command, $ssh_user, $orig_master_host, $orig_master_ip,$orig_master_port, $new_master_host, $new_master_ip, $new_master_port,$orig_master_ssh_port, $new_master_ssh_port);my $vip =’10.1.20.100′; # Virtual IP my $devic=’eth0′;my $key = “0”;my$net_mask=’255.255.255.0′;my $ssh_start_vip =”/sbin/ifconfig $devic:$key $vip netmask $net_mask”;my $ssh_stop_vip =”/sbin/ifconfig $devic:$key down”;my$mysql_conf=”/etc/my.cnf”;my $open_readonly=”/bin/sed-i ‘s/.*read_only.*/read_only=1/g’ $mysql_conf “;my $close_readonly=”/bin/sed-i ‘s/.*read_only.*/read_only=0/g’ $mysql_conf “;my $open_relaylog_purge=”/bin/sed-i ‘s/.*relay_log_purge.*/relay_log_purge=0/g’ $mysql_conf “;my$close_relaylog_purge=”/bin/sed -i’s/.*relay_log_purge.*/relay_log_purge=0/g’ $mysql_conf “;GetOptions(‘command=s’ =>$command,‘ssh_user=s’ =>$ssh_user,‘orig_master_host=s’ => $orig_master_host,‘orig_master_ip=s’ =>$orig_master_ip,‘orig_master_port=i’ => $orig_master_port,‘orig_master_ssh_port=i’ => $orig_master_ssh_port,‘new_master_host=s’ => $new_master_host,‘new_master_ip=s’ =>$new_master_ip,‘new_master_port=i’ =>$new_master_port,‘new_master_ssh_port=i’ => $new_master_ssh_port,);exit &main();sub main {print “nnIN SCRIPTTEST====$ssh_stop_vip==$ssh_start_vip===nn”; if ( $command eq “stop” || $command eq “stopssh” ) { # $orig_master_host, $orig_master_ip,$orig_master_port are passed. # If you manage master ip address atglobal catalog database, # invalidate orig_master_ip here. my $exit_code = 1; eval { print “Disabling the VIP onold master: $orig_master_host n”; &stop_vip(); $exit_code = 0; }; if ($@) { warn “Got Error: $@n”; exit $exit_code; } exit $exit_code;}elsif ( $command eq “start” ) { # all arguments are passed. # If you manage master ip address atglobal catalog database, # activate new_master_ip here. # You can also grant write access(create user, set read_only=0, etc) here. my $exit_code = 10; eval { print “Enabling the VIP – $vipon the new master – $new_master_host n”; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code;}elsif ( $command eq “status” ) { print “Checking the Status of thescript.. OK n”; # `ssh $ssh_user@cluster1 “$ssh_start_vip “`; exit 0;}else { &usage(); exit 1;}}# A simple system call that enablethe VIP on the new master sub start_vip() {`ssh $ssh_user@$new_master_host ” $ssh_start_vip “`;print “Disable read_only and relay_log_purge in my.cnf – on the new master – $new_master_hostn”;`ssh $ssh_user@$new_master_host ” $close_readonly “`;`ssh $ssh_user@$new_master_host ” $close_relaylog_purge “`;}# A simple system call thatdisable the VIP on the old_mastersub stop_vip() {`ssh $ssh_user@$orig_master_host ” $ssh_stop_vip “`;print “Enable read_only and relay_log_purge in my.cnf – on the orig master – $orig_master_hostn”;`ssh $ssh_user@$orig_master_host ” $open_readonly “`;`ssh $ssh_user@$orig_master_host ” $open_relaylog_purge “`;}sub usage {print“Usage: master_ip_failover –command=start|stop|stopssh|status–orig_master_host=host –orig_master_ip=ip –orig_master_port=port–new_master_host=host –new_master_ip=ip –new_master_port=port–orig_master_ssh_port=ssh_port –new_master_ssh_port = ssh_portn”;}在node94上添加脚本/etc/masterha/send_report(里面填写上相关的smtp账号的信息):#!/usr/bin/perl#Copyright (C) 2011 DeNA Co.,Ltd.##This program is free software; you can redistribute it and/or modify#it under the terms of the GNU General Public License as published by#the Free Software Foundation; either version 2 of the License, or#(at your option) any later version.##This program is distributed in the hope that it will be useful,#but WITHOUT ANY WARRANTY; without even the implied warranty of#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the#GNU General Public License for more details.##You should have received a copy of the GNU General Public License#along with this program; if not, write to the Free Software#Foundation, Inc.,#51 Franklin Street, Fifth Floor, Boston, MA 02110-1301USA## Note: This is a sample scriptand is not complete. Modify the script based on your environment.use strict;use warnings FATAL => ‘all’;use Mail::Sender;use Getopt::Long;#new_master_host and new_slave_hostsare set only when recovering master succeededmy ( $dead_master_host,$new_master_host, $new_slave_hosts, $subject, $body ,$conf);my$smtp=’smtp.exmail.qq.com’;my$mail_from=’zabbix@xxxx.com’;my$mail_user=’zabbix@xxxx.com’;my $mail_pass=’xxxxxxx’;my$mail_to=[‘lixxxx@xxxx.com’];GetOptions(‘orig_master_host=s’ => $dead_master_host,‘new_master_host=s’ =>$new_master_host,‘new_slave_hosts=s’ =>$new_slave_hosts,‘subject=s’ =>$subject,‘body=s’ => $body,‘conf=s’ => $conf,);mailToContacts($smtp,$mail_from,$mail_user,$mail_pass,$mail_to,$subject,$body);check_if_sendmail_ok(‘/tmp/monitormail.log’);sub mailToContacts {my ( $smtp, $mail_from, $user, $passwd, $mail_to, $subject, $msg ) = @_;open my $DEBUG, “> /tmp/monitormail.log” or die “Can’t open the debug file:$!n”;my $sender = new Mail::Sender { ctype => ‘text/plain; charset=utf-8’, encoding => ‘utf-8’, smtp => $smtp, from => $mail_from, auth => ‘LOGIN’, TLS_allowed => ‘0’, authid => $user, authpwd => $passwd, to => $mail_to, subject => $subject, debug => $DEBUG};$sender->MailMsg( {msg => $msg, debug => $DEBUG }) or print $Mail::Sender::Error;return 1;}sub check_if_sendmail_ok{ #>>250 2.0.0 Ok: queued as 3532C6DA009D # #>>221 2.0.0 Bye my$logf = shift; openRLOG, $logf or die “cannot open file $logf.n”; my@log =
检查下当前主从的配置: node94另外开一个xshell窗口,可以执行 masterha_check_repl–conf=/etc/masterha/app1.cnf 可以看出主节点、从节点的发生了变化:
查看是否masterha启动: 另外开一个xshell窗口,可以执行 masterha_check_status–conf=/etc/masterha/app1.cnf
如果需要停止masterha的话,不要用stop或者kill,要用下面的命令: masterha_stop–conf=/etc/masterha/app1.cnf
手动切换主从的方法: masterha_master_switch-h 查看帮助信息 masterha_master_switch–conf=/etc/masterha/app1.cnf –master_state=alive –new_master_host=10.1.20.93–new_master_port=3306 –orig_master_is_new_slave –running_updates_limit=10000
手工切换的时候需要注意2点:1、执行手工切换的时候,需要先关掉老的master和即将提升为master的主机的 event scheduler,否则无法切换(set global event_scheduler = OFF;)2、执行手工切换的时候,需要先关闭MHA的监控 masterha_stop–conf=/etc/masterha/app1.cnf )3、执行手工切换脚本的时候,它会自动在原先的master上执行FLUSH TABLES WITH READ LOCK; 等切换完成后,再UNLOCK TABLES释放掉这个原有master的锁。 发送邮件的脚本,需要先安装插件: yuminstall perl-Mail-Sender 发送失败的话,可以查看/tmp/monitormail.log 找找失败的原因。
MHA异常的话: 可以查看日志路径:/data/masterha/app1/
masterha_manager 还有几个比较有用的启动参数: –remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。 –manger_log 日志存放位置,想规范化管理日志可以加上 –ignore_last_failover 该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。【如果我们需要强制切换的话,需要先移除这个文件app1.failover.complete】
相关推荐: 面试题总结:可能是全网最好的MySQL重要知识点
作者:Snailclimb整理编辑:SegmentFault本文原载于SegmentFault专栏JavaGuide,如侵删。标题有点标题党的意思,但希望你在看了文章之后不会有这个想法——这篇文章是作者对之前总结的 MySQL 知识点做了完善后的产物,可以用来…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。