本次搭建目的是使用 haproxy + keepalived + mysql(双主复制) 搭建 mysql 高可用集群,使用 keepalived 监控 haproxy 和 mysql 状态,如果 haproxy 服务异常则将 VIP 漂移到另外的机器上。
本次试验机器性能有限,所以只用了两台虚拟机,在上面安装 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 |
参考:MySQL 双主复制
参考:
HAProxy 安装
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
这里直接使用 yum 安装
yum -y install keepalived
主备基本差不多,主要注意 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
,我配置两个第二个脚本不执行
上面配置中有一个检查脚本,它会检查服务运行状态,如果服务宕机了,则选择将 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 [email protected] "sh /etc/keepalived/restart_haproxy.sh"
MASTE_RHAPROXY=`sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "ps -ef | grep -i haproxy | grep -vc grep"`
if [ $MASTE_RHAPROXY -eq 0 ]; then
sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "systemctl start haproxy"
fi
MASTE_KEEPALIVED=`sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "ps -ef | grep -i keepalived | grep -vc grep"`
if [ $MASTE_KEEPALIVED -eq 0 ]; then
sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "systemctl start keepalived"
fi
这里注意一个问题,就是如果这里在脚本中远程启动关闭机器的服务及 keepalived
那么可能会出现在 master
机器服务异常 VIP 漂移之后,master
机器很快又恢复了,这个时候 VIP 又会自动回到原来的机器上,因为 master
配置的权重是比 back
要高的,所以这里有个问题就是如果 master
的 keepalived
服务启动好了,但是 haproxy
服务是异常的,这里就有问题。不过本次试验暂未考虑这些。
[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
这里使用 Navicat 连接数据库测试
这里的连接地址就是 VIP 加上在 haproxy 中配置的“端口”
现在 VIP 是在 mysql01 这个机器上
关闭 haproxy ,此时 VIP 已经不在 mysql01 这个机器上了
查看 mysql02 机器,此时 VIP 到了 mysql02 机器上,如果 mysql01 机器后面又立刻恢复正常,那么 VIP 则会回到原来的 mysql01 机器上
在 VIP 转移过程中,数据库连接访问依然是正常的