• MHA高可用配置及故障切换


    目录

    MySQL主从复制集群高可用

    高可用方案

    什么是MHA?

    MHA的概述

    MHA的组件

    MHA的工作原理

    部署MHA实验

    1.准备工作

    2.系统初始化

    3.设置时间同步

    4.修改主机名

    5.部署主从复制

    (1)修改/etc/my.cnf文件

    (2)创建软连接

    (3)创建并授权数据库主从复制和MHA用户

    ​(4)验证主从复制

    6.部署MHA

    (1)安装MHA依赖的环境,首先安装epel源

    (2)安装node组件

    (3)配置无密码认证

    (4)配置manager

    (5)创建MHA软件目录并拷贝配置文件

    (6)创建虚拟网卡

    (7)测试ssh无密码认证

    (8)测试mysql 主从连接情况

    (9)启动MHA

    7.实验测试

    若原master修复完成,如何加入到集群中?

    如何恢复原先20.0.0.10做主服务器?

    mysql集群(MHA高可用集群)部署总结


    MySQL主从复制集群高可用

    高可用方案

    • keepalived(主备)
    • MHA
    • MMM
    • MySQL Cluster
    • PXC

    什么是MHA?

    Master High Availability

    MHA的概述

    • 一套优秀的MySQL局可用环境下故障切换和主从复制的软件
    • MHA的出现就是解决MySQL单点的问题
    • MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换
    • MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用

    MHA的组件

    • MHA Manager(管理节点)
    • MHA Node(数据节点)

    MHA的工作原理

    • MHA Node部署在每台MySQL服务器上,MHA Manager可以单独部署在一台独立服务器上或者某个从库服务器上。
    • MHA Manager 会定时探测 MySQL 集群中主库的状态,当主库出现故障,MHA Manager 会自动将一台拥有最新数据的从库提升为新的主库,也会在新的主库生成写入 VIP,然后还会将其它的从库重新指向新的主库做主从复制,从而保证MySQL集群的高可用。整个故障转移过程对客户端应用来说是完全透明的。

    部署MHA实验

    要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一台充当从库

    1.准备工作

    4台服务器

    • 主服务器(20.0.0.10)   已安装mysql
    • 从服务器(20.0.0.20)   已安装mysql
    • 从服务器(20.0.0.30)   已安装mysql
    • MAH服务器(20.0.0.40)

    2.虚拟机初始化

    4台虚拟机操作相同

    1. systemctl disable --now firewalld #关闭防火墙并且设置开机不启动
    2. setenforce 0 #放空selinux
    3. mount /dev/sr0 /mnt #挂载到/mnt
    4. vim /etc/selinux/config #编辑selinux配置

    3.设置时间同步

    4台虚拟机操作相同

    1. vim /etc/chrony.conf                     #配置时间文件
    2. systemctl restart chronyd            #重启chronyd服务

    timedatectl                   #查询时间是否一致

    4.修改主机名

    主服务器(20.0.0.10)

    1. hostnamectl set-hostname mysql1             #修改主机名
    2. bash                                                            

    从服务器(20.0.0.20)

    1. hostnamectl set-hostname mysql2             #修改主机名
    2. bash

    从服务器(20.0.0.30)

    1. hostnamectl set-hostname mysql3             #修改主机名
    2. bash

    MAH服务器(20.0.0.40)

    1. hostnamectl set-hostname manager           #修改主机名
    2. bash

    设置参数实现通过主机名管理这些主机(四台服务器同时修改,操作一致)

    vim /etc/hosts                     #配置文件

    5.部署主从复制

    (1)修改/etc/my.cnf文件

    开启二进制日志和中继日志(主从服务器一起操作   id不能一样

    1. vim /etc/my.cnf                 #配置文件
    2. systemctl restart mysqld #重新启动虚拟机
    3. log-bin=mysql-bin
    4. binlog_format=mixed
    5. relay-log=relay-log-bin
    6. relay-log-index=relay-log-bin.index
    7. log-slave-updates = 1

    (2)创建软连接

    建mysql和mysqlbinlog的软链接(主从三台虚拟机同时操作)

    1. ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    2. ln -s /usr/local/mysql/bin/mysqladmin /usr/sbin/

    (3)创建并授权数据库主从复制和MHA用户

    主服务器(20.0.0.10)

    1. mysql -u root -pabc123
    2. create user 'myslave'@'20.0.0.%' identified by 'myslave123';
    3. grant replication slave on *.* to 'myslave'@'20.0.0.%';
    4. create user 'manager'@'20.0.0.%' identified by 'manager123';
    5. grant all on *.* to 'manager'@'20.0.0.%';
    6. flush privileges;
    7. show master status;

    两台从服务器(20.0.0.20   20.0.0.30)

    1. mysql -u root -pabc123
    2. create user 'myslave'@'20.0.0.%' identified by 'myslave123';
    3. grant replication slave on *.* to 'myslave'@'20.0.0.%';
    4. create user 'manager'@'20.0.0.%' identified by 'manager123';
    5. grant all on *.* to 'manager'@'20.0.0.%';
    6. flush privileges;
    7. change master to master_host='20.0.0.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=715; ##file和pos值为主服务器查询的值
    8. start slave;  
    9. show slave status\G   #检查状态
    10. set global read_only=1;   #设置为只读

    (4)验证主从复制

    主服务器(20.0.0.10)

    1. mysql -u root -pabc123
    2. create database jlh;
    3. use jlh;
    4. create table jlh1 (id int, name varchar(20), sex char(2));
    5. insert into jlh1 values (1, 'zx', '男');
    6. select * from jlh1

    从服务器(20.0.0.20   20.0.0.30)

    1. mysql -u root -pabc123
    2. show databases;
    3. use jlh;
    4. show tables;
    5. select * from jlh1;

    6.部署MHA

    (1)安装MHA依赖的环境,首先安装epel源

    4台服务器操作一致

    1. cd /etc/yum.repos.d/
    2. mv repo.bak/* ./
    3. mv local.repo repo.bak
    4. yum install -y epel-release
    5. yum install -y perl-DBD-MySQL \
    6. perl-Config-Tiny \
    7. perl-Log-Dispatch \
    8. perl-Parallel-ForkManager \
    9. perl-ExtUtils-CBuilder \
    10. perl-ExtUtils-MakeMaker \
    11. perl-CPAN

    (2)安装node组件

    4台服务器操作一致

    1. cd /opt
    2. rz -E

    1. tar xf mha4mysql-node-0.57.tar.gz
    2. cd mha4mysql-node-0.57/
    3. perl Makefile.PL && make && make install

    (3)配置无密码认证

    主服务器(20.0.0.10)

    • 在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证
    1. ssh-keygen -t rsa #一路回车
    2. ssh-copy-id root@20.0.0.20
    3. ssh-copy-id root@20.0.0.30

    从服务器(20.0.0.20)

    • 在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证
    1. ssh-keygen -t rsa #一路回车
    2. ssh-copy-id root@20.0.0.10
    3. ssh-copy-id root@20.0.0.30

    从服务器(20.0.0.30)

    • 在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证
    1. ssh-keygen -t rsa #一路回车
    2. ssh-copy-id root@20.0.0.10
    3. ssh-copy-id root@20.0.0.20

    MHA服务器(20.0.0.40)

    • 在 manger 节点上配置到所有数据库节点的无密码认证
    1. ssh-keygen -t rsa #一路回车
    2. ssh-copy-id root@20.0.0.10
    3. ssh-copy-id root@20.0.0.20
    4. ssh-copy-id root@20.0.0.30

    (4)配置manager

    MHA服务器(20.0.0.40)

    1. cd /opt
    2. rz -E

    1. tar xf mha4mysql-manager-0.57.tar.gz
    2. cd mha4mysql-manager-0.57
    3. perl Makefile.PL && make && make install
    1. cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
    2. #在 manager 节点上复制相关脚本到/usr/local/bin 目录
    3. cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
    4. #复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换
    1. vim /usr/local/bin/master_ip_failover
    2. #清空原来内容,进入命令模式,输入 :set paste 进入粘贴模式,将下面内容粘贴
    3. #!/usr/bin/env perl
    4. use strict;
    5. use warnings FATAL => 'all';
    6. use Getopt::Long;
    7. my (
    8. $command, $orig_master_host, $orig_master_ip,$ssh_user,
    9. $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    10. $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
    11. );
    12. # 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
    13. my $vip = '20.0.0.100/24';
    14. my $key = '1';
    15. # 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
    16. # 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
    17. # 我这边实际情况是修改成统一的网卡名称
    18. my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
    19. my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
    20. my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";
    21. GetOptions(
    22. 'command=s' => \$command,
    23. 'ssh_user=s' => \$ssh_user,
    24. 'orig_master_host=s' => \$orig_master_host,
    25. 'orig_master_ip=s' => \$orig_master_ip,
    26. 'orig_master_port=i' => \$orig_master_port,
    27. 'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    28. 'new_master_host=s' => \$new_master_host,
    29. 'new_master_ip=s' => \$new_master_ip,
    30. 'new_master_port=i' => \$new_master_port,
    31. 'new_master_ssh_port' => \$new_master_ssh_port,
    32. 'new_master_user' => \$new_master_user,
    33. 'new_master_password' => \$new_master_password
    34. );
    35. exit &main();
    36. sub main {
    37. $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    38. print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$ssh_start_vip===\n\n";
    39. if ( $command eq "stop" || $command eq "stopssh" ) {
    40. my $exit_code = 1;
    41. eval {
    42. print "Disabling the VIP on old master: $orig_master_host \n";
    43. &stop_vip();
    44. $exit_code = 0;
    45. };
    46. if ($@) {
    47. warn "Got Error: $@\n";
    48. exit $exit_code;
    49. }
    50. exit $exit_code;
    51. }
    52. elsif ( $command eq "start" ) {
    53. my $exit_code = 10;
    54. eval {
    55. print "Enabling the VIP - $vip on the new master - $new_master_host \n";
    56. &start_vip();
    57. &start_arp();
    58. $exit_code = 0;
    59. };
    60. if ($@) {
    61. warn $@;
    62. exit $exit_code;
    63. }
    64. exit $exit_code;
    65. }
    66. elsif ( $command eq "status" ) {
    67. print "Checking the Status of the script.. OK \n";
    68. exit 0;
    69. }
    70. else {
    71. &usage();
    72. exit 1;
    73. }
    74. }
    75. sub start_vip() {
    76. `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    77. }
    78. sub stop_vip() {
    79. `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
    80. }
    81. sub start_arp() {
    82. `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
    83. }
    84. sub usage {
    85. print
    86. "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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";
    87. }

    (5)创建MHA软件目录并拷贝配置文件

    MHA服务器(20.0.0.40)

    1. cd /usr/local/bin/scripts
    2. cp master_ip_online_change power_manager /usr/local/bin/
    3. cd /usr/local/bin/
    4. chmod +x master_ip_failover
    5. cd /opt/
    6. mkdir /opt/mysql-mha
    7. cd mysql-mha/
    8. mkdir mha-manger
    9. mkdir mha-node
    10. vim mysql_mha.cnf                 #编辑以下内容
    11. [server default]
    12. manager_log=/opt/mysql-mha/manager.log
    13. manager_workdir=/opt/mysql-mha/mha-manager
    14. master_binlog_dir=/usr/local/mysql/data
    15. master_ip_failover_script=/usr/local/bin/master_ip_failover
    16. master_ip_online_change_script=/usr/local/bin/master_ip_online_change
    17. user=manager
    18. password=manager123
    19. port=3306
    20. ping_interval=1
    21. remote_workdir=/opt/mysql-mha/mha-node
    22. repl_user=myslave
    23. repl_password=myslave123
    24. secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.20 -s 20.0.0.30
    25. shutdown_script=""
    26. ssh_user=root
    27. [server1]
    28. hostname=20.0.0.10
    29. port=3306
    30. [server2]
    31. hostname=20.0.0.20
    32. port=3306
    33. [server3]
    34. hostname=20.0.0.30
    35. port=3306

    (6)创建虚拟网卡

    主服务器(20.0.0.10)

    ifconfig ens33:1 20.0.0.100/24               #设置的vip一致

    (7)测试ssh无密码认证

    MHA服务器(20.0.0.40)

    masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf

    (8)测试mysql 主从连接情况

    创建软链接(三台主从服务器操作相同)

    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

    MHA服务器(20.0.0.40)

    masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf

    (9)启动MHA

    MHA服务器(20.0.0.40)

    1. nohup masterha_manager \
    2. > --conf=/opt/mysql-mha/mysql_mha.cnf \
    3. > --remove_dead_master_conf \
    4. > --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
    5. masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf

    --remove_dead_master_conf

    #该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。

    --ignore_last_failover

    #在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 app1.failover.complete 日志文件中记录,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换, 除非在第一次切换后删除该文件,为了方便。

    使用&后台运行程序

    • 结果会输出到终端;使用Ctrl+C发送SIGINT信号,程序免疫;关闭session发送SIGHUP信号,程序关闭。

    使用nohup运行程序

    • 结果默认会输出到nohup.out;使用Ctrl+C发送SIGINT信号,程序关闭;关闭session发送SIGHUP信号,程序免疫。

    使用nohup和&配合来启动程序nohup ./test &

    • 同时免疫SIGINT和SIGHUP信号

    7.实验测试

    主服务器关闭mysqld服务,某个从服务器会变成主服务器

    MHA服务器(20.0.0.40)

    若原master修复完成,如何加入到集群中?

    如何恢复原先20.0.0.10做主服务器?

    MHA服务器(20.0.0.40)

    vim mysql_mha.cnf

    1. nohup masterha_manager --conf=/opt/mysql-mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &  #重新启动mha         
    2. masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf #检查状态

    现主服务器(20.0.0.20)

    • 模拟破坏
    systemctl stop mysqld.service              #关闭服务

    20.0.0.10服务器变为主服务器

    mysql集群(MHA高可用集群)部署总结

    1. 采用一主两从架构
    2. 一主两从先做主从复制
    3. 给MHA进行登录授权,访问数据库的授权
    4. 所有数据库节点安装mha node 组件,manager服务器还要安装mha manager 组件
    5. 所有服务器相互组件做ssh免交互登录
    6. manager上准备好VIP故障转移脚本和MHA配置文件
    7. 在master上创建VIP地址
    8. 启动MHA进程并做故障转移测试

    主从复制步骤

    1. 主从服务器先做时间同步
    2. 修改主从数据库的配置文件,主库开启二进制日志,从库开启中继日志
    3. 在主库创建主从复制的用户,并授予主从复制的权限
    4. 在从库使用 change master to 对接主库,并 start slave 开启同步
    5. 在从库使用 show slave status\G 查看 IO线程和 SQL线程的状态是否都为 YES
  • 相关阅读:
    华为配置聚合vlan(Super vlan--Sub vlan)
    亲测可用的1688商品详情API和关键字搜索API,需要自取!
    gitlab拉取项目报128 fatal: unable to access ‘xxx.git/‘
    我和Java这些年的故事(二)
    C++ 语法基础课2 —— printf 语句与 C++中的判断结构
    java毕业设计图书个性化推荐系统mybatis+源码+调试部署+系统+数据库+lw
    分布式一致性协议
    HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
    LLM大模型实战 —— DB-GPT阿里云部署指南
    R语言使用马尔可夫链对营销中的渠道归因建模
  • 原文地址:https://blog.csdn.net/2401_83784772/article/details/139952007