配置MySQL高可用集群之MHA

MHA 的组成
该软件由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA
Manager 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节
点上。MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节
点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的
slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。
Manager 工具包主要包括以下几个工具:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 MHA
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的 server 信息
mysql-MHA 群环境说明
接下来部署 MHA,具体的搭建环境如下(所有操作系统均为 CentOS7.6 64bit):

其中有个虚拟的ip地址设的192.168.0.67,在master_ip_failover脚本中

IP 地址
主机名
角色定位
需要下载的软件
192.168.0.63xuegod63
master
mha4mysql-node
mysql.5.7
192.168.0.64xuegod64
slave1,Candidate master
mha4mysql-node
mysql.5.7
192.168.0.65xuegod65
slave2
mha4mysql-node
mysql.5.7
192.168.0.66xuegod66
manager
mha4mysql-mana
mha4mysql-nod
 

其中 master 对外提供写服务,备选 Candidate master(实际为 slave1)提供读服务,slave2 也提供读服务,一旦 master 宕机,将会把备选 master 提升为新的 master,slave2 指向新的 master 注:xuegod66作为管理节点可以配置给的低一些,其他节点配置能够运行 mysql 即可。

扩展图如下
此次搭建需要用到的文件和软件包

  一、配置所有节点的ssh免密码登录

这里用xshell工具实现输入到所以会话

[root@xuegod63 ~]# ssh-keygen -t rsa #可以一直回车

[root@xuegod63 ~]# ssh-copy-id 192.168.1.63
[root@xuegod63 ~]# ssh-copy-id 192.168.1.64
[root@xuegod63 ~]# ssh-copy-id 192.168.1.65
[root@xuegod63 ~]# ssh-copy-id 192.168.1.66

、所有节点安装mha-node

