Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入VRRP的功 能,VRRP是Virtual Router Redundancy protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就 是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有, keepalived一方面具有LVS cluster nodes healthchecks功能,另一方面也具有LVS directors faiover功能。
从实战开始讲解其用法:
项目实战
主机:Rocky8.10 × 4台
192.168.118.130 | 运行HaProxy的负载均衡器Master |
192.168.118.129/131 | 提供数据库服务 |
192.168.118.128 | 运行HaProxy的负载均衡器BackUp |
正常情况下:由两台运行HaProxy的服务同时运行Keepalived提供一个虚拟IP为192.168.118.110的服务地址,一个为Master,一个为BackUp。提供数据库服务,并且对访问流量进行负载均衡
异常情况:当Master挂掉的时候,另一台能够接管这个虚拟IP,和另一台上的所有资源,并且继续提供负载均衡的数据库服务。当Master检测到本身的HaProxy服务故障的时候也能资源漂移到BackUp服务器上面
安装mariadb-server
在两台我们打算做数据库后端的主机上面安装:yum install mariadb-server -y
mariadb默认应该是没有密码的,启动mariadb之后可以直接登录,如果有则执行以下命令:
mysql -uroot -p$(awk 'password/{print $NF}/' /var/log/mariadb/mariadb.log)
登录进去之后需改root用户密码,然后创建一个test用户用于负载均衡验证
alter user 'root'@'localhost' identified by '@OPENlab123';
create user 'test'@'%' identified by '@OPENlab123';
grant all on *.* to 'test'@'%';
我们编辑/etc/my.cnf,为每台数据库服务器定义一个server-id
#131主机的
[mysqld]
server-id=131
#129主机的
[mysqld]
server-id=129
重启服务:systemctl restart mariadb
安装与配置Haproxy
这一步参考我的上一篇文章:HaProxy源码安装(Rocky8)-CSDN博客
这里我们在配置好系统服务中增加一个启动的指定文件:
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/test.conf -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/test.conf -p /var/lib/haproxy/haproxy.pid
这里的意思是在启动之前先使用-c检查haproxy.cfg默认配置文件和我们需要配置的test.conf文件。当然你也可以直接修改haproxy.cfg。然后再启动时指定这两个为配置文件
现在我们就可以配置/etc/haproxy/conf.d/test.conf文件了,配置的内容如下:
frontend mysqld
bind 192.168.118.130:3306
mode tcp
default_backend MysqlClusters
backend MysqlClusters
mode tcp
balance roundrobin
server mysqlServer1 192.168.118.129:3306 check inter 2000 fall 3 rise 5
server mysqlServer2 192.168.118.131:3306 check inter 2000 fall 3 rise 5
前端(本主机)绑定端口为3306,然后再为其配置后端(提供服务的IP地址)。模式为TCP,均衡算法为rr轮询,名称分别为mysqlServer1哈mysqlServer2的IP,间隔2秒进行健康检查,3次没检查到算down机,之后如果5次检查到则重新启用
Keepalived的每台主机都需要配置上面内容,只需要修改前端的bindIP即可
重启haproxy
systemctl restart haproxy
检查效果:登录master和backup的IP地址加主配置文件(/etc/haproxy/haproxy.cfg中bind 0.0.0.0:端口)中绑定的端口:http://192.168.118.130:9999/haproxy输入在主配置文件中设置的用户和密码
发现上图多了我们定义的后端mysqlServer1和mysqlServer2(绿色)。表示添加后端能正常添加
我们使用以下命令检查是否负载均衡:
检查Master(130)是否能正常运行
for ((i=1;i<=4;i++)); do mysql -utest -p@OPENlab123 -h192.168.118.130 -P3306 -e "select @@server_id"; done
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
检查BackUp(128)是否能正常运行
[root@localhost ~]# for ((i=1;i<=4;i++)); do mysql -utest -p@OPENlab123 -h192.168.118.128 -P3306 -e "select @@server_id"
; done
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
安装和配置Keepalived
检查本地有没有keepalived rpm包
[root@localhost ~]# yum list keepalived
Available Packages
keepalived.x86_64 2.1.5-10.el8_10 appstream
有则可以直接yum install keepalived -y下载
没有的话:去官网找到Keepalived for Linux自己需要的版本然后上传到Linux主机上面。
tar -zxvf keepalived-2.1.5.tar.gz
mkdir -p /usr/local/keepalived
cd keepalived-2.1.5
./configure --prefix=/usr/local/keepalived
make && make install
事先看好自己网卡信息:ip a,我的是ens160
[root@localhost ~]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived...
显然/etc/keepalived/keepalived.conf就是配置文件了,我们将原有的备份下
cp /etc/keepalived/keepalived.conf{,.bak}
配置内容如下:
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51#一个组里面的id要一样
priority 200
advert_int 1
authentication {#认证也要一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {#没有使用的虚拟IP
192.168.118.110
}
}
复制一份给到backup主机上:
cd /etc/keepalived
scp ./keepalived.conf root@192.168.118.130:$PWD
配置内容:
! Configuration File for keepalived
global_defs {
router_id LVS_BACKUP#名称
}
vrrp_instance VI_1 {
state BACKUP#模式为备用
interface ens160
virtual_router_id 51
priority 100#优先级要比Master低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.118.110
}
}
然后单开一个进程去监控日志:tail -f /var/log/messages,之后启动keepalived
systemctl start keepalived
可以看到MASTER和BACKUP的日志是不一样的,master添加了110这个IP,backup移除了这个IP。我们使用下面命令查看网卡的时候,也会发现master多了一个IP192.168.118.110,而backup没有
ip a
我们回过头去修改一下master和backup的haproxy的配置文件,将监听IP改为bind 0.0.0.0:3306,然后重启haproxy就可以正常登录了。
测试与改进
验证一下效果:如果可以通过IP192.168.118.110登录MySQL的话,那么就配置好了
for ((i=1;i<=4;i++)); do mysql -utest -p@OPENlab123 -h192.168.118.110 -P3306 -e "select @@server_id"; done;
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
我们试着关掉Master上的keepalived服务此时监控日志看看发生了什么
[root@localhost ~]# systemctl stop keepalived
如下图所示:上面的是130Master,下图为backup。
可以看到从keepalived停止的那一刻开始,就会给backup发送将本机的优先级置为0,然后移除本机的VIP,而BackUp主机由于优先级相对变高了,自己接管了VIP
再次测试110这个VIP,依旧可以使用:
C:\Users\31096>ssh root@192.168.118.131
root@192.168.118.131's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last failed login: Mon Feb 24 14:21:24 CST 2025 from 192.168.118.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Mon Feb 24 14:04:37 2025 from 192.168.118.1
for ((i=1;i<=4;i++)); do mysql -utest -p@OPENlab123 -h192.168.118.110 -P3306 -e "select @@server_id"; done;
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 129 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 131 |
+-------------+
但是当我们的本机的haproxy停用的时候,就没法VIP漂移。所以我们还需要针对haproxy的检查,查看其是否正常运行状态
检测一个服务启用状态可以使用:killall -0或者systemctl is-active
这里使用后者(也可以查看3306这个端口是否被监听:netstat -lntup | grep 3306 | wc -l 大于1则活着的)
所以我们需要在keepalived脚本中添加以下内容,两个主机都添加
...
vrrp_script chk_haproxy {
script "systemctl is-active haproxy &> /dev/null"
interval 2#间隔时间
}
...
vrrp_instance VI_1 {
...
track_script {
chk_haproxy
}
...
}
然后重新启动:systemctl restart keepalived,即可
这次我们再次先关闭掉Master的haproxy,看日志会怎么输出
我们发现当Master停止了haproxy的时候,VIP也会漂移到BackUp主机上。这就是我们想要的效果。
本次项目结束,还可以将MySQL设置为主从同步或使用PXC,读者可以自行完成,参考我之前的文章。这里不再赘述