💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
>[info] 构建mha **注:** 正式环境 MHA 要安装在一台单独的服务器 **注:** `super_read_only` 必须MySQL 5.7 版本以上才有该参数,不然 验证会报错如下: ![](https://img.kancloud.cn/c6/95/c6958d44c3a8a992afd02058b6c0b450_957x359.png) ***** **流程:** 1. 安装mha node 2. 安装mha manger 3. 配置mha配置文件 4. 检测mha情况 5. 演示宕机 ### **1. 安装 MHA Node组件** 1. 登录主节点(192.168.83.130) ``` mkdir -p /usr/local/mha | cd /usr/local/mha rz 上传 mha 包 ``` ![](https://img.kancloud.cn/77/0c/770c5438ad08965a135cfb44b6d8e357_553x75.png) 2. scp 远程传输 将mha4mysql-node-0.58.tar.gz 到 另外两台子节点 ``` # 无 mha 目录先创建 scp mha4mysql-node-0.58.tar.gz root@192.168.83.131:/usr/local/mha/ scp mha4mysql-node-0.58.tar.gz root@192.168.83.132:/usr/local/mha/ ``` ![](https://img.kancloud.cn/c8/df/c8dfa9d8716fca2603afcadbd60727af_932x143.png) 3. 解压安装(在所有机器上执行:): ``` tar -zxvf mha4mysql-node-0.58.tar.gz cd mha4mysql-node-0.58 perl Makefile.PL make && make install ``` 4. node 安装完成后会得到四个工具,位于 `/usr/local/bin/` 下面 ``` ll /usr/local/bin/ ``` ![](https://img.kancloud.cn/51/4b/514bd3baea223a35e77b5bed05629920_626x289.png) ### **2. 安装 MHA Manager 组件** 1. 只在主节点 (192.168.83.130) 上安装: ``` cd /usr/local/mha tar -zxvf mha4mysql-manager-0.58.tar.gz perl Makefile.PL make && make install ``` 2. 查看 Manager 工具 ``` ll /usr/local/bin/ | grep master ``` ![](https://img.kancloud.cn/0b/07/0b077eb5567cf9645e27e6b607efef7c_834x220.png) ### **3. 配置 MHA Manger** 1. 创建文件目录 ``` # 创建MHA脚本目录 mkdir /etc/mha/scripts -p # 创建MHA日志目录 mkdir /var/log/mha/app1 -p # 创建日志文件 touch /var/log/mha/app1/manager.log ``` 2. MHA 应用配置文件 ``` vim /etc/mha/app1.cnf ``` **candidate_master=1的意思是是否能提升为master** ~~~ [server default] manager_workdir=/var/log/mha/app1 manager_log=/var/log/mha/app1/manager.log [server1] hostname=192.168.83.130 port=3306 [server2] hostname=192.168.83.131 port=3306 candidate_master=1 [server3] hostname=192.168.83.132 port=3306 ~~~ 3. MHA 检测配置文件 ``` vim /etc/masterha_default.cnf ``` **只需要改用户名 密码、master_binlog_dir、secondary_check_script:** ~~~ [server default] user=slave password=123456 repl_user=slave repl_password=123456 ssh_user=root ping_interval=1 master_binlog_dir=/www/server/data manager_workdir=/var/log/mha/app1 manager_log=/var/log/mha/app1/manager.log master_ip_failover_script="/etc/mha/scripts/master_ip_failover" master_ip_online_change_script="/etc/mha/scripts/master_ip_online_change" report_script="/etc/mha/scripts/send_report" remote_workdir=/tmp secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.83.130 -s 192.168.83.131 -s 192.168.83.132 shutdown_script="" ~~~ **MHA主要配置文件说明:** ~~~ manager_workdir=/var/log/masterha/app1:设置manager的工作目录 manager_log=/var/log/masterha/app1/manager.log:设置manager的日志文件 master_binlog_dir=/opt/mysql_data:设置master 保存binlog的位置,以便MHA可以找到master的日志 master_ip_failover_script="/etc/mha/scripts/master_ip_failover":设置自动failover时候的切换脚本 master_ip_online_change_script="/etc/mha/scripts/master_ip_online_change":设置手动切换时候的切换脚本 user=root:设置监控mysql的用户 password=dayi123:设置监控mysql的用户,需要授权能够在manager节点远程登录 ping_interval=1:设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover remote_workdir=/tmp:设置远端mysql在发生切换时binlog的保存位置 repl_user=repl :设置mysql中用于复制的用户密码 repl_password=replication:设置mysql中用于复制的用户 report_script=/usr/local/send_report:设置发生切换后发送的报警的脚本 shutdown_script="":设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用) ssh_user=root //设置ssh的登录用户名 candidate_master=1:在节点下设置,设置当前节点为候选的master slave check_repl_delay=0 :在节点配置下设置,默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master;这个选项对于对于设置了candidate_master=1的主机非常有用 ~~~ 4. 脚本配置 ``` vim /etc/mha/scripts/master_ip_failover ``` ***** 注意把下文中的变量$vip和$key 换成自己的。另外,如果网卡类型不是ens33的,就要把文中的ens33缓存自己的,因为老师的是ens33,所以写的是ens33: **注:** 最好不要 copy 代码,直接从 `master_ip_failover` 文件中 修改 copy ***** ``` #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); my $vip = '192.168.83.10'; my $key = '0'; my $ssh_start_vip = "ifconfig ens33:0 192.168.83.10 netmask 255.255.255.0 up"; my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; GetOptions( 'command=s' => \$command, 'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port=i' => \$orig_master_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, ); exit &main(); sub main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ( $command eq "stop" || $command eq "stopssh" ) { my $exit_code = 1; eval { print "Disabling the VIP on old master: $orig_master_host \n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) { my $exit_code = 10; eval { print "Enabling the VIP - $vip on the new master - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Checking the Status of the script.. OK \n"; exit 0; } else { &usage(); exit 1; } } sub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } sub stop_vip() { return 0 unless ($ssh_user); `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`; } sub usage { print "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"; } ``` 添加执行权限: ``` chmod +x /etc/mha/scripts/master_ip_failover ``` 5. 验证 MHA 相关操作 5.1 通过 masterha_check_ssh 命令验证ssh 信任登录是否成功 ``` masterha_check_ssh --conf=/etc/mha/app1.cnf ``` ![](https://img.kancloud.cn/ca/44/ca44362dc5e06d756d841f89705068ca_904x457.png) **如报错:** 直接更新 yum 再次安装 如下包 ``` yum -y update yum install -y perl-ParallelForkManager ``` 5.2 通过 masterha_check_repl 命令验证 mysql 主从复制是否成功 ``` masterha_check_repl --conf=/etc/mha/app1.cnf ``` **提示:** MySQL Replication Health is OK 表示成功 ![](https://img.kancloud.cn/fe/b0/feb09bff47c186ac3cc1ae6043157f22_941x354.png) **如报错:** mha服务器连接不上83.130 这台服务器节点 ![](https://img.kancloud.cn/ba/f0/baf0d0ec5b1082ec937cc7acb25804cd_960x371.png) ``` # 在3台服务器 添加权限(正式环境 all 谨慎) grant all on *.* to 'slave'@'192.168.83.%' identified by '123456'; # 刷新用户权限 flush privileges; ``` **如报错:** All log-bin enabled servers must have same binlog filtering rules (same binlog-do-db and binlog-ignore-db) ![](https://img.kancloud.cn/fa/6a/fa6a287378d0b76127134e677febe5a0_944x313.png) ``` # 我在主上开了复制过滤,在从上也必须开启(3台服务器复制过滤要一样) log-bin=mysql-bin binlog-do-db=test replicate-do-db=test ``` ![](https://img.kancloud.cn/ca/8d/ca8de50fde101cff7ae3e22ed6eec857_408x113.png) **如报错:** Slaves settings check failed! **如报错:** 检查 mysqlbinlog 设置软链接 (3台都需要设置) ![](https://img.kancloud.cn/1b/7c/1b7c3876c5ae4059cc0fd353a5dfccc9_973x259.png) ``` # which mysqlbinlog:查看当前软链接地址 ln -s /www/server/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog # which mysql:查看当前软链接地址 ln -s /www/server/mysql/bin/mysql /usr/local/bin/mysql # 如还不行:再配置(/usr/bin /usr/local/sbin export)再重启3台服务器 ln -s /www/server/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog # ln -s /www/server/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog | ln -s /www/server/mysql/bin/mysql /usr/bin/mysql # rm -rf /usr/local/bin/mysqlbinlog | rm -rf /usr/bin/mysqlbinlog | rm -rf /usr/local/sbin/mysqlbinlog | rm -rf /usr/local/bin/mysql | rm -rf /usr/bin/mysql | rm -rf /usr/local/sbin/mysql ``` **如报错:** 设置 最高权限 ``` chmod -R 777 /etc/mha/scripts/master_ip_failover ``` **如报错:** 不稳定,时不时出现(重启主服务器 或 2台从服务器)(关闭防火墙 firewalld) ![](https://img.kancloud.cn/47/2d/472d4a2d2113e97dff475bf8a81094aa_949x274.png)