• 【MHA】MySQL高可用MHA介绍2-安装,配置,要求与限制


    目录

    一 快速开始

    简单故障转移

    1 构建普通的复制环境

    2 在host1-host4上安装MHA Node

    3 在host4(manager_host)上安装MHA Manager

    4 创建配置文件

    5 检查SSH连接

    6 检查复制配置

    7 启动manager

    8 检查manager状态

    9 停止manager

    10 测试主故障转移

    11 下一步

    二 安装

    1 下载 MHA Node 和 MHA Manager

    2 安装 MHA Node

    在RHEL/CentOS系统上

    在Ubuntu/Debian系统上

    通过源码进行安装

    3 安装 MHA Manager

    在RHEL/CentOS发行版上,

     在Ubuntu/Debian系统上

    通过源码进行安装MHA Manager

    三 配置

    1 编写应用程序配置文件

    2 编写全局配置文件

    3 Binlog Server

    四 要求与限制

    1 SSH公钥认证

    2 操作系统

    3 单可写主服务器和多个从服务器或只读主服务器

    4 管理三层或更多层次的复制环境

    5 MySQL版本5.0或更高版本

    6 对于MySQL 5.1+使用mysqlbinlog 5.1+

    7 候选主服务器必须启用log-bin

    8 所有服务器上的二进制日志和中继日志过滤规则必须相同

    9 候选主服务器上必须存在复制用户

    10 保留中继日志并定期清除

    purge_relay_logs脚本

    定期运行purge_relay_logs脚本的计划

    不要在使用基于语句的二进制日志记录(SBR)时使用 LOAD DATA INFILE

    五 基于 GTID 的故障切换


    一 快速开始

    简单故障转移

    1 构建普通的复制环境

    MHA本身不会构建复制环境,因此您需要自己搭建MySQL复制环境。换句话说,您可以在现有环境中使用MHA。例如,假设有四个主机:host1、host2、host3、host4。主服务器当前正在host1上运行,并且两个从服务器正在host2和host3上运行。因此,MySQL服务器正在host1、host2和host3上运行。让我们在host4(manager_host)上运行MHA Manager。

    2 在host1-host4上安装MHA Node

    请参阅安装MHA Node。

    3 在host4(manager_host)上安装MHA Manager

    请参阅安装MHA Manager。MHA Manager依赖于MHA Node软件包,因此您需要在管理服务器上同时安装这两个软件包。

    4 创建配置文件

    下一步是在MHA Manager上创建一个配置文件。参数包括每个MySQL服务器的主机名、MySQL用户名和密码、MySQL复制用户名和密码、工作目录名称等。所有参数都在参数页面中描述。

    1. manager_host$ cat /etc/app1.cnf
    2. [server default]
    3. # mysql user and password
    4. user=root
    5. password=mysqlpass
    6. ssh_user=root
    7. # working directory on the manager
    8. manager_workdir=/var/log/masterha/app1
    9. # working directory on MySQL servers
    10. remote_workdir=/var/log/masterha/app1
    11. [server1]
    12. hostname=host1
    13. [server2]
    14. hostname=host2
    15. [server3]
    16. hostname=host3

    请注意,您没有指定host1是当前的主服务器。MHA会在内部自动检测当前的主服务器。

    5 检查SSH连接

    MHA Manager会通过SSH内部调用MHA Node软件包中包含的程序。MHA Node程序还通过SSH(scp)将差异中继日志文件发送给其他非最新的从服务器。为了使这些过程非交互式,需要设置SSH公钥身份验证。MHA Manager提供了一个简单的检查程序“masterha_check_ssh”,用于验证彼此之间是否可以建立非交互式的SSH连接。

    1. # masterha_check_ssh --conf=/etc/app1.cnf
    2. Sat May 14 14:42:19 2011 - [warn] Global configuration file /etc/masterha_default.cnf not found. Skipping.
    3. Sat May 14 14:42:19 2011 - [info] Reading application default configurations from /etc/app1.cnf..
    4. Sat May 14 14:42:19 2011 - [info] Reading server configurations from /etc/app1.cnf..
    5. Sat May 14 14:42:19 2011 - [info] Starting SSH connection tests..
    6. Sat May 14 14:42:19 2011 - [debug] Connecting via SSH from root@host1(192.168.0.1) to root@host2(192.168.0.2)..
    7. Sat May 14 14:42:20 2011 - [debug] ok.
    8. Sat May 14 14:42:20 2011 - [debug] Connecting via SSH from root@host1(192.168.0.1) to root@host3(192.168.0.3)..
    9. Sat May 14 14:42:20 2011 - [debug] ok.
    10. Sat May 14 14:42:21 2011 - [debug] Connecting via SSH from root@host2(192.168.0.2) to root@host1(192.168.0.1)..
    11. Sat May 14 14:42:21 2011 - [debug] ok.
    12. Sat May 14 14:42:21 2011 - [debug] Connecting via SSH from root@host2(192.168.0.2) to root@host3(192.168.0.3)..
    13. Sat May 14 14:42:21 2011 - [debug] ok.
    14. Sat May 14 14:42:22 2011 - [debug] Connecting via SSH from root@host3(192.168.0.3) to root@host1(192.168.0.1)..
    15. Sat May 14 14:42:22 2011 - [debug] ok.
    16. Sat May 14 14:42:22 2011 - [debug] Connecting via SSH from root@host3(192.168.0.3) to root@host2(192.168.0.2)..
    17. Sat May 14 14:42:22 2011 - [debug] ok.
    18. Sat May 14 14:42:22 2011 - [info] All SSH connection tests passed successfully.

    如果masterha_check_ssh停止并出现错误或要求进行身份验证,则SSH配置对于MHA的正常工作无效。您需要修复它然后再次尝试。最可能的原因是SSH公钥身份验证未正确设置。

    6 检查复制配置

    为了使MHA正常工作,配置文件中定义的所有MySQL主服务器和从服务器都必须正常工作。MHA Manager提供了一个名为masterha_check_repl的命令,用于快速检查复制的健康状况。

    1. manager_host$ masterha_check_repl --conf=/etc/app1.cnf
    2. ...
    3. MySQL Replication Health is OK.

    如果在这里遇到任何错误,请检查日志并修复问题。当前的主服务器不能是从服务器,并且所有其他从服务器必须从主服务器复制。TypicalErrors页面可能有助于修复设置错误。

    7 启动manager

    您已配置了MySQL复制,安装了MHA Node和MHA Manager,并配置了SSH公钥身份验证。下一步是启动MHA Manager。可以使用masterha_manager命令启动MHA Manager。

    1. manager_host$ masterha_manager --conf=/etc/app1.cnf
    2. ....
    3. Sat May 14 15:58:29 2011 - [info] Connecting to the master host1(192.168.0.1:3306) and sleeping until it doesn't respond..

    如果所有配置都有效,masterha_manager会检查MySQL主服务器的可用性,直到主服务器死机。如果masterha_manager在监视主服务器之前出现错误而停止,请检查错误日志并修复配置。所有日志默认打印到标准错误(STDERR),但可以在"manager_log"配置参数中更改。常见的错误是MySQL复制配置无效,ssh_user没有足够的权限(最低要求是中继日志的读权限和远程工作目录的写权限)。默认情况下,masterha_manager在前台运行。如果向masterha_manager发送SIGINT(发送Ctrl+C),masterha_manager将停止监控并退出。

    8 检查manager状态

    在MHA Manager监视MySQL主服务器之后,除非主服务器变得不可达或管理器自身终止,否则不会打印任何内容。您可能想要检查MHA Manager是否真的正常工作。masterha_check_status命令可用于检查当前MHA Manager的状态。以下是一个示例。

    1. manager_host$ masterha_check_status --conf=/etc/app1.cnf
    2. app1 (pid:5057) is running(0:PING_OK), master:host1

    "app1"是MHA内部处理的应用程序名称,是配置文件的前缀名称。

    如果管理器停止或配置文件无效,则将返回以下错误:

    1. manager_host$ masterha_check_status --conf=/etc/app1.cnf
    2. app1 is stopped(1:NOT_RUNNING).

    9 停止manager

    您可以使用masterha_stop命令停止MHA Manager。

    1. manager_host$ masterha_stop --conf=/etc/app1.cnf
    2. Stopped app1 successfully.

    如果无法停止(即挂起),请添加“--abort”参数。

    一旦您了解了如何停止它,请再次启动masterha_manager。

    10 测试主故障转移

    现在MHA Manager正在监控MySQL主服务器的可用性。接下来,让我们测试主故障转移是否正常工作。为了模拟这种情况,您可以简单地在主服务器上杀死mysqld。

    host1$  killall -9 mysqld mysqld_safe

    在某些发行版(如Ubuntu)上,mysqld将通过angel进程自动重新启动。如果mysqld重新启动非常快(几秒钟),则在MHA开始故障转移之前,来自MHA的ping将再次成功。在这种情况下,故障转移不会开始。如果重新启动mysqld花费很长时间(即InnoDB崩溃恢复需要2分钟),则故障转移将开始。

    如果您在测试杀死mysqld时遇到困难,或者想要测试Linux内核方面的问题,那么触发内核panic很容易。

    host1#  echo c > /proc/sysrq-trigger

    检查MHA管理器上的日志,并验证host2是否成为新主服务器,host3是否从host2复制。

    当故障转移完成(或以错误结束)时,MHA Manager进程将停止。这是一种预期行为。如果您想永久运行MHA Manager,请阅读“在后台运行MHA Manager”部分。

    11 下一步

    现在我们已经完成了主故障转移的基本测试。在实践中,您可能希望执行以下操作。

    • 通过两个或更多网络路由检查MySQL主服务器的可用性,请参阅secondary_network_script参数的详细信息。
    • 编写主IP故障转移脚本 在上述教程中,新主服务器的IP地址(host2的IP)已从死掉的主服务器的IP地址(host1的IP)更改。因此,应用程序必须更改主服务器的IP地址。这并不有趣。为了解决此问题,使用master_ip_failover_script参数会有所帮助。您可以编写任何程序来更新主服务器的IP地址。例如,接管虚拟IP地址,更新全局目录数据库等。MHA Manager包中包含了一个示例脚本(请参阅MHA Manager目录)/samples/scripts/master_ip_failover。示例脚本包含在MHA Manager压缩包和GitHub分支中。
    • 在后台运行MHA Manager有关详细信息,请参阅Runnning_Background页面。
    • 关闭MySQL主服务器,以便永远不会发生脑裂,请参阅shutdown_script参数和MHA Manager包中包含的一个示例脚本(请参阅MHA Manager目录)/samples/scripts/power_manager。
    • 故障转移完成后发送电子邮件,请参阅report_script参数和MHA Manager包中包含的一个示例脚本(请参阅MHA Manager目录)/samples/scripts/send_report。
    • 故障转移错误和手动故障转移测试

    您可能希望测试故障情况。请参阅下面的示例。

    1. terminal1# masterha_manager --conf=/etc/app1.cnf
    2. terminal2# mysql -hhost2 db1 -e "insert into t1 values (100, 100, 100)"
    3. terminal2# mysql -hhost1 db1 -e "insert into t1 values (100, 100, 100)"
    4. Check replication stops with error
    5. kill master
    6. Check master failover does not work.
    7. mysql_host2> set global slave_sql_skip_counter=1;
    8. mysql_host2> start slave;
    9. Check replication starts again.
    10. Test manual failover
    11. # remove error file
    12. # rm -f /var/log/masterha/mha_test50/mha_test50.failover.error
    13. # masterha_master_switch --master_state=dead --conf=/path/to/conf --dead_master_host=host1

    二 安装

    MHA由MHA Manager和MHA Node两个包组成。MHA Manager运行在管理服务器上,而MHA Node运行在每个MySQL服务器上。MHA Node程序并不总是运行,而是在需要时(在配置检查、故障转移等时)从MHA管理程序中调用。MHA Manager和MHA Node都是用Perl编写的。

    1 下载 MHA Node 和 MHA Manager

    可以从 下载  部分下载MHA Node和MHA Manager。这些是稳定的软件包。

    如果您想尝试源码开发,请检出GitHub源树。MHA Manager托管在这里,MHA Node托管在这里

    官方文档中的下载地址不能下载最新版本的Node 和 Manager 了,可以从以下地址下载最新的0.58版本

    Releases · yoshinorim/mha4mysql-manager · GitHub

    2 安装 MHA Node

    MHA Node具有以下脚本和依赖的Perl模块。

    • save_binary_logs:保存并复制挂掉的主服务器的二进制日志
    • apply_diff_relay_logs:识别差异中继日志事件并应用所有必要的日志事件
    • purge_relay_logs:清除中继日志文件

    您需要将MHA Node安装到所有MySQL服务器(主服务器和从服务器)。您还需要在管理服务器上安装MHA Node,因为MHA Manager模块在内部依赖于MHA Node模块。MHA Manager在内部通过SSH连接到受管MySQL服务器并执行MHA Node脚本。MHA Node除了DBD::mysql之外不依赖于任何外部Perl模块,因此您应该能够轻松安装。

    您可以按照以下步骤安装MHA Node的rpm软件包。

    RHEL/CentOS系统
    1. ## If you have not installed DBD::mysql, install it like below, or install from source.
    2. yum install perl-DBD-MySQL
    3. ## Get MHA Node rpm package from "Downloads" section.
    4. rpm -ivh mha4mysql-node-X.Y-0.noarch.rpm
    Ubuntu/Debian系统
    1. ## If you have not installed DBD::mysql, install it like below, or install from source.
    2. # apt-get install libdbd-mysql-perl
    3. ## Get MHA Node deb package from "Downloads" section.
    4. # dpkg -i mha4mysql-node_X.Y_all.deb
    通过源码进行安装
    1. ## Install DBD::mysql if not installed
    2. $ tar -zxf mha4mysql-node-X.Y.tar.gz
    3. $ perl Makefile.PL
    4. $ make
    5. $ sudo make install

    3 安装 MHA Manager

    MHA Manager具有诸如masterha_manager、masterha_master_switch等管理命令行程序,以及相关的Perl模块。MHA Manager依赖于以下Perl模块。在安装MHA Manager之前,您需要先安装它们。不要忘记安装MHA Node。

    • MHA Node package
    • DBD::mysql
    • Config::Tiny
    • Log::Dispatch
    • Parallel::ForkManager
    • Time::HiRes (included from Perl v5.7.3)

    您可以按照以下步骤安装MHA Manager的rpm软件包。

    在RHEL/CentOS发行版上,
    1. ## Install dependent Perl modules
    2. # yum install perl-DBD-MySQL
    3. # yum install perl-Config-Tiny
    4. # yum install perl-Log-Dispatch
    5. # yum install perl-Parallel-ForkManager
    6. ## Install MHA Node, since MHA Manager uses some modules provided by MHA Node.
    7. # rpm -ivh mha4mysql-node-X.Y-0.noarch.rpm
    8. ## Finally you can install MHA Manager
    9. # rpm -ivh mha4mysql-manager-X.Y-0.noarch.rpm
     在Ubuntu/Debian系统
    1. ## Install dependent Perl modules
    2. # apt-get install libdbd-mysql-perl
    3. # apt-get install libconfig-tiny-perl
    4. # apt-get install liblog-dispatch-perl
    5. # apt-get install libparallel-forkmanager-perl
    6. ## Install MHA Node, since MHA Manager uses some modules provided by MHA Node.
    7. # dpkg -i mha4mysql-node_X.Y_all.deb
    8. ## Finally you can install MHA Manager
    9. # dpkg -i mha4mysql-manager_X.Y_all.deb
    通过源码进行安装MHA Manager
    1. ## Install dependent Perl modules
    2. # apt-get install libdbd-mysql-perl
    3. # apt-get install libconfig-tiny-perl
    4. # apt-get install liblog-dispatch-perl
    5. # apt-get install libparallel-forkmanager-perl
    6. ## Install MHA Node, since MHA Manager uses some modules provided by MHA Node.
    7. # dpkg -i mha4mysql-node_X.Y_all.deb
    8. ## Finally you can install MHA Manager
    9. # dpkg -i mha4mysql-manager_X.Y_all.deb

    三 配置

    1 编写应用程序配置文件

    要使MHA正常工作,您必须创建一个配置文件并设置参数。参数包括每个MySQL服务器的主机名、MySQL用户名和密码、工作目录名称等。所有参数都在参数页面进行了描述。

     所有参数解释

    https://raw.githubusercontent.com/wiki/yoshinorim/mha4mysql-manager/Parameters.md

    以下是一个示例配置文件。

    manager_host$ cat /etc/app1.cnf

    1. [server default]
    2. # mysql user and password
    3. user=root
    4. password=mysqlpass
    5. # working directory on the manager
    6. manager_workdir=/var/log/masterha/app1
    7. # manager log file
    8. manager_log=/var/log/masterha/app1/app1.log
    9. # working directory on MySQL servers
    10. remote_workdir=/var/log/masterha/app1
    11. [server1]
    12. hostname=host1
    13. [server2]
    14. hostname=host2
    15. [server3]
    16. hostname=host3

    所有参数必须遵循“param=value”的语法。例如,以下参数设置是不正确的。

    1. [server1]
    2. hostname=host1
    3. # incorrect: must be "no_master=1"
    4. no_master

    应用程序范围的参数应该写在 [server default] 块中。在 [serverN] 块中,您应该设置局部范围的参数。主机名是必需的局部范围参数,因此必须在此处写入。块名称应以“server”开头。在内部,服务器配置按块名称排序,排序顺序在MHA确定新主服务器时很重要(有关详细信息,请参阅FAQ)。

    2 编写全局配置文件

    如果您计划从单个管理服务器管理两个或更多MySQL应用程序((主服务器,从服务器)对),则创建全局配置文件会使配置变得更加容易。一旦您在全局配置文件中编写了参数,您就不需要为每个应用程序设置参数。如果在/etc/masterha_default.cnf创建一个文件,MHA Manager脚本会自动将该文件读取为全局配置文件。

    您可以在全局配置文件中设置应用程序范围的参数。例如,如果所有MySQL服务器上的MySQL管理用户和密码相同,您可以在这里设置“user”和“password”。

    全局配置示例:

    1. [server default]
    2. user=root
    3. password=rootpass
    4. ssh_user=root
    5. master_binlog_dir= /var/lib/mysql
    6. remote_workdir=/data/log/masterha
    7. secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2
    8. ping_interval=3
    9. master_ip_failover_script=/script/masterha/master_ip_failover
    10. shutdown_script= /script/masterha/power_manager
    11. report_script= /script/masterha/send_master_failover_mail

    这些参数适用于所有由在主机上运行的MHA Manager监控的应用程序。

    应用程序配置文件应分别编写。以下示例是配置app1(host1-4)和app2(host11-14)。

    app1:

    manager_host$ cat /etc/app1.cnf

    1. [server default]
    2. manager_workdir=/var/log/masterha/app1
    3. manager_log=/var/log/masterha/app1/app1.log
    4. [server1]
    5. hostname=host1
    6. candidate_master=1
    7. [server2]
    8. hostname=host2
    9. candidate_master=1
    10. [server3]
    11. hostname=host3
    12. [server4]
    13. hostname=host4
    14. no_master=1

    在上述情况下,MHA Manager在/var/log/masterha/app1下生成工作文件(包括状态文件),并在/var/log/masterha/app1/app1.log生成日志文件。在监视其他应用程序时,您需要设置唯一的目录/文件名称。

    app2:

    manager_host$ cat /etc/app2.cnf

    1. [server default]
    2. manager_workdir=/var/log/masterha/app2
    3. manager_log=/var/log/masterha/app2/app2.log
    4. [server1]
    5. hostname=host11
    6. candidate_master=1
    7. [server2]
    8. hostname=host12
    9. candidate_master=1
    10. [server3]
    11. hostname=host13
    12. [server4]
    13. hostname=host14
    14. no_master=1

    如果在全局配置文件和应用程序配置文件中设置了相同的参数,则使用后者(应用程序配置)。

    3 Binlog Server

    从MHA版本0.56开始,MHA支持新的[section]。在binlog部分中,您可以定义mysqlbinlog流式传输服务器。当MHA执行基于GTID的故障转移时,MHA会检查binlog服务器,如果binlog服务器领先于其他从服务器,MHA会在恢复之前将差异binlog事件应用于新主服务器。当MHA执行非基于GTID的(传统的)故障转移时,MHA会忽略binlog服务器

    以下是一个示例配置。

    manager_host$ cat /etc/app1.cnf

    1. [server default]
    2. # mysql user and password
    3. user=root
    4. password=mysqlpass
    5. # working directory on the manager
    6. manager_workdir=/var/log/masterha/app1
    7. # manager log file
    8. manager_log=/var/log/masterha/app1/app1.log
    9. # working directory on MySQL servers
    10. remote_workdir=/var/log/masterha/app1
    11. [server1]
    12. hostname=host1
    13. [server2]
    14. hostname=host2
    15. [server3]
    16. hostname=host3
    17. [binlog1]
    18. hostname=binlog_host1
    19. [binlog2]
    20. hostname=binlog_host2

    四 要求与限制

    要使MHA真正发挥作用,您需要验证以下设置。大多数设置都会在启动masterha_manager或masterha_check_repl时自动检查。

    1 SSH公钥认证

    MHA Manager内部通过SSH连接到MySQL服务器。最新的从服务器上的MHA Node也通过SSH(scp)内部发送中继日志文件到其他从服务器。为了使这些过程自动化,通常建议启用SSH公钥认证而不使用密码。您可以使用MHA Manager中包含的masterha_check_ssh命令来检查SSH连接是否正常工作。

    当您使用masterha_secondary_check脚本检查附加网络连接时,您还需要验证MHA Manager到远程主机的SSH公钥访问是否可用。

    MHA Manager内部并行执行恢复。在生成差异中继日志文件时,MHA以并行方式连接到最新的从服务器,并生成并发送差异中继日志文件到非最新的从服务器。如果您有数十个从服务器或将数十个MySQL实例合并到单个操作系统中,sshd可能会拒绝SSH连接请求,这将导致从服务器恢复错误。为了避免此问题,请提高/etc/ssh/sshd_config中的MaxStartups参数(默认值为10)并重新启动sshd。

    2 操作系统

    MHA仅在Linux上进行了测试。

    3 单可写主服务器和多个从服务器或只读主服务器

    在主服务器崩溃的情况下,MHA解决了从服务器之间的一致性问题。此外,MHA尝试保存从主服务器中未发送的二进制日志事件,并将事件应用于所有从服务器。如果您只有一个从服务器,则无需关心从服务器之间的一致性问题。即使您仅使用一个从服务器,只要通过SSH连接到崩溃的主服务器,MHA仍然有助于保存事件,但是使用半同步复制也可以解决此问题。

    从MHA Manager版本0.52开始,支持多主复制配置。以下是使MHA与多主工作的一些注意事项。

    只允许一个主要主服务器(可写)。其他MySQL主服务器必须设置“read-only=1”。 默认情况下,所有受管理的服务器(在MHA配置文件中定义)应该在两层复制通道中。有关详细信息,请参见下文。

    在MHA Manager版本0.52之前,MHA检查所有受管理的主机,并仅在所有从服务器从同一主服务器复制时才开始监视/故障转移。也就是说,MHA不支持多主配置。通常,只要MHA管理自动故障转移,使用多主配置的原因是有限的,例如在线模式更改。如果您想临时使用多主配置(即仅用于模式更改),只需停止MHA并在操作期间配置多主。操作完成后,再次进行单主和多个从服务器配置,然后重新启动MHA。

    4 管理三层或更多层次的复制环境

    MHA不支持默认的三层或更多层次的复制结构(例如,Master1->Master2->Slave3)。 MHA只处理直接复制自当前主要主服务器的从服务器的故障转移和恢复。MHA可以管理master1和master2,并在master1崩溃时将master2提升为新主服务器,但是MHA无法监视和恢复slave3,因为slave3从不同的主服务器(master2)复制。为了使MHA与此类结构一起工作,可以进行以下配置。

    • 在这种情况下,仅在MHA配置文件中设置主服务器和第二层主机(master1和master2)
    • 使用“multi_tier_slave=1”参数并在MHA配置文件中设置所有主机

    在这两种情况下,MHA只管理主要主服务器和第二层从服务器。这仍然非常有帮助,因为在主服务器(master1)崩溃的情况下可以进行从master1到master2的自动故障转移,并且第三层从服务器仍然可以正常工作。有关详细信息,请参阅UseCases页面。

    5 MySQL版本5.0或更高版本

    MHA支持MySQL版本5.0或更高版本。MHA不支持MySQL 4.1或更早版本。这是因为从MySQL 5.0开始,二进制日志格式发生了变化(称为binlog v4格式)。当MHA解析二进制日志以识别目标中继日志位置时,binlog格式必须是v4,因此MySQL 4.1在此处无法工作。MySQL 5.0或更高版本中的mysqlbinlog还要求binlog格式为v4。此外,较早版本的MySQL存在一些围绕MySQL复制处理的严重问题,因此强烈建议使用更高版本。特别是如果您使用的是MySQL 5.0.60之前的版本,请考虑升级。

    6 对于MySQL 5.1+使用mysqlbinlog 5.1+

    MHA使用mysqlbinlog将binlog事件应用于目标从服务器。如果主服务器使用基于行的格式,则行事件将写入二进制日志中。这样的二进制日志只能由MySQL 5.1或更高版本中的mysqlbinlog解析,因为MySQL 5.0中的mysqlbinlog不支持基于行的格式。可以如下检查mysqlbinlog(和mysql)版本。

    1. [app@slave_host1]$ mysqlbinlog --version
    2. mysqlbinlog Ver 3.3 for unknown-linux-gnu at x86_64

    如果它包含在MySQL 5.1中,则mysqlbinlog版本应为3.3或更高。 MHA在所有从服务器上内部检查MySQL和mysqlbinlog版本。如果mysqlbinlog版本为3.2或更早版本,并且MySQL版本为5.1或更高版本,则MHA在开始监视之前会停止并显示错误。

    7 候选主服务器必须启用log-bin

    如果当前从服务器未设置log-bin,则显然它们无法成为新主服务器。MHA Manager内部检查log-bin设置,并且不会将其提升为新主服务器。如果当前没有从服务器设置log-bin,则MHA Manager不会继续执行故障转移。

    8 所有服务器上的二进制日志和中继日志过滤规则必须相同

    复制过滤规则(binlog-do-db,replicate-ignore-db等)在所有MySQL服务器上必须相同。MHA在启动时检查过滤规则,并且如果过滤规则不相同,则不会开始监视或故障转移。

    9 候选主服务器上必须存在复制用户

    故障转移完成后,所有其他从服务器都会执行CHANGE MASTER TO语句。要开始复制,必须在新主服务器上存在一个复制用户(具有REPLICATION SLAVE权限)。

    10 保留中继日志并定期清除

    默认情况下,从服务器上的中继日志会在SQL线程执行完毕后自动删除。但是,可能仍然需要这些中继日志来恢复其他从服务器。因此,您需要禁用自动中继日志清除,并定期清除旧的中继日志。但是,当手动清除中继日志时,您需要注意复制延迟问题。在ext3文件系统上,删除大文件需要很长时间,这将导致严重的复制延迟。为了避免复制延迟,临时创建中继日志的硬链接是有帮助的。有关详细信息,请参阅两张幻灯片。

    purge_relay_logs脚本

    MHA Node有一个命令行工具“purge_relay_logs”,用于执行上述幻灯片中描述的所有操作。也就是说,它创建硬链接,执行“SET GLOBAL relay_log_purge=1”,等待几秒钟以使SQL线程可以切换到新的中继日志(只要它明显落后),并执行“SET GLOBAL relay_log_purge=0”。

    purge_relay_logs需要以下参数。purge_relay_logs内部连接到MySQL从服务器,因此需要MySQL身份验证参数。

    • --user MySQL username. By default, it's root.

    • --password MySQL password for --user. By default, it's empty.

    • --host MySQL hostname. By default, it's 127.0.0.1. --host must be the same server where you run purge_relay_logs. For example, if you pass --host=host2 on host1, purge_relay_logs aborts. If you have virtual hostname vhost1 on host1, passing --host=vhost1 on host1 is valid and purge_relay_logs does not abort.

    • --port MySQL port number. By default, it's 3306.

    • --workdir Tentative directory where hard linked relay logs are created and removed. After executing the script successfully, hard-linked relay log files are deleted. By default, it's /var/tmp. If you put relay log files on a different OS partition from /var/tmp, you need to explicitly set this parameter. This is because creating hard links between different OS partitions are not supported (You'll get "Invalid cross-device link" error). In this case, set --workdir to a directory which resides on a same OS partition as relay log files.

    • --disable_relay_log_purge By default, if relay_log_purge is ON(1) in MySQL, purge_relay_logs script exits without doing anything. So relay_log_purge is still ON(1). By setting --disable_relay_log_purge, purge_relay_logs script does not exit and automatically sets relay_log_purge to 0. So after executing the script, relay_log_purge becomes OFF(0).

    定期运行purge_relay_logs脚本的计划

    purge_relay_logs会在不阻塞SQL线程的情况下移除中继日志。中继日志需要定期清理(例如,每天一次,每6小时一次等),因此应该在每个从服务器上定期通过作业调度程序调用purge_relay_logs脚本。例如,您可以按照以下方式从cron中调用purge_relay_logs

    1. [app@slave_host1]$ cat /etc/cron.d/purge_relay_logs
    2. # purge relay logs at 5am
    3. 0 5 * * * app /usr/bin/purge_relay_logs --user=root --password=PASSWORD --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

    建议在从服务器之间使用不同的时间调用 cron。如果所有从服务器同时调用 purge_relay_logs,那么在发生故障时,可能会导致没有一个从服务器拥有必要的中继日志事件。

    不要在使用基于语句的二进制日志记录(SBR)时使用 LOAD DATA INFILE

    当主服务器在使用基于语句的二进制日志记录(SBR)完成 LOAD DATA INFILE 后立即崩溃时,如果使用非事务性存储引擎或过旧的 MySQL 版本(例如 5.0.45 等),MHA 可能无法生成差异中继日志事件。使用 LOAD DATA INFILE 与 SBR 存在一些已知问题,并且在 MySQL 5.1 中已被弃用。LOAD DATA INFILE 也会导致显著的复制延迟,因此没有积极的原因使用它。

    如果您想使用 LOAD DATA,请使用 SET sql_log_bin=0; LOAD DATA … ; SET sql_log_bin=1; 更为推荐的方法。

    五 基于 GTID 的故障切换

    从 MHA 0.56 开始,MHA 支持基于 GTID 和传统的中继日志的故障切换。MHA 会自动区分选择哪种故障切换方式。要进行基于 GTID 的故障切换,需要满足以下所有条件:

    使用 MySQL 5.6(或更新版本) 所有 MySQL 实例都使用 gtid_mode=1 至少有一个实例已启用 Auto_Position 参数

  • 相关阅读:
    【C++】类和对象(下)
    PHP 大文件分块上传 底层实现
    HDU_3234
    安卓毕业设计选题基于Uniapp实现的鲜花购物商城
    【Java学习挑战】
    redis未授权访问漏洞
    【CSS】H7_浮动
    【Linux】【minicom】usb转串口
    北方工业大学计算机考研资料汇总
    IN动态|小达智能科技领导一行莅临英码科技调研,携手打造时代特色的AI教学平台
  • 原文地址:https://blog.csdn.net/weixin_48154829/article/details/138161159