实现 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

  1. #bin_log 配置
  2. log_bin=mysql-bin
  3. server-id=1
  4. sync-binlog=1
  5. binlog-ignore-db=information_schema
  6. binlog-ignore-db=performance_schema
  7. binlog-ignore-db=sys
  8. #relay_log 配置
  9. relay_log=mysql-relay-bin
  10. log_slave_updates=1
  11. relay_log_purge=0

两台从库配置/etc/my.cnf

  1. #bin_log 配置
  2. log_bin=mysql-bin
  3. #服务器 ID,从库 2、3
  4. server-id=2
  5. sync-binlog=1
  6. binlog-ignore-db=information_schema
  7. binlog-ignore-db=mysql
  8. binlog-ignore-db=performance_schema
  9. #relay_log 配置
  10. relay_log=mysql-relay-bin
  11. log_slave_updates=1
  12. relay_log_purge=0
  13. read_only=1

三台分别重启服务

  1. systemctl restart mysqld

主库开启权限

  1. #进入mysql
  2. grant replication slave on *.* to 'root'@'%' identified by 'root';
  3. grant all privileges on *.* to 'root'@'%' identified by 'root';
  4. flush privileges;
  5. grant replication slave on *.* to 'mha'@'%' identified by '123123';
  6. grant all privileges on *.* to 'mha'@'%' identified by '123123';
  7. flush privileges;

两台从库建立主从关系

  1. #查看是否以前有配置信息,若有则去除掉
  2. show slave status;
  3. #stop slave;
  4. #reset slave all;
  5. #在主库查看binlog状态
  6. #show master status \G;
  7. #从库设置主库信息
  8. change master to master_host='172.16.94.5',master_port=3306,master_user='root',master_password='root',
  9. master_log_file='mysql-bin.000014',master_log_pos=154;
  10. #开启从库
  11. start slave;
  12. #再次查看从库配置信息
  13. show slave status \G;

四台机器 ssh 互通

在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)

  1. ssh-keygen -t rsa

在三台 MySQL 服务器分别执行下面命令,密码输入系统密码,将公钥拷到 MHA Manager 服务器上

  1. ssh-copy-id 172.16.94.13

之后可以在 MHA Manager 服务器上检查下,看看.ssh/authorized_keys 文件是否包含 3 个公钥

  1. cat /root/.ssh/authorized_keys

执行下面命令,将 MHA Manager 的公钥添加到 authorized_keys 文件中(此时应该包含 4 个公钥)

  1. cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

从 MHA Manager 服务器执行下面命令,向其他三台 MySQL 服务器分发公钥信息

  1. scp /root/.ssh/authorized_keys root@172.16.94.5:/root/.ssh/authorized_keys
  2. scp /root/.ssh/authorized_keys root@172.16.94.6:/root/.ssh/authorized_keys
  3. scp /root/.ssh/authorized_keys root@172.16.94.10:/root/.ssh/authorized_keys

每台服务器都执行下列操作

  1. #赋予权限
  2. chmod 600 .ssh/authorized_keys
  3. #修改 /etc/hosts 文件
  4. vim /etc/hosts
  5. #添加内容
  6. 172.16.94.5 master1
  7. 172.16.94.6 slave1
  8. 172.16.94.10 slave2
  9. 172.16.94.13 mha

每台服务器都修改 /etc/ssh/sshd_config 文件

  1. vim /etc/ssh/sshd_config
  2. #添加内容或修改内容
  3. RSAAuthentication yes
  4. PubkeyAuthentication yes
  5. AuthorizedKeysFile .ssh/authorized_keys

可以 MHA Manager 执行下面命令,检测下与三台 MySQL 是否实现 ssh 互通。

  1. ssh 172.16.94.5
  2. exit
  3. ssh 172.16.94.6
  4. exit
  5. ssh 172.16.94.10
  6. exit

MHA 下载安装

MHA 下载

MySQL5.7 对应的 MHA 版本是 0.5.8,所以在 GitHub 上找到对应的 rpm 包进行下载,MHA manager 和

node 的安装包需要分别下载:

  1. 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 系统直接下载获取,例如

  1. 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。

  1. 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

  1. #依赖安装
  2. wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  3. rpm -ivh epel-release-latest-7.noarch.rpm
  4. yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y

MHA 安装

  1. #node安装
  2. wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
  3. rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
  4. #manager安装
  5. wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
  6. rpm -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 集群也可共享全局配置。

  1. #目录说明 #/var/log (CentOS目录) # /mha (MHA监控根目录) # /app1 (MHA监控实例根目录) # /manager.log (MHA监控实例日志文件) mkdir -p /var/log/mha/app1 touch /var/log/mha/app1/manager.log

