欢迎光临
我们一直在努力

教你如何使用Keepalived+LVS与Keepalived+HAProxy高可用负载集群部署

Keepalived+LVS与Keepalived+HAProxy高可用负载集群部署

解读:

  • 此实验分为两部分,一部分为Keepalived + LVS,另一部分为Keepalived+HAProxy;
  • 其中Keepalived内置ipvs模块,而没有内置haproxy与nginx因此要使用vrrp_script功能来控制VIP的漂移来实现高可用;
  • Keepalived使用默认抢占模式进行选举;
  • Keepalived部署双主架构来实现LVS与HAProxy调度web服务与mariadb数据库的高可用;
  • Keepablied使用自定义脚本实现邮箱告警;
  • LVS使用DR模式来调度流量。

Keepalived + LVS

实验环境

主机名IPOS
KA1 eth0:172.25.254.50,lo:172.25.254.100 Rocky Linux 9.6
KA2 eth0:172.25.254.60,lo:172.25.254.200 Rocky Linux 9.6
RS1 eth0:172.25.254.10,lo:172.25.254.100,172.25.254.200 Rocky Linux 9.6
RS2 eth0:172.25.254.20,lo:172.25.254.100,172.25.254.200 Rocky Linux 9.6

流程图

image-20260201040447172

网络配置

使用自定义脚本快速配置网络等信息

[root@KA1 ~]# vmset.sh eth0 172.25.254.50 KA1
[root@KA2 ~]# vmset.sh eth0 172.25.254.60 KA2
[root@RS1 ~]# vmset.sh eth0 172.25.254.10 RS1
[root@RS2 ~]# vmset.sh eth0 172.25.254.20 RS2

部署业务

部署web服务

[root@RS1 ~]# dnf install nginx -y
[root@RS2 ~]# dnf install nginx -y

[root@RS1 ~]# echo RS1 – 172.25.254.10 > /usr/share/nginx/html/index.html
[root@RS2 ~]# echo RS2 – 172.25.254.20 > /usr/share/nginx/html/index.html

[root@RS1 ~]# systemctl enable –now nginx
[root@RS2 ~]# systemctl enable –now nginx

#测试
[root@RS1 ~]# curl 172.25.254.10
RS1 – 172.25.254.10
[root@RS2 ~]# curl 172.25.254.20
RS1 – 172.25.254.20

部署mariadb

[root@RS1 ~]# dnf install mariadb-server -y
[root@RS2 ~]# dnf install mariadb-server -y

#标识主机体现实验现象
[root@RS1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=10
[root@RS1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=20

[root@RS1 ~]# systemctl enable –now mariadb
[root@RS2 ~]# systemctl enable –now mariadb

#创建远程登录用户并授权
[root@RS1 ~]# mysql -e "create user fjw@'%' identified by 'fjw'"
[root@RS1 ~]# mysql -e "grant select on *.* to fjw@'%';"
[root@RS2 ~]# mysql -e "create user fjw@'%' identified by 'fjw'"
[root@RS2 ~]# mysql -e "grant select on *.* to fjw@'%';"

#测试
#使用客户端能远程登录进去即可
mysql -ufjw -pfjw -h172.25.254.10
mysql -ufjw -pfjw -h172.25.254.20

部署LVS-DR模式

RS1与RS2在环回添加VIP

#RS1
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ipv4]
method=manual
address1=127.0.0.1/8
address2=172.25.254.100/32
address3=172.25.254.200/32

[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo

#RS2
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ipv4]
method=manual
address1=127.0.0.1/8
address2=172.25.254.100/32
address3=172.25.254.200/32

[root@RS2 system-connections]# nmcli connection reload
[root@RS2 system-connections]# nmcli connection up lo

#查看VIP

image-20260201023529037

image-20260201023821476

RS1与RS2配置arp抑制

#RS1与RS2
[root@RS1 system-connections]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
[root@RS1 system-connections]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
[root@RS1 system-connections]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
[root@RS1 system-connections]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf

[root@RS1 system-connections]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

KA1与KA2安装ipvsadm

[root@KA1 ~]# dnf install ipvsadm -y
[root@KA2 ~]# dnf install ipvsadm -y

部署Keepalived

KA1与KA2安装keepalived

[root@KA1 ~]# dnf install keepalived -y
[root@KA2 ~]# dnf install keepalived -y

编辑配置文件

KA1

[root@KA1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
notification_email {
......
router_id KA1#更改router_id
vrrp_skip_check_adv_addr
#vrrp_strict#关闭vrrp限制
vrrp_garp_interval 1#设置arp广播间隔
vrrp_gna_interval 1#ipv6的arp广播间隔时间
}

vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24
}
}

