实现 1 主 2 从 1MHA,主机挂掉,从机自动上位
| 机器名称 | IP | 角色 | 权限 |
|---|---|---|---|
| Mysql_Master | 172.16.94.5 | 数据库 Master | 可读写、主库 |
| Mysql_Slave1 | 172.16.94.6 | 数据库 Slave | 只读、从库 |
| Mysql_Slave2 | 172.16.94.10 | 数据库 Slave | 只读、从库 |
| Mysql_MHA | 172.16.94.13 | MHA Manager | 高可用监控 |
MySQL 主从搭建
主库配置/etc/my.cnf
#bin_log 配置log_bin=mysql-binserver-id=1sync-binlog=1binlog-ignore-db=information_schemabinlog-ignore-db=performance_schemabinlog-ignore-db=sys#relay_log 配置relay_log=mysql-relay-binlog_slave_updates=1relay_log_purge=0
两台从库配置/etc/my.cnf
#bin_log 配置log_bin=mysql-bin#服务器 ID,从库 2、3server-id=2sync-binlog=1binlog-ignore-db=information_schemabinlog-ignore-db=mysqlbinlog-ignore-db=performance_schema#relay_log 配置relay_log=mysql-relay-binlog_slave_updates=1relay_log_purge=0read_only=1
三台分别重启服务
systemctl restart mysqld
主库开启权限
#进入mysqlgrant replication slave on *.* to 'root'@'%' identified by 'root';grant all privileges on *.* to 'root'@'%' identified by 'root';flush privileges;grant replication slave on *.* to 'mha'@'%' identified by '123123';grant all privileges on *.* to 'mha'@'%' identified by '123123';flush privileges;
两台从库建立主从关系
#查看是否以前有配置信息,若有则去除掉show slave status;#stop slave;#reset slave all;#在主库查看binlog状态#show master status \G;#从库设置主库信息change master to master_host='172.16.94.5',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000014',master_log_pos=154;#开启从库start slave;#再次查看从库配置信息show slave status \G;
四台机器 ssh 互通
在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)
ssh-keygen -t rsa
在三台 MySQL 服务器分别执行下面命令,密码输入系统密码,将公钥拷到 MHA Manager 服务器上
ssh-copy-id 172.16.94.13
之后可以在 MHA Manager 服务器上检查下,看看.ssh/authorized_keys 文件是否包含 3 个公钥
cat /root/.ssh/authorized_keys
执行下面命令,将 MHA Manager 的公钥添加到 authorized_keys 文件中(此时应该包含 4 个公钥)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
从 MHA Manager 服务器执行下面命令,向其他三台 MySQL 服务器分发公钥信息
scp /root/.ssh/authorized_keys root@172.16.94.5:/root/.ssh/authorized_keysscp /root/.ssh/authorized_keys root@172.16.94.6:/root/.ssh/authorized_keysscp /root/.ssh/authorized_keys root@172.16.94.10:/root/.ssh/authorized_keys
每台服务器都执行下列操作
#赋予权限chmod 600 .ssh/authorized_keys#修改 /etc/hosts 文件vim /etc/hosts#添加内容172.16.94.5 master1172.16.94.6 slave1172.16.94.10 slave2172.16.94.13 mha
每台服务器都修改 /etc/ssh/sshd_config 文件
vim /etc/ssh/sshd_config#添加内容或修改内容RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys
可以 MHA Manager 执行下面命令,检测下与三台 MySQL 是否实现 ssh 互通。
ssh 172.16.94.5exitssh 172.16.94.6exitssh 172.16.94.10exit
MHA 下载安装
MHA 下载
MySQL5.7 对应的 MHA 版本是 0.5.8,所以在 GitHub 上找到对应的 rpm 包进行下载,MHA manager 和
node 的安装包需要分别下载:
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58 https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
下载后,将 Manager 和 Node 的安装包分别上传到对应的服务器。(可使用 WinSCP 等工具)
三台 MySQL 服务器需要安装 node
MHA Manager 服务器需要安装 manager 和 node
提示:也可以使用 wget 命令在 linux 系统直接下载获取,例如
wget https://github.com/yoshinorim/mha4mysqlmanager/releases/download/v0.58/mha4mysql-manager-0.580.el7.centos.noarch.rpm
MHA node 服务器安装
在四台服务器上安装 mha4mysql-node。
MHA 的 Node 依赖于 perl-DBD-MySQL,所以要先安装 perl-DBD-MySQL。
yum install perl-DBD-MySQL -y wget https://github.com/yoshinorim/mha4mysqlnode/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
MHA manager 服务器安装
在 MHA Manager 服务器安装 mha4mysql-node 和 mha4mysql-manager。
MHA 的 manager 又依赖了 perl-Config-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别 进行安装。
对于 centOS7
#依赖安装wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmrpm -ivh epel-release-latest-7.noarch.rpmyum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
MHA 安装
#node安装wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpmrpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm#manager安装wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpmrpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
提示:由于 perl-Log-Dispatch 和 perl-Parallel-ForkManager 这两个被依赖包在 yum 仓库找不到, 因此安装 epel-release-latest-7.noarch.rpm。在使用时,可能会出现下面异常:Cannot retrieve metalink for repository: epel/x86_64。可以尝试使 用/etc/yum.repos.d/epel.repo,然后注释掉 metalink,取消注释 baseurl。
MHA 配置文件
MHA Manager 服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的 Master/Slave 集群也可共享全局配置。
#目录说明 #/var/log (CentOS目录) # /mha (MHA监控根目录) # /app1 (MHA监控实例根目录) # /manager.log (MHA监控实例日志文件) mkdir -p /var/log/mha/app1 touch /var/log/mha/app1/manager.log
配置监控全局配置文件
vim /etc/masterha_default.cnf
[server default]#主库用户名,在 master mysql 的主库执行下列命令建一个新用户#creat user 'mha'@'%' identified by '123123';#grant all on *.* to mha@'%' identified by '123123';#flush privileges;user=mhapassword=123123port=3306#ssh 登录账号ssh_user=root#从库复制账号和密码repl_user=rootrepl_password=rootport=3306#ping 次数ping_interval=1#二次检查的主机secondary_check_script=masterha_secondary_check -s 172.16.94.5 -s 172.16.94.6 -s 172.16.94.10
配置监控实例配置文件
先使用mkdir -p /etc/mha命令创建目录,然后使用vim /etc/mha/app1.cnf命令编辑文件
[server default]#MHA 监控实例根目录manager_workdir=/var/log/mha/app1#MHA 监控实例日志文件manager_log=/var/log/mha/app1/manager.log#[serverx] 服务器编号#hostname 主机名#candidate_master 可以做主库#master_binlog_dir binlog 日志文件目录[server1]hostname=172.16.94.5candidate_master=1master_binlog_dir="/var/lib/mysql"[server2]hostname=172.16.94.6candidate_master=1master_binlog_dir="/var/lib/mysql"[server3]hostname=172.16.94.10candidate_master=1master_binlog_dir="/var/lib/mysql"
MHA 配置检测
执行 ssh 通信检测
在 MHA Manager 服务器上执行:
masterha_check_ssh --conf=/etc/mha/app1.cnf
检测 MySQL 主从复制
在 MHA Manager 服务器上执行:
masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明 MySQL 复制集群没有问题。
MHA Manager 启动
在 MHA Manager 服务器上执行:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
查看监控状态命令如下:
masterha_check_status --conf=/etc/mha/app1.cnf
查看监控日志命令如下:
tail -f /var/log/mha/app1/manager.log
测试 MHA 故障转移
模拟主节点崩溃
MHA Manager 服务器执行打开日志命令:
tail -200f /var/log/mha/app1/manager.log
关闭 Master MySQL 服务器服务,模拟主节点崩溃
systemctl stop mysqld
查看 MHA 日志,可以看到哪台 slave 切换成了 master
show master status;
测试 sql
CREATE TABLE position (id INT ( 20 ), NAME VARCHAR ( 50 ),salary VARCHAR ( 20 ),city VARCHAR ( 50 )) ENGINE = INNODB charset = utf8;insert into position values(1, 'Java', 13000, 'shanghai');insert into position values(2, 'DBA', 20000, 'beijing');show databases;use lanebinselect * from position;create TABLE position_detail6 (id int(20),pid int(20),description text) ENGINE=innodb charset=utf8;insert into position_detail6 values(1, 1, 'Java Developer6');insert into position_detail6 values(2, 2, 'Database Administrator6');select * from position_detail6;

总结
问题 1
无法实现 ssh 之间免密连接,配置文件内容未修改,hosts 内容未添加(可能非主要)
问题 2
无法安装 mha manager 节点,因为是 CentOS 8 要安装另一个版本的,且依然无法解决,只能改成 CentOS 7
问题 3
无法实现主从复制,再次查看下不同 mysql 的配置文件是否修改,slave 是否指定了 master,且主 master 一定不能指定其他的 master
因为这 3 个问题花费了我两天的时间,主要是 CentOS 8 几乎无解,尝试了好多方法都不行,应该早早把 MHA 机器换成 CentOS 7 的,本来一个小时就能解决,偏偏浪费了两天时间。