配置监控全局配置文件

  1. vim /etc/masterha_default.cnf
  1. [server default]
  2. #主库用户名,在 master mysql 的主库执行下列命令建一个新用户
  3. #creat user 'mha'@'%' identified by '123123';
  4. #grant all on *.* to mha@'%' identified by '123123';
  5. #flush privileges;
  6. user=mha
  7. password=123123
  8. port=3306
  9. #ssh 登录账号
  10. ssh_user=root
  11. #从库复制账号和密码
  12. repl_user=root
  13. repl_password=root
  14. port=3306
  15. #ping 次数
  16. ping_interval=1
  17. #二次检查的主机
  18. secondary_check_script=masterha_secondary_check -s 172.16.94.5 -s 172.16.94.6 -s 172.16.94.10

配置监控实例配置文件

  1. 先使用
  2. mkdir -p /etc/mha
  3. 命令创建目录,然后使用
  4. vim /etc/mha/app1.cnf
  5. 命令编辑文件
  1. [server default]
  2. #MHA 监控实例根目录
  3. manager_workdir=/var/log/mha/app1
  4. #MHA 监控实例日志文件
  5. manager_log=/var/log/mha/app1/manager.log
  6. #[serverx] 服务器编号
  7. #hostname 主机名
  8. #candidate_master 可以做主库
  9. #master_binlog_dir binlog 日志文件目录
  10. [server1]
  11. hostname=172.16.94.5
  12. candidate_master=1
  13. master_binlog_dir="/var/lib/mysql"
  14. [server2]
  15. hostname=172.16.94.6
  16. candidate_master=1
  17. master_binlog_dir="/var/lib/mysql"
  18. [server3]
  19. hostname=172.16.94.10
  20. candidate_master=1
  21. master_binlog_dir="/var/lib/mysql"

MHA 配置检测

执行 ssh 通信检测

在 MHA Manager 服务器上执行:

  1. masterha_check_ssh --conf=/etc/mha/app1.cnf

检测 MySQL 主从复制

在 MHA Manager 服务器上执行:

  1. masterha_check_repl --conf=/etc/mha/app1.cnf

出现“MySQL Replication Health is OK.”证明 MySQL 复制集群没有问题。

MHA Manager 启动

在 MHA Manager 服务器上执行:

  1. 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 &

查看监控状态命令如下:

  1. masterha_check_status --conf=/etc/mha/app1.cnf

查看监控日志命令如下:

  1. tail -f /var/log/mha/app1/manager.log

测试 MHA 故障转移

模拟主节点崩溃

MHA Manager 服务器执行打开日志命令:

  1. tail -200f /var/log/mha/app1/manager.log

关闭 Master MySQL 服务器服务,模拟主节点崩溃

  1. systemctl stop mysqld

查看 MHA 日志,可以看到哪台 slave 切换成了 master

  1. show master status;

测试 sql

  1. CREATE TABLE position (
  2. id INT ( 20 ), NAME VARCHAR ( 50 ),
  3. salary VARCHAR ( 20 ),
  4. city VARCHAR ( 50 )
  5. ) ENGINE = INNODB charset = utf8;
  6. insert into position values(1, 'Java', 13000, 'shanghai');
  7. insert into position values(2, 'DBA', 20000, 'beijing');
  8. show databases;
  9. use lanebin
  10. select * from position;
  11. create TABLE position_detail6 (
  12. id int(20),
  13. pid int(20),
  14. description text
  15. ) ENGINE=innodb charset=utf8;
  16. insert into position_detail6 values(1, 1, 'Java Developer6');
  17. insert into position_detail6 values(2, 2, 'Database Administrator6');
  18. select * from position_detail6;

MySQL高可用MHA搭建 - 图1

总结

问题 1

无法实现 ssh 之间免密连接,配置文件内容未修改,hosts 内容未添加(可能非主要)

问题 2

无法安装 mha manager 节点,因为是 CentOS 8 要安装另一个版本的,且依然无法解决,只能改成 CentOS 7

问题 3

无法实现主从复制,再次查看下不同 mysql 的配置文件是否修改,slave 是否指定了 master,且主 master 一定不能指定其他的 master

因为这 3 个问题花费了我两天的时间,主要是 CentOS 8 几乎无解,尝试了好多方法都不行,应该早早把 MHA 机器换成 CentOS 7 的,本来一个小时就能解决,偏偏浪费了两天时间。