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
实验环境
| 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 |
流程图

网络配置
使用自定义脚本快速配置网络等信息
[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


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


测试
测试web业务的负载均衡
for i in {1..5};do curl 172.25.254.100;done

测试数据库的负载均衡
mysql -ufjw -pfjw -h172.25.254.200 -e 'select @@server_id'

测试当各业务的master节点宕机VIP的转移
模拟故障KA1是否会转移到K2上VIP172.25.254.100

同理可测试KA2的VIP172.25.254.200是否会转移
Keepalived+HAProxy
说明
由于本次实验的部署是在同一环境中所以实验环境,网络配置也RS主机的业务都是与上面的实验相同下面只列出不同的地方进行配置说明
注释keepalived中ipvs的规则配置
其中Keepalived使用的抢占模式配置没有变化,RS上的VIP不会对实验产生影响配置了arp抑制
流程图

部署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

配置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业务的负载均衡

测试数据库的负载均衡

换了haproxy来代理后业务负载均衡也没问题
测试当各业务的master节点haproxy宕机VIP的转移
[root@KA1 ~]# systemctl start haproxy.service

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

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




