目录
master_ip_online_change_script
| Parameter Name | Required? | Parameter Scope | Default Value | Example |
|---|---|---|---|---|
| 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 | - (current replication password) | 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 | init_conf_load_script = /usr/local/custom_script/init_conf_loader |
目标 MySQL 服务器的主机名或 IP 地址。此参数是强制性的,并且必须在应用配置文件中的 [server_xxx] 块下进行配置。
目标 MySQL 服务器的 IP 地址。默认值是通过 gethostbyname($hostname) 获取的。MHA 管理器和 MHA 节点在内部使用此 IP 地址通过 MySQL 和 SSH 进行连接。通常情况下,您不需要配置此参数,因为它会自动从主机名参数中解析出来。
目标 MySQL 服务器的端口号。默认值是 3306。MHA 使用 IP 地址和端口连接到 MySQL 服务器。
(从 0.53 版本开始支持)
用于 SSH 的目标 MySQL 服务器的主机名或 IP 地址。当您处于多 VLAN 配置时,此参数 (和 ssh_port 参数) 是有用的:出于安全原因,不允许在数据 VLAN 上进行 SSH。默认值与主机名相同。
(从 0.53 版本开始支持)
用于 SSH 的目标 MySQL 服务器的 IP 地址。默认值是通过 gethostbyname($ssh_host) 获取的。
(从 0.53 版本开始支持)
用于 SSH 的目标 MySQL 服务器的端口号。默认值是 22。
(从 0.54 版本开始支持)
默认值为 5 秒。在添加此参数之前,超时是硬编码的。
(从 0.53 版本开始支持)
附加的 SSH 命令行选项。
您可能在从服务器之间使用不同类型的机器,并希望将最可靠的机器提升为新主服务器(例如,将 RAID1+0 从属服务器提升为 RAID0 从属服务器)。
通过将 candidate_master 设置为 1,只要满足成为新主服务器的条件(例如启用了二进制日志,不会显著延迟复制等),服务器就会优先考虑成为新主服务器。因此,candidate_master=1 并不意味着指定的主机在当前主服务器崩溃时总是成为新主服务器,但在设置优先级时很有帮助。
如果在多个服务器上将 candidate_master 设置为 1,则优先级由块名称([server_xxx])的排序顺序决定。[server_1] 的优先级将高于 [server_2]。
通过在目标服务器上设置 no_master=1,该服务器永远不会成为新主服务器。如果您有一些不应成为新主服务器的服务器,则此选项很有用。例如,当您在不可靠的(RAID0)机器上运行从属服务器或者在远程数据中心运行从属服务器时,您可能想要设置 no_master=1。请注意,如果没有从属服务器可以成为新主服务器,MHA 将中止并且不会开始监视/故障转移。
默认情况下,如果任何一个从属服务器失败(无法通过 MySQL/SSH 连接,SQL 线程停止并出现错误等),MHA 管理器不会启动故障转移。但在某些情况下,您可能希望仅在特定从属服务器失败时继续故障转移。通过在特定服务器上设置 ignore_fail=1,即使这些服务器失败,MHA 也会继续故障转移。默认情况下,它是 0。
在初始启动时跳过 SSH 连通性检查。
(从 0.56 版本开始支持)
在主服务器故障转移后跳过执行 RESET SLAVE(ALL)。
连接到目标 MySQL 服务器的 MySQL 管理数据库用户名。这应该是 root,因为它运行所有必要的管理命令,例如 STOP SLAVE、CHANGE MASTER、RESET SLAVE。默认情况下,它是 root。
“user”用户的 MySQL 密码。默认情况下为空。
在每个从属服务器上 CHANGE MASTER TO master_user .. 时使用的 MySQL 复制用户名。此用户应在目标主服务器上具有 REPLICATION SLAVE 权限。默认情况下,将使用新主服务器上 SHOW SLAVE STATUS(当前作为从属服务器运行)中的 Master_User。
“repl_user”用户的 MySQL 密码。默认情况下,它是当前复制密码。这意味着当前主服务器的密码。如果您使用设置 --orig_master_is_new_slave(这意味着当前主服务器作为新主服务器的新从属服务器运行)进行在线主服务器切换,而没有设置 repl_password,那么启动从属服务器将失败,因为当前主服务器上的默认复制密码为空(MHA 将在原始主服务器上执行 change master 而不在其他从属服务器上设置复制密码)。
当设置了此选项时,将差异中继日志应用到从属服务器时,从属服务器不会生成二进制日志。内部 MHA 将 --disable-log-bin 传递给 mysqlbinlog 命令。
设置主服务器的进程 ID 文件。当您在单个服务器内运行多个 MySQL 实例时,这可能很有用。有关详细信息,请参见 shutdown_script 参数。
MHA 管理器和 MHA 节点用于访问 MySQL 服务器的操作系统用户名。这是为各种目的所需的,例如远程执行命令(管理器->MySQL)、将差异中继日志从最新的从属服务器复制到其他从属服务器(MySQL->MySQL)等。
此用户必须至少具有 MySQL 二进制/中继日志文件和 relay_log.info 文件的读权限,以及日志目录(每个 MySQL 服务器上的 remote_workdir)的写权限。
此用户必须能够连接到服务器而无需任何交互操作。通常建议使用 SSH 公钥身份验证。默认情况下,ssh_user 是管理器上的当前操作系统用户。
每个 MHA 节点(运行在 MySQL 服务器上的)生成日志文件的工作目录的完整路径名。如果不存在,则 MHA 节点会自动创建它。如果未授予足够的权限,则 MHA 节点将中止。请注意,MHA 管理器和 MHA 节点都不会检查可用磁盘空间,因此您需要关注它。默认情况下,remote_workdir 是 "/var/tmp"。
主服务器上 MySQL 生成二进制日志的目录完整路径名。如果死亡的 MySQL 主服务器通过 SSH 可访问,为了读取和复制必要的二进制日志事件,则需要此参数。如果主 MySQL 已死机,则无法自动标识二进制日志目录。
默认情况下,master_binlog_dir 是 "/var/lib/mysql,/var/log/mysql"。/var/lib/mysql 是大多数 MySQL 发行版的默认二进制日志输出目录,而 /var/log/mysql 是 Ubuntu MySQL 软件包的默认二进制日志输出目录。您可以使用逗号分隔的多个目录设置多个目录(例如 /data1,/data2,…)。
日志级别 MHA 管理器打印的日志阈值。默认为 info,在大多数情况下应该没问题。可以设置为 debug/info/warning/error 之一。
MHA 管理器生成相关状态文件的工作目录的完整路径。如果未设置,则使用 /var/tmp。
如果 MySQL 命令行实用程序安装在非标准目录下,请使用此选项设置目录。
如果 MySQL 库安装在非标准目录下,请使用此选项设置目录。
MHA 管理器生成日志的完整路径文件名。如果未设置,则 MHA 管理器打印到 STDOUT/STDERR。在执行手动故障转移(交互式故障转移)时,MHA 管理器会忽略 manager_log 设置,并始终打印到 STDOUT/STDERR。
默认情况下,如果从属服务器落后于主服务器超过 100MB 的中继日志(需要应用超过 100MB 的中继日志),MHA 不会将从属服务器选为新主服务器,因为恢复需要太长时间。通过将 check_repl_delay 设置为 0,当选择新主服务器时,MHA 会忽略复制延迟。当您在特定主机上设置了 candidate_master=1,并且希望确保该主机可以成为新主服务器时,此选项很有用。
默认情况下,如果主服务器和从属服务器的任何一个具有不同的二进制日志/复制过滤规则,MHA 会打印错误并且不会启动监视或故障转移。这是为了避免意外的恢复错误,例如“表不存在”。如果您百分之百确定不同的过滤设置不会导致恢复问题,请设置 check_repl_filter = 0。请注意,MHA 不会在应用差异中继日志时检查过滤规则,因此如果设置 check_repl_filter = 0,则可能会遇到“表不存在”(或其他)错误。如果设置此参数,请非常小心。
默认情况下,最新的从属服务器(接收到最新的二进制日志事件的从属服务器)被优先选择为新主服务器。如果要完全控制优先级的顺序(例如 host2->host3->host4..),设置 latest_priority=0 将有所帮助。有关详细信息,请参见 FAQ。
(从 0.52 版本开始支持)
从 MHA 管理器版本 0.52 开始,支持多主复制配置。默认情况下,不允许在 MHA 配置文件中设置三个或更多级别的从属服务器:例如,假设 host2 从 host1 复制,host3 从 host2 复制。默认情况下,不允许在配置文件中写入 host1,2,3,因为这是三级复制,而 MHA 管理器会报错并停止。通过设置 multi_tier_slave,MHA 管理器不会因为三级复制而中止,而只是简单地忽略第三级主机。如果主机1(主)崩溃,主机2 将被选为主服务器,并且主机3 将继续从主机2 复制。
此参数说明 MHA Manager 多久 ping(执行 ping SQL 语句)一次主服务器。连续错过三个连接间隔后,MHA 管理器确定 MySQL 主服务器已死亡。因此,通过 ping 机制发现故障的最长时间是 ping 间隔的四倍。默认为 3(3 秒)。
如果 MHA 管理器由于太多连接或身份验证错误而无法连接,则不会将主服务器视为已死亡。
(从 0.53 版本开始支持)
默认情况下,MHA 建立到主服务器的持久连接,并通过执行 "SELECT 1"(ping_type=SELECT)检查主服务器的可用性。但在某些情况下,最好每次连接/断开连接都进行检查,因为它更严格,可以更快地检测到 TCP 连接级别的故障。设置 ping_type=CONNECT 可以实现这一点。从 0.56 版本开始,添加了 ping_type=INSERT。
通常情况下,强烈建议有两个或更多的网络路由来检查 MySQL 主服务器的可用性。默认情况下,MHA 管理器仅检查单个路由:从管理器到主服务器。但这并不推荐。实际上,MHA 可以通过调用在 secondary_check_script 参数中定义的外部脚本来具有两个或多个检查路由。下面是一个示例配置。
secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2
masterha_secondary_check 包含在 MHA 管理器软件包中。内置的 masterha_secondary_check 脚本在大多数情况下应该是可以的,但您可以在这里调用任何脚本。
在上述示例中,MHA 管理器通过 Manager-(A)->remote_host1-(B)->master_host 和 Manager-(A)->remote_host2-(B)->master_host 两个路由检查 MySQL 主服务器的活动。如果连接 A 成功且 B 在两条路由中均失败,则 masterha_secondary_check 以返回代码 0 退出,MHA 管理器确定 MySQL 主服务器实际上已死亡,并将启动故障转移。如果 A 失败,masterha_secondary_check 以返回代码 2 退出,MHA 管理器猜测发生了网络问题,并且不会启动故障转移。如果 B 成功,masterha_secondary_check 以返回代码 3 退出,MHA 管理器了解到 MySQL 主服务器实际上是活动的,并且不会启动故障转移。
一般来说,remote_host1 和 remote_host2 应该位于 MHA 管理器和 MySQL 服务器的不同网络段上。
MHA 在 secondary_check_script 参数中调用一个脚本,并自动传递以下参数(因此您不需要在配置文件中设置以下参数)。masterha_secondary_check 在许多情况下应该是合适的,但是如果需要更多功能,可以编写任何网络检查脚本。
请注意,内置的 masterha_secondary_check 脚本依赖于 IO::Socket::INET Perl 包,默认情况下从 Perl v5.6.0 开始包含。masterha_secondary_check 脚本还通过 SSH 连接到所有远程服务器,因此需要 SSH 公钥身份验证设置。此外,masterha_secondary_check 脚本尝试从远程服务器(由 -s 设置)到 MySQL 主服务器建立 TCP 连接。这意味着 my.cnf 中的 max_connections 设置不受影响。如果 TCP 连接成功,主服务器上的 Aborted_connects 状态变量将增加 1。
在常见的高可用环境中,很多情况下人们会在主服务器上分配一个虚拟IP地址。如果主服务器崩溃,像Pacemaker这样的高可用软件会接管虚拟IP地址到备用服务器。
另一种常见方法是创建一个全局目录数据库,其中包含所有应用程序名称和写入者/读取者IP地址之间的映射(例如{app1_master1, 192.168.0.1},{app_master2, 192.168.0.2},…),而不是使用虚拟IP地址。在这种情况下,当当前主服务器失效时,您需要更新目录数据库。
这两种方法各有利弊。MHA不强制使用一种方法,而是允许用户使用任何IP地址故障转移解决方案。master_ip_failover_script参数可以用于此目的。换句话说,您需要编写一个脚本使应用程序能够透明地连接到新的主服务器,并且必须在master_ip_failover_script参数中定义。以下是一个示例。
master_ip_failover_script= /usr/local/sample/bin/master_ip_failover
示例脚本位于(MHA Manager package)/samples/scripts/master_ip_failover。示例脚本包含在MHA Manager压缩包和GitHub分支中。
MHA Manager调用master_ip_failover_script三次。第一次是在进入主监视之前(用于脚本有效性检查),第二次是在调用shutdown_script之前,第三次是在将所有中继日志应用到新主服务器之后。MHA Manager传递以下参数(您无需在配置文件中设置这些参数)。
如果您在主服务器上使用共享虚拟IP地址,您可能不需要在主服务器关闭阶段执行任何操作,只要稍后在shutdown_script中关闭该机器即可。在新主服务器激活阶段,您可以在新主服务器上分配虚拟IP。如果您使用目录数据库方法,则可能需要在主服务器关闭阶段删除或更新死亡主服务器的记录。在新主服务器激活阶段,您可以插入/更新新主服务器的记录。此外,您可以执行一切必要的操作,以使应用程序能够写入新的主服务器。例如,SET GLOBAL read_only=0,创建具有写权限的数据库用户等。
MHA Manager检查脚本的退出代码(返回代码)。如果脚本以返回代码0或10退出,则MHA Manager继续操作。如果脚本以除0或10之外的返回代码退出,则MHA Manager中止操作,不会继续故障转移。默认参数为空,因此MHA Manager不会默认调用任何内容。
您可能希望强制关闭主服务器,以便它永远不会重新启动服务(节点屏障)。这对于避免拆分大脑非常重要。以下是一个示例。
shutdown_script= /usr/local/sample/bin/power_manager
示例脚本位于(MHA Manager package)/samples/scripts/power_manager。示例脚本包含在MHA Manager压缩包和GitHub分支中。
在调用shutdown_script之前,MHA Manager会在内部检查MySQL主服务器是否通过SSH可访问。如果SSH可访问(操作系统处于活动状态,但mysqld未运行,即数据文件损坏),MHA Manager会传递以下参数。
如果主服务器无法通过SSH访问,则MHA Manager会传递以下参数。
示例脚本的工作原理如下。如果传递了--command=stopssh,则脚本通过SSH在主服务器上使用-9杀死所有mysqld和mysqld_safe进程。如果还传递了--pid_file,则脚本尝试仅杀死指定的进程,而不是杀死所有mysqld进程,如果失败,则杀死所有mysqld和mysqld_safe进程。当您在主服务器上运行多个mysqld实例时,这很有帮助。如果通过SSH停止成功,则脚本以返回代码10退出。如果退出代码为10,则MHA管理器稍后通过SSH连接到主服务器并保存必要的二进制日志。如果脚本无法通过SSH连接到主服务器或者MHA Manager传递了--command=stop,则脚本会尝试关闭计算机电源。关闭电源命令取决于硬件。对于HP(iLO),ipmitool或SSL很常见。对于戴尔(DRAC),dracadm很常见。如果关闭电源成功,则脚本以返回代码0退出。否则以返回代码1退出。如果退出代码为0,则MHA Manager启动故障转移流程。如果退出代码不是0或10,则MHA Manager中止故障转移。默认参数为空,因此MHA Manager不会默认调用任何内容。
此外,MHA Manager在启动监控时会调用shutdown_script。在那时传递以下参数。您可以在此处检查脚本设置。控制电源高度取决于硬件,因此强烈建议在此处检查电源状态。如果有任何问题,您可以在开始监控之前意识到。
当故障转移完成或以错误结束时,您可能希望发送报告(例如电子邮件)。report_script可用于此目的。MHA Manager传递以下参数。
默认参数为空,因此MHA Manager不会默认调用任何内容。
示例脚本位于(MHA Manager package)/samples/scripts/send_report。示例脚本包含在MHA Manager压缩包和GitHub分支中。
当您不想在配置文件中设置纯文本时(例如密码和repl_password)可以使用此脚本。通过从此脚本返回“name=value”对,您可以覆盖全局配置文件参数。示例脚本如下。
- #!/usr/bin/perl
-
- print "password=$ROOT_PASS\n";
- print "repl_password=$REPL_PASS\n";
默认参数为空,因此MHA Manager不会默认调用任何内容。