1.安装依赖包
[root@xuegod63 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log
Dispatch perl-Parallel-ForkManager libappstream-glib deltarpm patchutils
2. 传 mha4mysql-node-0.57-0.el7.noarch.rpm 程序 包到所有节点 上,全部安装
 [root@xuegod63 ~]rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
3.安装完成后会在/usr/bin/目录下生成以下脚本文件:
[root@xuegod63 ~]# cd /usr/bin/
[root@xuegod63 bin]# ll app* filter* purge* save*
-rwxr-xr-x. 1 root root 70176 6 月 10 2014 applydeltarpm
-rwxr-xr-x 1 root root 16381 5 月 31 2015 apply_diff_relay_logs
-rwxr-xr-x. 1 root root 27752 8 月 7 2017 appstream-compose
-rwxr-xr-x. 1 root root 102272 8 月 7 2017 appstream-util
-rwxr-xr-x. 1 root root 46256 6 月 10 2014 filterdiff
-rwxr-xr-x 1 root root 4807 5 月 31 2015 filter_mysqlbinlog
-rwxr-xr-x 1 root root 8261 5 月 31 2015 purge_relay_logs
-rwxr-xr-x 1 root root 7525 5 月 31 2015 save_binary_logss

三、xuegod66安装mha manager

1.安装依赖包
[root@xuegod66 ~]yum -y install perl-DBD-MySQL  perl-Config-Tiny  perl-Log-Dispatch  perl-Parallel-ForkManager  perl-Time-HiRes  perl-ExtUtils-CBuilder  perl-ExtUtils-MakeMaker  perl-CPAN
2.上传mha4mysql-manager-0.57-0.el7.noarch.rpm,然后安装
[root@xuegod66 ~]# rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
3.安装完成后会在/usr/bin 目录下面生成以下脚本文件

[root@xuegod62 ~]# ll /usr/bin/mast*

-rwxr-xr-x 1 root root 1995 5 月 31 2015 /usr/bin/masterha_check_repl
-rwxr-xr-x 1 root root 1779 5 月 31 2015 /usr/bin/masterha_check_ssh
-rwxr-xr-x 1 root root 1865 5 月 31 2015 /usr/bin/masterha_check_status
-rwxr-xr-x 1 root root 3201 5 月 31 2015 /usr/bin/masterha_conf_host
-rwxr-xr-x 1 root root 2517 5 月 31 2015 /usr/bin/masterha_manager
-rwxr-xr-x 1 root root 2165 5 月 31 2015 /usr/bin/masterha_master_monitor
-rwxr-xr-x 1 root root 2373 5 月 31 2015 /usr/bin/masterha_master_switch
-rwxr-xr-x 1 root root 5171 5 月 31 2015 /usr/bin/masterha_secondary_check
-rwxr-xr-x 1 root root 1739 5 月 31 2015 /usr/bin/masterha_stop

四、安装mysql.5.7(除了xuegod66,其他的服务器都要安装)

1.下载并上传软件包
上传 mysql-5.7.tar.gz 到 xuegod63 主机上
注:mysql-5.7.tar.gz 中包括了安装 mysql5.7 主要的软件包。 这样部署起来更方便
[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.64:/root/
[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.65:/root/
2.安装,先解压
[root@xuegod63 ~]# tar xvf mysql-5.7.tar.gz
[root@xuegod63 ~]# yum -y install ./mysql*.rpm
[root@xuegod63 ~]# systemctl start mysqld #启动 MySQL 会生成临时密码。
3.启动以后关闭密码强度审计插件,并重启mysql服务
[root@xuegod63 ~]# vim /etc/my.cnf   #修改 MySQL 的配置文件,在[myqld]标签 处末行添加以下项:
validate-password=OFF    #不使用密码强度审计插件
[root@xuegod63 ~]# systemctl restart mysqld   #重启 MySQL 服务
4.获取临时密码并登录修改密码
[root@xuegod63 ~]# grep 'password' /var/log/mysqld.log   #获取临时密码。

 [root@xuegod63 ~]# mysql -u root -p'zhVhqgiPj0:)'   #使用临时密码登录MySQl,注意临时密码要引号

mysql> set password for root@localhost = password('123456');   #修改 root 用户密码为 123456

mysql> flush privileges; #刷新权限

另外两个主机也这样操作

五、配置 mysql 主从环境

1.将xuegod63 配置为主master服务器

1.1.xuegod63 创建要同步的数据库
[root@xuegod63 ~]# mysql -u root -p123456
mysql> create database HA;
mysql> use HA;
mysql> create table test(id int,name varchar(20));
mysql> insert into test values (1,"mk");
mysql> exit
1.2.将 xuegod63 配置为 mysql 主节点
[root@xuegod63 ~]# vim /etc/my.cnf #在文件最后,插入以下内容
log-bin=mysql-bin-master   #启用二进制日志
server-id=1   #本机数据库 ID 标示
binlog-do-db=HA   #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql  #不可以被从服务器复制的库
1.3.重启 MySQL:
[root@xuegod63 ~]# systemctl restart mysqld && systemctl enable mysqld
1.4.授权:
[root@xuegod63 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to repl@'192.168.0.%' identified by '123456';
mysql> flush privileges;
1.5.可以查看状态信息:
mysql> show master status;
mysql> exit

1.6.最后将 HA 数据库上传到从节点

[root@xuegod63 ~]# mysqldump -u root -p123456 -B HA >HA.sql
[root@xuegod63 ~]# scp HA.sql root@192.168.1.64:/root
[root@xuegod63 ~]# scp HA.sql root@192.168.1.65:/root
2.将  xuegod64 配置为从候选slave1,Candidate master的服务器
2.1.导入数据库
[root@xuegod64 ~]# mysql -u root -p123456 <HA.sq
2.2.配置 xuegod64 为 mysql 从节点
[root@xuegod64 ~]# vim /etc/my.cnf #在文件的最后插入以下内容
log-bin=mysql-slave1   #启用二进制日志
server-id=2   #本机数据库 ID 标示
binlog-do-db=HA   #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql   #不可以被从服务器复制的库
log_slave_updates=1    #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的 操作日
志  
2.3.重启 MySQL 并授权:
[root@xuegod64 ~]# systemctl restart mysqld
[root@xuegod64 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456';
mysql> flush privileges;
2.4建立主从关系
mysql>change master to  master_host='192.168.1.63', master_user='repl',master_password='1 23456'; 
mysql> start slave;
mysql> show slave status\G

 3、置 xuegod65为slave服务器

3.1导入数据库

[root@xuegod65 ~]# mysql -u root -p123456 <HA.sq

3.2、配置 my.cnf

[root@xuegod65 ~]# vim /etc/my.cnf #在文件的最后插入以下内容
log-bin=mysql-slave2   #启用二进制日志
server-id=3   #本机数据库 ID 标示
binlog-do-db=HA   #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
log_slave_updates=1   #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的
操作日志
3.3.重 启 MySQL 并授权:
[root@xuegod65 ~]# systemctl restart mysqld #重启 MySQL
[root@xuegod65 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to 'repl'@'192.168.1%' identified by '123456';
mysql> flush privileges;
3.4.建立主从关系
mysql> change master to
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G

4、测试主从数据同步

测试 mysql 主从数据同步:
在 xuegod63 mysql 主上插入数据:
mysql> use HA;
mysql> insert into test values(2,"man");
mysql> insert into test values(3,"root");
在 xuegod65 上查看数据:
mysql> use HA;
mysql> select * from test; #可以看到数据,说明,数据同步成功

六、配置 MHA 管理用户

1.两台 slave 服务器设置 read_only(从库对外提供读服务,只是没有写进配置文件,当集群发生切换时新的 master 节点会取消只读状态)

[root@xuegod64 ~]# mysql -u root -p123456 -e 'set global read_only=1'
[root@xuegod65 ~]# mysql -u root -p123456 -e 'set global read_only=1'
注:set global read_only=1 作用是:进行主备切换的时候,一般都会先对主库进行只读操作
(on),然后主备同步完成后,再把备库置为可读写(off)。这样可以避免切换的过程中双写引起脏数据。
2. 所有数据库结点上创建 mha 管理用户
远程登录用户必须拥有 localhost 权限才可以登录, 必须先授权 localhost 再授权 192.168.0.%
[root@xuegod63 ~]# mysql -uroot -p123456
mysql> grant all privileges on *.* to 'mha'@'localhost' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'192.168.1.%' identified by '123456';
mysql> flush privileges;
[root@xuegod64 ~]# 同上
[root@xuegod65 ~]# 同上
注:该管理用户是为了管理 MHA 集群,比如:master 节点故障后,MHA 管理软件通过管理用户
在 slave2 节点执行 sql 语句将 master 设置为 xuegod64。

到这里整个集群环境已经搭建完毕,剩下的就是配置 MHA 软件了。

七、配置MHA

1. 创建 MHA 的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)。
[root@xuegod62 ~]# mkdir -p /etc/masterha
[root@xuegod62 ~]# mkdir -p /var/log/masterha/app1
[root@xuegod62 ~]# cd /etc/masterha/
[root@xuegod62 masterha]# rz    #上传 app1.cnf 到/etc/masterha/目录下
注:app1.cnf 配置文件从这里可以下载:https://github.com/yoshinorim/mha4mysql
manager/wiki/Configuration

2.改 app1.cnf 配置文件,修改后的文件内容如下

[root@xuegod62 ~]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1  #设置 manager 的工作目录
manager_log=/var/log/masterha/app1/manager.log  #设置 manager 的日志
master_binlog_dir=/var/lib/mysql #指定 mysql 保存 binlog 的位 置,以便 MHA 可以找到 master 的日志,我这里的也就是 mysql 的数据目录
master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动 failover 时候的 切换脚本,这个脚本如果没有,就不需要写入此项,否则会报错。
password=123456 #设置 MySQL 中 mha 用户的密码,这个密码是前文中创建监控用 户的那个密码
user=mha #设置管理用户 mha
ping_interval=1 #设置监控主库,发送 ping 包的时间间隔,默认是 3 秒,尝试三次没有 回应的时候自动进行 railover
remote_workdir=/tmp #设置远端 MySQL 在发生切换时,binlog 的保存位置
repl_password=123456 #设置复制用户的密码
repl_user=repl #设置复制环境中的复制用户名
#report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本,没有配置则注释
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放
在发生脑裂,这里没有使用)
ssh_user=root #设置 SSH 的登录用户名
[server1]
hostname=192.168.0.63
port=3306
[server2]
hostname=192.168.0.64
port=3306
candidate_master=1 #设置为候选 master,如果设置该参数以后,发生主从切换以后将会将此
从库提升为主库,即使这个主库不是集群中事件最新的 slave candidate 侯选人
check_repl_delay=0 #默认情况下,如果一个 slave 落后 master 100M 的 relay logs 的话,
MHA 将不会选择该 slave 作为一个新的 master,因为对于这个 slave 的恢复需要花费很长时间,通过 设置 check_repl_delay=0,MHA 触发切换在选择一个新的 master 的时候将会忽略复制延时,这个参 数对于设置了 candidate_master=1 的主机非常有用,因为这个候选主在切换的过程中一定是新的
master
[server3]
hostname=192.168.0.65
port=3306
3.上传 master_ip_failover perl 脚本文件到 xuegod62 主机上/usr/local/bin/目录下
下,MHA 主 程序负责对数据转移和故障切换功能,该脚本负责对 VIP 进行切换
赋予执行的权限,并进行修改,主要修改网卡名称
[root@xuegod62 ~]# chmod +x /usr/local/bin/master_ip_failover
4. 闭关 relay log 的自动清除功能(在每个 slave 节点上)
[root@xuegod64 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'
[root@xuegod65 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'

八、MHA 配置开启和检查

1. 检查 SSH 配置
检查 MHA Manger 到所有 MHA Node 的 SSH 连接状态
[root@xuegod62~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

 可以看见各个节点 SSH 验证都是 OK 的。

2. 检查整个 mysql 主从复制状态。

通过 masterha_check_repl 脚本查看 mysql 主从复制状态
[root@ xuegod62 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

MySQL Replication Health is OK. 显示 Ok ,正常!

3.开启 MHA Manager 监控
[root@xuegod63 ~]# 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 &
[1] 30867
启动参数介绍:
--remove_dead_master_conf #该参数代表当发生主从切换后,老的主库的 IP 将会从配置文
件中移除。
--manger_log #日志存放位置
--ignore_last_failover #我需要忽略上次故障转移。默认情况,如果先前的故障转移失
败,则 MHA 不会启动故障转移,因为该问题可能再次发生。
4. 检查 MHA Manager 的状态:
通过 master_check_status 脚本查看 Manager 的状态
查看 MHA Manager 监控是否正常:
[root@ xuegod62 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:10890) is running(0:PING_OK), master:192.168.1.63
可以看见已经在监控了,而且 master 的主机为 192.168.1.63 。
注意:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表 MHA 监控没有开
启。
5. 查看启动日志
[root@xuegod62 ~]# tail -n20 /var/log/masterha/app1/manager.log
。。。
。。。
Fri Nov 9 15:53:51 2018 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't
respond..
其中"Ping(SELECT) succeeded, waiting until MySQL doesn't respond.."说明整个系统已经开
始监控了。
 6. 关闭 MHA Manage 监控
[root@xuegod62~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+ 退出 1 nohup masterha_manager --conf=/etc/masterha/app1.cnf
--remove_dead_master_conf --ignore_last_failover < /dev/null >
/var/log/masterha/app1/manager.log

实战:模拟故障转移及故障恢复

1、故障转移

打开mha manages监控

[root@xuegod63 ~]# 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 &
[1] 30867

此时主库的 vip 已经出现 192.168.0.67

 #打开新窗口观察日志

[root@xuegod62 ~]# tail -f /var/log/masterha/app1/manager.log
#模拟主库挂掉
[root@xuegod63 ~]# systemctl stop mysqld
在 xuegod66 上看日志是否切换 master 成功
[root@xuegod66 ~]# tail -f /var/log/masterha/app1/manager.log
我们从日志上可以看到故障切换成功,恭喜你新的 master 是 xuegod64.
并且 vip 会漂移到新主库

 登陆从服务器 xuegod65 查看 show slave status\G 是否成功切换

[root@xuegod65 ~]# mysql -u root -p123456
mysql> show slave status\G

2.、故障恢复后重新加入 mysql 主从集群

当 xuegod63 的 mysql 服务修复好并启动后,手动将 xuegod63 加入到现在的 mysql
主从集群中。
重新启动故障主机。
[root@xuegod63 ~]# systemctl start mysqld
修改节点为只读状态并关闭 relay log 日志自动删除功能
[root@xuegod63 ~]# mysql -uroot -p123456 -e 'set global read_only=1'
[root@xuegod63 ~]# mysql -uroot -p123456 -e ' set global relay_log_purge=0'

 将 xuegod63 主机以 slave 的身份加入到 myslq 主从集群

[root@xuegod63 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.0.64',master_user='repl',master_passsword='123456';
mysql> flush privileges;
mysql> start slave;
mysql> show slave status\G #已经加入 mysql 主从集群
如果需要把故障的主机重新添加到 MHA 集群,我们需要删除/var/log/masterha/app1/下的
app1.master_status.health 文件,否则主机添加失败。 配置 keepalived 时需要,现在已不用
登录 xuegod66 上,执行:
[root@xuegod66 ~]# rm -rf /var/log/masterha/app1/*
MHA 进行故障转移之后会将配置文件中的故障节点直接删除,我们需要将 xuegod63 的配置文件 重新添加到集群配置文件中。
[root@xuegod66 ~]# vim /etc/masterha/app1.cnf
改:
15 [server2]
16 candidate_master=1 #删除这行内容,因为现在它是主
17 check_repl_delay=0 #删除这行内容
18 hostname=192.168.0.64
19 port=3306
加:
在文件最后,插入以下内容:
[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.0.63
port=3306
重新检测集群可用性
[root@xuegod63 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
。。。
MySQL Replication Health is OK
再次 开启动 masterha_manager ,监控 mysql 主从集群:
[root@xuegod63 ~]# 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 &
再模拟新主库挂掉
[root@xuegod64 ~]# systemctl stop mysqld
在 xuegod66 上看日志是否切换 master 成功 #又换回 63 主机
[root@xuegod66 ~]# tail -f /var/log/masterha/app1/manager.log

 并且 vip 也漂移回来

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值