Loading

负载均衡服务-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)。

image-20230316190849667


ipvs工作于内核空间中,而ipvsadm则是用户定义集群的接口,并将用户定义的策略送往ipvs。当前端调度器(Director)接收到发往本主机的请求时,首先进入PREROUTING链,经查看路由表发现,该请求的目标IP地址是本主机,因此将请求报文送往INPUT链,经过查看请求报文的目标端口发现,请求的是集群服务的端口,因此IPVS就会根据调度方法和集群类型,强行将请求报文发往FORWARD链上,而后经过POSTROUTING,再送往基于调度算法挑选出的某一台后端real server。

image-20230316193857427


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模式

客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

  1. 调度时:目的IP改成RIP(DNAT)返回时:源IP改成VIP(SNAT)
  2. 调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部realserver节点通信。
  3. 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈。
  4. NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到realserver节点的10.0.0.2:8080(DR和TUN模式不具备的)
  5. 所有NAT内部realserver节点只需要配置私有LAN IP即可。
  6. 由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)。

工作原理图

img


4.2 DR模式

当用户请求报文到达负载调度器时,调度器通过为请求报文重新封装一个MAC首部进行转发,重新封装后的报文中的源MAC是DIP所在接口的MAC地址,目标MAC是挑选出的某realserver的RIP所在的接口的MAC地址,而请求报文的IP首部不会发生变化(源IP是CIP,目标IP是VIP),而realserver将响应直接返回给用户。在LVS-DR这种方式中,各个realserver上都必须配有VIP,以便在响应用户请求时,用VIP作为源IP来封装报文的IP首部。

  1. 必须确保前端路由器将目标IP为VIP的请求报文发往Director。
  2. realserver跟Director必须在同一物理网络中,同一广播域。如果realserver跟Director之间只要多了一个路由器则MAC地址就改变了,无法确保按照Director的调度将请求报文转发给挑选出的某realserver。
  3. realserver的网关必须不能指向DIP。
  4. 请求报文必须由Director调度,但响应报文必须不能经由Director转发。
  5. 因为响应报文必须不能经由Director转发,因此不支持端口映射。

工作原理图

img


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可以分别分布在不同的地域位置。

  1. RIP、VIP和DIP全得是公网地址。
  2. RS的网关不能指向也不可能指向DIP。
  3. 请求报文经由Director转发,但响应报文将由realserver直接发往CIP。
  4. 因为响应报文不经由Director转发,因此不支持端口映射。
  5. realserver的OS必须支持隧道功能。
  6. TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
  7. 所有的realserver服务器都要绑定VIP,抑制ARP,配置复杂。

工作原理图

img


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抓包这两个网络,然后进行浏览器访问,观察数据包。

image-20230318103456128

首先宿主机10.0.0.1向Director发起请求,最后还是由Director进行返回

image-20230318104938425

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

image-20230318105357296


那Realserver-02进行回复,查询路由表没有直达10.0.0.0/24网络的路由,走默认路由。前面讲到了00:0c:29:c9:d6:36就是DIP的MAC,所以将数据发往Director。

image-20230318105741075

image-20230318105638532


Director收到Realserver-02,查看路由表有到达该网络的条目,再查看ARP表是否有目的IP地址相对应的MAC地址,然后进行重新封装源MAC和目的MAC。

image-20230318110102338

image-20230318110600543

image-20230318110016897


6.7 查看LVS的连接情况

通过下面的查询能看到目前连接的状态,源IP和发起端口,Director的IP端口情况,目的realserver的IP端口情况。

image-20230318111407149

Tips:关于state状态可以查阅TCP/IP的TCP状态机!


查看目前设置的超时策略

image-20230318111912801

超时时间用ipvsadm --set tcp tcpfin udp设置,比如
#ipvsadm --set 120 20 100
表示tcp空闲等待时间为120 秒
客户端关闭连接等待时间为20秒
udp空闲等待为100秒

查看分发情况

image-20230318114035107

调度算法是对连接进行调度,而不是对数据包、字节等调度,因此查看统计数据时,应该比较的是Conns列的比例。另外,如果连接数大致满足比例,但数据包或者字节数却远不符合比例(高的多或低的多),那么可能对应的那台realserver主机性能比其它realserver的性能要好或差。


