记录一下搭建MHA主从的完整过程,同时也把自己部署过程中遇到的坑写进来
参考链接:
https://blog.csdn.net/m0_49526543/article/details/109483659
先说一下内网的环境,MHA要求至少一主二从,可以根据实际情况添加从服务器数量
mysql主服务器地址: 192.168.100.151
mysql从服务器地址(2台):192.168.100.152 192.168.100.158
mha manager服务器: 192.168.100.161
分别在主服务器和从服务器安装mysql服务,这里就不写具体安装细节了
1. 配置mysql主从
主服务器:
mysql配置添加:
$ vim /usr/local/mysql/my.cnf [mysqld] server-id = 1 //指定id号,服务器的唯一标识,不能相同 log-bin=master-bin //主服务器日志文件 log-slave-updates=true
重启服务:
$ systemctl restart mysqld
两台从服务器
$ vim /usr/local/mysql/my.cnf [mysqld] server-id = 3 log-bin=master-bin //slave1 里加上 ,slave2 不用加 relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地 relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
重启服务
$ systemctl restart mysqld
给三台服务器做软链接
$ ln -s /usr/local/mysql/bin/mysql /usr/sbin/ $ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
数据库的授权。在所有的数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用监控,即在master、slave1、slave2 上搭建。
mysql-root> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql-root> CREATE USER 'mha'@'%' IDENTIFIED BY '123456';
mysql-root> grant replication slave on *.* to 'slave'@'%';
mysql-root> grant all privileges on *.* to 'mha'@'%';
mysql-root> flush privileges; //刷新数据库的权限相关表
从服务器上登录mysql 执行命令:
mysql-slave> change master to master_host='192.168.100.201',master_user='slave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1562; mysql-slave> start slave; #查看slave状态 mysql-slave> show slave status\G
必须设置从库为只读:
mysql-slave> set global read_only=1; mysql-slave> flush privileges;
2 安装并配置keepalived
安装keepalived的目的是把主从数据库的ip地址映射到一个统一的虚拟IP地址 这样主节点一旦宕机会自动把新升级为主节点的机器ip映射到这个虚拟IP上,项目只要通过这个固定的虚拟IP访问数据库就可以了。
安装keepalived
$ yum install -y keepalived
配置keepalived
主数据库节点
! Configuration File for keepalived global_defs { notification_email { [email protected] ######定义接受邮件的邮箱 } notification_email_from [email protected] ######定义发送邮件的邮箱 smtp_server 127.0.0.1 smtp_connect_timeout 10 } vrrp_instance vrrptest { ######定义vrrptest实例 state BACKUP ######服务器状态 采用 backup -> backup 模式 全部配置成BACKUP interface ens192 ######使用的接口 通过ip addr 或 ifconfig查询 不同的机器配置的网卡不一样 virtual_router_id 61 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换 不要使用默认的51 需要更换一个其他的 priority 100 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER advert_int 1 ######服务器之间的存活检查时间 nopreempt authentication { auth_type PASS ######认证类型 auth_pass 1111 ######认证密码,一组lvs 服务器的认证密码必须一致 } virtual_ipaddress { ######虚拟IP地址 192.168.100.190/24 } }
从数据库节点
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 10 } vrrp_instance vrrptest { state BACKUP interface ens192 virtual_router_id 61 priority 80 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.190/24 } }
启动keepalived
$ sudo systemctl start keepalived #启动keepalived $ sudo systemctl status keepalived #查看状态
验证keepalived是否生效
关闭主节点上的keepalived服务
$ systemctl stop keepalived $ systemctl status keepalived
在每台从节点上执行ip addr,看VIP是否漂移到优先级第二高的节点上了
手动启动原主节点上的keepalived服务
$ systemctl start keepalived $ systemctl status keepalived
3. 安装MHA
所有的服务器都需要mha的依赖环境 首先安装epel源
$ yum install epel-release --nogpgcheck -y $ yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
Centos系统 mha只支持到7.9 Centos8以上的版本不支持
manager节点需要先安装mha4mysql-node 然后安装mha4mysql-manager 顺序不要搞反
其他服务器只需要安装mha4mysql-node就可以了
安装包下载地址:
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
解压安装包
$ tar zxvf mha4mysql-node-0.57.tar.gz $ cd mha4mysql-node-0.57/ $ perl Makefile.PL $ make && make install
manager节点安装manager
$ tar zxvf mha4mysql-manager-0.57.tar.gz $ cd mha4mysql-manager-0.57/ $ perl Makefile.PL $ make && make install
4. 建立SSH互信
manager节点(1主+两从的互信):
$ ssh-keygen -t rsa //一路按回车键 $ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码 $ ssh-copy-id 192.168.100.152 $ ssh-copy-id 192.168.100.158
主服务器(配置两个从服务器的互信):
$ ssh-keygen -t rsa //一路按回车键 $ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码 $ ssh-copy-id 192.168.100.152 $ ssh-copy-id 192.168.100.158
从服务器1(主+从2):
$ ssh-keygen -t rsa //一路按回车键 $ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码 $ ssh-copy-id 192.168.100.158
从服务器2(主+从1):
$ ssh-keygen -t rsa //一路按回车键 $ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码 $ ssh-copy-id 192.168.100.152
显示如下信息表示建立完成:
测试一下:
$ ssh 192.168.100.151 #能够正常登录即为互信连接成功
5 配置MHA
在manager节点上复制相关脚本到/usr/local/bin 的目录$ cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
创建目录 /etc/masterha/
创建配置文件 /etc/masterha/app1.cnf
复制以下内容到配置文件中:
注意 配置项的key value以及等于号之间不能有空格 不然无法执行 并且没有报错信息 这是个大坑!!!
[server default] #manager日志 manager_log=/etc/masterha/manager.log #manager工作目录 manager_workdir=/etc/masterha #master保存binlog的位置 master_binlog_dir=/usr/local/mysql/data #设置自动failover时候的切换脚本 后边来改 master_ip_failover_script=/usr/local/bin/master_ip_failover #设置mysql中root用户的密码 ssh_user=root #从库访问主库的账号 repl_user=slave #从库访问主库的密码 repl_password=123456 #mha_manager访问主库的账号 user=mha #mha_manager访问主库的密码 password=123456 # 主节点 [server1] hostname=192.168.100.151 port=3306 candidate_master=1 #从节点1 [server2] candidate_master=1 hostname=192.168.100.152 port=3306 #从节点2 [server3] hostname=192.168.100.158 port=3306
配置MHA与keepalived联动脚本
$ vim /usr/local/bin/master_ip_failover
内容如下:
#!/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.100.190'; my $ssh_start_vip ="sudo systemctl start keepalived"; my $ssh_stop_vip ="sudo systemctl stop keepalived"; 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 SCRIPTTEST====$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 \"`; } # A simple system call that disable the VIPon the old_master sub stop_vip() { `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 /usr/local/bin/master_ip_failover
6 测试MHA是否正确配置
测试ssh互信
$ masterha_check_ssh -conf=/etc/masterha/app1.cnf #返回 All SSH connection tests passed successfully.表示正常
测试mha健康状态
$ masterha_check_repl -conf=/etc/masterha/app1.cnf #返回 MySQL Replication Health is OK. 表示正常
启动MHA
$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
启动成功后,可用过如下命令来查看master节点的状态(启动完成需要一段时间):
$ masterha_check_status --conf=/etc/mha_master/app1.cnf
如果要停止MHA,需要使用master_stop命令。
$ masterha_check_status --conf=/etc/masterha/app1.cnf
6 存在的坑
MHA构建中的报错集中解决方案:
https://blog.csdn.net/weixin_49228721/article/details/110879425
我遇到的问题如下:
-
app1.cnf的配置中 key value 和等号之间不能有空格
错误写法:
[server default] manager_log = /etc/masterha/manager.log manager_workdir = /etc/masterha
正确写法:
[server default] manager_log=/etc/masterha/manager.log manager_workdir=/etc/masterha
-
测试时报错: There is no alive server. We can't do failover...
解决方法:
在主库执行命令:
mysql-master>ALTER USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; mysql-master>FLUSH PRIVILEGES; mysql-master>ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; mysql-master>FLUSH PRIVILEGES;
从库执行命令
mysql-master>ALTER USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; mysql-master>FLUSH PRIVILEGES;
-
安装MHA的服务器要关闭防火墙的端口限制
-
报错:sh: mysql: command not found
不知道为什么会导致软连接失效 重新建立一下软连接即可