前言
内部FTP/REST服务数据上报服务均为单节点,会存在单节点故障和性能瓶颈。先急迫需提供清晰简单明了的高可用+负载均衡(keepalived+lvs+DR)方案,业内的slb解决方案,核心实现思想也是keepalived+lvs。现这里简单演示记录下手动做高可用和负载均衡的说明和步骤。
技术思路
当前高可用+负载均衡方案主要使用使用keepalived+lvs+DR实现,lvs组件实现负载均衡,keepalived组件实现高可用。
Keepalived是啥?
Keepalived就是VRRP的实现,该协议是虚拟冗余路由协议,顾名思义为服务保活,通过故障转移对外保证服务的高可用。详情可以查看官方文档。
软件架构图
一些说明
0,VRRP(虚拟冗余路由协议)提供VIP和VMAC地址,设定那个路由器是活动节点,客户端使用VIP和VMAC寻址。
1,Master会不停的向Backup节点基于VRRP协议上报心跳,一旦心跳超时,Backup节点立马变化为Master。整个故障转移流程是全自动。
2,VRRP Stack为一个子进程负责VRRP(也就是VRRP协议的实现)。
3,Checkers为一个子进程负责IPVS的后端的应用服务器的定时健康检查。比如下游的nginx挂了,则可以通过Checkers做相应的操作,比如告警和重启服务。
4,Control Plane为主进程,控制VRRP Stack和Checkers两个子进程。且复杂一些配置文件的处理。
5,WatchDog为linux内核监控进程,监控两个子进程的状态。
LVS是啥?
LVS是Linux Virtual Server的简写,也就是Linux 虚拟服务器,基于IP地址的虚拟化应用,主要为负载均衡提出了高效的解决方法,解决DNS中的TTL缓存导致动态不均衡和F5等硬件设备昂贵的痛点。详情可以查看官方文档。LVS有三种负载均衡工作方式,地址转换(NAT)、IP 隧道(TUN)和直接路由(DR)由于DR模式响应数据不经过LVS节点,是性能最好的,下文所有的说明均基于DR模式,其他模式可以参考官方说明。
软件架构
一些说明
1,LVS主要由两个部分组成,ipvs和ipvsadm。ipvs工作在内核空间,基于内核态的netfilter框架实现,真正实现数据链路调度的部分。ipvsadm工作在用户空间,主要为内核的ipvs编写规则,实现 VIP 和 RS 的增删改查功能。
2,LVS为使用IP+端口形式做四层负载均衡。不同于nginx等使用应用层信息比如HTTP头,URL,cookie等做七层负载均衡。如果不使用应用层信息做定制化的负载均衡则推荐使用LVS。
3,LVS的一些专业术语,DS(Director Server负载均衡节点服务器),RS(Real Server后端真实服务器),VIP(对外提供访问的虚拟IP),RIP(真实后端服务器的IP),CIP(访问客户端的IP),DIP(负载均衡节点服务器IP),VMAC(VIP对应的MAC地址)。
4,LVS工作原理,LVS基于内核的netfilter,IPVS工作在INPUT链上。客户端请求通过交换机进 LVS服务器网卡进入内核空间层,在PREROUTING查找路由,判断VIP是否为本机IP,如果是则将数据包传入INPUT。IPVS在INPUT链中判断访问的VIP和端口判断请求是否为IPVS服务,如果是则进行IPVS相关流程,并修改数据包中的相关信息(主要是RIP-MAC,这里会通过响应的负载均衡算法,比如轮询配置中的RS节点)发送到POSTROUTING链。POSTROUTING链收到数据包后,将根据目标IP地址服务器,将数据包最终发送至后端真实RS服务器中。RS处理并返回响应数据包返回到交换机。
5,LVS+DR模式的一些限制,DR模式虽然响应数据不用过LVS节点,性能高和数据完整性强,但是LVS与RS必须在同一个物理网络,且RS上配置了lo网卡和arp内核参数。
6,LVS+keepalived至少需要4台机器,DR和RS不能再同一个接地上,否则会出现死循环。
7,LVS+DR无法像nginx会作为一个代理服务去重试错误请求,如果在DR模式下,如果RS节点没有配置VIP则这部分请求就会丢失。
交付架构
演示资源
交付图
简单操作
Real Server节点操作
1,交付上报服务
在两个RS节点192.168.100.34和192.168.100.35成功完成数据上报服务的实例交付。
2,启动上报服务
在两个RS节点192.168.100.34和192.168.100.35上启动FTP/REST内核服务。
systemctl status ftp
systemctl restart ftp
systemctl status rest
systemctl restart rest
3,创建LVS节点
在RS节点上创建lo:0虚拟网卡并修改内核参数,需要在两个RS节点192.168.100.34和192.168.100.35执行如下操作,切记只能在两个RS节点上执行!!!否则会导致其他节点服务访问。
创建install_vip.sh脚本文件,内容如下:
CT_VIP=192.168.100.111
source /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $CT_VIP netmask 255.255.255.255 broadcast $CT_VIP
/sbin/route add -host $CT_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 $CT_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
执行命令创建和销毁lo:0虚拟网卡和设置内核参数以及重置内核参数。
# 1,上传脚本
rz -bye
# 2,创建
sh install_vip.sh start
# 3,需要注意机器重启后lo:0网卡就会丢失,需要配置开机启动
chmod +x /etc/rc.d/rc.local
echo '# for lvs lo:0' >> /etc/rc.local
echo '/root/install_vip.sh start' >> /etc/rc.local
创建成功后可以看到下图则表示成功。
Director Server节点操作
1,创建keepalived配置文件
创建keepalived.conf配置文件。参考模板如下。
! Configuration File for keepalived
global_defs {
router_id T_LVS
}
vrrp_instance VI_1 { # 定义VRRP实例名(VT_1),建议默认配置
state MASTER # 当前节点的主备初始状态,可以为MASTER和BACKUP
interface enp1s0 # 机器的具体网卡
virtual_router_id 100 # 虚拟路由id,唯一标识,主备节点该值相同
mcast_src_ip 192.168.100.244 # 发送多播包的地址,一般问本机ip
priority 100 # 节点初始优先级
advert_int 1 # vrrp通告优先级时间间隔
authentication { # 认证机制
auth_type PASS
auth_pass xxxx # 密钥,和其他keepalived节点必须一致
}
virtual_ipaddress {
192.168.100.111 # 虚拟IP
}
}
virtual_server fwmark 300 { # virtual server(虚拟服务器),FTP使用ipvs的防火墙打标方式
delay_loop 6 # 健康检查的时间间隔
lb_algo wrr # 负载调度算法
lb_kind DR # lvs的模式
protocol TCP # ip包转发协议,有TCP和UDP两种
persistence_timeout 900
real_server 192.168.100.34 9814 { # ftp real server 的ip+port
weight 1 # 权重
TCP_CHECK { # 健康检查
connect_timeout 3 # 无响应超时时间,单位是秒
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重试间隔
connect_port 9814 # real_server指定的端口
}
}
real_server 192.168.100.35 9814 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 9814
}
}
}
virtual_server 192.168.100.111 9826 { # rest的 virtual_server
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.34 9826 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.35 9826 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
在另一个节点按上同理操作,修改keepalived.conf配置文件中为state BACKUP,priority 50;
2,安装keepalived+lvs
建议下载使用keepalived-2.0.13.tar.gz离线安装,使用yum install -y keepalived安装的版本可能会出现调度问题。
安装流程如下:
# 1,上传keepalived-2.0.13.tar.gz安装文件
rz -bye
# 2,解压
tar -zxvf keepalived-2.0.13.tar.gz
# 3,编译并安装
yum install -y gcc
yum install libnl3-devel
cd keepalived-2.0.13/
./configure --prefix=/usr/local/keepalived
make && make install
# 4,配置开机启动
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
systemctl enable keepalived
# 5,上传配置文件keepalived.conf
cd /etc/keepalived
rz -bye
# 6,启动keepalived
systemctl restart keepalived
systemctl status keepalived
# 7,安装ipvsadm
yum -y install ipvsadm
3,操作iptables
在两个DR节点192.168.100.145和192.168.100.244上执行如下操作。由于FTP在passive mode可能无法使用ip+端口的形式定义virtual_server,只能使用ipvs的防火墙打标方式。
# 1,给FTP的服务端口(9814)和数据传输端口(8000:10000)
iptables -t mangle -A PREROUTING -p tcp -d 192.168.100.111 --dport 9814 -j MARK --set-mark 300
iptables -t mangle -A PREROUTING -p tcp -d 192.168.100.111 --dport 8000:10000 -j MARK --set-mark 300
# 2,查看是否生效
iptables -t mangle -L
# 3,保存 iptables 避免重启机器后标签丢失
yum install -y iptables-services
systemctl enable iptables.service
service iptables save
4,测试负载均衡+高可用是否生效
FTP服务
# 测试ftp走vip是否ok
ftp -nvi 192.168.100.111 9814
user admin ***
REST服务
# 创建一个测试文件
touch test_rest_compoent_available.txt
# 执行rest 脚本
chmod +x rest-test.sh
sh rest-test.sh 192.168.100.111 'xxxx'
6,高可用测试
在一个RS节点执行脚本
while true; do sh rest-test.sh 192.168.100.111 'xxxxx'; sleep 1;done
ftp -nvi 192.168.100.111 9814
模拟LVS节点下线
在LVS MASTER节点执行systemctl stop keepalived;ip a可以看到vip漂移走了。
在LVS BACKUP节点执行ip a可以看到VIP转移到了BACKUP上;
服务检查正常,VIP回到MASTER节点;
模拟RS节点下线
# 在其中一个RS(192.168.100.34)节点执行
systemctl stop ftp && systemctl stop rest
# 然后再LVS节点上执行
watch ipvsadm -Ln --stats
可以看到192.168.100.34节点已经不在路由中了。
然后访问服务,可以看到服务正常;
总结
1,为何负载均衡用LVS而不是nginx?
答:LVS+DR模式下,LVS节点只有请求包的流量,响应包的流量不过LVS节点,性能更高。且LVS为4层负载,nginx为7层负载,在一般的场景下用不上7层负载。
2,FTP为何要用ipvs的防火墙打标方式?
答:如果FTP不用fwmark的方式,那么FTP只能访问9814服务端口,在passive mode的情况下可能无法访问数据传输端口。
3,LVS和keepalived分别起什么样的角色?
答:keepalived是LVS的一部分。keepalived顾名思义“保活”,LVS为负载均衡。
4,两节点下其中一个keepalived只是备用,一直空闲?
答:生产环境一般用2个VIP做双主相互热备,2个VIP绑定2个外网IP并绑定DNS域名对外服务。