[TOC]
环境准备
系统:centos7
软件版本:mysql-5.7.23-linux-glibc2.12-x86_64
安装目录:/usr/local/mysql
数据库目录:/data/mysql
数据库root密码: hc123456
A数据库:10.0.0.11
B数据库:10.0.0.12
VIP:10.0.0.100
1.两个数据库版本最好一致
2.两个数据库内数据保持一致,若不一致,可手动调整,比如A比B多一个库,那将这个库导入到B库,达到一致。
数据库同步账号: sync
数据库sync密码: pcpaeyphmp
说明:数据库通过配置相互做对端的slave实现双主,使用heartbeat提供VIP,haproxy(负载均衡)将两台主机的端口转发给VIP
如VIP所在主机故障,VIP漂移到另一台主机继续提供服务
数据库安装
两端都执行查看安装文档
curl http://home.onlycloud.xin/code/mysql-bin-install.sh -o mysql-install.sh
sh mysql-install.sh
source /etc/profile
hosts解析
cat <<EOF >>/etc/hosts
10.0.0.11 nfs-01
10.0.0.12 nfs-02
EOF
修改主机名
A数据库
hostnamectl set-hostname nfs-01
B数据库
hostnamectl set-hostname nfs-02
A数据库操作
1.开启binlog(数据库二进制日志),设置server-id,重启mysql服务
1 | cp /etc/my.cnf{,.`date +%F`} |
2.创建同步数据的用户,授权允许10.0.0.0/24网络使用sync用户登录
1 | source /etc/profile |
B数据库操作
1.配置从库只允许来自服务器线程或具有SUPER权限的数据库用户进行更新(root,sync),开启binlog(数据库二进制日志),设置server-id,重启mysql服务
1 | cp /etc/my.cnf{,.`date +%F`} |
2.连接数据库A,需要A数据库主机名,登陆凭据,二进制文件的名称和位置
1 | source /etc/profile |
3.创建同步数据的用户,授权允许10.0.0.0/24网络使用sync用户登录
1 | mysql -uroot -phc123456 |
A数据库操作
连接数据库B,需要B服务器主机名,登陆凭据,二进制文件的名称和位置
1 | source /etc/profile |
验证mysql
A创建数据库
1 | create database test_01; |
B查看数据库
1 | show databases; |
B创建数据库
1 | create database test_02; |
A查看数据库
1 | show databases; |
mysql排错
Slave_IO_Running: # 状态不为Yes
1.数据库A与数据库B之间网络是否通畅
2.同步账号的用户权限,及是否允许数据库B登录
3.查看两端server-id(不能相同) 使用mysql命令查看 show variables like 'server_id'; 此配置项在my.cnf
安装haproxy
两端都安装配置相同
yum -y install haproxy
配置haproxy
1 | cp /etc/haproxy/haproxy.cfg{,.bak} |
创建监控用户
监控
mysql
运行状态此用户无需配置密码及权限
mysql -u root -phc123456 -e "create user 'haproxy'@'%';flush privileges;"
配置日志
1 | cat <<'!' >/etc/rsyslog.d/haproxy.conf |
设置启动方式
# 允许没VIP时启动(如果没有配置此项且应用会导致 haproxy 服务无法启动)
echo "net.ipv4.ip_nonlocal_bind = 1" >>/etc/sysctl.conf
sysctl -p
服务管理
systemctl start haproxy # 启动服务
systemctl enable haproxy # 随系统启动
systemctl status haproxy # 运行状态
安装heartbeat
配置依赖软件安装源
1 | cat <<EOF >/etc/yum.repos.d/gf-epel-7.repo |
下载软件包并安装 heartbeat
1 | heartbeat='heartbeat-3.0.6-1.el7.centos.x86_64.rpm' |
配置heartbeat
创建
ha.cf
配置文件
1 | cat <<EOF >/etc/ha.d/ha.cf |
两端认证密码配置 authkeys
1 | cat <<EOF >>/etc/ha.d/authkeys |
配置heartbeat资源
1 | cat <<EOF > ha.d/haresources |
启动服务,验证(两个节点各自执行 ip add 能看到两个 10.0.0网段ip)
1 | systemctl start heartbeat |
验证heartbeat
浏览器打开以下链接查看资源状态(账号:admin/admin)
http://10.0.0.11:1080/admin
http://10.0.0.12:1080/admin
http://10.0.0.100:1080/admin
关闭存在VIP主机的heartbeat服务,然后在另一端验证(在正常的一端已经接管了所有虚拟IP ip add 能看到三个 10.0.0网段ip)登录数据库验证
systemctl stop heartbeat
ip add | grep 10.0.0
mysql -h 10.0.0.100 -P 3308 -uroot -phc123456
启动关闭的服务后验证 虚拟IP已经恢复
systemctl start heartbeat
ip add | grep 10.0.0
mysql -h 10.0.0.100 -P 3308 -uroot -phc123456
查看同步状态
# 可以看到Master_Host IP一直在切换负载均衡配置成功
mysql -h 10.0.0.100 -P 3308 -uroot -phc123456 -e 'show slave status\G'
同步故障恢复
修复A主B从同步
A数据库操作
A数据库锁表查看binlog文件的position(偏移)和File(日志文件)的值
mysql -uroot -phc123456
flush tables with read lock; # 锁住数据库表防止写入
show master status; # 记下 binlog文件的position(偏移)和File(日志文件)的值)
# MySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
B数据库操作
B数据库重新连接A
1 | mysql -uroot -phc123456 |
A数据库操作
unlock tables; # 解锁数据库
修复B主A从同步
B数据库操作
B数据库锁表查看binlog文件的position(偏移)和File(日志文件)的值
mysql -uroot -phc123456
flush tables with read lock; # 锁住数据库表防止写入
show master status; # 记下 binlog文件的position(偏移)和File(日志文件)的值)
# MySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
A数据库操作
A数据库重新连接B
1 | mysql -uroot -phc123456 |
B数据库操作
unlock tables; # 解锁数据库