003.Heartbeat MySQL双主复制
程序员文章站
2022-09-04 17:08:41
一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master01 CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Master02 CentOS 7.5 MySQL 5.6 192.168.88.101 192.168.77.1 ......
一 基础环境
关闭防火墙及selinux;
配置ntp时钟同步。
二 实际部署
2.1 安装mysql
1 [root@master1 ~]# yum list installed | grep mysql #查看是否存在其他mysql组件 2 [root@master1 ~]# yum -y remove mysql* #为避免冲突引,卸载已存在的组件 3 [root@master1 ~]# yum -y install mariadb mariadb-server 4 [root@master1 ~]# systemctl start mariadb.service
注意:以上操作在master02主机上也需要执行。
2.2 初始化mysql
1 [root@master1 ~]# mysql_secure_installation #设置root密码 2 [root@master1 ~]# systemctl restart mariadb.service
注意:以上操作在master02主机上也需要执行。
2.3 master01 my.cf配置
1 [root@master1 ~]# vi /etc/my.cnf 2 [mysqld] 3 …… 4 server-id=1 #设置主服务器master的id 5 log-bin=mysql-bin #配置二进制变更日志命名格式 6 replicate-wild-ignore-table=mysql.% 7 replicate-wild-ignore-table=test.% 8 replicate-wild-ignore-table=information_schema.%
注意:
master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:
方法一:
不同步哪些数据库:
1 binlog-ignore-db = mysql 2 binlog-ignore-db = test 3 binlog-ignore-db = information_schema
只同步哪些数据库,除此之外,其他不同步
1 binlog-do-db = mysqltest
方法二:
建议采用以下方式配置过滤:
1 replicate-wild-ignore-table=mysql.% #从库配置不同步表 2 replicate-wild-do-table=test.% #从库配置需要同步的表
提示:不要在主库使用binlog-ignore-db和binlog-do-db,也不要在从库使用replicate-wild-ignore和replicate-wild-do-table。
2.4 创建账号
1 [root@master1 ~]# mysql -uroot -p 2 enter password: 3 mariadb [(none)]> grant replication slave on *.* to 'repl_user'@'192.168.88.101' identified by 'x12345678'; 4 mariadb [(none)]> grant all privileges on *.* to 'root'@'192.168.88.%' identified by 'x120952576' with grant option; 5 mariadb [(none)]> flush privileges; 6 [root@master1 ~]# systemctl restart mariadb.service 7 [root@master1 ~]# mysql -uroot -p 8 enter password: 9 mariadb [(none)]> show master status;
master01:
file:mysql-bin.000001
position:245
2.5 master02 my.cf配置配置
1 [root@master2 ~]# vi /etc/my.cnf 2 [mysqld] 3 server-id=2 #设置主服务器master的id 4 log-bin=mysql-bin #配置二进制变更日志命名格式 5 replicate-wild-ignore-table=mysql.% 6 replicate-wild-ignore-table=test.% 7 replicate-wild-ignore-table=information_schema.% 8 read_only=1
2.6 创建账号
1 [root@master2 ~] mysql -uroot -p 2 enter password: 3 mariadb [(none)]> grant replication slave on *.* to 'repl_user'@'192.168.88.100' identified by 'x12345678'; 4 mariadb [(none)]> grant all privileges on *.* to 'root'@'192.168.88.%' identified by 'x120952576' with grant option; 5 mariadb [(none)]> flush privileges; 6 [root@master2 ~]# systemctl restart mariadb.service 7 [root@master2 ~]# mysql -uroot -p 8 enter password: 9 mariadb [(none)]> show master status;
master02:
file:mysql-bin.000001
position:245
三 启动主从
3.1 手动同步
如果master01和master02已经存在数据,则在开启主备复制之前,需要将master01和master02手动同步一次(/var/lib/mysql整个目录打包tar.gz),具体方法略。
注意:本实验都是重新安装的mysql,可直接启动同步。
3.2 启动master01的slave功能
1 [root@master1 ~]# mysql -uroot -p 2 enter password: 3 mariadb [(none)]> change master to master_host='192.168.88.101', 4 master_user='repl_user', 5 master_password='x12345678', 6 master_log_file='mysql-bin.000001', 7 master_port=3306, 8 master_log_pos=245; 9 mariadb [(none)]> start slave; 10 mariadb [(none)]> show slave status\g #查看slave状态
3.3 启动master02的slave功能
1 [root@master02 ~]# mysql -uroot -p 2 enter password: 3 mariadb [(none)]> change master to master_host='192.168.88.100', 4 master_user='repl_user', 5 master_password='x12345678', 6 master_log_file='mysql-bin.000001', 7 master_log_pos=245; 8 mariadb [(none)]> start slave; 9 mariadb [(none)]> show slave status\g #查看slave状态
提示:
slave的i/o和sql线程都已经开始运行,而且seconds_behind_master不再是null。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
四 安装heartbeat
略,见《002.heartbeat部署及httpd高可用》中的heartbeat安装部分。
提示:相关安装及主机名等准备步骤参考《002.heartbeat部署及httpd高可用》即可。
五 配置heartbeat
5.1 配置authkeys
1 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/authkeys 2 auth 3 3 3 md5 yes!
5.2 配置heartbeat
1 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/ha.cf 2 logfile /var/log/ha-log #记录heartbeat其他相关日志信息 3 logfacility local0 #设置heartbeat的日志,这里用的是系统日志 4 keepalive 2 #设定心跳(监测)时间间隔为2秒 5 deadtime 15 #宣告死亡时间 6 warntime 10 #心跳延时时间 7 initdead 60 #初始化时间 8 udpport 694 #用于通信的udp端口 9 bcast eth1 #接受广播心跳的网卡接口 10 ucast eth1 192.168.77.101 #置对方机器心跳检测的ip 11 auto_failback off #关闭自动切回恢复正常的主节点 12 node master1.yewu.com #集群节点的名称,必须匹配uname -n的结果。 13 node master2.yewu.com 14 ping 192.168.88.1 15 respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail
注意: 主机和备机之间进行心跳检测,当备机无法检测到主机的心跳,则开启vip;
如果主机和备机都没有挂掉,由于通信问题导致相互无法连接,则会出现裂脑,即主备都对外声明了vip,导致数据出现故障 ,因此建议主机和备机间应该采用专门只是用于检测心跳的网卡(网络),其他数据(业务)网络应该独立于此心跳网络。
5.3 配置haresources
1 [root@master1 ~]# ll /usr/local/heartbeat/etc/ha.d/resource.d/ #查看现有资源类型 2 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/haresources 3 master1.yewu.com ipaddr::192.168.88.88/24/eth0 mariadb 4 [root@master1 ~]# scp /usr/local/heartbeat/etc/ha.d/{ha.cf,haresources,authkeys} 192.168.88.101:/usr/local/heartbeat/etc/ha.d/ #将所有配置复制至master2节点 5 [root@master2 ~]# vi /usr/local/heartbeat/etc/ha.d/ha.cf 6 ucast eth1 192.168.77.100 #置对方机器心跳检测的ip 7 [root@master1 ~]# systemctl stop mariadb.service 8 [root@master1 ~]# systemctl disable mariadb.service 9 [root@master2 ~]# systemctl stop mariadb.service 10 [root@master2 ~]# systemctl disable mariadb.service
提示:关闭mysql启动及自启动,从而使mariadb基于heartbeat资源形式唤醒;
heartbeat的haresources调用/etc/init.d下的脚本来启动资源,基于centos7系统不存在此脚本,可手动写入一个启动脚本,mariadb的启动脚本可留言索要,两个脚本都可用。
六 验证heartbeat
6.1 master1单节点启动验证
1 [root@master1 ~]# systemctl start heartbeat.service 2 [root@master1 ~]# systemctl enable heartbeat.service 3 [root@master1 ~]# tail -f /var/log/ha-log #验证日志
1 [root@master1 ~]# ifconfig #查看活的的vip
端口测试:tcping.exe 192.168.88.88 3306
6.2 master2启动并验证
1 [root@master2 ~]# systemctl start heartbeat.service 2 [root@master1 ~]# tail -f /var/log/ha-log #观察master2节点启动后的master1日志
端口测试:tcping.exe 192.168.88.88 3306
1 [root@master1 ~]# shutdownr #模拟master1节点宕机 2 [root@master2 ~]# tail -f /var/log/ha-log #观察master2节点的切换log
1 [root@master2 ~]# ifconfig #master2节点会自动接管vip
端口测试:tcping.exe 192.168.88.88 3306
提示:由于配置了auto_failback off,在master1节点恢复后资源依旧会保留至master2节点;
对于集群上节点之间的切换实质上是资源的接管,通常包括vip分配回收,磁盘卸载挂载,以及服务的启停等;
对于备用节点,其相应的共享磁盘状态为不可读写,服务处于停止状态;
heartbeat现有项目已拆分,建议使用pacemaker+corosync,可参考rh436相关文档。
七 其他优化
7.1 检测脚本
heartbeat只检测心跳,即可检测设备是否宕机,然后宕机后进行切换,而不会检测上层应用,如mysql。可手动写入一个脚本检测服务状态,如mysql。若mysql服务宕掉,则kill掉heartbeat进程从而实现故障转移(类似keepalived),参考脚本如下:
脚本一:# cat mysql_down.sh
1 #!/bin/sh 2 #****************************************************************# 3 # scriptname: mysql_down.sh 4 # author: xhy 5 # create date: 2018-12-20 16:40 6 # modify author: xhy 7 # modify date: 2018-12-20 16:40 8 # version: 9 #***************************************************************# 10 date=$(date +%f" "%t) 11 ip=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}') 12 mail="baojingtongzhi@163.com" 13 pkill keepalived 14 echo "$date $ip the mysql service failure,kill keepalived." |mail -s "master-backup mysql monitor" $mail
脚本二:# cat mysql_down.sh
1 #!/bin/sh 2 #****************************************************************# 3 # scriptname: mysql_down.sh 4 # author: xhy 5 # create date: 2018-12-20 16:40 6 # modify author: xhy 7 # modify date: 2018-12-20 16:40 8 # version: 9 #***************************************************************# 10 mysql=/usr/bin/mysql 11 mysql_host=localhost 12 mysql_user=root 13 mysql_password=x120952576 14 date=`date +%y%m%d-%h:%m:` 15 echo $date 16 $mysql -h $mysql_host -u $mysql_user -p$mysql_password -e "show status;" >/dev/null 2>&1 17 #$mysqlclient --host=$host --port=$port--user=$user --password=$password -e"show databases;" > /dev/null 2>&1 18 if [ $? == 0 ] 19 then 20 echo " $host mysql login successfully " 21 exit 0 22 else 23 echo " $host mysql login faild" 24 /etc/init.d/heartbeat stop 25 exit 2 26 fi
7.2 定时检测任务
1 [root@master2 ~]# crontab -e 2 */1 * * * * /root/mysql_down.sh >>/root/check_mysql.log
参考文档:https://blog.csdn.net/yabingshi_tech/article/details/51483196
下一篇: 设计模式系列 - 代理模式