文章目录
MySQL 高可用
简介
本次搭建目的是使用 haproxy + keepalived + mysql(双主复制) 搭建 mysql 高可用集群,使用 keepalived 监控 haproxy 和 mysql 状态,如果 haproxy 服务异常则将 VIP 漂移到另外的机器上。
1. 环境准备
本次试验机器性能有限,所以只用了两台虚拟机,在上面安装 mysql 、haproxy 、keepalived
IP | 主机名 | 软件版本 |
---|---|---|
192.168.169.100 | mysql01 | 系统版本:CentOS Linux release 7.9.2009 mysql 版本:mysql-5.7.38 haproxy 版本:haproxy-2.4.17 keepalived 版本:Keepalived v1.3.5 |
192.168.169.101 | mysql02 | 系统版本:CentOS Linux release 7.9.2009 mysql 版本:mysql-5.7.38 haproxy 版本:haproxy-2.4.17 keepalived 版本:Keepalived v1.3.5 |
2. 搭建 mysql 双主复制
参考:MySQL 双主复制
3. 安装 HAProxy
参考:
下面是本次试验使用的配置文件信息
global
#日志
log 127.0.0.1 local0 info
#最大连接数
maxconn 10240
daemon
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
#应用全局的日志配置
log global
mode http
#超时配置
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000
frontend mysql-front
bind *:3307 # 这里绑定的端口就是后面使用 VIP 访问 mysql 时使用的端口
mode tcp
default_backend mysql-backup
backend mysql-backup
mode tcp
balance roundrobin
server db1 192.168.169.100:3306 weight 1 check inter 2000 rise 2 fall 3
server db2 192.168.169.101:3306 weight 1 check inter 2000 rise 2 fall 3
listen http_front #haproxy的客户页面
bind 192.168.169.101:8888 #HAProxy自己的IP地址
mode http
option httplog
stats uri /haproxy
stats auth admin:123456 #控制面板账号密码 账号:admin
stats refresh 5s
stats enable
4. 安装 keepalived
这里直接使用 yum 安装
yum -y install keepalived
4.1 修改配置文件
主备基本差不多,主要注意 router_id 、state 、priority
这三个参数
# 修改 Keepalived 配置文件,将原本的 keepalived.conf 文件备份,新建 keepalived.conf 文件加入如下内容
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
# 注意:这个是 master(主机) 的配置文件
! Configuration File for keepalived # 这一行为注释
global_defs {
router_id server01 # router_id 机器标识,通常使用 hostname,相对具有唯一性,和备机区分开,不能使用同一个标识
}
vrrp_script chk_server { # 定义一个检测脚本,在global_defs之外配置
script "/etc/keepalived/check_server.sh" # 自己写的监测脚本
interval 2 # 每2s监测一次
weight -10 # 该参数用于指定当监测失效时,该设备的优先级会减少的值,该值为负表示减少
fall 2 # 尝试两次都成功才成功
rise 2 # 尝试两次都失败才失败
}
vrrp_instance VI_1 { # 定义一个vrrp_install实例,名称为VI_1
state MASTER # 表示该实例的角色状态,有MASTER和BACKUP两种主备状态
interface ens33 # 对外提供服务的网络接口,注意修改为自己的网卡名称,如 ens33,eth0,eth1
virtual_router_id 51 # 虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致
priority 150 # priority表示实例优先级,数字越大,优先级越高。master 的优先级必须大于 backup
advert_int 1 # 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,默认是秒
authentication { # 权限认证配置
auth_type PASS # 主要有 PASS 和 AH 两种
auth_pass 1111 # 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
}
virtual_ipaddress {
192.168.169.99 # 虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中访问 zabbix server 需要和域名绑定的ip
}
track_script { # 调用自定义的脚本
chk_server
}
}
这里有一个问题,keepalived
能不能配置两个 vrrp_script
和两个 track_script
,我配置两个第二个脚本不执行
4.2 编写脚本
上面配置中有一个检查脚本,它会检查服务运行状态,如果服务宕机了,则选择将 VIP 漂移到另外一台机器上
因为我这个是所有的服务都装在了一台机器上,然后我这里就可以在脚本中检测很多东西。
这里主要是检查 mysql
运行状态,如果 mysql
宕机了,那么就重启 mysql
,如果重启失败,则关闭 keepalived
让 VIP 漂移到另外的机器上继续提供服务。HAProxy
也是同样的道理,不过 HAProxy
宕机之后这里直接关闭 keepalived
切换服务器提供服务了。然后下面写了一点 ssh 远程执行的命令,意思就是 VIP 漂移完成之后在重启之前机器关闭的服务和 keepalived
,当然这里也可以通过其他更好的方式去实现。
两台机器脚本基本一样,只是需要注意修改对应 IP 即可
vim check_server.sh
#!/bin/bash
MYSQLNUM=`ps -ef | grep -i mysqld | grep -vc grep`
if [ $MYSQLNUM -eq 0 ]; then
service mysql restart
if [ $? -eq 0 ]; then
echo "mysql restart success"
else
systemctl stop keepalived.service
fi
fi
HAPROXYNUM=`ps -ef | grep -i haproxy | grep -vc grep`
if [ $HAPROXYNUM -eq 0 ]; then
systemctl stop keepalived.service
fi
#sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.101 "sh /etc/keepalived/restart_haproxy.sh"
MASTE_RHAPROXY=`sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "ps -ef | grep -i haproxy | grep -vc grep"`
if [ $MASTE_RHAPROXY -eq 0 ]; then
sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "systemctl start haproxy"
fi
MASTE_KEEPALIVED=`sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "ps -ef | grep -i keepalived | grep -vc grep"`
if [ $MASTE_KEEPALIVED -eq 0 ]; then
sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "systemctl start keepalived"
fi
这里注意一个问题,就是如果这里在脚本中远程启动关闭机器的服务及 keepalived
那么可能会出现在 master
机器服务异常 VIP 漂移之后,master
机器很快又恢复了,这个时候 VIP 又会自动回到原来的机器上,因为 master
配置的权重是比 back
要高的,所以这里有个问题就是如果 master
的 keepalived
服务启动好了,但是 haproxy
服务是异常的,这里就有问题。不过本次试验暂未考虑这些。
5. 测试
5.1 确认所有服务的启动状态
[root@mysql01 ~]# ps -ef | grep -E 'mysql|keepalived|haproxy' | grep -v grep
root 1121 1 0 18:43 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql01.pid
mysql 1446 1121 0 18:43 ? 00:00:39 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql01.err --pid-file=/usr/local/mysql/data/mysql01.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306
root 1916 1 0 20:58 ? 00:00:00 /opt/soft/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg
root 1924 1 0 20:59 ? 00:00:00 /usr/sbin/keepalived -D
root 1925 1924 0 20:59 ? 00:00:00 /usr/sbin/keepalived -D
root 1926 1924 0 20:59 ? 00:00:00 /usr/sbin/keepalived -D
5.2 连接访问测试
这里使用 Navicat 连接数据库测试
这里的连接地址就是 VIP 加上在 haproxy 中配置的“端口”
- 关闭 HAProxy 测试连接
现在 VIP 是在 mysql01 这个机器上
关闭 haproxy ,此时 VIP 已经不在 mysql01 这个机器上了
查看 mysql02 机器,此时 VIP 到了 mysql02 机器上,如果 mysql01 机器后面又立刻恢复正常,那么 VIP 则会回到原来的 mysql01 机器上
5.3 测试结论
在 VIP 转移过程中,数据库连接访问依然是正常的