lvs+keepalived实现mysql高可用负载均衡_该用户是个懒人的博客-爱代码爱编程
系统:CentOS 7.6
数据库:MySQL 5.7
Keepalived版本:2.0.20
1.配置yum源镜像文件
以下所需依赖当前系统镜像都有,直接yum安装即可,yum源配置这里不做演示。
MySQL安装及配置自行安装这里不做演示。
2.安装依赖
[root@MySQL-HA1 opt]# yum install -y gcc gcc-c++ openssl-devel popt-devel kernel-devel
3.安装ipvsadm
[root@MySQL-HA1 opt]# yum -y install ipvsadm # 安装ipvsadm命令行工具
[root@MySQL-HA1 opt]# ipvsadm -version # 查看ipvsadm版本
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
4.安装Keepalived
[root@MySQL-HA1 opt]# tar -zxvf keepalived*.tar.gz
[root@MySQL-HA1 opt]# mv keepalived-2.0.20 keepalived
[root@MySQL-HA1 opt]# cd !$
[root@MySQL-HA1 keepalived]# ./configure --prefix=/opt/keepalived
[root@MySQL-HA1 keepalived]# make && make install
4.1将 keepalived 配置成系统服务
[root@MySQL-HA1 keepalived]# mkdir -p /etc/keepalived/
[root@MySQL-HA1 keepalived]# cp -r /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@MySQL-HA1 keepalived]# cp -r /opt/keepalived/sbin/keepalived /usr/sbin/
[root@MySQL-HA1 keepalived]# cp /opt/keepalived/keepalived/keepalived.service /etc/systemd/system/
[root@MySQL-HA1 keepalived]# systemctl daemon-reload
4.2设置 Keepalived 开机自启
[root@MySQL-HA1 keepalived]# systemctl enable keepalived
5.Keepalived配置
5.1 修改 Keepalived 配置
[root@MySQL-HA1 keepalived]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id MySQL_HA1 # 命名主机名(同一个组里唯一)
script_user root
}
vrrp_instance VI_1 {
state MASTER # 设置服务类型主/从(MASTER/SLAVE/BACKUP)每个组里只有一个主
interface ens33 # 指定那块网卡用来监听
virtual_router_id 66 # 设置组号,如果是一组就是相同的ID号
priority 100 # 服务器优先级,主服务器优先级高(其他节点向下调整)
advert_int 1 # 心跳时间,检测对方存活
authentication { # 存活验证密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100 # 设置集群地址(VIP)
}
}
# 设置集群地址及端号
# 多个集群可复制当前virtual_server块修改集群及各节点IP及端口,在 virtual_ipaddress 块中添加集群IP即可)。
virtual_server 192.168.1.100 3306 {
delay_loop 6 # 健康检查间隔
lb_algo wlc # 负载均衡使用的算法可自行修改
lb_kind NAT # NAT 模式的群集
protocol TCP # 使用的协议
real_server 192.168.1.12 3306 { # 管理的节点IP及使用的端口
notify_down "/opt/keepalived/chekredis.sh"
# 在检测到Server down后执行的脚本(当前节点配置,其他节点无需配置);
weight 1 # 权重,优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 3306 # 检查的目标端
connect_timeout 3 # 连接超时(秒)
retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
real_server 192.168.1.13 3306 { # 管理的第二个节点IP及使用的端口
# 多个节点可复制当前real_server块向下粘贴修改节点IP及端口即可(注意!!!不要粘贴到当前virtual_server块以外)。
weight 1 # 权重,优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 3306 # 检查的目标端
connect_timeout 3 # 连接超时(秒)
retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
}
* 多余删除
5.1 配置shell脚本
[root@MySQL-HA1 keepalived]# vi /opt/keepalived/chekredis.sh
# 位置路径需与 keepalived.conf 中 notify_down 后配置一致,shell内容根据实际情况修改。
#! /bin/bash
sleep 5
num=$(netstat -ntpl | grep 3306 | grep -v grep | wc -l)
if [ $num -eq 0 ]
then
systemctl start mysql
sleep 5
num=$(netstat -ntpl | grep 3306 | grep -v grep | wc -l)
if [ $num -eq 0 ]
then
systemctl stop keepalived
fi
fi
6.启动Keepalived,查看集群IP是否正常出现
[root@MySQL-HA1 keepalived]# systemctl start keepalived
[root@MySQL-HA1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1d:d8:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.12/24 brd 192.168.32.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.1.100/24 scope global secondary ens33 # 集群IP
valid_lft forever preferred_lft forever
7.ipvsadm -Ln查看集群节点
[root@MySQL-HA1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:3306 wlc # 集群IP
-> 192.168.1.12:3306 Masq 1 0 0 # 节点1 MySQL_HA1
-> 192.168.1.13:3306 Masq 1 0 0 # 节点2 MySQL_HA2
============================================ 当前节点所有配置结束 ============================================
其他服务节点可根据实际情况安装 ipvsadm 和 keepalived 并配置即可。
8.测试
8.1 节点宕机测试
关闭除当前节点外其他任意节点 MySQL,等几秒使用 ipvsadm -Ln 查看目标节点是否被踢出集群(提前注释掉“notify_down /opt/keepalived/chekredis.sh”)。
8.2 当前服务器宕机(keeplived停机)测试
[root@MySQL-HA1 keepalived]# systemctl stop keepalived
# 关闭主节点 keepalived 查看集群IP是否自动漂移到从节点。