接下来部署 MHA,具体的搭建环境如下(所有操作系统均为 CentOS7.6):
VIP:192.168.1.66
IP 地址 主机名 角色 软件
192.168.1.62 xuegod62.cn manager mha4mysql-mana mha4mysql-node
192.168.1.63 xuegod63.cn master mha4mysql-node
192.168.1.64 xuegod64.cn slave1,Candidate master mha4mysql-node
192.168.1.65 xuegod65.cn slave2 mha4mysql-node
其中 master 对外提供写服务,备选 Candidate master(实际为 slave1)提供读服务,slave2 也提供读服务,一旦 master 宕机,将会把备选 master 提升为新的 master,slave2 指向新的 master
注:xuegod62 作为管理节点可以配置给的低一些,其他节点配置能够运行 mysql 即可。拓扑图如下:
配置所有主机相互 SSH 登录无密码验证(使用 key 登录,工作中常用)。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误
[root@xuegod63 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #回车
Enter same passphrase again: #回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:sBMnO2ri/4gq+JnAXXCEx4WqDeBPnatKkwXrZ/uWMjM root@xuegod63
The key's randomart image is:
+---[RSA 2048]----+
| o.o. |
|. ..+ |
|o. .+.= . |
| ooooo B |
| .*. .* S |
|o.+o.o o |
|o*.++ . |
|+o+E.+ |
|o+BoXo. |
+----[SHA256]-----+ [root@xuegod63 ~]# ssh-copy-id 192.168.1.62
[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@xuegod62 ~]# ssh-keygen -t rsa
[root@xuegod62 ~]# ssh-copy-id 192.168.1.62 [root@xuegod62 ~]# ssh-copy-id 192.168.1.63
[root@xuegod62 ~]# ssh-copy-id 192.168.1.64
[root@xuegod62 ~]# ssh-copy-id 192.168.1.65
[root@xuegod64 ~]# ssh-keygen -t rsa
[root@xuegod63 ~]# ssh-copy-id 192.168.1.64 [root@xuegod64 ~]# ssh-copy-id 192.168.1.63
[root@xuegod64 ~]# ssh-copy-id 192.168.1.62
[root@xuegod64 ~]# ssh-copy-id 192.168.1.65
[root@xuegod65 ~]# ssh-keygen -t rsa
[root@xuegod63 ~]# ssh-copy-id 192.168.1.65
[root@xuegod65 ~]# ssh-copy-id 192.168.1.63
[root@xuegod65 ~]# ssh-copy-id 192.168.1.62
[root@xuegod65 ~]# ssh-copy-id 192.168.1.64
所有节点安装 mha-node 工具包
配好网络源,安装 epel 源,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# yum install -y wget
[root@xuegod62 ~]# wget -O /etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-7.repo
注:可以在 xshell 的这里执行,这样就可以在所有终端上执行这个命令了。
[root@xuegod62 ~]# yum clean all
[root@xuegod62 ~]# yum makecache
1.使用 yum 安装全部依赖,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny
perl-LogDispatch perl-Parallel-ForkManager libappstream-glib deltarpm patchutils
2. 上传 mha4mysql-node-0.57-0.el7.noarch.rpm 程序包到所有节点上。先上传到 xuegod63 上,然后复制到其他结点:
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.62:/root/
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.64:/root/
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.65:/root/
注意:所有的节点都需要安装 mha4mysql-node 程序包,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
安装完成后会在/usr/bin/目录下生成以下脚本文件:
[root@xuegod62 ~]# cd /usr/bin/
[root@xuegod62 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
仅在 xuegod62(管理节点)安装MHA Manager 中主要包括了几个管理员的命令行工具,例如 master_manger,master_master_switch 等。
MHA Manger 也依赖于 perl 模块,具体如下:
[root@xuegod62 bin]# cd
[root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-LogDispatch perl-Parallel-ForkManager
perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtilsMakeMaker perl-CPAN
安装 mha4mysql-manager
[root@xuegod62 ~]# rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
安装完成后会在/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
资料领取添加小姐姐微信即可
注意:主库 binlog-do-db 和 从库 replicate- do-db 设置必须相同,MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。
xuegod63 master
xuegod64 slave1,备用 master
xuegod65 slave2
在 xuegod63 配置主数据库服务器
上传 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/
安装 mysql
注:所有 mysql 节点全部安装,由于临时密码不同,此处省略 64、65 节点安装初始化过程
[root@xuegod63 ~]# tar xvf mysql-5.7.tar.gz
[root@xuegod63 ~]# yum -y install ./mysql*.rpm
[root@xuegod63 ~]# systemctl start mysqld #启动 MySQL 会生成临时密码。
xuegod63 在 MySQL 的配置文件/etc/my.cnf 中关闭密码强度审计插件,并重启 MySQl 服务。
[root@xuegod63 ~]# vim /etc/my.cnf #修改 MySQL 的配置文件,在[myqld]标签
处末行添加以下项:
validate-password=OFF #不使用密码强度审计插件
[root@xuegod63 ~]# systemctl restart mysqld #重启 MySQL 服务
[root@xuegod63 ~]# grep 'password' /var/log/mysqld.log #获取临时密码。
2018-08-01T09:59:33.918961Z 1 [Note] A temporary password is generated for
root@localhost: buL.UJp!T2Od #临时密码
[root@xuegod63 ~]# mysql -u root -p'buL.UJp!T2Od' #使用临时密码登录
MySQl,注意临时密码要引号
mysql> set password for root@localhost = password('123456'); #修改 root 用户密
码为 123456
mysql> flush privileges;
xuegod64 同上 xuegod65 同上
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
将 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 #不可以被从服务器复制的库
重启 MySQL:
[root@xuegod63 ~]# systemctl restart mysqld && systemctl enable mysqld
授权:
[root@xuegod63 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> flush privileges;
查看状态信息:
mysql> show master status;
mysql> exit
将 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
配置 xuegod64 为 mysql 从节点:
导入数据库
[root@xuegod64 ~]# mysql -u root -p123456 <HA.sql
配置 my.cnf:
[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 才会记录主库同步的
操作日志
重启 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;
建立主从关系
mysql> change master to
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
mysql> exit
配置 xuegod65
导入数据库
[root@xuegod65 ~]# mysql -u root -p123456 <HA.sql
配置 my.cnf:
[root@xuegod65 ~]# vim /etc/my.cnf
#在文件的最后插入以下内容
#启用二进制日志
#本机数据库 ID 标示
log-bin=mysql-slave2
server-id=3
binlog-do-db=HA
binlog-ignore-db=mysql
log_slave_updates=1
#可以被从服务器复制的库。二进制需要同步的数据库名
#不可以被从服务器复制的库
#只有开启 log_slave_updates,从库 binlog 才会记录主库同步的
操作日志
[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;
建立主从关系
mysql> change master to
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
mysql> exit
测试 mysql 主从数据同步:
在 xuegod63 mysql 主上插入数据:
mysql> use HA;
mysql>
mysql>
insert into test
insert into test
values(2,"man");
values(3,"root");
在 xuegod65 上查看数据:
mysql> use HA;
mysql> select * from test;
+------+------+
#可以看到数据,说明,数据同步成功
| id | name |
+------+------+
|
|
1 | mk
|
1 | root |
+------+------+
两台 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)。这样可以避免切换的过程中双写引起脏数据。
在所有数据库结点上创建 mha 管理用户
远程登录用户必须拥有 localhost 权限才可以登录,必须先授权 localhost 再授权 192.168.1.%
[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;
mysql> exit
[root@xuegod64 ~]# 同上
[root@xuegod65 ~]# 同上
注:该管理用户是为了管理 MHA 集群,比如:master 节点故障后,MHA 管理软件通过管理用户在 slave2 节点执行 sql
语句将 master 设置为 xuegod64。 到这里整个集群环境已经搭建完毕,剩下的就是配置 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/mha4mysqlmanager/wiki/Configuration
[root@xuegod62 ~]# vim /etc/masterha/app1.cnf
修改 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 秒,尝试三次没有
回应的时候自动进行 failover
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.1.63
port=3306
[server2]
hostname=192.168.1.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.1.65
port=3306
上传 master_ip_failover perl 脚本文件到 xuegod62 主机上/usr/local/bin/目录下,MHA 主
程序负责对数据转移和故障切换功能,该脚本负责对 VIP 进行切换
[root@xuegod62 ~]# mv master_ip_failover /usr/local/bin/
[root@xuegod62 ~]# chmod +x /usr/local/bin/master_ip_failover
如果你的网卡名称不是 ens33 请修改脚本文件中的网卡名称
14 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; # Network name
15 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
[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 在发生切换的过程中,从库的恢复过程中依赖于 relay log 的相关信息,所以这里要将 relay log 的自动清除设置为 OFF,采用手动清除 relay log 的方式。 在默认情况下,从服务器上的中继日志会在 SQL 线程执行完毕后被自动删除。 但是在 MHA 环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能
[root@xuegod62~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
[root@ xuegod62 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK. 显示 Ok ,正常!
[root@ xuegod62 ~]# 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 不会启动故障转移,因为该问题可能再次发生。
[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 监控没有开启
[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.."说明整个系统已经开
始监控了。
[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 2>&1
实战场景:当主节点 xuegod63 上的 mysql 服务关闭后,MHA 可以自动将 xuegod64 备用从节点,转为主节点。MHA 调用 master_ip_failover 把 keepalive 上的 VIP 地址配置到 xuegod64 上。
[root@xuegod62 ~]# 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 已经出现 1.66
#打开新窗口观察日志
[root@xuegod62 ~]# tail -f /var/log/masterha/app1/manager.log
#模拟主库挂掉
[root@xuegod63 ~]# systemctl stop mysqld
。。。
192.168.1.64(192.168.1.64:3306): Resetting slave info succeeded.
Master failover to 192.168.1.64(192.168.1.64:3306) completed successfully.
我们从日志上可以看到故障切换成功,恭喜你新的 master 是 xuegod64.
并且 vip 会漂移到新主库
新的主库插入记录,从库查看
实战场景:当 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.1.64',master_user='repl',master_password='123456';
mysql> flush privileges;
mysql> start slave;
mysql> show slave status\G #已经加入 mysql 主从集群
mysql> exit
MHA 进行故障转移之后会将配置文件中的故障节点直接删除,我们需要将 xuegod63 的配置文件重新添加到集群配置文件中。
[root@xuegod62 ~]# vim /etc/masterha/app1.cnf
改:
15 [server2]
16 candidate_master=1 #删除这行内容,因为现在它是主
17 check_repl_delay=0 #删除这行内容
18 hostname=192.168.1.64
19 port=3306
为:
[server2]
hostname=192.168.1.64
port=3306
在文件最后,插入以下内容:
[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.1.63
port=3306
重新检测集群可用性
[root@xuegod63 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
。。。
MySQL Replication Health is OK.
masterha_manager 切换主库后会停掉,需要手动启动
再次开启动 masterha_manager,监控 mysql 主从集群:
[root@xuegod62 ~]# 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
在 xuegod62 上看日志是否切换 master 成功 #又换回 63 主机
并且 vip 也漂移回来
登陆从服务器 xuegod65 查看 show slave status\G 是否成功切换
[root@xuegod65 ~]# mysql -u root -p123456
mysql> show slave status\G
小结:
目前高可用方案可以一定程度上实现数据库的高可用,还有其他方案 heartbeat+drbd,Cluster、MGR 等。这些高可用软件各有优劣。在进行高可用方案选择时,主要是看业务还有对数据一致性方面的要求
想要获取原笔记和视频+学习资料
添加我们的小姐姐即可
可不能撩我们的小姐姐哦