6.8 删除LVS配置

删除realserver节点,能看出只移除某个节点。

image-20230318114401854


删除虚拟服务器,会连带realserver节点一起删除。

image-20230318120412051


7. 搭建LVS-DR模式

7.1 前期准备

image-20230319173516652

角色 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缓存表中的条目就不断被覆盖直到最后一个回应。(下图就是同时回复广播包的场景)

image-20230319163816879

因此,必须要保证路由器、交换机只保存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 查看并保存配置

image-20230319172426606


7.7 开启抓包并浏览器访问测试

首先PC进行浏览器访问

image-20230319173230205


进入到路由器后进行NAT转换,二层、三层进行解封装替换。源MAC是路由器的g0/0/0口,目的MAC是Director节点VIP的MAC地址(VIP建立在eth0网卡上,实则是一个MAC)。三层也需要转换,将50.50.50.222转换成192.168.100.200。

image-20230319173829161


Director节点也收到请求,然后ipvsadm已经开始干活,看得出它想让Realserver-02来进行请求。

image-20230319174558175

image-20230319174758407


在Realserver-02接口抓包能看到,已经从Director节点解封装二层,发送到Realserver-02。此时Realserver-02会接收这个报文,因为目的MAC就是自己。拆到第三层,目的IP也是自己本机有的IP(也就是VIP 192.168.100.200),继续拆,目的端口是80,送往上层协议,也就是Realserver-02本机上的nginx。

image-20230319175117748


nginx处理完后进行封装数据包回复,封装到第三层时根据来包时的源IP进行查询路由表,匹配的是默认路由,二层封装网关的MAC后将数据发送出去。(数据已经不经过Director啦)

image-20230319175514523

image-20230319175723236


在路由器网关处看回复包,由Realserver-02发往网关。

image-20230319175938667


在PC处看回复包,经路由器NAT,已经修改了源IP,PC成功收到http回复!

image-20230319180203152

Tips:Director虽然要将数据包交给Realserver,但交出去的这个数据包是修改过目标MAC地址的数据包。在Director上不会经过ip_forward转发,而是修改MAC后根据路由决策直接路由到RIP。因此,DR模式下,Director无需开启ip_forward功能,这一点很容易出现误解。


8. LVS+Keepalived负载均衡高可用方案

8.1 前期准备

image-20230320211904595

角色 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 查看并保存配置

image-20230320203846797

image-20230320203912641

#保存配置 lb01、lb02都进行
ipvsadm -Sn > /etc/sysconfig/ipvsadm

8.8 启动lvs和keepalived

lb01、lb02上进行

systemctl start keepalived.service
systemctl start ipvsadm

查看测试是不是只有lb01有VIP

image-20230320204357194

image-20230320204412122


8.9 测试

开启浏览器测试访问,查看是不是只有lb01有建立连接,目前的情况没有问题。

image-20230320204745251

image-20230320204822304


下面进行关闭keepalived进行模拟故障,备节点是否会转为主。

[root@lb01 ~]# systemctl stop keepalived.service

查看VIP是否漂移,已经成功漂移。

image-20230320205040783


再次在Client上进行访问,然后看lb02和lb01的连接情况,下面情况是对的,lb01不会有连接的情况。

image-20230320205139430

image-20230320205210869


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,出现以下情况为正常。

image-20230320210802664

image-20230320210816076

image-20230320210846097

image-20230320210856213


Client进行访问测试,主LVS进行处理。

image-20230320211004341

image-20230320211016791


下面模拟Realserver-02的nginx服务无法正常提供,看看keepalived是否进行检查和删减Ipvsadm规则。下面情况可以看出keepalived会去主动移除出现问题的节点。

[root@web02 ~]# systemctl stop nginx

image-20230320211231548

image-20230320211242028


重新启动Realserver-02的nginx服务,Realserver节点又被加入ipvsadm规则里面。

[root@web02 ~]# systemctl start nginx

image-20230320211512022

image-20230320211521325


附录

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等博主,感谢提供技术干货知识!

posted @ 2023-09-06 17:59  YinJayChen  阅读(45)  评论(0编辑  收藏  举报