-
mha配置参数详解:
参数名字 | 是否必须 | 参数作用域 | 默认值 | 示例 |
---|---|---|---|---|
hostname | Yes | Local Only | - | hostname=mysql_server1, hostname=192.168.0.1, etc |
ip | No | Local Only | gethostbyname($hostname) | ip=192.168.1.3 |
port | No | Local/App/Global | 3306 | port=3306 |
ssh_host | No | Local Only | same as hostname | ssh_host=mysql_server1, ssh_host=192.168.0.1, etc |
ssh_ip | No | Local Only | gethostbyname($ssh_host) | ssh_ip=192.168.1.3 |
ssh_port | No | Local/App/Global | 22 | ssh_port=22 |
ssh_connection_timeout | No | Local/App/Global | 5 | ssh_connection_timeout=20 |
ssh_options | No | Local/App/Global | ""(empty string) | ssh_options="-i /root/.ssh/id_dsa2" |
candidate_master | No | Local Only | 0 | candidate_master=1 |
no_master | No | Local Only | 0 | no_master=1 |
ignore_fail | No | Local Only | 0 | ignore_fail=1 |
skip_init_ssh_check | No | Local Only | 0 | skip_init_ssh_check=1 |
skip_reset_slave | No | Local/App/Global | 0 | skip_reset_slave=1 |
user | No | Local/App/Global | root | user=mysql_root |
password | No | Local/App/Global | ""(empty string) | password=rootpass |
repl_user | No | Local/App/Global | Master_User value from SHOW SLAVE STATUS | repl_user=repl |
repl_password | No | Local/App/Global |
| repl_user=replpass |
disable_log_bin | No | Local/App/Global | 0 | disable_log_bin=1 |
master_pid_file | No | Local/App/Global | ""(empty string) | master_pid_file=/var/lib/mysql/master1.pid |
ssh_user | No | Local/App/Global | current OS user | ssh_user=root |
remote_workdir | No | Local/App/Global | /var/tmp | remote_workdir=/var/log/masterha/app1 |
master_binlog_dir | No | Local/App/Global | /var/lib/mysql | master_binlog_dir=/data/mysql1,/data/mysql2 |
log_level | No | App/Global | info | log_level=debug |
manager_workdir | No | App | /var/tmp | manager_workdir=/var/log/masterha |
client_bindir | No | App | - | client_bindir=/usr/mysql/bin |
client_libdir | No | App | - | client_libdir=/usr/lib/mysql |
manager_log | No | App | STDERR | manager_log=/var/log/masterha/app1.log |
check_repl_delay | No | App/Global | 1 | check_repl_delay=0 |
check_repl_filter | No | App/Global | 1 | check_repl_filter=0 |
latest_priority | No | App/Global | 1 | latest_priority=0 |
multi_tier_slave | No | App/Global | 0 | multi_tier_slave=1 |
ping_interval | No | App/Global | 3 | ping_interval=5 |
ping_type | No | App/Global | SELECT | ping_type=CONNECT |
secondary_check_script | No | App/Global | null | secondary_check_script= masterha_secondary_check -s remote_dc1 -s remote_dc2 |
master_ip_failover_script | No | App/Global | null | master_ip_failover_script=/usr/local/custom_script/master_ip_failover |
master_ip_online_change_script | No | App/Global | null | master_ip_online_change_script= /usr/local/custom_script/master_ip_online_change |
shutdown_script | No | App/Global | null | shutdown_script= /usr/local/custom_script/master_shutdown |
report_script | No | App/Global | null | report_script= /usr/local/custom_script/report |
init_conf_load_script | No | App/Global | null | report_script= /usr/local/custom_script/init_conf_loader |
作用域范围解释: Local Scope 表示可以设置在单个app配置文件中的[server_xx]块标记下边的参数;App Scope表示可以针对单个app内所有的master和slave设置,可以设置在单个app配置文件中的[server_default]块标记下边;Global Scope表示全局参数,可以设置在全局配置文件中
-
以下是配置文件中具体每个配置参数的解释:
-
hostname:目标实例的主机名或者IP地址,这个参数是强制的,只能配置在app配置文件的[server_xxx]段落标记下
-
ip:目标实例的ip地址,默认从hostname获取,MHA内部管理节点与数据节点之间的mysql和ssh通过这个IP连接,正常情况下你不需要配置这个参数,因为MHA会自动解析Hostname获得
-
port:目标实例的端口,默认是3306,MHA使用mysql server的IP和port连接
-
ssh_host:从0.53版本开始支持,默认情况下和hostname参数相同,当你使用了VLAN隔离的时候,比如为了安全,把ssh网段和访问数据库实例的网段分开使用两个不同的IP,那么就需要单独配置这个参数
-
ssh_ip:从0.53版本开始支持,默认情况下与ssh_host相同
-
ssh_port:从0.53版本开始支持,目标数据库的ssh端口,默认是22
-
ssh_connection_timeout:从0.54版本开始支持,默认是5秒,增加这个参数之前这个超时时间是写死在代码里的
-
ssh_options:从0.53版本开始支持,额外的ssh命令行选项
-
candidate_master:从不同的从库服务器中,提升一个可靠的机器为新主库,(比如:RAID 10比RAID0的从库更可靠),可以通过在配置文件中对应的从库服务器的配置段下添加candidate_master=1来提升这个从库被提升为新主库的优先级(这个从库要开始binlog,以及没有显著的复制延迟,如果不满足这两个条件,也并不会在主库挂掉的时候成为新主库,所以,这个参数只是提升了优先级,并不是说指定了这个参数就一定会成为新主库)
-
no_master:通过在目标服务器的配置段落设置no_master=1,它永远也不会变为新主库,用于配置在不想用于接管主库故障的从库上,如:只是一个binlog server,或者硬件配置比较差的从库上,或者这个从库只是一个远程灾备的从库,但是,要注意,不能把所有的从库都配置这个参数,这样MHA检测到没有可用备主的时候,会中断故障转移操作
-
ignore_fail:默认情况下,MHA在做故障转移的时候,会去检测所有的server,如果发现有任何的从库有问题(比如不能通过SSH检测主机或者mysql的存活,或者说有SQL线程复制错误等)就不会进行故障转移操作,但是,有时候可能需要在特定从库有故障的情况下,仍然继续进行故障转移,就可以使用这个参数指定它。默认是0,需要设置时在对应服务器的配置段下添加ignore_fail=1
-
skip_init_ssh_check:监控程序启动的时候,跳过SSH连接检测
- skip_reset_slave:0.56开始支持,master故障转移之后,跳过执行reset slave all语句
- user:目标mysql实例的管理帐号,尽量是root用户,因为运行所有的管理命令(如:stop slave,change master,reset slave)需要使用,默认是root
-
password:user参数指定的用户的密码,默认为空
-
repl_user:在所有slave上执行change master的复制用户名,这个用户最好是在主库上拥有replication slave权限
-
repl_password:repl_user参数指定的用户的密码,默认情况下,是当前复制帐号的密码,如果你运行了online master switch脚本且使用了–orig_master_is_new_slave做在线切换,当前主库作为了从库加入新主库,此时,如果你没有设置repl_password来指定复制帐号的密码,当前主库作为从库加入新主库的时候会在change master的时候失败,因为默认情况下这个密码是空的,MHA做切换的时候,其他所有作为从库加入新主库时,都需要使用这个密码
-
disable_log_bin:如果设置这个参数,当应用差异日志到从库时,slave不生成binlog写入,内部通过mysqlbinlog命令的–disable-log-bin选项实现
-
master_pid_file:设置master的pid,在运行多实例的环境下,你可能需要用到这个参数来指定master的pid,参考shutdown_script参数详解
-
ssh_user:访问MHA manger和MHA mysql节点的OS系统帐号,需要使用它来远程执行各种各样的管理mysql节点的命令(从manager到mysql),从latest slave拷贝差异日志到其他从库上(从mysql到mysql),该用户必须要能够没有任何交互地连接到服务器,通常使用ssh key认证,默认情况下,这个用户是manager所在的OS系统用户。
-
remote_workdir:每一个MHA node(指的是mysql server节点)生成日志文件的工作路径,这个路径是绝对路径,如果该路径目录不存在,则会自动创建,如果没有权限访问这个路径,那么MHA将终止后续过程,另外,你需要关心一下这个路径下的文件系统是否有足够的磁盘空间,默认值是/var/tmp
-
master_binlog_dir:在master上生成binlog的绝对路径,这个参数用在master挂了,但是ssh还可达的时候,从主库的这个路径下读取和复制必须的binlog events,这个参数是必须的,因为master的mysqld挂掉之后,没有办法自动识别master的binlog存放目录。默认情况下,master_binlog_dir的值是/var/lib/mysql,/var/log/mysql,/var/lib/mysql目录是大多数mysql分支默认的binlog输出目录,而 /var/log/mysql是ubuntu包的默认binlog输出目录,这个参数可以设置多个值,用逗号隔开
-
log_level:manager记录日志的等级,默认以及大多数场景下都是info级别,可以设置的值为debug/info/warning/error
-
manager_workdir:mha manager生成的相关状态文件的绝对路径,如果没有设置,则默认使用/var/tmp
-
client_bindir: 如果mysql命令工具是安装在非标准路径下,那么使用这个参数指定绝对路径
-
client_libdir:如果mysql的库文件是安装在非标准路径下,那么使用这个参数指定据对路径
-
manager_log:mha manager生成的日志据对路径,如果没有设置,mha manager将打印在标准输出,标准错误输出上,如:当mha manager执行故障转移的时候,这些信息就会打印
-
check_repl_delay:默认情况下,如果从库落后主库100M的relay logs,MHA不会选择这个从库作为新主库,因为它会增加恢复的时间,设置这个参数为0,MHA在选择新主库的时候,则忽略复制延迟,这个选项用在你使用candidate_master=1 明确指定需要哪个从库作为新主库的时候使用。
-
check_repl_filter:默认情况下,如果master和slave相互之间有任何不同的binlog复制过滤规则,MHA将打印错误日志并拒绝启动监控程序或者拒绝故障转移操作,这是为了避免意外出现类似Table not exists这样的错误,如果你100%确定不同的复制过滤规则不会出现恢复问题,那么就设置check_repl_filter = 0,此时MHA在应用差异日志的时候就不会去检测复制过滤规则,但是你可能会碰到Table not exists这样的错误,使用这个参数要非常小心
-
latest_priority:默认情况下,latest slave(收到最新的binlog的slave),优先作为新主库,如果你想控制这个优先级顺序,可以通过 latest_priority=0,此时,就会按照配置文件中配置的顺序来选择新主库(如 host2->host3->host4)。
-
multi_tier_slave:从0.52版本开始,支持多个主库的复制架构,默认情况下,在配置文件中不支持三个或更多层级的复制架构,例如:host2从host1复制,host3从host2复制,默认情况下,是不允许host1,2,3同时可写的。因为这个是一个三层复制,MHA manager会报错并停止,设置这个参数之后,MHA manager不会中断三层复制架构的监控,只是忽略了第三层,即host3,如果host1挂了,host2将接管host1,被选择为新主库,host3继续从host3复制。
-
ping_interval:这个参数表示mha manager多久ping(执行select ping sql语句)一次master,连续三个丢失ping连接,mha master就判定mater死了,因此,通过4次ping间隔的最大时间的机制来发现故障,默认是3,表示间隔是3秒
-
ping_type:从0.53版本开始支持,默认情况下,mha master基于一个到master的已经存在的连接执行select 1(ping_type=select)语句来检查master的可用性,但是在有些场景下,最好是每次通过新建/断开连接的方式来检测,因为这能够更严格以及更快速地发现TCP连接级别的故障,把ping_type设置为connect就可以实现。从0.56开始新增了ping_type=INSERT类型。
-
secondary_check_script:通常,推荐通过两个或者更多的网络路径来检测master的可用性,默认情况下,MHA只是通过单个网络路径来检测,即从mha master到master的路线,但是不推荐这么做,mha可以通过secondary_check_script 参数来调用一个外部的脚本来实现两个或更多个网络路径来检测master的可用性,配置示例如下:
secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2 masterha_secondary_check 脚本包含在mha manager的安装包里,这个脚本适合大多数的场景,但是你可以调用任何你自定义的脚本。 在上述的示例中,mha manager检测master的存活的网络路径是:mha manager–>remote_host1–>master_host和mha manager–>remote_host2–>master_host,如果两条线路中,mha master到远程主机的连接是通的,但是远程主机到master不通,这个脚本返回状态0,那么mha就判定master死了。 将开始执行故障转移。如果mha manager到远程主机都不通,那么这个脚本返回状态2,mha manager就猜测网络可能发生了问题了,拒绝执行故障转移操作。如果两条线路从头到位都走通了,那么这个脚本返回状态3,此时mha master知道主库是或者的,就不会进行故障转移操作。 通常来说,remote_host1和remote_host2需要处于本地的两个不同的网段 mha调用secondary_check_script 脚本自动地传递如下参数(不需要你在配置文件中的secondary_check_script 参数中指定这些参数),如果你需要更多的功能,你可以自定义这个脚本: –user:远程主机ssh用户名,如果指定了这个,那么ssh_user参数就会被忽略 –master_host:指定master的主机名(实例) –master_ip:指定master的IP(实例) –master_port:指定master的端口号(实例) PS:运行这个脚本需要依赖perl的 IO::Socket::INET包,这个包包含在perl的5.6.0里,masterha_secondary_check 脚本仍然通过免密钥的ssh来连接远程服务器,这个脚本尝试从远程服务器建立到master的TCP连接,这个意思是my.cnf中的max_connections 参数对这个么有 影响,如果这个TCP连接成功了,在mysql的Aborted_connects 变量中会增加1 -
master_ip_failover_script:通常在MHA环境下,通常需要分配一个VIP供master用于对外提供读写服务,如果master挂了,HA软件指引备用服务器接管VIP,另外一个通用的方法,是在数据库中创建一个全局的应用程序名称与读写IP地址之间的全局类目映射( {app1_master1, 192.168.0.1}, {app_master2, 192.168.0.2}, …)来代替VIP地址的使用,在这种情况下,如果你的master挂了,你需要更新这个数据库中的全局类目映射。第二种方法这里个人觉得跟智能DNS解析类似。
两种方法各有优缺点,MHA不强制使用哪一种方法,但是允许用户使用任何IP地址做故障转移的方案,master_ip_failover_script 参数可以用于实现这个目的,换句话说,你需要自己编写一个脚本来透明地把应用程序连接到新主库上。需要在配置文件中定义这个参数,示例如下: master_ip_failover_script= /usr/local/sample/bin/master_ip_failover mha manager安装包中(tar包和githup分支上才有,rpm包没有)的samples/scripts/master_ip_failover路径下有一个简单的脚本 mha manager会调用master_ip_failover_script 这个参数指定的脚本三次,第一次是在进入主库监控之前(为了检测脚本的有效性),第二次是将要调用shutdown_script参数的脚本之前,第三次是新主库应用完成了差异relay log之后,mha manager调用这个脚本会用到如下参数(注意:你不需要在配置文件中这个参数上单独设置这些) 检测阶段参数: –command=status –ssh_user=(current master's ssh username) –orig_master_host=(current master's hostname) –orig_master_ip=(current master's ip address) –orig_master_port=(current master's port number) 关闭当前master的阶段参数(注意,到调用shutdown_script的时候,主库已经被判定为死了): –command=stop or stopssh –ssh_user=(dead master's ssh username, if reachable via ssh) –orig_master_host=(current(dead) master's hostname) –orig_master_ip=(current(dead) master's ip address) –orig_master_port=(current(dead) master's port number) 新的master激活阶段参数: –command=start –ssh_user=(new master's ssh username) –orig_master_host=(dead master's hostname) –orig_master_ip=(dead master's ip address) –orig_master_port=(dead master's port number) –new_master_host=(new master's hostname) –new_master_ip=(new master's ip address) –new_master_port(new master's port number) –new_master_user=(new master's user) –new_master_password(new master's password) 如果你在master上使用的是共享VIP,那么在master的shutdown阶段就不需要做任何事情,只要在shutdown_script脚本关闭机器的电源之后,在新的master的激活阶段,在新的master上分配这个VIP即可,如果你使用的是一个全局类目映射的方案,你可能需要在shutdown死掉的master阶段之后,删除或者更新对应的dead master的记录。在新的master的激活阶段,你可以新增或者更新对应的新的master的记录,然后,你可以做一些事情(如:在新主库上执行set global read_only=0;以及创建数据库用户的写权限),以便应用程序就可以在新的主库上写入数据了 mha manager会检测脚本执行退出的代号,如果是0或者10,mha manager则继续操作,如果返回的是0和10以外的代号,mha manager停止并中断故障转移,默认情况下,这个参数为空,所以,默认情况下mha不会调用这个脚本做任何事情。 -
master_ip_online_change_script:这是一个与master_ip_failover_script 参数很接近的参数,但是这个参数不使用故障转移命令,而是master的在线change命令(masterha_master_switch –master_state=alive),使用如下参数(注意:你不需要在配置文件中这个参数上单独设置这些):
冻结当前主库写操作阶段的参数: –command=stop or stopssh –orig_master_host=(current master's hostname) –orig_master_ip=(current master's ip address) –orig_master_port=(current master's port number) –orig_master_user=(current master's user) –orig_master_password=(current master's password) –orig_master_ssh_user=(from 0.56, current master's ssh user) –orig_master_is_new_slave=(from 0.56, notifying whether the orig master will be new slave or not) 允许新的主库写阶段的参数: –command=start –orig_master_host=(orig master's hostname) –orig_master_ip=(orig master's ip address) –orig_master_port=(orig master's port number) –new_master_host=(new master's hostname) –new_master_ip=(new master's ip address) –new_master_port(new master's port number) –new_master_user=(new master's user) –new_master_password=(new master's password) –new_master_ssh_user=(from 0.56, new master's ssh user) 在冻结当前主库写的阶段,mha manager在当前主库上执行FLUSH TABLES WITH READ LOCK,你可以写任何的逻辑来优雅地实现主库的切换(参考http://www.slideshare.net/matsunobu/automated-master-failover/44),在新的master允许写的阶段,你可以做和master_ip_failover_script脚本的第三阶段几乎一样的事情,例如:在新的主库上创建写权限用户和执行set global read_only=0语句,或者更新全局类目映射记录,如果这个脚本执行返回状态吗是0或者10以外的值,mha manager将终止并停止master在线切换操作。默认这个参数为空,mha不会调用这个参数做任何事情,在mha manager的tar包和githup分支下的samples/scripts/master_ip_online_change路径下有一个简单的脚本。 -
shutdown_script:你可能想要强制关闭master节点来避免master节点重新启动服务,这对于避免脑裂来说是很重要的,示例:
shutdown_script= /usr/local/sample/bin/power_manager 在mha manager的tar包和github的分支的samples/scripts/power_manager路径下有一个简单的脚本,在调用这个脚本之前,mha manager内部会通过ssh去检测master是否可达,如果ssh可达(主机OS活着但是mysqld挂了),mha manager使用如下参数: –command=stopssh –ssh_user=(ssh username so that you can connect to the master) –host=(master's hostname) –ip=(master's ip address) –port=(master's port number) –pid_file=(master's pid file) 如果master通过ssh不可达,那么mha manager就会使用如下参数: –command=stop –host=(master's hostname) –ip=(master's ip address) 这个脚本工作流程如下: 如果通过–command=stopssh参数,这个脚本通过ssh过去master上kill -9杀掉mysqld和mysqld_safe进程,如果同时也通过–pid_file参数,这个脚本通过ssh过去主库上只kill -9杀掉指定的进程号,不会杀掉所有的进程,这个对在master上运行多实例的时候有帮助,如果通过ssh停止成功,这个脚本退出状态是10,如果退出状态是10,mha manager随后就通过ssh连接到master保存必要的binlog,如果这个脚本通过ssh连接master失败,或者mha manager是使用的参数 –command=stop,这个脚本就会尝试关闭机器的电源,关闭机器的命令依赖硬件(For HP(iLO), 通常是ipmitool or SSL,For Dell(DRAC), 通常是dracadm),如果关闭电源成功,这个脚本的退出状态是0,否则退出的状态是1,如果这个脚本的退出状态是0,则mha manager开始执行故障转移过程,如果这个状态是0和10以外的其他状态,则mha终止故障转移,默认这个参数为空,所以mha不会调用这个参数做任何事情。 另外,mha manager开始监控的时候会调用shutdown_script 参数,在这次调用会使用以下参数,在这里可以检测脚本的设置,控制电源需要高度依赖硬件,所以建议要检测电源的状态,如果发现什么问题,你可以在启动监控程序之前去解决。 –command=status –host=(master's hostname) –ip=(master's ip address) -
report_script:在故障转移完成或者说因为错误而终止的时候,你可能希望发送一个报告出来,这就是使用report_script 参数的目的,mha manager通过如下参数使用这个脚本:
–orig_master_host=(dead master's hostname) –new_master_host=(new master's hostname) –new_slave_hosts=(new slaves' hostnames, delimited by commas) –subject=(mail subject) –body=(body) 默认情况下,这个参数是空的,mha manager不会调用这个参数做任何事情,在mha manager的tar包和github分支的samples/scripts/send_report路径下有一个简单的脚本。 -
init_conf_load_script:这个脚本在你不想在配置文件中设置纯文本的信息的时候使用(比如:password和repl_password),从这个脚本返回name=value的键值对,它可以作为全局配置文件参数,示例脚本内容如下:
-
#!/usr/bin/perl
print "password=$ROOT_PASS\n";
print "repl_password=$REPL_PASS\n";
这个参数默认为空,所以mha manager不会调用这个参数做任何事情