基于keepalived实现haproxy高可用站点

server/2025/2/25 10:00:11/

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 -qExecStart=/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 mysqldbind 192.168.118.130:3306mode tcpdefault_backend MysqlClustersbackend MysqlClustersmode tcpbalance roundrobinserver mysqlServer1 192.168.118.129:3306 check inter 2000 fall 3 rise 5server 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 keepalivedglobal_defs {router_id LVS_MASTER
}vrrp_instance VI_1 {state MASTERinterface ens160virtual_router_id 51#一个组里面的id要一样priority 200advert_int 1authentication {#认证也要一样auth_type PASSauth_pass 1111}virtual_ipaddress {#没有使用的虚拟IP192.168.118.110}
}

复制一份给到backup主机上:

cd /etc/keepalived
scp ./keepalived.conf root@192.168.118.130:$PWD

配置内容:

! Configuration File for keepalivedglobal_defs {router_id LVS_BACKUP#名称
}vrrp_instance VI_1 {state BACKUP#模式为备用interface ens160virtual_router_id 51priority 100#优先级要比Master低advert_int 1authentication {auth_type PASSauth_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.socketLast 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,读者可以自行完成,参考我之前的文章。这里不再赘述


http://www.ppmy.cn/server/170529.html

相关文章

硬件加速与技术创新双轮驱动:DeepSeek和ChatGPT性能进阶的未来蓝图

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

Centos中将UTC的时区改为CTS时区

在CentOS系统中&#xff0c;要将系统时区从协调世界时&#xff08;UTC&#xff09;更改为所需的时区&#xff08;可能是您提到的“CTS”&#xff0c;但通常我们指的是具体的时区名称&#xff0c;如中国标准时间 CST 或中国夏令时 CDT&#xff0c;这里假设您意指中国标准时间&am…

如何实现使用DeepSeek的CV模型对管道内模糊、低光照或水渍干扰的图像进行去噪、超分辨率重建。...

要使用 DeepSeek 的 CV 模型对管道内模糊、低光照或水渍干扰的图像进行去噪、超分辨率重建&#xff0c;一般可以按照以下步骤实现&#xff1a; 1. 准备工作 1.1 获取 API 访问权限 首先&#xff0c;你需要从 DeepSeek 官方获取 API 访问权限和相应的 API 密钥。这通常需要在 De…

ESP32学习笔记_Bluetooth(2)——Bluetooth Stack、GAP

文章目录 Bluetooth StackGAPRoles when Operating over BR/EDR Physical TransportRoles when Operating over an LE Physical TransportDefines compliance requirementsDevice Connection Establishment Process 摘要&#xff1a;这篇博文介绍了 ESP32 蓝牙协议栈的相关内容…

web网络安全:SQL 注入攻击

SQL 注入攻击&#xff08;SQL Injection&#xff09;概述 SQL 注入&#xff08;SQL Injection&#xff09; 是Web应用程序中最常见的安全漏洞之一。攻击者通过在应用程序的输入字段中插入恶意SQL代码&#xff0c;能够操控数据库执行非预期操作&#xff0c;导致数据泄露、篡改甚…

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…

测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法

在测试登录窗口时&#xff0c;可以从 表单测试、 逻辑判断和 业务流程三个方面设计测试思路和方法。以下是一个详细的测试方案&#xff1a; 1. 表单测试 表单测试主要关注输入框、按钮等UI元素的正确性和用户体验。 测试点&#xff1a; 输入框测试 &#xff1a; * 或 • &#…

【Linux】初识进程概念与 fork 函数的应用

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条冯诺依曼体系与计算机系统架构 进程是操作系统中资源分配和调度的核心单位&#…