前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >003.Heartbeat MySQL双主复制

003.Heartbeat MySQL双主复制

作者头像
木二
发布2019-07-26 10:21:39
8310
发布2019-07-26 10:21:39
举报
文章被收录于专栏:木二天空木二天空

一 基础环境

节点

系统版本

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

VIP

192.168.88.88

关闭防火墙及SELinux;

配置NTP时钟同步。

二 实际部署

2.1 安装MySQL

代码语言:javascript
复制
  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

代码语言:javascript
复制
  1 [root@master1 ~]# mysql_secure_installation		#设置root密码
  2 [root@master1 ~]# systemctl restart mariadb.service

注意:以上操作在Master02主机上也需要执行。

2.3 master01 my.cf配置

代码语言:javascript
复制
  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]可添加修改如下选项:

方法一:

不同步哪些数据库:

代码语言:javascript
复制
  1 binlog-ignore-db = mysql
  2 binlog-ignore-db = test
  3 binlog-ignore-db = information_schema

只同步哪些数据库,除此之外,其他不同步

代码语言:javascript
复制
  1 binlog-do-db = mysqltest

方法二:

建议采用以下方式配置过滤:

代码语言:javascript
复制
  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 创建账号

代码语言:javascript
复制
  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;
01
01

master01:

file:mysql-bin.000001

position:245

2.5 master02 my.cf配置配置

代码语言:javascript
复制
  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 创建账号

代码语言:javascript
复制
  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;
02
02

master02:

file:mysql-bin.000001

position:245

三 启动主从

3.1 手动同步

如果Master01和Master02已经存在数据,则在开启主备复制之前,需要将Master01和Master02手动同步一次(/var/lib/mysql整个目录打包tar.gz),具体方法略。

注意:本实验都是重新安装的MySQL,可直接启动同步。

3.2 启动Master01的slave功能

代码语言:javascript
复制
  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状态
03
03

3.3 启动Master02的slave功能

代码语言:javascript
复制
  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状态
04
04

提示:

slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

四 安装Heartbeat

略,见《002.Heartbeat部署及httpd高可用》中的Heartbeat安装部分。

提示:相关安装及主机名等准备步骤参考《002.Heartbeat部署及httpd高可用》即可。

五 配置Heartbeat

5.1 配置authkeys

代码语言:javascript
复制
  1 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/authkeys
  2 auth 3
  3 3 md5 Yes!

5.2 配置Heartbeat

代码语言:javascript
复制
  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

代码语言:javascript
复制
  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单节点启动验证

代码语言:javascript
复制
  1 [root@master1 ~]# systemctl start heartbeat.service
  2 [root@master1 ~]# systemctl enable heartbeat.service
  3 [root@master1 ~]# tail -f /var/log/ha-log		#验证日志
05
05
代码语言:javascript
复制
  1 [root@master1 ~]# ifconfig				#查看活的的vip
06
06

端口测试:tcping.exe 192.168.88.88 3306

07
07

6.2 master2启动并验证

代码语言:javascript
复制
  1 [root@master2 ~]# systemctl start heartbeat.service
  2 [root@master1 ~]# tail -f /var/log/ha-log	#观察master2节点启动后的master1日志
08
08

端口测试:tcping.exe 192.168.88.88 3306

09
09
代码语言:javascript
复制
  1 [root@master1 ~]# shutdownr			#模拟master1节点宕机
  2 [root@master2 ~]# tail -f /var/log/ha-log	#观察master2节点的切换log
10
10
代码语言:javascript
复制
  1 [root@master2 ~]# ifconfig			#master2节点会自动接管vip
11
11

端口测试:tcping.exe 192.168.88.88 3306

12
12

提示:由于配置了auto_failback off,在master1节点恢复后资源依旧会保留至master2节点;

对于集群上节点之间的切换实质上是资源的接管,通常包括VIP分配回收,磁盘卸载挂载,以及服务的启停等;

对于备用节点,其相应的共享磁盘状态为不可读写,服务处于停止状态;

Heartbeat现有项目已拆分,建议使用pacemaker+corosync,可参考RH436相关文档。

七 其他优化

7.1 检测脚本

heartbeat只检测心跳,即可检测设备是否宕机,然后宕机后进行切换,而不会检测上层应用,如MySQL。可手动写入一个脚本检测服务状态,如MySQL。若mysql服务宕掉,则kill掉heartbeat进程从而实现故障转移(类似keepalived),参考脚本如下:

脚本一:# cat mysql_down.sh

代码语言:javascript
复制
  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

代码语言:javascript
复制
  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 定时检测任务

代码语言:javascript
复制
  1 [root@master2 ~]# crontab -e
  2 */1 * * * * /root/mysql_down.sh >>/root/check_mysql.log

参考文档:https://blog.csdn.net/yabingshi_tech/article/details/51483196

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 基础环境
  • 二 实际部署
    • 2.1 安装MySQL
      • 2.2 初始化MySQL
        • 2.3 master01 my.cf配置
          • 2.4 创建账号
            • 2.5 master02 my.cf配置配置
              • 2.6 创建账号
              • 三 启动主从
                • 3.1 手动同步
                  • 3.2 启动Master01的slave功能
                    • 3.3 启动Master02的slave功能
                    • 四 安装Heartbeat
                    • 五 配置Heartbeat
                      • 5.1 配置authkeys
                        • 5.2 配置Heartbeat
                          • 5.3 配置haresources
                          • 六 验证Heartbeat
                            • 6.1 master1单节点启动验证
                              • 6.2 master2启动并验证
                              • 七 其他优化
                                • 7.1 检测脚本
                                  • 7.2 定时检测任务
                                  相关产品与服务
                                  云数据库 SQL Server
                                  腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档