一,什么是 LVS?
LVS: 是Linux Virtual Server的简写,也就是Linux 虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
二,为什么使用LVS?
使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性,从而以低廉的成本实现最优的性能。
三,什么是Keepalived?
Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。
四,实验架构图
集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。
最终我们要达到的目标为:
Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB) 当 MATSER 的 LB 节点故障时,自动切换到
BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点 当某个 RS
节点故障时,自动剔除该节点;恢复后,再次加入集群
五,开始搭建
1,在DS1和DS2执行以下下载命令,分别在主备lvs上安装keepalived
yum install ipvsadm keepalived -y
修改主lvs下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived
global_defs {
notification_email {
hgh@163.com # 发生故障时发送的邮箱
}
#notification_email_from hgh@163.com # 使用哪个邮箱发送
#smtp_server hgh.com # 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 标示为主lvs
interface eth0 # HA检测端口(当前 IP 对应的网络接口,通过 ifconfig 查询)
virtual_router_id 51 # 主备的virtual_router_id 必须相同
priority 100 # 优先级,备lvs要比主lvs稍小
advert_int 1 # VRRP Multicast 广播周期秒数
authentication { # 定义认证
auth_type PASS # 认证方式为口令认证
auth_pass 1111 # 定义口令
}
virtual_ipaddress { # 定义vip
192.168.10.100 # 多个vip可换行添加
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6 # 每隔6秒查看realserver状态
lb_algo wlc # 调度算法为加权最小连接数
lb_kind DR # lvs工作模式为DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 50 # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP # 用TCP监测realserver的状态
real_server 192.168.10.203 80 { # 定义realserver
weight 3 # 定义权重
TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
connect_timeout 3 # 三秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.204 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
修改备lvs下/etc/keepalived/keepalived.conf文件
配置备lvs时需要注意:需要修改state为BACKUP ,
priority比MASTER低,virtual_router_id和master的值一致
! Configuration File for keepalived
global_defs {
notification_email {
#hgh@163.com # 发生故障时发送的邮箱
}
#notification_email_from hgh@163.com # 使用哪个邮箱发送
#smtp_server 163.com # 发件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP # 标示为备lvs
interface eth0 # HA检测端口(当前 IP 对应的网络接口,通过 ifconfig 查询)
virtual_router_id 51 # 主备的virtual_router_id 必须相同
priority 99 # 优先级,备lvs要比主lvs稍小
advert_int 1 # VRRP Multicast 广播周期秒数
authentication { # 定义认证
auth_type PASS # 认证方式为口令认证
auth_pass 1111 # 定义口令
}
virtual_ipaddress { # 定义vip
192.168.10.100 # 多个vip可换行添加
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6 # 每隔6秒查看realserver状态
lb_algo wlc # 调度算法为加权最小连接数
lb_kind DR # lvs工作模式为DR(直接路由)模式
nat_mask 255.255.255.0
persistence_timeout 50 # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
protocol TCP # 用TCP监测realserver的状态
real_server 192.168.10.203 80 { # 定义realserver
weight 3 # 定义权重
TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
connect_timeout 3 # 三秒无响应超时
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.204 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置完成后,分别重启 Keepalived 服务。
systemctl restart keepalived
搭建配置 RS(后端真实的工作服务器)这些操作都是在RS服务器进行配置注意切换
RS 配置主要分两部分,一部分是 web 服务,另一部分是网络转发配置。
然后在RS1,RS2安装httpd模拟你现在的工程项目就运行在httpd的80端口,和我们配置的keeplived对应上,实现监控
运行以下脚本,才能转发访问到我们后面的两个DS服务器
安装测试httpd服务
yum install -y httpd
systemctl start httpd
然后编写以下脚本 SNS_VIP这个变量的ip地址应该和你keeplived配置的虚拟ip一致
#!/bin/bash
# 设置脚本解释器为Bash
SNS_VIP=192.168.10.100
# 定义一个变量SNS_VIP并赋值为192.168.10.100,这是虚拟IP的地址
case "$1" in
# 使用命令行参数$1的值来决定脚本的操作
start)
ifconfig ens33:1 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
# 启用虚拟IP,并将它绑定到本地回环接口ens33:1上
/sbin/route add -host $SNS_VIP dev ens33:1
# 添加路由,将虚拟IP的数据包发送到ens33:1接口
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
# 设置ARP(地址解析协议)参数,以忽略本地回环接口上的ARP请求
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
# 设置ARP参数,以告知其他主机这是一个共享的IP地址
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
# 设置全局ARP参数,忽略所有接口上的ARP请求
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
# 设置全局ARP参数,告知其他主机这是一个共享的IP地址
sysctl -p >/dev/null 2>&1
# 使用sysctl重新加载网络参数,以使更改生效
echo "RealServer Start OK"
# 输出启动成功的消息
;;
stop)
ifconfig ens33:1 down
# 关闭虚拟IP
route del $SNS_VIP >/dev/null 2>&1
# 删除虚拟IP的路由配置
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
# 恢复ARP参数,接受本地回环接口上的ARP请求
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
# 恢复ARP参数,不告知其他主机共享IP地址
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
# 恢复全局ARP参数,接受所有接口上的ARP请求
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
# 恢复全局ARP参数,不告知其他主机共享IP地址
echo "RealServer Stopped"
# 输出停止成功的消息
;;
*)
echo "Usage: $0 {start|stop}"
# 如果命令行参数不是start或stop,则输出使用说明
exit 1
esac
exit 0
# 脚本正常退出
编写完毕 ,在RS运行此脚本
bash tcp.sh start
启动完之后 你应该可以通过你所设置的虚拟ip访问页面
HA 测试(高可用)
配置完双机热备后,我们就可以测试下,节点发生故障后以及 LB 切换失败后,能否保证服务的 HA。
在负载均衡的主节点上输入 ip a
,可以看到 VIP 目前已经正确配置在网卡上。
输入
watch ipvsadm -Ln --stats
可实时看到负载均衡的结果
Prot: 代表协议类型,此处为TCP。
LocalAddress:Port: 代表负载均衡器监听的本地地址和端口,本例中为192.168.10.100:80。
Conns: 代表当前连接到负载均衡器的连接数。
InPkts: 代表从客户端到负载均衡器的进入数据包数量。
OutPkts: 代表从负载均衡器到后端服务器的出去数据包数量。
InBytes: 代表从客户端到负载均衡器的进入数据包的字节数。
OutBytes: 代表从负载均衡器到后端服务器的出去数据包的字节数。
RemoteAddress:Port: 代表连接到负载均衡器的客户端的远程地址和端口。
RemoteAddress:Port: 代表转发到的后端服务器的地址和端口。
根据上述输出,可以看到负载均衡器当前有两台后端服务器,分别是192.168.10.203:80和192.168.10.204:80。其中,后端服务器192.168.10.203:80目前还未有连接到达,而后端服务器192.168.10.204:80有一个连接到达,并接收了一个进入数据包。
此时手动停止一个 RS(就是停止一个你所运行httpd的虚拟机),再次访问 VIP,LVS 会自动剔除无法访问的服务,重启后,服务会被自动添加。
可以观察到,当某一台(203)停止了服务,lvs会删除掉失效的服务,keepalived会尝试重连,失败之后也会remove 这个服务。
随后 我重新启动(203)的httpd,可以观察到 keepalived 检查可用之后,会重新添加这个服务到当前。
接下来测试一下 如果是DS(前端负载均衡器节点)其中的某一台出现故障,keepalived会如何处理?
首先停止(201)
systemctl stop keepalived.service
可以发现,本来在DS1的vip,现在漂移到了DS2,从而实现HA(高可用)。
总结
高可用性:LVS和Keepalived可以实现故障转移,当一个后端服务器出现故障或不可用时,流量将自动转移到其他可用的后端服务器,确保服务的持续可用性。
负载均衡:LVS可以平衡流量负载,将请求均匀分配到多个后端服务器,避免某台服务器过载而导致性能下降或服务不可用的情况。
灵活性和扩展性:LVS允许根据需要添加或删除后端服务器,以适应不断变化的流量和需求。此外,Keepalived提供了灵活的配置选项,可以根据实际情况进行调整和定制。
效率和性能:LVS和Keepalived是基于内核层的解决方案,相比于其他负载均衡器,可以提供更高效和更低延迟的性能。
总的来说,
使用LVS和Keepalived可以提供高可用性、负载均衡,并且具有灵活性和高效性能,使得服务能够稳定可靠地运行,并能够根据需要进行扩展和调整。