vrrp_instance DB_VIP {
state BACKUP
interface eth0
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24
}
}

virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP

real_server 172.25.254.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}

real_server 172.25.254.20 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

virtual_server 172.25.254.200 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP

real_server 172.25.254.10 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}

real_server 172.25.254.20 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}

[root@KA1 ~]# keepalived -t
[root@KA1 ~]# systemctl enable –now keepalived

KA2

注意修改优先级与id

[root@KA2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
notification_email {
......
router_id KA2
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 1
vrrp_gna_interval 1
}

vrrp_instance WEB_VIP {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24
}
}

vrrp_instance DB_VIP {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24
}
}

virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP

real_server 172.25.254.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}

real_server 172.25.254.20 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

virtual_server 172.25.254.200 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP

real_server 172.25.254.10 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}

real_server 172.25.254.20 3306 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 80
}
}
}

[root@KA2 ~]# keepalived -t
[root@KA2 ~]# systemctl enable –now keepalived

配置完成后即可查看VIP

image-20260201034448441

image-20260201034529183

测试

测试web业务的负载均衡

for i in {1..5};do curl 172.25.254.100;done

image-20260201031935493

测试数据库的负载均衡

mysql -ufjw -pfjw -h172.25.254.200 -e 'select @@server_id'

image-20260201032117658

测试当各业务的master节点宕机VIP的转移

模拟故障KA1是否会转移到K2上VIP172.25.254.100

image-20260201032415120

同理可测试KA2的VIP172.25.254.200是否会转移

Keepalived+HAProxy

说明

由于本次实验的部署是在同一环境中所以实验环境,网络配置也RS主机的业务都是与上面的实验相同下面只列出不同的地方进行配置说明

注释keepalived中ipvs的规则配置

image-20260201032714741

其中Keepalived使用的抢占模式配置没有变化,RS上的VIP不会对实验产生影响配置了arp抑制

流程图

image-20260201040544969

部署haproxy

安装haproxy

[root@KA1 ~]# dnf install haproxy -y
[root@KA2 ~]# dnf install haproxy -y

开启内核参数

由于haproxy监听的是存在VIP的端口,要监听不存在VIP的端口需要开启内核参数

[root@KA1 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf
[root@KA2 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf

[root@KA1 ~]# sysctl -p
[root@KA2 ~]# sysctl -p

配置haproxy

在KA1与KA2的haproxy都配置好负载

#KA1
[root@KA1 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
mode http
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check

listen dbcluster
bind 172.25.254.200:3306
mode tcp
server db1 172.25.254.10:3306 check
server db2 172.25.254.20:3306 check
[root@KA1 ~]# systemctl restart haproxy.service

#KA2
[root@KA1 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
mode http
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check

listen dbcluster
bind 172.25.254.200:3306
mode tcp
server db1 172.25.254.10:3306 check
server db2 172.25.254.20:3306 check
[root@KA1 ~]# systemctl restart haproxy.service

#测试

配置完成可以查看haproxy的进程是否在监听端口

[root@KA2 ~]# ss -antlupe | grep haproxy

image-20260201033631045

配置vrrp_script

编写haproxy存活检测脚本

KA1与KA2都要编写

[root@KA1 ~]# mkdir /etc/keepalived/scripts/
[root@KA1 ~]# vim /etc/keepalived/scripts/haproxy_check.sh
#!/bin/bash
killall -0 haproxy &> /dev/null#判断haproxy进程是否存在

[root@KA1 ~]# chmod +x /etc/keepalived/scripts/haproxy_check.sh

KA配置vrrp_scrpit并调用

KA1

[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
......
vrrp_script check_haproxy {
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
user root
}

vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24
}
track_script {
check_haproxy
}
}
......

[root@KA1 ~]# systemctl restart keepalived.service

KA2

[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
......
vrrp_script check_haproxy {
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
user root
}
......
vrrp_instance DB_VIP {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24
}
track_script {
check_haproxy
}
}

[root@KA2 ~]# systemctl restart keepalived.service

测试

测试web业务的负载均衡

测试数据库的负载均衡

image-20260201035053178

换了haproxy来代理后业务负载均衡也没问题

测试当各业务的master节点haproxy宕机VIP的转移

[root@KA1 ~]# systemctl start haproxy.service

image-20260201035246435

[root@KA1 ~]# systemctl start haproxy.service

image-20260201035312076

至此实验大功告成,后续会添加Keepalived+nginx作为反向代理实现高可用的实验部署

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 教你如何使用Keepalived+LVS与Keepalived+HAProxy高可用负载集群部署
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址