Keepalived(高可用)和LVS(负载均衡)

前言

内部FTP/REST服务数据上报服务均为单节点,会存在单节点故障和性能瓶颈。先急迫需提供清晰简单明了的高可用+负载均衡(keepalived+lvs+DR)方案,业内的slb解决方案,核心实现思想也是keepalived+lvs。现这里简单演示记录下手动做高可用和负载均衡的说明和步骤。

技术思路

当前高可用+负载均衡方案主要使用使用keepalived+lvs+DR实现,lvs组件实现负载均衡,keepalived组件实现高可用。

Keepalived是啥?

Keepalived就是VRRP的实现,该协议是虚拟冗余路由协议,顾名思义为服务保活,通过故障转移对外保证服务的高可用。详情可以查看官方文档。

软件架构图

image.png

image.png
一些说明

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模式,其他模式可以参考官方说明。

软件架构

image.png

image.png
一些说明

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则这部分请求就会丢失。

交付架构

演示资源

image.png

交付图

image.png

简单操作

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

创建成功后可以看到下图则表示成功。


image.png

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
image.png

4,测试负载均衡+高可用是否生效
FTP服务

# 测试ftp走vip是否ok
ftp -nvi 192.168.100.111 9814
user admin ***
image.png

REST服务

# 创建一个测试文件
touch test_rest_compoent_available.txt
 
# 执行rest 脚本
chmod +x rest-test.sh
sh rest-test.sh 192.168.100.111 'xxxx'
image.png

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漂移走了。


image.png

在LVS BACKUP节点执行ip a可以看到VIP转移到了BACKUP上;


image.png

服务检查正常,VIP回到MASTER节点;


image.png
image.png

模拟RS节点下线

# 在其中一个RS(192.168.100.34)节点执行
systemctl stop ftp && systemctl stop rest
 
# 然后再LVS节点上执行
watch ipvsadm -Ln --stats

可以看到192.168.100.34节点已经不在路由中了。


image.png

然后访问服务,可以看到服务正常;


image.png

总结

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域名对外服务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容