背景:最近在搭建LVS+keepalived的高可用架构,中间遇到了一些坑比较让人头疼,此处重要就安装部署的步骤进行记录,特别是遇到坑进行说明,希望能对有需要的同学提供给帮助!
坑点1:
在部署LVS+keepalived并且使用DR模式时要确认lvs部署的节点需要跟后端的real server在同一二级网络中,lvs节点跟后端real server通过交换机完成通信;一般在同一网段中的虚拟机会在同一二级网络中。
MAC 地址修改:在 DR 模式中,LVS 仅修改请求包的目标 MAC 地址为选定的 Real Server 的 MAC 地址,而不修改目标 IP 地址(仍为 VIP)。因此,LVS 必须与 RS 处于同一二层网络,才能通过 ARP 协议直接获取 RS 的 MAC 地址,并通过二层交换将请求转发给 RS。
避免跨网段路由:若 LVS 和 RS 不在同一二层网络,请求包需经过路由器或三层设备,此时目标 MAC 地址会被修改为网关 MAC,导致 RS 无法直接接收该数据包。
lvs节点跟real server不在同一二级网络中会导致部署完成后请求一直不通,主要表现形式就是:
(1)在开通对应的网络策略后,不启用lvs+keepalived是,客户端telnet VIP port或者curl http://VIP:port都是提示connection refused,表明网络是通的,只是服务端没有监听对应的端口;
(2)在启用lvs+keepalived后,客户端再telnet VIP port或者curl http://VIP:port都是提示connection time out。
以上问题在排查是花费了很多时间,一度以为是服务端的问题,最后通过 tcpdump 工具抓包才发现,服务端根本就没有收到请求。
坑点2:
我在确认我所部署的lvs节点跟后端的real server不在同一二级网络,且中间还要经过一道防火墙后,想到了另外一个办法,在中间增加一层nginx,分别在两台lvs安装部署nginx,通过将请求转发到nginx,再由nginx转发请求,这样就能在不增加机器的情况下完成请求转发,实现后端服务的高可用。但是在此处我先配置了一个http的请求转发,在实际的测试中发现nginx的错误日志信息中一直返回400,没法正常处理,最后发现请求转发到nginx不是http请求,而是tcp请求,所有http请求一直无法处理tcp请求导致报400。解决方式是在nginx 增加stream 模块,大家可以参考很多网上资料进行配置。
部署的关键步骤:
1.准备两台虚拟机(需要跟后端服务在同一二级网络中) 2.提前完成网络策略打通。3.VIP地址 4.开始部署
首先安装keepalived+lvs管理工具ipvsadm;执行命令: sudo yum -y keepalived ipvsadm;命令执行完成后修改配置文件:keepalived.conf,文件目录:/etc/keepalived/keepalived.conf
! 全局配置段
global_defs {
notification_email { # 故障通知邮箱(需邮件服务器支持)
admin@example.com
}
notification_email_from keepalived@example.com
smtp_server smtp.example.com # SMTP服务器地址
smtp_connect_timeout 30 # SMTP超时时间
router_id LVS_DEVEL # 唯一标识,建议用主机名
}
! 自定义健康检查脚本(监控Nginx状态)
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx" # 检查Nginx进程是否存在
interval 2 # 检查间隔(秒)
weight 2 # 优先级增减值(失败时降低权重)
}
! VRRP实例配置(主备节点需同步此段)
vrrp_instance VI_1 {
state MASTER # 初始状态:MASTER/BACKUP
interface eth0 # 绑定网卡名称(需实际网卡名)
virtual_router_id 51 # 虚拟路由ID(0-255,主备必须一致)
priority 100 # 节点优先级(MASTER > BACKUP)
advert_int 1 # 主备心跳间隔(秒)
! 认证配置(主备节点需一致)
authentication {
auth_type PASS # 认证类型:PASS/AH(推荐PASS)
auth_pass 123456 # 认证密码(建议加密)
}
! 虚拟IP配置(可配置多个)
virtual_ipaddress {
192.168.1.100/24 dev eth0 # 虚拟IP地址及绑定网卡
}
! 绑定健康检查脚本
track_script {
chk_nginx # 引用上方定义的脚本
}
! 新增虚拟服务器配置(转发HTTP流量到后端真实服务器)
virtual_server 192.168.1.100 80 { # 虚拟IP及端口
delay_loop 6 # 健康检查间隔(秒)
lb_algo wrr # 负载均衡算法(加权轮询)
lb_kind DR # 直接路由模式(需后端服务器配置ARP抑制)
protocol TCP # 协议类型
! 后端真实服务器列表(主备节点配置需一致)
real_server 192.168.1.101 80 {
weight 1 # 权重值
! TCP健康检查(检测80端口连通性)
TCP_CHECK {
connect_timeout 3 # 连接超时时间(秒)
retry 3 # 重试次数
delay_before_retry 2 # 重试间隔(秒)
}
}
real_server 192.168.1.102 80 {
weight 1
TCP_CHECK {
connect_timeout 3 # 连接超时时间(秒)
retry 3 # 重试次数
delay_before_retry 2 # 重试间隔(秒)
}
}
}
}
可参考如上文件进行配置,需要注意的点是,keepalived部署一般为 一MASTER 一BACKUP,在MASTER正常运行的请求下,所有请求VIP的请求都有MASTER完成转发,若MASTER 发生了故障,BACKUP主动接管并承担MASTER的工作。在配置时需要注意几个点:
(1)MASTER角色的keepalived配置中state值需要配置为MASTER,BACKUP的state需要配置为
BACKUP;
(2)virtual_router_id MASTER和BACKUP需要一致。
(3)priority值MASTER配置值 要大于BACKUP。
完成以上后就可以启动keepalived,启动命令:sudo service keepalived start; 停止命令是:sudo service keepalived stop。
启动成功后我们通过 ip addr 命令查看是否我们的VIP地址有绑定在网卡上(网卡可以通过ifconfig来查看),若成功绑定则再执行命令:sudo ipvsadm -ln,查看lvs负载策略是否建立起来,在实际请求还可以通过命令:sudo ipvsadm -lnc查看连接情况。
接下来需要完成real server的虚拟机上VIP和lo网卡绑定,可执行脚本如下:
#!/bin/bash
SNS_VIP=10.0.0.192 #虚拟ip地址
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
脚本执行成功后一样通过ip addr查看是否绑定成功,绑定成功则可以在客户端访问VIP了,看是否正常响应,到此MASTER就部署完成可,接下来可以按照以上的步骤完成另外一个lvs节点部署。然后可以测试MASTER挂掉后BACKUP是否有接管后续的请求。
参考:
LVS+Keepalived(主备)+Nginx实现高可用负载均衡_lvs+keepalived+nginx-CSDN博客