从零开始搭建 Keepalaived+Lvs 高可用集群(Aliyun部署)
大家有没有发现一个问题?就是在学习 keepalived+lvs
的过程中,学习相关文章,没有一篇关于 "如何部署 Aliyun
?"上的文章。 想要部署到Aliyun ECS上,一定要看到最后
架构
本设计方案采用四台服务器构建高可用集群,使用 Keepalived
结合 Linux Virtual Server (LVS)
实现 负载均衡 和 高可用性。其中,两台服务器配置为LVS
的Director
服务器,用于处理客户端请求并分发到后端服务器。另外两台服务器作为LVS
的Real Server
,提供实际的服务处理。Keepalived
用于实现Director
服务器的高可用性,确保在主 Director
服务器故障时,备份 Director
能够无缝接管服务。
流程
- 安装配置操作系统和必要软件在所有四台服务器上。
- 在两台
Director
服务器上安装并配置Keepalived
,设置虚拟IP地址和故障转移机制。 - 在两台
Real Server
上部署应用服务,并确保服务正常运行。 - 配置
LVS
规则,包括设置虚拟服务、定义Real Server
以及选择负载均衡算法。 - 测试集群的负载均衡能力 和 高可用性,确保在故障情况下服务不中断。
各服务功能
- Keepalived:负责监控
Director
服务器的状态,实现故障检测和自动故障转移。 - LVS Director:作为负载均衡器,接收客户端请求并根据配置的规则分发到
Real Server
。 - LVS Real Server:处理来自
Director
的实际业务请求,提供服务。
部署
安装相关软件
安装 Keepalived
邮件通知 xmail
环境配置
Director 与 RealServer 服务器上配置需手动修改, keepalived 不会自动设置
-
Director
开启 ipv4 转发echo 1 > /proc/sys/net/ipv4/ip_forward
-
RealServer
设置 arp#!/bin/bash vip=192.168.152.131 mask='255.255.255.255' dev=lo:0 case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev $vip netmask $mask broadcast $vip up route add -host $vip dev $dev echo "The RS Server is Ready!" ;; stop) ifconfig $dev down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo "The RS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac
部署
配置
Keepalived Master
[root@localhost lvs]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
*******@163.com
}
notification_email_from admin03@localhost #邮件发送者
smtp_server 127.0.0.1 #邮件服务器地址为127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.131
}
notify_master "/etc/keepalived/notify.sh master "
notify_backup "/etc/keepalived/notify.sh backup "
notify_fault "/etc/keepalived/notify.sh fault "
}
virtual_server 192.168.152.131 80 {
delay_loop 6
lb_algo sh # 负载均衡算法 源ip_hash
lb_kind DR # DR 模式
persistence_timeout 50
protocol TCP
real_server 192.168.152.129 80 {
weight 1
TCP_CHECK {
nb_get_retry 3 # 重新连接次数
delay_before_retry 3 # 重新连接间隔时间
connect_port 80 # 向当前RS的哪个PORT发起健康状态检测请求
connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server
}
}
real_server 192.168.152.133 80 {
weight 1
TCP_CHECK {
nb_get_retry 3 # 重新连接次数
delay_before_retry 3 # 重新连接间隔时间
connect_port 80 # 向当前RS的哪个PORT发起健康状态检测请求
connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server
}
}
}
Keepalived Backup
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
******@163.com #邮件通知接收者
}
notification_email_from admin03@localhost #邮件发送者
smtp_server 127.0.0.1 #邮件服务器地址为127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL # 与 master 一致
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP # 备用节点
interface ens33
virtual_router_id 51
priority 80 # 优先级比master低, 用于选举master的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.131
}
notify_master "/etc/keepalived/notify.sh master "
notify_backup "/etc/keepalived/notify.sh backup "
notify_fault "/etc/keepalived/notify.sh fault "
}
virtual_server 192.168.152.131 80 {
delay_loop 6
lb_algo sh
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.152.129 80 {
weight 1
TCP_CHECK {
nb_get_retry 3 # 重新连接次数
delay_before_retry 3 # 重新连接间隔时间
connect_port 80 # 向当前RS的哪个PORT发起健康状态检测请求
connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server
}
}
real_server 192.168.152.133 80 {
weight 1
TCP_CHECK {
nb_get_retry 3 # 重新连接次数
delay_before_retry 3 # 重新连接间隔时间
connect_port 80 # 向当前RS的哪个PORT发起健康状态检测请求
connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server
}
}
}
- 在所有服务器上安装Linux操作系统,并进行网络配置,确保服务器之间可以互相访问。
- 在
Director
服务器上安装Keepalived
,并配置VRRP
(虚拟路由冗余协议),设置优先级和虚拟IP。 - 在
Real Server
上部署业务应用,确保应用服务可以在指定端口上接收请求。 - 在
Director
服务器上配置LVS
规则,包括定义虚拟服务的IP地址和端口,以及Real Server
的IP地址和权重。 - 配置网络设备,如路由器和交换机,确保流量可以正确路由到
Director
服务器。 - 进行压力测试和故障模拟,验证集群的性能和高可用性。
测试高可用
参考 从零开始搭建 LVS 高性能集群 (DR模式) 部署 nginx
服务
查看部署结果
DR-Master
[root@localhost lvs]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:02:6a:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.128/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.152.131/32 scope global ens33 # vip 配置成功
[root@localhost lvs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 wrr
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 1
DR-BackUp
[root@localhost ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fb:da:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.125/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
RS
[root@master lvs]# ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.152.131/32 brd 192.168.152.131 scope global lo
通过访问 VIP:80
, 服务正常响应
高可用
- 关闭 Master
keepalvied
服务
# 关闭 keepalvied 服务
[root@localhost lvs]# systemctl stop keepalived
# 查看链路规则 已清空
[root@localhost lvs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 查看vip已经不绑定 master ens33 网卡
[root@localhost lvs]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:02:6a:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.128/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::fc0c:8e16:abd:b067/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 查看 BackUp
keepalvied
服务
# vip 已经漂移到 backup 节点
[root@localhost ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fb:da:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.125/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.152.131/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# backup 节点 配置了链路规则
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 sh persistent 50
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 0
-
Nginx
服务能够通过VIP:80
正常访问 -
重启 Master
keepalvied
服务
[root@localhost lvs]# systemctl start keepalived
# VIP 重新漂移到 Master 节点
[root@localhost lvs]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:02:6a:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.128/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.152.131/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::fc0c:8e16:abd:b067/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# Master 节点 重新配置了链路规则
[root@localhost lvs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 sh persistent 50
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 0
- 查看 BackUp
keepalvied
服务
# VIP 解除 Backup 节点 ens33 绑定
[root@localhost ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fb:da:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.125/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# backup 节点 配置了链路规则 未清理
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 sh persistent 50
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 0
-
Nginx
服务能够通过VIP:80
正常访问 -
邮箱通知主备切换
优劣势
-
优势:
- 高可用性:
Keepalived
确保了Director
服务器的高可用性,减少单点故障风险。 - 负载均衡:
LVS
提供了高效的负载均衡能力,能够处理大量并发请求。 - 可扩展性:可以轻松添加更多的
Real Server
来扩展服务能力。 - 灵活性:支持多种负载均衡算法,适应不同的业务需求。
- 高可用性:
-
劣势:
- 复杂性:配置和管理
Keepalived
和LVS
可能相对复杂。 - 资源消耗:
Director
服务器需要足够的资源来处理负载均衡和故障转移。 - 依赖性:对
Keepalived
和LVS
的依赖可能增加系统的脆弱性。
- 复杂性:配置和管理
-
性能测试:定期进行性能测试,确保集群满足业务性能要求。
-
监控和日志:实施监控系统来监控集群状态,并记录日志以便于问题排查。
通过这种设计,可以构建一个既高可用又能够负载均衡的集群系统,适用于需要高稳定性和高性能的业务场景。
ISSUE
-
Keepalived
配置成功, vip 正常绑定到rs网卡,vip 无法ping通
Keepalived 服务版本错误,建议下载安装包,编译。 -
Keepalived+lvs
如何部署到aliyun ECS
集群?
无法将Keepalived+lvs
部署到aliyun ECS
集群。
无法将Keepalived+lvs
部署到aliyun ECS
集群。
无法将Keepalived+lvs
部署到aliyun ECS
集群。
因为aliyun
不提供VIP
, 必须通过EIP+HaVIP
, 但是HaVIP
需要申请资格,可以花钱购买LB
服务。