• MySQL之MHA


    目录

    一、MHA概念

    1.什么是MHA

    2.MHA的组成

    3.MHA特点

    二、搭建 MySQL MHA思路

     1.MHA架构

    2.故障模拟

    3.搭建环境 

    三、MHA搭建 (主从复制基础上)

    1. 在各主机上添加域名解析

    2.在主从服务器上创建软链接

     3.登录数据库主从配置授权

    4.查看主从复制是否同步 

    5.设置两个从节点 只读模式  

     四、搭建MHA

    1.所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源 

     2.  安装 MHA 软件包

    3.在 MHA-manager 节点上安装 manager 组件 

    4.在所有服务器上配置无密码认证

    5.在 manager 节点上配置 MHA 


    一、MHA概念

     

    1.什么是MHA

    MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件

    2.MHA的组成

    MHA Node(数据节点)
    MHA Node 运行在每台 MySQL 服务器上。

    MHA Manager(管理节点)
    MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
    MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

    3.MHA特点

    ●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
    ●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
    ●目前MHA支持一主多从架构,最少三台服务,即一主两从

    MHA :为了解决的了是故障切换、数据尽可能的保存,以及所有节点日志的一致性

    二、搭建 MySQL MHA思路

     1.MHA架构

    • 数据库安装
    • 一主两从
    • MHA搭建

    2.故障模拟

    • 主库失效
    • 备选主库成为主库
    • 原故障主库恢复重新加入到MHA成为从库

    3.搭建环境 

    节点服务器系统IP地址安装服务及工具
    MHAmanagerCentOS-7.6-x86_64192.168.169.202MHAnode组件、MHAmanager组件
    masterCentOS-7.6-x86_64192.168.169.201mysql-boost-5.7.20.tar.gz、MHAnode组件
    slave1CentOS-7.6-x86_64192.168.169.4mysql-boost-5.7.20.tar.gz、MHAnode组件
    slave2CentOS-7.6-x86_64192.168.169.5mysql-boost-5.7.20.tar.gz、MHAnode组件

    三、MHA搭建 (主从复制基础上)

    1. 在各主机上添加域名解析

    1. vim /etc/hosts
    2. 192.168.169.201 master
    3. 192.168.169.4 slave1
    4. 192.168.169.5 slave2
    5. 192.168.169.202 manager

    2.在主从服务器上创建软链接

    1. ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    2. ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
    3. ls /usr/sbin/mysql*

     3.登录数据库主从配置授权

    1. grant replication slave on *.* to 'myslave'@'192.168.169.%' identified by '123456';
    2. grant all privileges on *.* to 'mha'@'192.168.169.%' identified by 'manager';
    3. grant all privileges on *.* to 'mha'@'master' identified by 'manager';
    4. grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
    5. grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
    6. flush privileges;

     主从三台机子重复一样的操作,只放一张master截图

    4.查看主从复制是否同步 

    1. show slave status\G
    2. #在两台从服务器MySQL中查看

    5.设置两个从节点 只读模式  

    set global read_only=1;

     四、搭建MHA

    1.所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源 

    1. yum install epel-release --nogpgcheck -y
    2. yum install -y perl-DBD-MySQL \
    3. perl-Config-Tiny \
    4. perl-Log-Dispatch \
    5. perl-Parallel-ForkManager \
    6. perl-ExtUtils-CBuilder \
    7. perl-ExtUtils-MakeMaker \
    8. perl-CPAN

     四台机器一同安装,这里只展示master

     

     2.  安装 MHA 软件包

    1. ##将需要的包下载到/opt下##
    2. ##每台服务器上解压安装node组件##
    3. cd /opt
    4. tar zxf mha4mysql-node-0.57.tar.gz
    5. cd mha4mysql-node-0.57
    6. perl Makefile.PL
    7. make && make install

     

    3.在 MHA-manager 节点上安装 manager 组件 

    1. tar zxf mha4mysql-manager-0.57.tar.gz
    2. cd mha4mysql-manager-0.57/
    3. perl Makefile.PL
    4. make && make install

     #manager 组件安装后在  /usr/local/bin 下面会生成几个工具,主要包括以下几个:

    1. masterha-check_ssh 检查MHA的SSH配置状况(免交互)
    2. masterha_check_repl 检查MySQL复制状况
    3. masterha_manager 启动manager的脚本
    4. masterha_check_status 检查当前MHA运行状态
    5. masterha_master_monitor 检查master是否宕机
    6. masterha_master_switch 控制故障转移(自动或者手动)
    7. masterha_conf_host 添加或删除配置的server信息
    8. masterha_stop 关闭manager

     #node 组件安装后也会在  /usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下

    1. save_binary_logs
    2. #保存和复制master的二进制日志
    3. apply_diff_relay_logs
    4. #识别差异的中继日志时间,并将其差异的事件应用于其他的slave
    5. filter_mysqlbinlog
    6. #去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
    7. purge_relay_logs
    8. #清除中继日志(不会阻塞 SQL线程)

     

    4.在所有服务器上配置无密码认证

    1. #在 manager 节点上配置到所有数据库节点的无密码认证
    2. ssh-keygen -t rsa #一路按回车键
    3. ssh-copy-id 192.168.169.4
    4. ssh-copy-id 192.168.169.5
    5. ssh-copy-id 192.168.169.201
    6. ####数据库服务器之间互相导入即可####
    7. #在master上
    8. ssh-keygen -t rsa #一路按回车键
    9. ssh-copy-id 192.168.169.4
    10. ssh-copy-id 192.168.169.5
    11. #在slave1上
    12. ssh-keygen -t rsa #一路按回车键
    13. ssh-copy-id 192.168.169.201
    14. ssh-copy-id 192.168.169.5
    15. #在slave2上
    16. ssh-keygen -t rsa #一路按回车键
    17. ssh-copy-id 192.168.169.201
    18. ssh-copy-id 192.168.169.4

     这里操作基本一致,只以mha做例子

     

    5.在 manager 节点上配置 MHA 

    1. 1##在 manager 节点上复制相关脚本到/usr/local/bin 目录
    2. cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
    3. #拷贝后会有四个执行文件
    4. ll /usr/local/bin/scripts/
    5. master_ip_failover
    6. #自动切换时 VIP 管理的脚本
    7. master_ip_online_change
    8. #在线切换时 vip 的管理
    9. power_manager
    10. #故障发生后关闭主机的脚本
    11. send_report
    12. #因故障切换后发送报警的脚本
    13. 2##复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,
    14. 这里使用master_ip_failover脚本来管理 VIP 和故障切换
    15. cp /usr/local/bin/scripts/* /usr/local/bin
    16. 3##修改master_ip_failover 全部删除,添加以下内容,修改相关参数
    17. #!/usr/bin/env perl
    18. use strict;
    19. use warnings FATAL => 'all';
    20. use Getopt::Long;
    21. my (
    22. $command, $ssh_user, $orig_master_host, $orig_master_ip,
    23. $orig_master_port, $new_master_host, $new_master_ip, $new_master_port
    24. );
    25. #############################添加内容部分#########################################
    26. my $vip = '192.168.169.250';
    27. #指定vip的地址
    28. my $brdc = '192.168.169.255';
    29. #指定vip的广播地址
    30. my $ifdev = 'ens33';
    31. #指定vip绑定的网卡
    32. my $key = '1';
    33. #指定vip绑定的虚拟网卡序列号
    34. my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
    35. #代表此变量值为ifconfig ens33:1 192.168.169.250
    36. my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
    37. #代表此变量值为ifconfig ens33:1 192.168.169.250 down
    38. my $exit_code = 0;
    39. #指定退出状态码为0
    40. #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
    41. #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
    42. ##################################################################################
    43. GetOptions(
    44. 'command=s' => \$command,
    45. 'ssh_user=s' => \$ssh_user,
    46. 'orig_master_host=s' => \$orig_master_host,
    47. 'orig_master_ip=s' => \$orig_master_ip,
    48. 'orig_master_port=i' => \$orig_master_port,
    49. 'new_master_host=s' => \$new_master_host,
    50. 'new_master_ip=s' => \$new_master_ip,
    51. 'new_master_port=i' => \$new_master_port,
    52. );
    53. exit &main();
    54. sub main {
    55. print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
    56. if ( $command eq "stop" || $command eq "stopssh" ) {
    57. my $exit_code = 1;
    58. eval {
    59. print "Disabling the VIP on old master: $orig_master_host \n";
    60. &stop_vip();
    61. $exit_code = 0;
    62. };
    63. if ($@) {
    64. warn "Got Error: $@\n";
    65. exit $exit_code;
    66. }
    67. exit $exit_code;
    68. }
    69. elsif ( $command eq "start" ) {
    70. my $exit_code = 10;
    71. eval {
    72. print "Enabling the VIP - $vip on the new master - $new_master_host \n";
    73. &start_vip();
    74. $exit_code = 0;
    75. };
    76. if ($@) {
    77. warn $@;
    78. exit $exit_code;
    79. }
    80. exit $exit_code;
    81. }
    82. elsif ( $command eq "status" ) {
    83. print "Checking the Status of the script.. OK \n";
    84. exit 0;
    85. }
    86. else {
    87. &usage();
    88. exit 1;
    89. }
    90. }
    91. sub start_vip() {
    92. `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    93. }
    94. ## A simple system call that disable the VIP on the old_master
    95. sub stop_vip() {
    96. `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
    97. }
    98. sub usage {
    99. print
    100. "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\n";
    101. }
    102. :2,87 s/^#//
    103. #删除注释

    manager 节点上复制相关脚本到/usr/local/bin 目录

    1. master_ip_failover #自动切换时 VIP 管理的脚本
    2. master_ip_online_change #在线切换时 vip 的管理
    3. power_manager #故障发生后关闭主机的脚本
    4. send_report #因故障切换后发送报警的脚本

     复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换

     

    修改master_ip_failover 全部删除,添加内容,修改相关参数 

     

    创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

    对于上图配置文件解释如下 

    1. [server default]
    2. manager_log=/var/log/masterha/app1/manager.log      
    3. #manager日志
    4. manager_workdir=/var/log/masterha/app1        
    5. #manager工作目录
    6. master_binlog_dir=/usr/local/mysql/data/         
    7. #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到
    8. master_ip_failover_script=/usr/local/bin/master_ip_failover  
    9. #设置自动failover时候的切换脚本,也就是上面的那个脚本
    10. master_ip_online_change_script=/usr/local/bin/master_ip_online_change  
    11. #设置手动切换时候的切换脚本
    12. password=manager
    13. #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
    14. ping_interval=1
    15. #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
    16. remote_workdir=/tmp
    17. #设置远端mysql在发生切换时binlog的保存位置
    18. repl_password=123456
    19. #设置复制用户的密码
    20. repl_user=myslave
    21. #设置复制用户的用户
    22. report_script=/usr/local/send_report     
    23. #设置发生切换后发送的报警的脚本
    24. secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.169.4 -s 192.168.169.5
    25. #指定检查的从服务器IP地址
    26. shutdown_script=""
    27. #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
    28. ssh_user=root
    29. #设置ssh的登录用户名
    30. user=mha
    31. #设置监控用户root
    32. [server1]
    33. hostname=192.168.169.201
    34. port=3306
    35. [server2]
    36. hostname=192.168.169.4
    37. port=3306
    38. candidate_master=1
    39. #设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,
    40. 即使这个从库不是集群中最新的slave
    41. check_repl_delay=0
    42. #默认情况下如果一个slave落后master 超过100M的 relay logs的话,
    43. MHA将不会选择该slave作为一个新的master, 因为对于这个slave的
    44. 恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换
    45. 在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了
    46. candidate_master=1的主机非常有用,因为这个候选主在切换的过程中
    47. 一定是新的master
    48. [server3]
    49. hostname=192.168.169.5
    50. port=3306

     第一次配置需要在 Master 节点上手动开启虚拟IP

     在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully

     

     

    在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常  

    如果出现报错,与之匹配的解决方法

    1.[/usr/local/share/perl5/MHA/Server.pm, ln490] Slave IO thread is not running on 192.168.169.201(192.168.169.201:3306)

    表示你的主从配置出现问题,需要你去重新配置主从复制,使IO线程可以连接。

    具体可以参考此博客。

    (44条消息) MySQL 数据库在主从复制中配置从服务器时 Slave_IO_Running对象项为 Connecting 而不是 YES 导致主从不能同步复制_Xucf1的博客-CSDN博客

    2.[error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln364] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf

    这个错误原因在与集群中的slave节点的数据库配置文件/ect/my.cnf没有设置log-bin参数,解决办法就是将所有slave节点的数据库配置文件加上log-bin=XXX参数,重启数据库服务即可。

    在 manager 节点上启动 MHA

    1. --remove_dead_master_conf
    2. 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
    3. --manger_log
    4. 日志存放位置。
    5. --ignore_last_failover
    6. 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时话,
    7. 则不会进行Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代
    8. 表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记
    9. 录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候
    10. 如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该
    11. 文件,为了方便,这里设置为--ignore_last_failover

     

    查看 MHA 状态,可以看到当前的 master 是 master 节点

     

    查看 MHA 日志,也以看到当前的 master 是 192.168.169.201,如下所示  

     

    查看 master的 VIP 地址 192.168.169.250是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失

     

     

  • 相关阅读:
    S4系统编辑屏幕报错 报错 RFC callback call rejected by whitelist
    大数据安全的重要性解读
    重构:在新底座之上让应用重生
    力扣(LeetCode)218. 天际线问题(2022.08.06)
    Unity实战篇 | 游戏中控制 地图无限自动化生成 的方法,进一步优化项目
    Revit二次开发-WPF ProgressBar 执行程序中显示进度条
    浅讲make/makefile【linux】
    Unity关于GL绘制和Gizmos绘制的Matrix问题。
    视频格式怎么批量转换?5 个批量视频转换器分享
    Redis事务相关源码探究
  • 原文地址:https://blog.csdn.net/FateZRK/article/details/125546712