[关闭]
@cdmonkey 2022-06-22T09:05:46.000000Z 字数 4105 阅读 223

ipvsadm

命令总结 LVS


一、指令简介

该指令是管理集群服务“LVS”的命令行工具,具备如下的功能:

指令格式:

  1. ipvsadm -A|E -t|u|f service-address [-s scheduler]
  2. [-p [timeout]] [-M netmask]
  3. ipvsadm -D -t|u|f service-address
  4. ipvsadm -C
  5. ipvsadm -R
  6. ipvsadm -S [-n]
  7. ipvsadm -a|e -t|u|f service-address -r server-address
  8. [-g|i|m] [-w weight] [-x upper] [-y lower]
  9. ipvsadm -d -t|u|f service-address -r server-address
  10. ipvsadm -L|l [options]
  11. ipvsadm -Z [-t|u|f service-address]
  12. ipvsadm --set tcp tcpfin udp
  13. ipvsadm --start-daemon state [--mcast-interface interface]
  14. [--syncid syncid]
  15. ipvsadm --stop-daemon state
  16. ipvsadm -h

常用选项:

ipvsadm-opt.png-20.5kB

常用参数:

ipvsadm-par.png-15.4kB

常用于“-L”选项配合使用的参数:

ipvsadm-list.png-10.9kB

二、Manage Virtual Service

Add a Virtual Service

增加虚拟服务时,服务地址“service-address”通常包括三个部分:网络地址、端口号和协议。另一种情况就是防火墙标记。

  1. # For example:
  2. # ipvsadm -A -t|u|f service-address [-s scheduler]
  3. [root@LVS-A ~]# ipvsadm -A -t 172.16.1.26:80 -s rr -p 20

Edit a Virtual Service

Delete a Virtual Service

二、Manage Real Server

Add a Real Server

增加真实服务器节点时,服务地址“service-address”为事先定义好的集群服务。

  1. # For example:
  2. # ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
  3. [root@LVS-A ~]# ipvsadm -a -t 172.16.1.26:80 -r 172.16.1.10 -g -w 1

Delete a Real Server

  1. # ipvsadm -d -t|u|f service-address -r server-address

三、Persistent connection(持久连接)

在一定的时间内,来自统一客户端的请求始终被定位到同一台服务器节点。无论使用什么算法,“LVS”集群的持久连接都能实现。

持久端口连接

那么如何能够实现持久连接?每一个新的客户端发起连接请求后,无论该请求的TCP连接是否已经断开,只要这个客户端曾经访问过集群服务,调度器就会在内存的一个缓冲区(持久连接模板)当中,将每一个曾经发起过请求连接的客户端的地址以及请求连接最终被分配到的服务器节点(无论是通过什么调度算法)的映射关系记录下来。只要尚未超时,只要是同一个客户端再次发起连接请求,都会按照持久连接模板记录的内容,将该连接定位到同一个服务器节点上。

该功能又被称为“PPC”,即持久端口连接。

  1. #显示持久连接的信息:
  2. [root@LVS-A ~]# ipvsadm -L -n --persistent-conn
  3. IP Virtual Server version 1.2.1 (size=4096)
  4. Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
  5. -> RemoteAddress:Port
  6. TCP 172.16.1.26:80 rr persistent 20
  7. -> 172.16.1.22:80 1 0 0 0
  8. -> 172.16.1.23:80 1 0 0 0

显示当前的“IPVS”连接信息(持久连接模板):

  1. [root@LVS-A ~]# ipvsadm -L -n -c
  2. IPVS connection entries
  3. pro expire state source virtual destination
  4. TCP 00:00 FIN_WAIT 172.16.1.1:60412 172.16.1.26:80 172.16.1.23:80
  5. TCP 00:00 FIN_WAIT 172.16.1.1:60413 172.16.1.26:80 172.16.1.23:80
  6. TCP 00:00 FIN_WAIT 172.16.1.1:60414 172.16.1.26:80 172.16.1.23:80
  7. TCP 00:00 FIN_WAIT 172.16.1.1:60415 172.16.1.26:80 172.16.1.23:80
  8. TCP 00:00 FIN_WAIT 172.16.1.1:60411 172.16.1.26:80 172.16.1.23:80
  9. TCP 00:15 NONE 172.16.1.1:0 172.16.1.26:80 172.16.1.23:80
  10. #每一个客户端发出的连接请求(使用不同的端口)都会被记录下来。

