MHA官方文档翻译
2017-12-06 13:17
344 查看
英文官方文档
http://code.google.com/p/mysql-master-ha/wiki/TableOfContents?tm=6
转载请注明出处
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。
MHA提供了上述功能,使得其在适用于对高可用性,数据完整性要求高的场合,还有要求几乎non-stop的主库维护。
[b]◎自动故障检测和自动故障转移[/b]
MHA能够在一个已经存在的复制环境中监控MySQL,当检测到Master故障后能够实现自动故障转移,通过鉴定出最“新”的Salve的relaylog,并将其应用到所有的Slave,这样MHA就能够保证各个slave之间的数据一致性,即使有些slave在主库崩溃时还没有收到最新的relaylog事件。通常情况下MHA能够达到如下指标:9-12秒检测到主库故障,7-10秒关闭master所在的mysqld服务以防止故障扩散,并在几秒内实现各个slave上的relaylog重放到新的master。总共的downtime通常控制在10-30秒内。一个slave节点能否成为候选的主节点可通过在配置文件中配置它的优先级。由于master能够保证各个slave之间的数据一致性,所以所有的slave节点都有希望成为主节点。在通常的replication环境中由于复制中断而极容易产生的数据一致性问题,在MHA中将不会发生。
[b]◎交互式(手动)故障转移[/b]
MHA可以被定义成手动地实现故障转移,而不必去理会master的状态,即不监控master状态,确认故障发生后可通过MHA手动切换。
[b]◎非交互式的故障转移[/b]
即不监控Master状态,但是发生故障后可通过MHA实现自动转移。
[b]◎在线切换Master到不同的主机[/b]
通常当RAID控制器或者RAM损坏,或者需要将现有的master服务器进行升级的时候,我们就需要切换当前的master到其他的主机中。这并不是主库崩溃,但是却需要我们手动切换。这通常是越快越好,因为这段时间内主库是写禁止的。所以,你还需要阻塞或删除正在进行的会话,因为不禁止写就会导致数据一致性问题。举个例子,updatingmaster1,updatingmaster2,committingmaster1,gettingerroroncommittingmaster2就会导致数据一致性问题。所以说,快速的切换和优美平滑的阻塞写都是需要的。
MHA能够在0.5-2秒内实现切换,0.5-2秒的写阻塞通常是可接受的,所以你甚至能在非维护期间就在线切换master。诸如升级到高版本,升级到更快的服务器之类的工作,将会变得更容易。
关于MHA如何修复一致性问题,详细请查看如下链接地址,这里我不做详细研究
http://www.slideshare.net/matsunobu/automated-master-failover
其他帮助脚本:提供手工故障转移,在线master切换,con检查等功能
Apply_diff_relay_logs:从数据最新的slave上产生不同的relaylog,并且将其应用到不同的binlogevents中
Purge_relay_log:清除relaylog
MHAmanager节点上运行着这些程序:监控mysql状态,master故障转移等。
MHAnode节点上有实现自动故障转移的helper脚本,比如分析mysqlbinary/relaylog,认出哪一个relaylog应该应用到其他的slave,并识别出这个relaylog的位置,并将events应用到目标slave上等。Node节点应该运行在每一个mysqlserver上。
如果MHAManager挂掉了,MHA会尝试通过SSH连接到node节点并执行node节点的命令
1Masterfailoverandslavepromotioncanbedoneveryquickly
自动故障转移快
2Mastercrashdoesnotresultindatainconsistency
主库崩溃不存在数据一致性问题
3NoneedtomodifycurrentMySQLsettings(MHAworkswithregularMySQL(5.0orlater))
不需要对当前mysql环境做重大修改
4Noneedtoincreaselotsofservers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)
5Noperformancepenalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。
6Workswithanystorageengine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb
一主多从,这是最普遍的情况。
一主多从,将其中一个从配置成远程数据中心,其永远不会成为master
一主多从,并只配置一个候选主节点
通用的方法就是创建一个全局的目录库,在库中存放着所有应用和IP地址之间的映射关系,用以取代VIP。在这种方案下,如果master崩溃,那么你就需要修改这个目录库。
两种方案都各有优缺点,MHA不会强制使用哪一种。MHA可以调用其他的脚本来禁用\激活writeip地址,通过设置master_ip_failover_script脚本的参数,该脚本可在manager节点中找到。你可以在该脚本中更新目录库,或者实现VIP漂移等任何你想干的事。你同样可以借用现有的HA方案的软件实现IP故障转移,比如Pacemaker,在这种情况下MHA将不会做IP故障转移。
使用半同步复制可以极大地减少这种丢失数据的风险。由于它也是基于mysql的复制机制,所以MHA能够配合半同步复制一起使用。值得一提的是,只要有一台slave收到最新的binlogevents,则MHA就会将它应用到所有的slave,从而保证了数据的一致性。
MHANodepackage
DBD::mysql
Config::Tiny
Log::Dispatch
Parallel::ForkManager
Time::HiRes(includedfromPerlv5.7.3)
注意到host1是当前的master,MHA会自动检测到它。
如果有报错,则表示SSH配置有问题,影响MHA工作。你需要修复它并重试,通常的错误都是SSHpublickey认证没有正确配置。
masterha_check_repl脚本检测复制是否正确配置。
如果有报错,可通过查看日志修复它。当前的master一定不能是slave,其他所有的slave必须正确从master中复制。常见的错误可参考TypicalErrors页。
masterha_manager命令开启
如果所有的配置都正确,masterha_manager会检查mastermaster是否可用直到master崩溃。如果在监控master之前masterha_manager报错,你可以检查下logs并修改配置。所有的日志都会以标准错误的方式打印出来,也可以在manager配置文件中指定错误日志位置。典型的错误有复制配置问题,ssh无访问relaylog的权限问题。默认情况下masterha_manager不是运行在后台,按下crtl+c键就会终止masterha_manager。
masterha_check_status命令检查manager的状态,以下是范例
app1是MHA内部的应用名称,该名称可在manager配置文件中指定,如果manager终止或者配置得有错误,将会显示以下信息
masterha_stop命令来停止manager
如果无法停止,尝试加--abort参数,知道了怎么停止,下面我们重新开启manager。
这时候检查manager的log日志,看看host2是否成功成为新的master,并且host3从host2中复制。
当完成一次正常的故障转移后,manager进程将会终止。如果你需要将manager进程运行在后台,可运行如下指令,或者通过安装daemontools来实现(这里略)
Parameters页。
下面是一个配置文件的设置范例
manager_host$cat/etc/app1.cnf
[serverdefault]
#mysqluserandpassword
user=root
password=mysqlpass
#workingdirectoryonthemanager
manager_workdir=/var/log/masterha/app1
#managerlogfile
manager_log=/var/log/masterha/app1/app1.log
#workingdirectoryonMySQLservers
remote_workdir=/var/log/masterha/app1
[server1]
hostname=host1
[server2]
hostname=host2
[server3]
hostname=host3
所有的参数设置必须是"param=value"格式,打个比方,以下设置时错误的。
[server1]
hostname=host1
#incorrect:mustbe"no_master=1"
no_master
Application-scope参数必须写在[serverdefault]块下,而在[serverN]块下,你需要设置的是local-scope参数,比如hostname是一个local-scope参数,所以必须写在这个块下面。块名称必须是字母”server”开头。
你可以在全局配置文件中设置applicationscope参数,例如,如果所有的mysql服务器的管理账户和密码都是一样的,你就可以在这里设置user和password
以下是全局配置文件范例
Globalconfigurationfile(/etc/masterha_default.cnf)
[serverdefault]
user=root
password=rootpass
ssh_user=root
master_binlog_dir=/var/lib/mysql
remote_workdir=/data/log/masterha
secondary_check_script=masterha_secondary_check-sremote_host1-sremote_host2
ping_interval=3
master_ip_failover_script=/script/masterha/master_ip_failover
shutdown_script=/script/masterha/power_manager
report_script=/script/masterha/send_master_failover_mail
以上这些参数可适用于所有的applications。
Application配置文件应该被单独配置,以下是app1(host1-4)和app2(host11-14)的范例
app1:
manager_host$cat/etc/app1.cnf
[serverdefault]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/app1.log
[server1]
hostname=host1
candidate_master=1
[server2]
hostname=host2
candidate_master=1
[server3]
hostname=host3
[server4]
hostname=host4
no_master=1
app2:
manager_host$cat/etc/app2.cnf
[serverdefault]
manager_workdir=/var/log/masterha/app2
manager_log=/var/log/masterha/app2/app2.log
[server1]
hostname=host11
candidate_master=1
[server2]
hostname=host12
candidate_master=1
[server3]
hostname=host13
[server4]
hostname=host14
no_master=1
2SSHpublickey认证
3仅支持Liunx操作系统
4只有一台master能被设置成readonly=0,其他设置为只读
5如果是Master1->Master2->Slave3这样的三级复制框架,在配置文件中只需要设置master1和master2这样的二级复制结构,并设置multi_tier_slave=1来支持三级复制结构。
6MHA仅支持mysql5.0及以后的版本
7mysqlbinlog必须是3.3及以上版本
8log-bin必须在每一个可称为master的mysql服务器上设置
9所有mysql服务器的复制过滤规则必须一致
10必须在能成为master的服务器上设置复制账户
11所有Mysql服务器上必须设置relay_log_purge=1,使得能够保存一段时间的relaylog
12基于语句的复制时,不要使用loaddatainfile命令
Verifyingreplicationsettingsandidentifyingthecurrentmaster
核实复制配置并识别出当前的master
Monitoringthemasterserver
Detectingthemasterserverfailure
Verifyingslaveconfigurationsagain
Shuttingdownfailedmasterserver(optional)
Recoveringanewmaster
Activatingthenewmaster
Recoveringtherestslaves
Notifications(optional)
监控masterserver直到master崩溃,在这一步时manager不再监控slave的状态。所以如果需要添加或删除slave节点,最好重新修改manager配置文件并重启MHA
检测到master故障
重新扫描配置文件,各种重连,核实master确实已经崩溃。如果最近一次的报错和现在一样并且时间相隔非常之短,MHA将会停止继续报错并进入下一步
关闭崩溃的主机(可选),防止错误继续扩散
重新选举出一个新的master。如果崩溃的主机能够通过SSH连接,则复制崩溃主机的binlog到最新的slave上,并指向他的end_log_pos。在选择新的master上遵守manager上的配置文件,如果某个slave能成为master,则设置candidate_master=1。如果某个slave永远不能成为master,则设置no_master=1。识别出最新的slave并将其选举为新的master,最新的slave即接受到最新的relaylog的那台slave。
激活新的master
重新设置其余的slave使其指向新选举出来的master
发送通告(可选),比如发送邮件,禁用新master上backup工作等,可通过report_script脚本设置
Verifyingreplicationsettingsandidentifyingthecurrentmaster
Identifyingthenewmater
Rejectingwritesonthecurrentmaster
Waitingforallslavestocatchupreplication
Grantingwritesonthenewmaster
Switchingreplicationonalltherestslaves
核实复制配置并识别出当前的master,这个过程还会检测以下几个条件是否满足:
Slave上的IO线程isrunning
Salve上的SQL线程isrunning
Slave上所有的复制延迟少于2s
在master上的update操作没有超过2秒的
识别出新的master
在当前master上执行FLUSHTABLESWITHREADLOCK阻塞写操作防止数据一致性问题
等待所有的slave的复制跟上master
在新的master上执行SHOWMASTERSTATUS,记录下binlog文件名称和pos,并执行SETGLOBALread_only=0授权其写操作
在其他salve上并行执行CHANGEMASTER,STARTSLAVE,指向新的master,并startslave
LocalScope:Per-serverscopeparameters.Localscopeparametersshouldbesetunder[server_xxx]blockswithinapplicationconfigurationfile.
AppScope:Parametersforeach{master,slaves}pair.Theseparametersshouldbesetundera[server_default]blockwithinapplicationconfigurationfile.
GlobalScope:Parametersforall{master,slaves}pairs.Globalscopeparametersareusefulonlywhenyoumanagemultiple{master,slaves}pairsfromsinglemanagerserver.Theseparametersshouldbesetinaglobalconfigurationfile.
applicationconfigurationfile.
MySQL服务器的主机名称或IP地址,写在[server_xxx]下,xxx相当于各个mysql服务器。
通常不需要配置
Mysql服务的端口号,默认3306.
如果手动故障切换时,MHA则忽略参数设置,而直接输出到STDOUT/STDERR。
FullpathfilenamethatMHAManagergenerateslogs.Ifnotset,MHAManagerprintstoSTDOUT/STDERR.Whenexecutingmanualfailover(interactivefailover),MHAManagerignoresmanager_logsettingandalwaysprintstoSTDOUT/STDERR.
若设置该参数为0,MHA在选择新的Master时,会忽略复制延迟。当某个mysql设置candidate_master=1时,再将check_repl_delay设置为0就很有必要,确保它能成为新的master
masterha_secondary_check脚本在manager节点上,通常情况下能够运行良好。
在这个范例中,MHA通过Manager-(A)->remote_host1-(B)->master_host
和Manager-(A)->remote_host2-(B)->master_host来检测master状态。如果在上述两步中都是A连接成功而B连接不成功,则MHA能够判断是master确实已经死亡并返回0,进行故障切换。如果A连接不成功,该脚本会返回2,MHA认为可能是自身的网络问题而不进行故障转移。如果此时B连接成功,则实际上master是存活的。通俗地说,remote_host1和remote_host2应该被设置在不同的网段上。
该脚本在通用场合中都适用,当然你也可以自己写脚本来实现更多的功能。下面是该脚本的参数列表。
--user=(SSHusernameoftheremotehosts.ssh_userparametervaluewillbepassed)
--master_host=(master'shostname)
--master_ip=(master'sipaddress)
--master_port=(master'sportnumber)
注意该脚本需要依赖于IO::Socket::INETPerl包,Perlv5.6.0中默认已经包括。而该脚本允许连接任何一个远程服务器,所以需要配置SSHpublickey。并且,该脚本尝试建立远程服务器到master的tcp连接,意味着如果tcp连接成功,则mysql配置文件中的max_connections设置不受影响,而aborts_connects的值会自动加1
通用的方法就是创建一个全局的目录库,在库中存放着所有应用和IP地址之间的映射关系,用以取代VIP。在这种方案下,如果master崩溃,那么你就需要修改这个目录库。
都各有优缺点,MHA不会强制使用哪一种,允许用户使用任何的ip漂移技术。master_ip_failover_script脚本能用于该目的。换句话说,你需要自己写脚本实现应用层连接到新的master,并且必须定义master_ip_failover_script脚本参数,下面是使用范例
MHAManager需要调用3次该脚本,第一次是在启动监控master之前(检查脚本是否可用),,第二次是在调用shutdown_script脚本之前,而第三次是在新的Master应用完所有的
relaylogs之后。MHAManager会传递如下参数(这些参数不需要你自己配置):
Checkingphase
--command=status
--ssh_user=(currentmaster'ssshusername)
--orig_master_host=(currentmaster'shostname)
--orig_master_ip=(currentmaster'sipaddress)
--orig_master_port=(currentmaster'sportnumber)
Currentmastershutdownphase
--command=stoporstopssh
--ssh_user=(deadmaster'ssshusername,ifreachableviassh)
--orig_master_host=(current(dead)master'shostname)
--orig_master_ip=(current(dead)master'sipaddress)
--orig_master_port=(current(dead)master'sportnumber)
Newmasteractivationphase
--command=start
--ssh_user=(newmaster'ssshusername)
--orig_master_host=(deadmaster'shostname)
--orig_master_ip=(deadmaster'sipaddress)
--orig_master_port=(deadmaster'sportnumber)
--new_master_host=(newmaster'shostname)
--new_master_ip=(newmaster'sipaddress)
--new_master_port(newmaster'sportnumber)
--new_master_user=(newmaster'suser)
--new_master_password(newmaster'spassword)
如果你在master上使用了VIP,当master关闭阶段你可能不需要做任何事,只要你能够让VIP漂移到新的master。如果你使用的目录库方案,你可能需要删除或更新在master上的记录。在新的master激活阶段,你可以在新的master上插入/更新一条记录。并且,你可以做任何事使得应用层能够向新master中插入数据,比如设置read_only=0,创建用户的写权限等。
MHAmanager会检查这个脚本返回的运行结果,如果返回0或10,则MHAmanager继续运行。如果返回的不是0或10,mangaer就会终止。默认参数空置,所以MHAmanager不会做任何事。
Currentmasterwritefreezingphase
--command=stoporstopssh
--orig_master_host=(currentmaster'shostname)
--orig_master_ip=(currentmaster'sipaddress)
--orig_master_port=(currentmaster'sportnumber)
--orig_master_user=(currentmaster'suser)
--orig_master_password=(currentmaster'spassword)
--orig_master_ssh_user=(from0.56,currentmaster'ssshuser)
--orig_master_is_new_slave=(from0.56,notifyingwhethertheorigmasterwillbenewslaveornot)
Newmastergrantingwritephase
--command=start
--orig_master_host=(origmaster'shostname)
--orig_master_ip=(origmaster'sipaddress)
--orig_master_port=(origmaster'sportnumber)
--new_master_host=(newmaster'shostname)
--new_master_ip=(newmaster'sipaddress)
--new_master_port(newmaster'sportnumber)
--new_master_user=(newmaster'suser)
--new_master_password=(newmaster'spassword)
--new_master_ssh_user=(from0.56,newmaster'ssshuser)
MHAmanager包中有一个范例脚本,在调用该命令前,MHA内部会检查master能否通过SSH连接。如果可连接(OS存活但是mysqld服务终止),MHAmanager传递如下参数
--command=stopssh
--ssh_user=(sshusernamesothatyoucanconnecttothemaster)
--host=(master'shostname)
--ip=(master'sipaddress)
--port=(master'sportnumber)
--pid_file=(master'spidfile)
IfthemasterisnotreachableviaSSH,MHAManagerpassesthefollowingarguments.
--command=stop
--host=(master'shostname)
--ip=(master'sipaddress)
该脚本以如下方式运行。如果--command=stopssh被通过,则该脚本会通过ssh在mysqld和mysqld_safe进程上执行kill-9操作。如果—pid_file同样被通过,该脚本就会尝试只杀死代理的进程,而不是所有的mysql进程,这在单个master上运行多实例时是非常有用的。如果成功地通过SSH停止了该服务,则脚本运行结果返回10,并且后续manager会通过SSH连接到master并保存必要的binlog。如果该脚本无法通过SSH连接到master或者—command命令通过的话,那么该脚本将会尝试关闭机器电源。关闭电源依赖于H/W。如果电源关闭成功,该脚本返回0,否则返回1。当MHA接到返回的0时即开始故障切换。如果返回的代码既不是0也不是10,MHA将会终止故障转移工作。缺省参数为空,所以默认情况下MHA不对其做任何事。
并且,MHA在开始监控之后就会调用该脚本,以下参数将会在这个时候被传递过去,你可以在这里检测脚本设置。是否控制电源很多程度上决定于H/W,所以非常简易在这里检测电源状态。如果你哪里配置错了,在启动监控的时候你需要特别小心。
--command=status
--host=(master'shostname)
--ip=(master'sipaddress)
--orig_master_host=(deadmaster'shostname)
--new_master_host=(newmaster'shostname)
--new_slave_hosts=(newslaves'hostnames,delimitedbycommas)
--subject=(mailsubject)
--body=(body)
默认情况下该参数为空,即MHA不对其做任何事。在MHAmanager包的
Defaultparameterisempty,soMHAManagerdoesnotinvokeanythingbydefault./samples/scripts/send_report目录下有使用范例。
缺省参数为空,所以MHA不对其做任何事。
masterha_master_switch:切换master,分故障master切换和在线master切换两种
交互式故障master切换
$masterha_master_switch--master_state=dead--conf=/etc/app1.cnf--dead_master_host=host1
指定新的master
非交互式
在线master切换
Thenthefollowinglineswillbeaddedtotheconffile.
[server_db101]
hostname=db101
Youcanaddseveralparametersintheconfigfilebypassing--paramparameters,separatedbysemi-colon(;).
#masterha_conf_host--command=add--conf=/etc/conf/masterha/app1.cnf--hostname=db101--block=server100--params="no_master=1;ignore_fail=1"
Thefollowinglineswillbeaddedtotheconffile.
[server100]
hostname=db101
no_master=1
ignore_fail=1
Youcanalsoremovespecifiedblock.Thebelowcommandwillremovetheetireblockserver100.
#masterha_conf_host--command=delete--conf=/etc/conf/masterha/app1.cnf--block=server100
masterha_conf_hosttakesbelowarguments
如果你在app1和app2上有一些共有的参数,可在全局配置文件中配置。
下面是一个简要的Pacemaker配置(Heartbeatv1模式)
#/etc/ha.d/haresourcesonhost2
host2failover_startIPaddr::192.168.0.3
#failover_startscriptexample
start)
`masterha_master_switch--master_state=dead--interactive=0--wait_on_failover_error=0--dead_master_host=host1--new_master_host=host2`
exit
stop)
#donothing
#Applicationconfigurationfile:
[server1]
hostname=host1
candidate_master=1
[server2]
hostname=host2
candidate_master=1
[server3]
hostname=host3
no_master=1
因为数据文件不是共享的,所以数据资源也不用被集群工具或DRBD管理。处于这个目的,集群工具仅仅实现一个执行masterha_master_switch脚本和虚拟IP漂移的功能,你也可以自己使用手工脚本实现这些功能。
转载请注明出处
Overview
MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。
MHA提供了上述功能,使得其在适用于对高可用性,数据完整性要求高的场合,还有要求几乎non-stop的主库维护。
[b]◎自动故障检测和自动故障转移[/b]
MHA能够在一个已经存在的复制环境中监控
[b]◎交互式(手动)故障转移[/b]
MHA可以被定义成手动地实现故障转移,而不必去理会master的状态,即不监控master状态,确认故障发生后可通过MHA手动切换。
[b]◎非交互式的故障转移[/b]
即不监控Master状态,但是发生故障后可通过MHA实现自动转移。
[b]◎在线切换Master到不同的主机[/b]
通常当RAID控制器或者RAM损坏,或者需要将现有的master服务器进行升级的时候,我们就需要切换当前的master到其他的主机中。这并不是主库崩溃,但是却需要我们手动切换。这通常是越快越好,因为这段时间内主库是写禁止的。所以,你还需要阻塞或删除正在进行的会话,因为不禁止写就会导致数据一致性问题。举个例子,updatingmaster1,updatingmaster2,committingmaster1,gettingerroroncommittingmaster2就会导致数据一致性问题。所以说,快速的切换和优美平滑的阻塞写都是需要的。
MHA能够在0.5-2秒内实现切换,0.5-2秒的写阻塞通常是可接受的,所以你甚至能在非维护期间就在线切换master。诸如升级到高版本,升级到更快的服务器之类的工作,将会变得更容易。
ArchitectureofMHA
当主库发生崩溃,MHA通过以下方式修复关于MHA如何修复一致性问题,详细请查看如下链接地址,这里我不做详细研究
MHAComponents
MHA由Manager节点和Node节点组成。Manaer模块:可以管理多套Master-SlaveReplication
Masterha_manager:提供实现自动故障检测和故障转移的命令其他帮助脚本:提供手工故障转移,在线master切换,con检查等功能
Node模块:部署在所有的MySQLServer上
Save_binary_logs:如有必要,复制master的二进制日志Apply_diff_relay_logs:从数据最新的slave上产生不同的relaylog,并且将其应用到不同的binlogevents中
Purge_relay_log:清除relaylog
MHAmanager节点上运行着这些程序:监控mysql状态,master故障转移等。
MHAnode节点上有实现自动故障转移的helper脚本,比如分析mysqlbinary/relaylog,认出哪一个relaylog应该应用到其他的slave,并识别出这个relaylog的位置,并将events应用到目标slave上等。Node节点应该运行在每一个mysqlserver上。
如果MHAManager挂掉了,MHA会尝试通过SSH连接到node节点并执行node节点的命令
AdvantagesofMHA
这一节简略介绍,大致内容在上面的叙述中已经有提到。1Masterfailoverandslavepromotioncanbedoneveryquickly
自动故障转移快
2Mastercrashdoesnotresultindatainconsistency
主库崩溃不存在数据一致性问题
3NoneedtomodifycurrentMySQLsettings(MHAworkswithregularMySQL(5.0orlater))
不需要对当前mysql环境做重大修改
4Noneedtoincreaselotsofservers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)
5Noperformancepenalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。
6Workswithanystorageengine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb
TypicalUsecases
怎么部署Manager节点
◎设置一个专门的ManagerServer和多个Replication环境
由于MHAmanager仅仅使用了非常少的cpu和内存资源,所以你可以让一个manager管理很多个replication,甚至超过100个replication◎Manager节点和一个salve节点复用
假如你只有一个replication环境,而且你可能不喜欢为配置一个专门的manager而花费了更多的硬件开销,那么你可以让manager和一个slave节点复用。值得注意的是,如果这么配置了,尽管manager和slave在同一台机子上了,但是manger依旧通过SSH连接到slave,所以你依旧需要配置SSH无密码登陆。复制配置(这一部分简略翻译)
Singlemaster,multipleslaves
一主多从,这是最普遍的情况。
Singlemaster,multipleslaves(oneonremotedatacenter)
一主多从,将其中一个从配置成远程数据中心,其永远不会成为master
Singlemaster,multipleslaves,onecandidatemaster
一主多从,并只配置一个候选主节点
Multiplemasters,multipleslaves
Threetierreplication
管理MasterIP地址
HA方案中,很多情况下人们会在master上绑定一个虚拟IP。当master崩溃的时候,软件比如Keepalived会将虚拟IP重新指向正常的Server。通用的方法就是创建一个全局的目录库,在库中存放着所有应用和IP地址之间的映射关系,用以取代VIP。在这种方案下,如果master崩溃,那么你就需要修改这个目录库。
两种方案都各有优缺点,MHA不会强制使用哪一种。MHA可以调用其他的脚本来禁用\激活writeip地址,通过设置
和MySQL半同步复制配合使用
尽管MHA试图从崩溃的master上保存binarylog,但这并不总是可行的。例如,如果master是因为H/W故障或者是SSH故障,则MHA无法保存binlog,从而无法应用仅存在master上的binlog进行故障转移,这将会导致丢失最近的数据。使用半同步复制可以极大地减少这种丢失数据的风险。由于它也是基于mysql的复制机制,所以MHA能够配合半同步复制一起使用。值得一提的是,只要有一台slave收到最新的binlogevents,则MHA就会将它应用到所有的slave,从而保证了数据的一致性。
Tutorial
创建通用的复制环境
MHA不会自己创建replication环境,所以你需要自己手动搭建。换句话说,你可以将MHA部署在现有的复制环境中。举个例子,假设有四台主机:host1,host2,host3,host4.我们将host1配置成master,host2和host3配置成slave,而host4配置成manager在host1-host4上安装node节点
RHEL/Centos系统
##IfyouhavenotinstalledDBD::mysql,installitlikebelow,orinstallfromsource. #yuminstallperl-DBD-MySQL ##GetMHANoderpmpackagefrom"Downloads"section. #rpm-ivhmha4mysql-node-X.Y-0.noarch.rpm
Ubuntu/Debian系统
##IfyouhavenotinstalledDBD::mysql,installitlikebelow,orinstallfromsource. #apt-getinstalllibdbd-mysql-perl ##GetMHANodedebpackagefrom"Downloads"section. #dpkg-imha4mysql-node_X.Y_all.deb
源码安装
##InstallDBD::mysqlifnotinstalled $tar-zxfmha4mysql-node-X.Y.tar.gz $perlMakefile.PL $make $sudomakeinstall
在host4上安装manager节点
MHA的manager节点提供masterha_manager,masterha_master_switch等命令行的功能,依赖与Perl模块。在安装manager节点之前,你需要安装以下prel模块,另外别忘了在manager节点安装node节点。MHANodepackage
DBD::mysql
Config::Tiny
Log::Dispatch
Parallel::ForkManager
Time::HiRes(includedfromPerlv5.7.3)
RHEL/Centos系统
##InstalldependentPerlmodules #yuminstallperl-DBD-MySQL #yuminstallperl-Config-Tiny #yuminstallperl-Log-Dispatch #yuminstallperl-Parallel-ForkManager ##InstallMHANode,sinceMHAManagerusessomemodulesprovidedbyMHANode. #rpm-ivhmha4mysql-node-X.Y-0.noarch.rpm ##FinallyyoucaninstallMHAManager #rpm-ivhmha4mysql-manager-X.Y-0.noarch.rpm
Ubuntu/Debian系统
##InstalldependentPerlmodules #apt-getinstalllibdbd-mysql-perl #apt-getinstalllibconfig-tiny-perl #apt-getinstallliblog-dispatch-perl #apt-getinstalllibparallel-forkmanager-perl ##InstallMHANode,sinceMHAManagerusessomemodulesprovidedbyMHANode. #dpkg-imha4mysql-node_X.Y_all.deb ##FinallyyoucaninstallMHAManager #dpkg-imha4mysql-manager_X.Y_all.deb
源码安装
##InstalldependentPerlmodules #MHANode(Seeabove) #Config::Tiny ##perl-MCPAN-e"installConfig::Tiny" #Log::Dispatch ##perl-MCPAN-e"installLog::Dispatch" #Parallel::ForkManager ##perl-MCPAN-e"installParallel::ForkManager" ##InstallingMHAManager $tar-zxfmha4mysql-manager-X.Y.tar.gz $perlMakefile.PL $make $sudomakeinstall
创建配置文件
下一步就是创建manager的配置文件,参数主要包括mysqlserver的用户名,密码,复制账户的用户名和密码,工作目录等。所有的参数列表详见parameter表。manager_host$cat/etc/app1.cnf [serverdefault] #mysqluserandpassword user=root password=mysqlpass ssh_user=root #workingdirectoryonthemanager manager_workdir=/var/log/masterha/app1 #workingdirectoryonMySQLservers remote_workdir=/var/log/masterha/app1 [server1] hostname=host1 [server2] hostname=host2 [server3] hostname=host3
注意到host1是当前的master,MHA会自动检测到它。
检查SSH连接
MHAmanager通过SSH访问所有的node节点,各个node节点也同样需要通过SSH来相互发送不同的relaylog文件,所以有必要在每一个node和manager上配置SSH无密码登陆。MHAmanager可通过masterha_check_ssh脚本检测SSH连接是否配置正常。#masterha_check_ssh--conf=/etc/app1.cnf SatMay1414:42:192011-[warn]Globalconfigurationfile/etc/masterha_default.cnfnotfound.Skipping. SatMay1414:42:192011-[info]Readingapplicationdefaultconfigurationsfrom/etc/app1.cnf.. SatMay1414:42:192011-[info]Readingserverconfigurationsfrom/etc/app1.cnf.. SatMay1414:42:192011-[info]StartingSSHconnectiontests.. SatMay1414:42:192011-[debug]ConnectingviaSSHfromroot@host1(192.168.0.1)toroot@host2(192.168.0.2).. SatMay1414:42:202011-[debug]ok. SatMay1414:42:202011-[debug]ConnectingviaSSHfromroot@host1(192.168.0.1)toroot@host3(192.168.0.3).. SatMay1414:42:202011-[debug]ok. SatMay1414:42:212011-[debug]ConnectingviaSSHfromroot@host2(192.168.0.2)toroot@host1(192.168.0.1).. SatMay1414:42:212011-[debug]ok. SatMay1414:42:212011-[debug]ConnectingviaSSHfromroot@host2(192.168.0.2)toroot@host3(192.168.0.3).. SatMay1414:42:212011-[debug]ok. SatMay1414:42:222011-[debug]ConnectingviaSSHfromroot@host3(192.168.0.3)toroot@host1(192.168.0.1).. SatMay1414:42:222011-[debug]ok. SatMay1414:42:222011-[debug]ConnectingviaSSHfromroot@host3(192.168.0.3)toroot@host2(192.168.0.2).. SatMay1414:42:222011-[debug]ok. SatMay1414:42:222011-[info]AllSSHconnectiontestspassedsuccessfully.
如果有报错,则表示SSH配置有问题,影响MHA工作。你需要修复它并重试,通常的错误都是SSHpublickey认证没有正确配置。
检查复制配置
为了让MHA正常工作,所有的master和slave必须在配置文件中正确配置,MHA可通过manager_host$masterha_check_repl--conf=/etc/app1.cnf ... MySQLReplicationHealthisOK.
如果有报错,可通过查看日志修复它。当前的master一定不能是slave,其他所有的slave必须正确从master中复制。常见的错误可参考
开启Manager
当你正确配置了mysql复制,正确安装了manager和node节点,SSH配置也正确,那么下一步就是开启manager,可通过manager_host$masterha_manager--conf=/etc/app1.cnf .... SatMay1415:58:292011-[info]Connectingtothemasterhost1(192.168.0.1:3306)andsleepinguntilitdoesn'trespond..
如果所有的配置都正确,
检查manager状态
当MHAmanager启动监控以后,如果没有异常则不会打印任何信息。我们可通过manager_host$masterha_check_status--conf=/etc/app1.cnf app1(pid:5057)isrunning(0:PING_OK),master:host1
app1是MHA内部的应用名称,该名称可在manager配置文件中指定,如果manager终止或者配置得有错误,将会显示以下信息
manager_host$masterha_check_status--conf=/etc/app1.cnf app1isstopped(1:NOT_RUNNING).
终止manager
你可以通过manager_host$masterha_stop--conf=/etc/app1.cnf Stoppedapp1successfully.
如果无法停止,尝试加--abort参数,知道了怎么停止,下面我们重新开启manager。
测试master的自动故障转移
现在master运行正常,manager监控也正常,下一步就是停止master,测试自动故障转移,你可以简单地停止master上的mysqld服务host1$killall-9mysqldmysqld_safe
这时候检查manager的log日志,看看host2是否成功成为新的master,并且host3从host2中复制。
当完成一次正常的故障转移后,manager进程将会终止。如果你需要将manager进程运行在后台,可运行如下指令,或者通过安装daemontools来实现(这里略)
manager_host$nohupmasterha_manager--conf=/etc/app1.cnf</dev/null>/var/log/masterha/app1/app1.log2>&1&
Writinganapplicationconfigurationfile
为了MHA正常运行,你需要创建一个配置文件并设置参数,参数主要包括每个mysql进程所在的服务器的用户名和密码,mysql服务的用户名和密码,工作目录等等。整个参数列表设置详细请见下面是一个配置文件的设置范例
manager_host$cat/etc/app1.cnf
[serverdefault]
#mysqluserandpassword
user=root
password=mysqlpass
#workingdirectoryonthemanager
manager_workdir=/var/log/masterha/app1
#managerlogfile
manager_log=/var/log/masterha/app1/app1.log
#workingdirectoryonMySQLservers
remote_workdir=/var/log/masterha/app1
[server1]
hostname=host1
[server2]
hostname=host2
[server3]
hostname=host3
所有的参数设置必须是"param=value"格式,打个比方,以下设置时错误的。
[server1]
hostname=host1
#incorrect:mustbe"no_master=1"
no_master
Application-scope参数必须写在[serverdefault]块下,而在[serverN]块下,你需要设置的是local-scope参数,比如hostname是一个local-scope参数,所以必须写在这个块下面。块名称必须是字母”server”开头。
Writingaglobalconfigurationfile
如果你计划只用一台manager管理两个或以上的master-slave对,那么建议你创建一个全局配置文件,这样你就不需要为每一个复制都配置相同的参数。如果你创建了一个文件/etc/masterha_default.cnf,那么它默认就是全局配置文件。你可以在全局配置文件中设置applicationscope参数,例如,如果所有的mysql服务器的管理账户和密码都是一样的,你就可以在这里设置user和password
以下是全局配置文件范例
Globalconfigurationfile(/etc/masterha_default.cnf)
[serverdefault]
user=root
password=rootpass
ssh_user=root
master_binlog_dir=/var/lib/mysql
remote_workdir=/data/log/masterha
secondary_check_script=masterha_secondary_check-sremote_host1-sremote_host2
ping_interval=3
master_ip_failover_script=/script/masterha/master_ip_failover
shutdown_script=/script/masterha/power_manager
report_script=/script/masterha/send_master_failover_mail
以上这些参数可适用于所有的applications。
Application配置文件应该被单独配置,以下是app1(host1-4)和app2(host11-14)的范例
app1:
manager_host$cat/etc/app1.cnf
[serverdefault]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/app1.log
[server1]
hostname=host1
candidate_master=1
[server2]
hostname=host2
candidate_master=1
[server3]
hostname=host3
[server4]
hostname=host4
no_master=1
app2:
manager_host$cat/etc/app2.cnf
[serverdefault]
manager_workdir=/var/log/masterha/app2
manager_log=/var/log/masterha/app2/app2.log
[server1]
hostname=host11
candidate_master=1
[server2]
hostname=host12
candidate_master=1
[server3]
hostname=host13
[server4]
hostname=host14
no_master=1
RequirementsandLimitations
1这一部分做简要翻译,安装MHA的依赖和限制2SSHpublickey认证
3仅支持Liunx
4只有一台master能被设置成readonly=0,其他设置为只读
5如果是Master1->Master2->Slave3这样的三级复制框架,在配置文件中只需要设置master1和master2这样的二级复制结构,并设置multi_tier_slave=1来支持三级复制结构。
6MHA仅支持mysql5.0及以后的版本
7mysqlbinlog必须是3.3及以上版本
8log-bin必须在每一个可称为master的mysql服务器上设置
9所有mysql服务器的复制过滤规则必须一致
10必须在能成为master的服务器上设置复制账户
11所有Mysql服务器上必须设置relay_log_purge=1,使得能够保存一段时间的relaylog
12基于语句的复制时,不要使用loaddatainfile命令
WhatMHAdoesonmonitoringandfailover
这一部分很多内容与上述重复,我只做简要翻译,在监控和故障转移过程中,MHA主要做了以下几项工作Verifyingreplicationsettingsandidentifyingthecurrentmaster
核实复制配置并识别出当前的master
Monitoringthemasterserver
Detectingthemasterserverfailure
Verifyingslaveconfigurationsagain
Shuttingdownfailedmasterserver(optional)
Recoveringanewmaster
Activatingthenewmaster
Recoveringtherestslaves
Notifications(optional)
监控masterserver直到master崩溃,在这一步时manager不再监控slave的状态。所以如果需要添加或删除slave节点,最好重新修改manager配置文件并重启MHA
检测到master故障
重新扫描配置文件,各种重连,核实master确实已经崩溃。如果最近一次的报错和现在一样并且时间相隔非常之短,MHA将会停止继续报错并进入下一步
关闭崩溃的主机(可选),防止错误继续扩散
重新选举出一个新的master。如果崩溃的主机能够通过SSH连接,则复制崩溃主机的binlog到最新的slave上,并指向他的end_log_pos。在选择新的master上遵守manager上的配置文件,如果某个slave能成为master,则设置
激活新的master
重新设置其余的slave使其指向新选举出来的master
发送通告(可选),比如发送邮件,禁用新master上backup工作等,可通过
WhatMHAdoesononline(fast)masterswitch
简要翻译,在线master切换过程中,MHA主要做了以下工作Verifyingreplicationsettingsandidentifyingthecurrentmaster
Identifyingthenewmater
Rejectingwritesonthecurrentmaster
Waitingforallslavestocatchupreplication
Grantingwritesonthenewmaster
Switchingreplicationonalltherestslaves
核实复制配置并识别出当前的master,这个过程还会检测以下几个条件是否满足:
Slave上的IO线程isrunning
Salve上的SQL线程isrunning
Slave上所有的复制延迟少于2s
在master上的update操作没有超过2秒的
识别出新的master
在当前master上执行FLUSHTABLESWITHREADLOCK阻塞写操作防止数据一致性问题
等待所有的slave的复制跟上master
在新的master上执行SHOWMASTERSTATUS,记录下binlog文件名称和pos,并执行SETGLOBALread_only=0授权其写操作
在其他salve上并行执行CHANGEMASTER,STARTSLAVE,指向新的master,并startslave
Parameters
MHAmanager配置参数列表如下ParameterName | Required? | ParameterScope | DefaultValue | Example |
Yes | LocalOnly | - | hostname=mysql_server1,hostname=192.168.0.1,etc | |
No | LocalOnly | gethostbyname($hostname) | ip=192.168.1.3 | |
No | Local/App/Global | 3306 | port=3306 | |
No | LocalOnly | sameashostname | ssh_host=mysql_server1,ssh_host=192.168.0.1,etc | |
No | LocalOnly | gethostbyname($ssh_host) | ssh_ip=192.168.1.3 | |
No | Local/App/Global | 22 | ssh_port=22 | |
No | Local/App/Global | 5 | ssh_connection_timeout=20 | |
No | Local/App/Global | ""(emptystring) | ssh_options="-i/root/.ssh/id_dsa2" | |
No | LocalOnly | 0 | candidate_master=1 | |
No | LocalOnly | 0 | no_master=1 | |
No | LocalOnly | 0 | ignore_fail=1 | |
No | LocalOnly | 0 | skip_init_ssh_check=1 | |
No | Local/App/Global | 0 | skip_reset_slave=1 | |
No | Local/App/Global | root | user=mysql_root | |
No | Local/App/Global | ""(emptystring) | password=rootpass | |
No | Local/App/Global | Master_UservaluefromSHOWSLAVESTATUS | repl_user=repl | |
No | Local/App/Global | -(currentreplicationpassword) | repl_user=replpass | |
No | Local/App/Global | 0 | disable_log_bin=1 | |
No | Local/App/Global | ""(emptystring) | master_pid_file=/var/lib/mysql/master1.pid | |
No | Local/App/Global | currentOSuser | ssh_user=root | |
No | Local/App/Global | /var/tmp | remote_workdir=/var/log/masterha/app1 | |
No | Local/App/Global | /var/lib/mysql | master_binlog_dir=/data/mysql1,/data/mysql2 | |
No | App/Global | info | log_level=debug | |
No | App | /var/tmp | manager_workdir=/var/log/masterha | |
No | App | - | client_bindir=/usr/mysql/bin | |
No | App | - | client_libdir=/usr/lib/mysql | |
No | App | STDERR | manager_log=/var/log/masterha/app1.log | |
No | App/Global | 1 | check_repl_delay=0 | |
No | App/Global | 1 | check_repl_filter=0 | |
No | App/Global | 1 | latest_priority=0 | |
No | App/Global | 0 | multi_tier_slave=1 | |
No | App/Global | 3 | ping_interval=5 | |
No | App/Global | SELECT | ping_type=CONNECT | |
No | App/Global | null | secondary_check_script=masterha_secondary_check-sremote_dc1-sremote_dc2 | |
No | App/Global | null | master_ip_failover_script=/usr/local/custom_script/master_ip_failover | |
No | App/Global | null | master_ip_online_change_script=/usr/local/custom_script/master_ip_online_change | |
No | App/Global | null | shutdown_script=/usr/local/custom_script/master_shutdown | |
No | App/Global | null | report_script=/usr/local/custom_script/report | |
No | App/Global | null | report_script=/usr/local/custom_script/init_conf_loader |
AppScope:Parametersforeach{master,slaves}pair.Theseparametersshouldbesetundera[server_default]blockwithin
GlobalScope:Parametersforall{master,slaves}pairs.Globalscopeparametersareusefulonlywhenyoumanagemultiple{master,slaves}pairsfromsinglemanagerserver.Theseparametersshouldbesetina
hostname
HostnameorIPaddressofthetargetMySQLserver.Thisparameterismandatory,andmustbeconfiguredunder[server_xxx]blockswithinMySQL服务器的主机名称或IP地址,写在[server_xxx]下,xxx相当于各个mysql服务器。
ip
IPaddressofthetargetMySQLserver.Defaultisgethostbyname($hostname).MHAManagerandMHANodeinternallyusesthisIPaddresstoconnectviaMySQLandSSH.Normallyyoudon'tneedtoconfigurethisparameterbecauseit'sautomaticallyresolvedfromhostnameparameter.通常不需要配置
port
PortnumberofthetargetMySQLserver.Defaultis3306.MHAconnectstoMySQLserversbyusingIPaddressandport.Mysql服务的端口号,默认3306.
ssh_host
Ssh所在服务器,默认和hostname一样,不需要配置。ssh_ip
(Supportedfrom0.53)IPaddressofthetargetMySQLserverthatisusedviaSSH.Defaultisgethostbyname($ssh_host).通常不用配置ssh_port
(Supportedfrom0.53)PortnumberofthetargetMySQLserverusedviaSSH.Defaultis22.ssh_connection_timeout
(Supportedfrom0.54)Defaultis5seconds.Beforeaddingthisparametertimeoutwashardcoded.ssh_options
(Supportedfrom0.53)AdditionalSSHcommandlineoptions.candidate_master
在[server_xxx]下配置,值为1代表该mysql可以成为master,如果有两个以上mysql都设置为1,那么谁写在前面,谁的优先级就高。no_master
设置为1代表该mysql永远无法成为master,通常在RAID0或者远程数据中心设置该mysql的no_master为1,或者manager和slave复用的主机上也这么设置。ignore_fail
默认情况下,manager在slave出现故障的时候不会自动故障转移,比如SSH连接或者SQL线程有问题等。如果设置为1则该slave出现故障时会自动切换skip_init_ssh_check
跳过初始化过程中的ssh检查skip_reset_slave
0.56版本后支持当master崩溃,跳过执行resetslaveuser
mysql管理账户,最好是root账户,默认也就是root账户password
user对应的mysql账户密码repl_user
复制账户,通常不用设置repl_password
复制账户对应的密码,通常不用设置disable_log_bin
如果这个选项被设置,那么当将不同的relaylog应用到各个slave的过程中,slave不产生binlogmaster_pid_file
设置master的pid文件,通常不用设置ssh_user
默认是当前登陆manager的OS的用户,需要拥有读取mysqlbinlog和relaylog的权限remote_workdir
每一个MHAnode节点产生log文件的目录,如果不存在MHA会自动创建,需要给出相应目录的权限,默认在/var/tmp,最好自己指定master_binlog_dir
master产生binlog文件的目录,最好自己指定,因为当master崩溃后,如果master还能连通SSH,就会复制其binlog,默认路径为/var/lib/mysql.log_level
通常不用设置,表示日志级别manager_workdir
manager产生自身状态的文件的目录,默认/var/tmpclient_bindir
IfMySQLcommandlineutilitiesareinstalledunderanon-standarddirectory,usethisoptiontosetthedirectory.client_libdir
IfMySQLlibrariesareinstalledunderanon-standarddirectory,usethisoptiontosetthedirectory.manager_log
Manager日志的全路径名称,若未设置,默认输出到STDOUT/STDERR;如果手动故障切换时,MHA则忽略参数设置,而直接输出到STDOUT/STDERR。
FullpathfilenamethatMHAManagergenerateslogs.Ifnotset,MHAManagerprintstoSTDOUT/STDERR.Whenexecutingmanualfailover(interactivefailover),MHAManagerignoresmanager_logsettingandalwaysprintstoSTDOUT/STDERR.
check_repl_delay
默认情况下,如果某个slave的复制延迟超过100MB,MHA则不会使其成为新的master,因为这需要很长的时间来恢复。如果设为0,MHA在选举新的master时会忽略复制延迟若设置该参数为0,MHA在选择新的Master时,会忽略复制延迟。当某个mysql设置candidate_master=1时,再将check_repl_delay设置为0就很有必要,确保它能成为新的master
check_repl_filter
检查复制过滤,默认情况下如果master和slave拥有不同的过滤规则就会报错,通过设置为0可以忽略复制过滤检查,当然你得特别小心,确保没有问题。latest_priority
默认情况下MHA在master崩溃后,选举复制延迟最低的slave为新的master,但允许你自己控制每个slave成为主节点的优先级和顺序,通过设置该参数为0,并由写入candidate_master=1的mysql服务器顺序决定。multi_tier_slave
从0.52版本开始,MHA支持多级复制配置。默认情况下,不允许设置三层以上的复制结构,比如h2从h1复制,而h3又从h2复制,MHA将会报错。通过设置multi_tier_slave参数,则h1崩溃后,h2被选举为新的master,而h3依旧从h2复制ping_interval
这个参数指定了MHAmanager应该多长时间执行pingSQL一次去连接master,当超过三次连接不上master,manager将判定master已经死亡。默认3秒ping一次,所以,总的检测时间大概就是12秒。如果由于连接错误或者连接数过多而导致的错误不会计入master死亡统计。ping_type
0.53版本默认连接到master并执行select1,即ping_type=SELECT。但是在某些场合,更好地方式是通过创建连接后又断开连接的方式,因为这个更加严格,并且能更快地发现tcp连接问题,即ping_type=CONNECT。从5.6版本以后还支持ping_type=INSERTsecondary_check_script
通常情况下,我们建议使用两个或以上的网络路由来检测master是否存活。但默认情况下,manager仅通过单个路由来检查,即fromManager节点toMaster节点。MHA实际上可以支持多个路由检测,只要通过调用额外的脚本masterha_check_script即可,下面是范例。secondary_check_script=masterha_secondary_check-sremote_host1-sremote_host2
masterha_secondary_check脚本在manager节点上,通常情况下能够运行良好。
在这个范例中,MHA通过Manager-(A)->remote_host1-(B)->master_host
和Manager-(A)->remote_host2-(B)->master_host来检测master状态。如果在上述两步中都是A连接成功而B连接不成功,则MHA能够判断是master确实已经死亡并返回0,进行故障切换。如果A连接不成功,该脚本会返回2,MHA认为可能是自身的网络问题而不进行故障转移。如果此时B连接成功,则实际上master是存活的。通俗地说,remote_host1和remote_host2应该被设置在不同的网段上。
该脚本在通用场合中都适用,当然你也可以自己写脚本来实现更多的功能。下面是该脚本的参数列表。
--user=(SSHusernameoftheremotehosts.
--master_host=(master'shostname)
--master_ip=(master'sipaddress)
--master_port=(master'sportnumber)
注意该脚本需要依赖于IO::Socket::INETPerl包,Perlv5.6.0中默认已经包括。而该脚本允许连接任何一个远程服务器,所以需要配置SSHpublickey。并且,该脚本尝试建立远程服务器到master的tcp连接,意味着如果tcp连接成功,则mysql配置文件中的max_connections设置不受影响,而aborts_connects的值会自动加1
master_ip_failover_script
HA方案中,很多情况下人们会在master上绑定一个虚拟IP。当master崩溃的时候,软件比如Keepalived会将虚拟IP重新指向正常的Server。通用的方法就是创建一个全局的目录库,在库中存放着所有应用和IP地址之间的映射关系,用以取代VIP。在这种方案下,如果master崩溃,那么你就需要修改这个目录库。
都各有优缺点,MHA不会强制使用哪一种,允许用户使用任何的ip漂移技术。master_ip_failover_script脚本能用于该目的。换句话说,你需要自己写脚本实现应用层连接到新的master,并且必须定义master_ip_failover_script脚本参数,下面是使用范例
master_ip_failover_script=/usr/local/sample/bin/master_ip_failover
MHAManager需要调用3次该脚本,第一次是在启动监控master之前(检查脚本是否可用),,第二次是在调用shutdown_script脚本之前,而第三次是在新的Master应用完所有的
relaylogs之后。MHAManager会传递如下参数(这些参数不需要你自己配置):
Checkingphase
--command=status
--ssh_user=(currentmaster'ssshusername)
--orig_master_host=(currentmaster'shostname)
--orig_master_ip=(currentmaster'sipaddress)
--orig_master_port=(currentmaster'sportnumber)
Currentmastershutdownphase
--command=stoporstopssh
--ssh_user=(deadmaster'ssshusername,ifreachableviassh)
--orig_master_host=(current(dead)master'shostname)
--orig_master_ip=(current(dead)master'sipaddress)
--orig_master_port=(current(dead)master'sportnumber)
Newmasteractivationphase
--command=start
--ssh_user=(newmaster'ssshusername)
--orig_master_host=(deadmaster'shostname)
--orig_master_ip=(deadmaster'sipaddress)
--orig_master_port=(deadmaster'sportnumber)
--new_master_host=(newmaster'shostname)
--new_master_ip=(newmaster'sipaddress)
--new_master_port(newmaster'sportnumber)
--new_master_user=(newmaster'suser)
--new_master_password(newmaster'spassword)
如果你在master上使用了VIP,当master关闭阶段你可能不需要做任何事,只要你能够让VIP漂移到新的master。如果你使用的目录库方案,你可能需要删除或更新在master上的记录。在新的master激活阶段,你可以在新的master上插入/更新一条记录。并且,你可以做任何事使得应用层能够向新master中插入数据,比如设置read_only=0,创建用户的写权限等。
MHAmanager会检查这个脚本返回的运行结果,如果返回0或10,则MHAmanager继续运行。如果返回的不是0或10,mangaer就会终止。默认参数空置,所以MHAmanager不会做任何事。
master_ip_online_change_script
这个和master_ip_failover_script参数相似,但它并不是用在master故障切换上,而是用在master在线手动切换命令上,传递参数过程如下Currentmasterwritefreezingphase
--command=stoporstopssh
--orig_master_host=(currentmaster'shostname)
--orig_master_ip=(currentmaster'sipaddress)
--orig_master_port=(currentmaster'sportnumber)
--orig_master_user=(currentmaster'suser)
--orig_master_password=(currentmaster'spassword)
--orig_master_ssh_user=(from0.56,currentmaster'ssshuser)
--orig_master_is_new_slave=(from0.56,notifyingwhethertheorigmasterwillbenewslaveornot)
Newmastergrantingwritephase
--command=start
--orig_master_host=(origmaster'shostname)
--orig_master_ip=(origmaster'sipaddress)
--orig_master_port=(origmaster'sportnumber)
--new_master_host=(newmaster'shostname)
--new_master_ip=(newmaster'sipaddress)
--new_master_port(newmaster'sportnumber)
--new_master_user=(newmaster'suser)
--new_master_password=(newmaster'spassword)
--new_master_ssh_user=(from0.56,newmaster'ssshuser)
shutdown_script
你或许希望强制关闭master所在的服务器,这样就可以防止灾难扩散,以下是范例shutdown_script=/usr/local/sample/bin/power_manager
MHAmanager包中有一个范例脚本,在调用该命令前,MHA内部会检查master能否通过SSH连接。如果可连接(OS存活但是mysqld服务终止),MHAmanager传递如下参数
--command=stopssh
--ssh_user=(sshusernamesothatyoucanconnecttothemaster)
--host=(master'shostname)
--ip=(master'sipaddress)
--port=(master'sportnumber)
--pid_file=(master'spidfile)
IfthemasterisnotreachableviaSSH,MHAManagerpassesthefollowingarguments.
--command=stop
--host=(master'shostname)
--ip=(master'sipaddress)
该脚本以如下方式运行。如果--command=stopssh被通过,则该脚本会通过ssh在mysqld和mysqld_safe进程上执行kill-9操作。如果—pid_file同样被通过,该脚本就会尝试只杀死代理的进程,而不是所有的mysql进程,这在单个master上运行多实例时是非常有用的。如果成功地通过SSH停止了该服务,则脚本运行结果返回10,并且后续manager会通过SSH连接到master并保存必要的binlog。如果该脚本无法通过SSH连接到master或者—command命令通过的话,那么该脚本将会尝试关闭机器电源。关闭电源依赖于H/W。如果电源关闭成功,该脚本返回0,否则返回1。当MHA接到返回的0时即开始故障切换。如果返回的代码既不是0也不是10,MHA将会终止故障转移工作。缺省参数为空,所以默认情况下MHA不对其做任何事。
并且,MHA在开始监控之后就会调用该脚本,以下参数将会在这个时候被传递过去,你可以在这里检测脚本设置。是否控制电源很多程度上决定于H/W,所以非常简易在这里检测电源状态。如果你哪里配置错了,在启动监控的时候你需要特别小心。
--command=status
--host=(master'shostname)
--ip=(master'sipaddress)
report_script
当故障切换完成或返回错误的时候,你或许希望可以发送一个报告给你,report_script参数可适用于这种场合。MHAmanager将会传递如下参数--orig_master_host=(deadmaster'shostname)
--new_master_host=(newmaster'shostname)
--new_slave_hosts=(newslaves'hostnames,delimitedbycommas)
--subject=(mailsubject)
--body=(body)
默认情况下该参数为空,即MHA不对其做任何事。在MHAmanager包的
Defaultparameterisempty,soMHAManagerdoesnotinvokeanythingbydefault./samples/scripts/send_report目录下有使用范例。
init_conf_load_script
这个脚本能被应用于你不想在配置文件中填写清楚的文本信息,比如密码和复制账户的密码。通过从这个脚本中返回name=value对,你可以重写这个全局配置文件。范例如下#!/usr/bin/perl print"password=$ROOT_PASS\n"; print"repl_password=$REPL_PASS\n";
缺省参数为空,所以MHA不对其做任何事。
Commandreference
这一部分不做翻译,通常情况下只需要运行范例的命令,参数的详细介绍请见官方文档。masterha_manager:开启MHAManager
#masterha_manager--conf=/etc/conf/masterha/app1.cnf
masterha_master_switch:切换master,分故障master切换和在线master切换两种
交互式故障master切换
$masterha_master_switch--master_state=dead--conf=/etc/app1.cnf--dead_master_host=host1
指定新的master
$masterha_master_switch--master_state=dead--conf=/etc/app1.cnf--dead_master_host=host1--new_master_host=host5
非交互式
$masterha_master_switch--master_state=dead--conf=/etc/conf/masterha/app1.cnf--dead_master_host=host1--new_master_host=host2--interactive=0
在线master切换
$masterha_master_switch--master_state=alive--conf=/etc/app1.cnf--new_master_host=host2
masterha_check_status:检查MHA运行状态
$masterha_check_status--conf=/path/to/app1.cnf app1(pid:8368)isrunning(0:PING_OK),master:host1 $echo$? 0
StatusCode(Exitcode) | StatusString | Description |
0 | PING_OK | MasterisrunningandMHAManagerismonitoring.Masterstateisalive. |
1 | --- | Unexpectederrorhappened.Forexample,configfiledoesnotexist.Ifthiserrorhappens,checkargumentsarevalidornot. |
2 | NOT_RUNNING | MHAManagerisnotrunning.Masterstateisunknown. |
3 | PARTIALLY_RUNNING | MHAManagermainprocessisnotrunning,butchildprocessesarerunning.Thisshouldnothappenandshouldbeinvestigated.Masterstateisunknown. |
10 | INITIALIZING_MONITOR | MHAManagerisjustafterstartupandinitializing.Waitforawhileandseehowthestatuschanges.Masterstateisunknown. |
20 | PING_FAILING | MHAManagerdetectspingtomasterisfailing.Masterstateismaybedown. |
21 | PING_FAILED | MHAManagerdetectseithera)pingtomasterfailedthreetimes,b)preparingforstartingmasterfailover.Masterstateismaybedown. |
30 | RETRYING_MONITOR | MHAManagerinternalhealthcheckprogramdetectedthatmasterwasnotreachablefrommanager,butafterdoublecheckMHAManagerverifiedthemasterisalive,andcurrentlywaitingforretry.Masterstateisverylikelyalive. |
31 | CONFIG_ERROR | TherearesomeconfigurationproblemsandMHAManagercan'tmonitorthetargetmaster.Checkalogfilefordetail.Masterstateisunknown. |
32 | TIMESTAMP_OLD | MHAManagerdetectsthatpingtomasterisokbutstatusfileisnotupdatedforalongtime.CheckwhetherMHAManageritselfhangsornot.Masterstateisunknown. |
50 | FAILOVER_RUNNING | MHAManagerconfirmsthatmasterisdownandrunningfailover.Masterstateisdead. |
51 | FAILOVER_ERROR | MHAManagerconfirmsthatmasterisdownandrunningfailover,butfailedduringfailover.Masterstateisdead. |
masterha_check_repl:检查复制健康状态
manager_host$masterha_check_repl--conf=/etc/app1.cnf ... MySQLReplicationHealthisOK.
masterha_stop:停止MHAmanager运行
manager_host$masterha_stop--conf=/etc/app1.cnf Stoppedapp1successfully.
Masterha_conf_host:在配置文件中添加或移除host
#masterha_conf_host--command=add--conf=/etc/conf/masterha/app1.cnf--hostname=db101Thenthefollowinglineswillbeaddedtotheconffile.
[server_db101]
hostname=db101
Youcanaddseveralparametersintheconfigfilebypassing--paramparameters,separatedbysemi-colon(;).
#masterha_conf_host--command=add--conf=/etc/conf/masterha/app1.cnf--hostname=db101--block=server100--params="no_master=1;ignore_fail=1"
Thefollowinglineswillbeaddedtotheconffile.
[server100]
hostname=db101
no_master=1
ignore_fail=1
Youcanalsoremovespecifiedblock.Thebelowcommandwillremovetheetireblockserver100.
#masterha_conf_host--command=delete--conf=/etc/conf/masterha/app1.cnf--block=server100
masterha_conf_hosttakesbelowarguments
master_check_ssh:ssh认证检查
#masterha_check_ssh--conf=/etc/app1.cnf SatMay1414:42:192011-[warn]Globalconfigurationfile/etc/masterha_default.cnfnotfound.Skipping. SatMay1414:42:192011-[info]Readingapplicationdefaultconfigurationsfrom/etc/app1.cnf.. SatMay1414:42:192011-[info]Readingserverconfigurationsfrom/etc/app1.cnf.. SatMay1414:42:192011-[info]StartingSSHconnectiontests.. SatMay1414:42:192011-[debug]ConnectingviaSSHfromroot@host1(192.168.0.1)toroot@host2(192.168.0.2).. SatMay1414:42:202011-[debug]ok. SatMay1414:42:202011-[debug]ConnectingviaSSHfromroot@host1(192.168.0.1)toroot@host3(192.168.0.3).. SatMay1414:42:202011-[debug]ok. SatMay1414:42:212011-[debug]ConnectingviaSSHfromroot@host2(192.168.0.2)toroot@host1(192.168.0.1).. SatMay1414:42:212011-[debug]ok. SatMay1414:42:212011-[debug]ConnectingviaSSHfromroot@host2(192.168.0.2)toroot@host3(192.168.0.3).. SatMay1414:42:212011-[debug]ok. SatMay1414:42:222011-[debug]ConnectingviaSSHfromroot@host3(192.168.0.3)toroot@host1(192.168.0.1).. SatMay1414:42:222011-[debug]ok. SatMay1414:42:222011-[debug]ConnectingviaSSHfromroot@host3(192.168.0.3)toroot@host2(192.168.0.2).. SatMay1414:42:222011-[debug]ok. SatMay1414:42:222011-[info]AllSSHconnectiontestspassedsuccessfully.
purge_relay_logsscript:删除旧的relaylog
[app@slave_host1]$cat/etc/cron.d/purge_relay_logs
#purgerelaylogsat5am
05***app/usr/bin/purge_relay_logs--user=root--password=PASSWORD--disable_relay_log_purge>>/var/log/masterha/purge_relay_logs.log2>&1
Monitoringmultipleapplications
你或许在一台机子上希望监控多套master-salve复制,这非常容易,只要为application2创建一个新的配置文件并启动manager#masterha_manager--conf=/etc/conf/masterha/app1.cnf
#masterha_manager--conf=/etc/conf/masterha/app2.cnf
如果你在app1和app2上有一些共有的参数,可在全局配置文件中配置。
Usingwithclusteringsoftware
如果你在master上使用虚拟IP,你可能已经使用了类似于Pacemaker的集群软件。如果你使用了相似的工具,你或许需要使用它们来管理虚拟IP地址,而不是让所有的事都由MHA完成。MHA仅用于故障切换,所以你需要使用配合使用其他集群工具来实现高可用。下面是一个简要的Pacemaker配置(Heartbeatv1模式)
#/etc/ha.d/haresourcesonhost2
host2failover_startIPaddr::192.168.0.3
#failover_startscriptexample
start)
`masterha_master_switch--master_state=dead--interactive=0--wait_on_failover_error=0--dead_master_host=host1--new_master_host=host2`
exit
stop)
#donothing
#Applicationconfigurationfile:
[server1]
hostname=host1
candidate_master=1
[server2]
hostname=host2
candidate_master=1
[server3]
hostname=host3
no_master=1
因为数据文件不是共享的,所以数据资源也不用被集群工具或DRBD管理。处于这个目的,集群工具仅仅实现一个执行masterha_master_switch脚本和虚拟IP漂移的功能,你也可以自己使用手工脚本实现这些功能。
相关文章推荐
- MHA官方文档翻译
- MHA官方文档翻译
- MHA官方文档翻译
- fmdb官方文档(翻译)
- Android接口与架构(驱动开发)翻译官方文档
- Aircrack-ng官方文档翻译[中英对照]---Aireplay-ng
- 第36篇 翻译webrtc官方文档(三)及PHP命名空间(二)
- sonarqube官方文档翻译之AdministrationGuide(一)
- 图片缓存技术(adnroid官方文档翻译)
- Flume官方文档翻译之(十二)
- spring-boot-starter-data-redis 翻译官方文档 8.1 - 8.3
- 我的《Android官方开发文档Training系列课程中文版》的中期翻译计划
- MySQL学习 --来自官方文档的翻译
- NSURLSession---iOS-Apple苹果官方文档翻译
- 发现的一个翻译的不错的elasticsearch 2.3.3 官方文档的API
- django 1.8 官方文档翻译: 1-1-2 快速安装指南
- ABP官方文档翻译 3.1 实体
- 《ios人机交互指南翻译系列之一,来自苹果最新官方文档,2015.8》 设计策略:把概念变成产品
- Python3.2官方文档翻译--作用域和命名空间实例
- Mysql官方文档翻译 -- 10.1.3.1 Server字符集和字符列排序规则