负载均衡服务-LVS
负载均衡服务-LVS
1. 什么是LVS
LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。LVS不直接处理请求,而是将请求转发至位于它后端真正的服务器realserver上。(LVS是四层,传输层tcp/udp)
Tips:ipvs是集成在内核中的框架,可以通过用户空间的程序
ipvsadm
工具来管理,该工具可以定义一些规则来管理内核中的ipvs。
2. 为什么选择LVS
相比于Nginx、Haproxy等负载均衡器,LVS支持较大的并发量。Nginx、Haproxy是工作在七层的负载均衡器,因此需要监听在一个端口上,同时对于每一个客户端都需要打开一个套接字文件来接受请求数据,当在应用层分析完数据时,有需要扮演成客户端角色向后端的服务器主机发送请求报文,不仅需要打开大量套接字文件,还需要有多个随机端口可以使用,而端口数最多只有65535个,并且其中有一部分端口是不能使用的。
因此,工作在七层的负载均衡软件(如Nginx、Haproxy等)的最大并发数受限于能够打开的套接字文件数(内核需要打开很多的文件描述符来维护)以及能使用的随机端口数。对于LVS而言,因此它工作在四层,所以不需要监听在某个端口以响应客户端请求,因此不需要打开套接字接受和发送数据,同时也不需要使用端口,所有功能均在ipvs中实现,因此LVS的性能更高,支持的并发量更大。据统计,LVS的最大并发量可以达到400~500w。
1、LVS是一款开源且免费的软件,结合Linux使用可以大大降低企业的应用成本。
2、LVS具有可伸缩性。当一台服务器负载压力增长时,系统可以在不降低服务质量的情况下通过扩展来满足需求。
3、LVS具有高可靠性。这在国内很多大型的、关键性的Web站点实践中得到印证。
3. LVS的工作原理
LVS集群负载均衡器接受服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。
一组服务器通过高速的局域网或者地理分布的广域网相互连接,在他们的前端有一个负载调度器/分发器(Load Balancer)。 负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响不需要作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。
ipvs工作于内核空间中,而ipvsadm则是用户定义集群的接口,并将用户定义的策略送往ipvs。当前端调度器(Director)接收到发往本主机的请求时,首先进入PREROUTING链,经查看路由表发现,该请求的目标IP地址是本主机,因此将请求报文送往INPUT链,经过查看请求报文的目标端口发现,请求的是集群服务的端口,因此IPVS就会根据调度方法和集群类型,强行将请求报文发往FORWARD链上,而后经过POSTROUTING,再送往基于调度算法挑选出的某一台后端real server。
LVS的基本命名约定
名称 | 缩写 | 说明 |
---|---|---|
虚拟IP | VIP | virtual IP,LVS服务器上接收外网数据包的网卡IP地址。比如:www.yinjay.com域名就要解析到vip上提供服务。 |
真实IP地址 | RIP | realserver(常简称为RS)上接收Director转发数据包的IP,即提供服务的服务器IP。 |
Director的IP地址 | DIP | director IP,用于连接内外网络的IP地址,LVS服务器上转发数据包到realserver的网卡IP地址。 |
客户端主机IP地址 | CIP | 客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址。 |
4. LVS的三种模式
4.1 NAT模式
客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
- 调度时:目的IP改成RIP(DNAT)返回时:源IP改成VIP(SNAT)
- 调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部realserver节点通信。
- 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈。
- NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到realserver节点的10.0.0.2:8080(DR和TUN模式不具备的)
- 所有NAT内部realserver节点只需要配置私有LAN IP即可。
- 由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)。
工作原理图
4.2 DR模式
当用户请求报文到达负载调度器时,调度器通过为请求报文重新封装一个MAC首部进行转发,重新封装后的报文中的源MAC是DIP所在接口的MAC地址,目标MAC是挑选出的某realserver的RIP所在的接口的MAC地址,而请求报文的IP首部不会发生变化(源IP是CIP,目标IP是VIP),而realserver将响应直接返回给用户。在LVS-DR这种方式中,各个realserver上都必须配有VIP,以便在响应用户请求时,用VIP作为源IP来封装报文的IP首部。
- 必须确保前端路由器将目标IP为VIP的请求报文发往Director。
- realserver跟Director必须在同一物理网络中,同一广播域。如果realserver跟Director之间只要多了一个路由器则MAC地址就改变了,无法确保按照Director的调度将请求报文转发给挑选出的某realserver。
- realserver的网关必须不能指向DIP。
- 请求报文必须由Director调度,但响应报文必须不能经由Director转发。
- 因为响应报文必须不能经由Director转发,因此不支持端口映射。
工作原理图
4.3 TUN模式
TTUN即Tunneling,也就是通过IP隧道技术实现虚拟服务器。在TUN方式中,当用户请求报文到达时,调度器不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出的realserver的RIP,进行第二次封装)。而这个RS将直接响应用户的请求,不会再经由Director转发,因此调度器只处理用户的报文请求,从而大大提高了集群系统的吞吐量。LVS-TUN这种集群类型的另外一个特点是对realserver的地域位置没有要求,一般和Director不再同一网段中(也可以在同一网段),即各个realserver可以分别分布在不同的地域位置。
- RIP、VIP和DIP全得是公网地址。
- RS的网关不能指向也不可能指向DIP。
- 请求报文经由Director转发,但响应报文将由realserver直接发往CIP。
- 因为响应报文不经由Director转发,因此不支持端口映射。
- realserver的OS必须支持隧道功能。
- TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
- 所有的realserver服务器都要绑定VIP,抑制ARP,配置复杂。
工作原理图
Tips:LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
5. LVS的调度算法
当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别:
- 固定调度方法:rr,wrr,dh,sh
- 动态调度算法:wlc,lc,lblc,lblcr,SED,NQ
算法 | 说明 |
---|---|
rr | 轮循调度,它将请求依次分配不同的realserver节点,也就是在realserver节点中均摊请求。这种算法简单,但是只适合于realserver节点处理性能相差不大的情况。 |
wrr | 权重轮循,它将依据不同realserver节点的权值分配任务。权值较高的realserver将优先获得任务,并且分配到的连接数将比权值较低的realserver节点更多。相同权值的realserver得到相同数目的连接数。 |
dh | 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的realserver |
sh | 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的realserver |
wlc | 加权最小连接数调度,实际连接数除以权值,最小的realserver作为分配的realserver |
lc | 最小连接数调度,连接数最小的realserver作为分配的realserver |
lblc | 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台realserver节点 |
lblcr | 基于地址带重复最小连接数调度。(略) |
SED | 最短的期望的延迟(不成熟) |
NQ | 最小队列调度(不成熟) |
Tips:常用rr和wrr方案!
6. 搭建LVS-NAT模式
6.1 前期准备
角色 | IP地址 | 主机名 | 网关 |
---|---|---|---|
Client | CIP:10.0.0.1 | 宿主机 | |
Director | VIP:10.0.0.5 DIP:172.16.1.5 |
lb01 | |
Realserver-01 | RIP:172.16.1.7 | web01 | 172.16.1.5 |
Realserver-02 | RIP:172.16.1.8 | web02 | 172.16.1.5 |
6.2 安装LVS管理工具
lb01上执行
#安装ipvsadm
[root@lb01 ~]# yum install ipvsadm
[root@lb01 ~]# lsmod | grep ip_vs
ip_vs 145458 0
nf_conntrack 139264 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
#出现这个内容就表示LVS已经安装好,并加载到了内核
6.3 配置路由转发
由于director接收到CIP发送的数据包后,需要转发给Real Server进行处理,但Real Server的RIP和DIP是同一网段的,因此Director必须将VIP接口上收到的数据包转发给DIP,也就是说Director需要开启ip_forward功能。
临时性:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
当RS处理完成后,响应数据需要先转发给Director,但因为响应数据的目标地址为CIP,因此需要将RS的网关指向Director的DIP,这样CIP目的的数据包才能保证交给director进行处理并返回给客户端。
6.4 配置规则
首先确定IP规划根据前期准备的进行配置,确保这一项后进行配置LVS的规则。同时还要在real sever上进行配置nginx,确保能访问web服务(默认80端口即可),此处不再进行配置示例。
在lb01上进行配置LVS规则
[root@lb01 ~]# ipvsadm -A -t 10.0.0.5:12306 -s rr
[root@lb01 ~]# ipvsadm -a -t 10.0.0.5:12306 -r 172.16.1.7:80 -m -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.5:12306 -r 172.16.1.8:80 -m -w 1
-A 添加虚拟服务器
-t 表示TCP服务 VIP:Port
-s 指定调度算法 rr是轮询
-a 添加分发器
-r 表示添加real server的地址
-m 指定LVS的工作模式为NAT模式
-w 指定real server服务器的权值
6.5 查看并保存配置
#查看配置
[root@lb01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.5:12306 rr
-> 172.16.1.7:80 Masq 1 0 0
-> 172.16.1.8:80 Masq 1 0 0
#保存配置
[root@lb01 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lb01 ~]# cat /etc/sysconfig/ipvsadm
-A -t 10.0.0.5:12306 -s rr
-a -t 10.0.0.5:12306 -r 172.16.1.7:80 -m -w 1
-a -t 10.0.0.5:12306 -r 172.16.1.8:80 -m -w 1
#启动ipvsadm
[root@lb01 ~]# systemctl start ipvsadm
6.6 开启抓包并浏览器访问测试
我的real server网络使用虚拟网卡vmnet1(RIP),director网络使用虚拟网卡vmnet1(DIP)和vmnet8(VIP)。开启wireshark抓包这两个网络,然后进行浏览器访问,观察数据包。
首先宿主机10.0.0.1向Director发起请求,最后还是由Director进行返回
Tips:目的MAC:00:0c:29:c9:d6:2c 是VIP地址的MAC
下面再看看vmnet1网络的抓包情况,解封装二层数据帧,00:0c:29:c9:d6:36
是DIP,00:0c:29:31:e0:9f
是Realserver-02的RIP
那Realserver-02进行回复,查询路由表没有直达10.0.0.0/24网络的路由,走默认路由。前面讲到了00:0c:29:c9:d6:36
就是DIP的MAC,所以将数据发往Director。
Director收到Realserver-02,查看路由表有到达该网络的条目,再查看ARP表是否有目的IP地址相对应的MAC地址,然后进行重新封装源MAC和目的MAC。
6.7 查看LVS的连接情况
通过下面的查询能看到目前连接的状态,源IP和发起端口,Director的IP端口情况,目的realserver的IP端口情况。
Tips:关于state状态可以查阅TCP/IP的TCP状态机!
查看目前设置的超时策略
超时时间用ipvsadm --set tcp tcpfin udp设置,比如
#ipvsadm --set 120 20 100
表示tcp空闲等待时间为120 秒
客户端关闭连接等待时间为20秒
udp空闲等待为100秒
查看分发情况
调度算法是对连接进行调度,而不是对数据包、字节等调度,因此查看统计数据时,应该比较的是Conns列的比例。另外,如果连接数大致满足比例,但数据包或者字节数却远不符合比例(高的多或低的多),那么可能对应的那台realserver主机性能比其它realserver的性能要好或差。
6.8 删除LVS配置
删除realserver节点,能看出只移除某个节点。
删除虚拟服务器,会连带realserver节点一起删除。
7. 搭建LVS-DR模式
7.1 前期准备
角色 | IP地址 | 主机名 | 网关 |
---|---|---|---|
Client | CIP:50.50.50.100 | win7 | 50.50.50.200 |
Director | VIP:192.168.100.200 DIP:192.168.100.101 |
lb01 | 192.168.100.254 |
Realserver-01 | RIP:192.168.100.102 | web01 | 192.168.100.254 |
Realserver-02 | RIP:192.168.100.103 | web02 | 192.168.100.254 |
Tips:路由器上将公网50.50.50.222:80映射到内网192.168.100.200:80上!
7.2 安装LVS管理工具
lb01上执行
#安装ipvsadm
[root@lb01 ~]# yum install ipvsadm
[root@lb01 ~]# lsmod | grep ip_vs
ip_vs 145458 0
nf_conntrack 139264 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
#出现这个内容就表示LVS已经安装好,并加载到了内核
7.3 配置ARP抑制
Director和Realserver节点都需要配置VIP,当路由器发送ARP广播后,Director和Realserver都会收到这个广播包。且都认为这个广播包找的就是自己,于是都回应给路由器,这样路由器上的ARP缓存表中的条目就不断被覆盖直到最后一个回应。(下图就是同时回复广播包的场景)
因此,必须要保证路由器、交换机只保存Director上VIP对应的MAC地址,即只允许Director才对路由器的ARP广播进行回应。也就是说,所有Realserver上的VIP必须隐藏起来。
#临时生效
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
#永久生效
echo "net.ipv4.conf.all.arp_ignore=1" >>/etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce=2" >>/etc/sysctl.conf
sysctl -p
7.4 配置VIP
#lb01
ifconfig eth0:0 192.168.100.200/24 up
#web01
ifconfig lo:0 192.168.100.200/32 up
#web02
ifconfig lo:0 192.168.100.200/32 up
7.5 配置规则
这与NAT模式不同,因为响应报文必须不能经由Director转发,因此不支持端口映射。Director节点只解封装二层然后进行转发到Realserver,所以源目端口需要一致。
ipvsadm -A -t 192.168.100.200:80 -s rr
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.102:80 -g -w 1
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.103:80 -g -w 1
-A 添加虚拟服务器
-t 表示TCP服务 VIP:Port
-s 指定调度算法 rr是轮询
-a 添加分发器
-r 表示添加real server的地址
-g 指定LVS的工作模式为DR模式
-w 指定real server服务器的权值
7.6 查看并保存配置
7.7 开启抓包并浏览器访问测试
首先PC进行浏览器访问
进入到路由器后进行NAT转换,二层、三层进行解封装替换。源MAC是路由器的g0/0/0口,目的MAC是Director节点VIP的MAC地址(VIP建立在eth0网卡上,实则是一个MAC)。三层也需要转换,将50.50.50.222转换成192.168.100.200。
Director节点也收到请求,然后ipvsadm已经开始干活,看得出它想让Realserver-02来进行请求。
在Realserver-02接口抓包能看到,已经从Director节点解封装二层,发送到Realserver-02。此时Realserver-02会接收这个报文,因为目的MAC就是自己。拆到第三层,目的IP也是自己本机有的IP(也就是VIP 192.168.100.200),继续拆,目的端口是80,送往上层协议,也就是Realserver-02本机上的nginx。
nginx处理完后进行封装数据包回复,封装到第三层时根据来包时的源IP进行查询路由表,匹配的是默认路由,二层封装网关的MAC后将数据发送出去。(数据已经不经过Director啦)
在路由器网关处看回复包,由Realserver-02发往网关。
在PC处看回复包,经路由器NAT,已经修改了源IP,PC成功收到http回复!
Tips:Director虽然要将数据包交给Realserver,但交出去的这个数据包是修改过目标MAC地址的数据包。在Director上不会经过ip_forward转发,而是修改MAC后根据路由决策直接路由到RIP。因此,DR模式下,Director无需开启ip_forward功能,这一点很容易出现误解。
8. LVS+Keepalived负载均衡高可用方案
8.1 前期准备
角色 | IP地址 | 主机名 | 网关 |
---|---|---|---|
Client | CIP:50.50.50.100 | win7 | 50.50.50.200 |
Director | VIP:192.168.100.200 DIP:192.168.100.100 |
lb01 | 192.168.100.254 |
Director | VIP:192.168.100.200 DIP:192.168.100.101 |
lb02 | 192.168.100.254 |
Realserver-01 | RIP:192.168.100.102 | web01 | 192.168.100.254 |
Realserver-02 | RIP:192.168.100.103 | web02 | 192.168.100.254 |
8.2 安装LVS和keepalived
lb01、lb02上执行
#安装ipvsadm
yum install ipvsadm
lsmod | grep ip_vs
#出现下面内容就表示LVS已经安装好,并加载到了内核
ip_vs 145458 0
nf_conntrack 139264 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
#安装keepalived
yum install keepalived
8.3 配置ARP抑制
#临时生效
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
#永久生效
echo "net.ipv4.conf.all.arp_ignore=1" >>/etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce=2" >>/etc/sysctl.conf
sysctl -p
8.4 配置VIP
lb01、lb02的VIP由keepalived去做,所以这里只用配Realserver上的VIP
#web01
ifconfig lo:0 192.168.100.200/32 up
#web02
ifconfig lo:0 192.168.100.200/32 up
8.5 配置keepalived
lb01上的keepalived配置
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS-01
}
vrrp_instance lvs {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200/24 dev eth0 label eth0:1
}
}
}
lb02上的keepalived配置
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS-02
}
vrrp_instance lvs {
state BACKUP
interface eth0
virtual_router_id 10
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200/24 dev eth0 label eth0:1
}
}
}
8.6 配置规则
这与NAT模式不同,因为响应报文必须不能经由Director转发,因此不支持端口映射。Director节点只解封装二层然后进行转发到Realserver,所以源目端口需要一致。
lb01、lb02上都要添加
ipvsadm -A -t 192.168.100.200:80 -s rr
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.102:80 -g -w 1
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.103:80 -g -w 1
-A 添加虚拟服务器
-t 表示TCP服务 VIP:Port
-s 指定调度算法 rr是轮询
-a 添加分发器
-r 表示添加real server的地址
-g 指定LVS的工作模式为DR模式
-w 指定real server服务器的权值
8.7 查看并保存配置
#保存配置 lb01、lb02都进行
ipvsadm -Sn > /etc/sysconfig/ipvsadm
8.8 启动lvs和keepalived
lb01、lb02上进行
systemctl start keepalived.service
systemctl start ipvsadm
查看测试是不是只有lb01有VIP
8.9 测试
开启浏览器测试访问,查看是不是只有lb01有建立连接,目前的情况没有问题。
下面进行关闭keepalived进行模拟故障,备节点是否会转为主。
[root@lb01 ~]# systemctl stop keepalived.service
查看VIP是否漂移,已经成功漂移。
再次在Client上进行访问,然后看lb02和lb01的连接情况,下面情况是对的,lb01不会有连接的情况。
8.10 清空规则
#lb01进行
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb01 ~]# > /etc/sysconfig/ipvsadm
[root@lb01 ~]# systemctl restart ipvsadm.service
#lb02进行
[root@lb02 ~]# ipvsadm -C
[root@lb02 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb02 ~]# > /etc/sysconfig/ipvsadm
[root@lb02 ~]# systemctl restart ipvsadm.service
8.11 配置keepalived接管LVS
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
修改keepalived配置文件
lb01的配置如下
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS-01
}
vrrp_instance lvs {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.100.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.100.102 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.100.103 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
lb01的配置如下
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS-02
}
vrrp_instance lvs {
state BACKUP
interface eth0
virtual_router_id 10
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.100.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.100.102 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.100.103 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
一些配置详解
virtual_server 192.168.100.200 80 { #VIP地址和端口
delay_loop 6
lb_algo rr #指定算法
lb_kind DR #指定LVS的工作模式
nat_mask 255.255.255.0 #指定VIP的掩码
persistence_timeout 50 #会话保持时间
protocol TCP #协议
real_server 192.168.100.102 80 { #添加Realserver节点
weight 1 #权重
TCP_CHECK { #节点健康检查
connect_timeout 8 #延迟超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #延迟重试次数
connect_port 80 #利用80端口检查
}
}
real_server 192.168.100.103 80 {
....... #节点配置雷同,只是有多少Realserver节点就添加多少个这种模板
}
}
重新加载配置keepalived文件
lb01、lb02都进行
systemctl reload keepalived.service
8.12 再次测试
查看是否有自动配置规则,还有VIP是否配置在lb01,出现以下情况为正常。
Client进行访问测试,主LVS进行处理。
下面模拟Realserver-02的nginx服务无法正常提供,看看keepalived是否进行检查和删减Ipvsadm规则。下面情况可以看出keepalived会去主动移除出现问题的节点。
[root@web02 ~]# systemctl stop nginx
重新启动Realserver-02的nginx服务,Realserver节点又被加入ipvsadm规则里面。
[root@web02 ~]# systemctl start nginx
附录
ipvsadm命令选项解释
选项 | 说明 |
---|---|
-A --add-service | 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 |
-E --edit-service | 编辑内核虚拟服务器表中的一条虚拟服务器记录 |
-D --delete-service | 删除内核虚拟服务器表中的一条虚拟服务器记录 |
-C --clear | 清除内核虚拟服务器表中的所有记录 |
-R --restore | 恢复虚拟服务器规则 |
-S --save | 保存虚拟服务器规则,输出为-R选项可读的格式 |
-a --add-server | 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 |
-e --edit-server | 编辑一条虚拟服务器记录中的某条真实服务器记录 |
-d --delete-server | 删除一条虚拟服务器记录中的某条真实服务器记录 |
-L|-l --list | 显示内核虚拟服务器表 |
-Z --zero | 虚拟服务表计数器清零(清空当前的连接数量等) |
--set tcp tcpfin udp | 设置连接超时值 |
--start-daemon | 启动同步守护进程。他后面可以是master或backup,用来说明LVS Router 是master或是backup。在这个功能上也可以采用keepalived的VRRP功能 |
--stop-daemon | 停止同步守护进程 |
-h --help | 显示帮助信息 |
其他一些选项
选项 | 说明 |
---|---|
-t --tcp-service service-address | 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port] |
-u --udp-service service-address | 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port] |
-f --fwmark-service fwmark | 说明是经过iptables 标记过的服务类型 |
-s --scheduler scheduler | 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc |
-p --persistent [timeout] | 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout的默认值为30秒 |
-M --netmask | netmask persistent granularity mask |
-r --real-server server-address | 真实的服务器[Real-Server:port] |
-g --gatewaying | 指定LVS的工作模式为直接路由模式(也是LVS 默认的模式) |
-i --ipip | 指定LVS的工作模式为隧道模式 |
-m --masquerading | 指定LVS的工作模式为NAT模式 |
-w --weight weight | 真实服务器的权值 |
--mcast-interface interface | 指定组播的同步接口 |
-c --connection | 显示LVS目前的连接 如:ipvsadm -L -c |
--timeout | 显示tcp tcpfin udp的timeout 值 如:ipvsadm -L --timeout |
--daemon | 显示同步守护进程状态 |
--stats | 显示统计信息 |
--rate | 显示速率信息 |
--sort | 对虚拟服务器和真实服务器排序输出 |
-n --numeric | 输出IP地址和端口的数字形式 |
Tips:本文部分内容参考骏马金龙、iTab等博主,感谢提供技术干货知识!