开启持久连接功能:定义集群服务时使用“-p”参数,如果不指定时间(秒),则默认是300秒。

  1. # ipvsadm -A -t service-address [-s scheduler] [-p [timeout]]
  2. # Startup PPC:
  3. [root@LVS-A ~]# ipvsadm -A -t 172.16.1.26:80 -s rr -p 20

使用基于“SSL”连接的场景中,最需要使用持久连接,因为通信双方交换证书、协商加密算法等操作比较费时,如果不使用持久连接,那么刚刚建立的安全连接短时间内又要重新创建,非常消耗资源。

持久客户端连接

除此之外,如果集群提供多种服务,那么持久连接能够保证来自同一客户端对不同集群服务的连接请求都会依据第一次的连接情况,将所有的后续连接(可能包含对多个服务的请求)都定向到同一台真实服务器节点上。只要是来自同一客户端的连接都会被定向到同一个服务器节点,所以该功能又被称为“PCC”,即持久客户端连接。

前文中设定集群虚拟服务时使用“-p”参数开启的仅是持久端口连接,对于不同的服务,很可能会被持久化连接到不同的服务器节点。那么要如何开启持久客户端连接呢?

  1. [root@LVS-A ~]# ipvsadm -C
  2. [root@LVS-A ~]# ipvsadm -A -t 172.16.1.26:0 -s rr -p 600
  3. ---------------
  4. [root@LVS-A ~]# ipvsadm -a -t 172.16.1.26:0 -r 172.16.1.22 -g -w 2
  5. [root@LVS-A ~]# ipvsadm -a -t 172.16.1.26:0 -r 172.16.1.23 -g -w 2
  6. [root@LVS-A ~]# ipvsadm -L -n
  7. IP Virtual Server version 1.2.1 (size=4096)
  8. Prot LocalAddress:Port Scheduler Flags
  9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  10. TCP 172.16.1.26:0 rr persistent 600
  11. -> 172.16.1.22:0 Route 2 0 0
  12. -> 172.16.1.23:0 Route 2 0 0

我们把0端口定义为集群服务就意味着所有端口(服务)都成为集群服务,用户对任何服务的请求都会被调度器转发至服务器节点,这也是持久客户端连接的特点。如果不想把所有的服务都定义为集群服务,而是将指定的若干服务定义为集群服务,并且使用持久客户端连接(这些连接都会被持久连接到同一个服务器节点),很困难,除非将这些集群服务定义为同一个服务。那么如何能将若干毫不相干的端口定义为一个集群服务呢?这就需要使用防火墙标记功能了。

持久防火墙标记连接

防火墙标记功能需要使用“Mangle”表,对需要定义为同一个集群服务的端口标记为同一个标记号,使其通过防火墙标记归并为同一个服务。标记的行为于PREROUTING链处进行(即在数据包刚进入主机时就进行标记):

  1. # Make the httpd an sshd to a same mark:
  2. PREROUTING -> INPUT -> FORWARDING -> OUTPUT -> POSTROUTING
  3. 80: 10
  4. 23: 10

创建指定服务的防火墙标记(不用启动防火墙,直接添加规则):

  1. # Create Firewall mark at Director:
  2. iptables -t mangle -A PREROUTING -d 172.16.1.26 -i eth0 -p tcp --dport 80 -j MARK --set-mark 5
  3. iptables -t mangle -A PREROUTING -d 172.16.1.26 -i eth0 -p tcp --dport 23 -j MARK --set-mark 5

创建集群服务(服务地址service-address使用定义好的防火墙标记)并分配服务器节点:

  1. # Add Virtual Service:
  2. # ipvsadm -A -f service-address [-s scheduler] [-p [timeout]]
  3. [root@LVS-A ~]# ipvsadm -A -f 5 -s rr -p 600
  4. [root@LVS-A ~]# ipvsadm -a -f 5 -r 172.16.1.22 -g -w 2
  5. [root@LVS-A ~]# ipvsadm -a -f 5 -r 172.16.1.23 -g -w 2

我们至此便将两个服务通过防火墙标记定义为一个集群服务,并能够针对该服务设置持久连接,那么其所包含的两个服务将使用相同的持久连接。如果一个连接(设置了持久连接的同一个聚群服务的连接)的持久连接计时已经超时,然而该连接尚未断开,那么持久连接计时器自动延长120秒,直到该连接断开并且超时。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注