基于keepalived实现haproxy高可用站点

news/2025/2/26 4:34:25

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,读者可以自行完成,参考我之前的文章。这里不再赘述


http://www.niftyadmin.cn/n/5867154.html

相关文章

基于javaweb的SpringBoot社区维修平台设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

图解前馈神经网络(FNN)

目录 ​编辑 1.前馈神经网络介绍 2.网络结构 3.模型工作示例 4.总结 1.前馈神经网络介绍 前馈神经网络&#xff08;Feedforward Neural Network&#xff0c;FNN&#xff09;是一种最简单、最经典的神经网络结构&#xff0c;它是人工神经网络的基础形式之一。 前馈神经网络…

忽略Git文件的修改,让它不被提交

使用Git托管的工程中&#xff0c;经常有这样的需求&#xff0c;希望文件只是本地修改&#xff0c;不提交到服务端。 如果仅仅是本地存在的文件&#xff0c;我们可以通过.gitignore配置避免文件被提交。 有的时候文件是由git托管的&#xff0c;但是我们希望只在本地修改&#…

运行 Rancher 的建议

运行在多个节点上的多个 Rancher 实例确保了单节点环境无法实现的高可用性&#xff0c;所以在生产环境或者一些很重要的环境中部署 Rancher 时&#xff0c;应该使用至少有三个节点的高可用 Kubernetes 集群&#xff0c;并在这个集群上面安装 Rancher。 在专用的集群上运行 Ran…

【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组&#xff1f;2.2 什么是会话&#xff1f; 3、应用层协议HTTP3.1 HTTP协议3.2 HT…

Flutter 布局入门指南:掌握核心技巧,轻松构建精美界面

目录 一、理解 Flutter 布局的核心思想 1. Widget 树与约束传递 2. 常见布局 Widget 分类 二、6 个必学的布局技巧 技巧 1&#xff1a;用 Expanded 和 Flexible 实现弹性空间分配 技巧 2&#xff1a;用 SizedBox 精确控制尺寸 技巧 3&#xff1a;处理内容溢出&#xff0…

一种简单的快速批量视频抽取固定间隔帧截图的操作方法

因工作需要&#xff0c;大量视频文件需要间隔固定帧数进行截图保存&#xff0c;之后进行其它方面操作。 步骤一&#xff1a;访问Download FFmpeg &#xff0c;左下侧Win图标下选择 Windows builds from gyan.dev &#xff0c;弹出页面的release builds区域选择previous releas…

【NLP 24、实践 ⑤ 计算Bert模型中的参数数量】

以前不甘心&#xff0c;总想争个对错&#xff0c;现在不会了 人心各有所愿&#xff0c;没有道理可讲 —— 25.1.18 计算Bert模型结构中的参数数量 BertModel.from_pretrained()&#xff1a;用于从预训练模型目录或 Hugging Face 模型库加载 BERT 模型的权重及配置。 参数名称…