lvs nat模式

理论知识

详见:http://www.linuxvirtualserver.org/VS-NAT.html

LVS 角色

Virtual IP(VIP): 叫虚拟IP地址
Director Server(DR): 实际IP地址
real server: 节点 ip

工作原理

当用户访问服务器集群提供的服务时,发往虚拟IP地址的请求数据包(负载平衡器的外部IP地址)到达负载平衡器。负载均衡器检查数据包的目的地址和端口号。如果根据虚拟服务器规则表匹配虚拟服务器服务,则通过调度算法从群集中选择真实服务器,并将连接添加到记录建立的连接的哈希表中。然后,将目的地地址和分组的端口重写为所选服务器的目的地址和端口,并将数据包转发到服务器。当传入的分组属于此连接并且可以在哈希表中找到所选择的服务器时,该分组将被重写并转发到所选择的服务器。当回复报文返回时,负载平衡器将报文的源地址和端口重写为虚拟业务的源地址和端口。连接终止或超时后,连接记录将在哈希表中删除。

三台设备的配置如下

服务器 IP 说明
master VIP:192.168.1.117 Director Server: 172.10.100.128 VIP
master-backup VIP:192.168.1.118 Director: Server172.10.100.129 VIP
Real Server Real Server: 172.10.100.130 real 1节点
Real Server Real Server: 172.10.100.131 real 2节点

master 开启地址转发

[root@node-lvs-master ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf 
[root@node-lvs-master ~]# sysctl -p

安装lvs

[root@node-lvs-master ~]# yum -y install ipvsadm

注意:最好关闭所有设备的iptables和selinux,反正是实验,开端口麻烦。

[root@node-lvs-master ~]# /etc/init.d/iptables stop
[root@node-lvs-master ~]# setenforce 0 #临时关闭
[root@node-lvs-master ~]# sed -i s@SELINUX=enforcing@SELINUX=disabled@g /etc/selinux/config 

先访问130

130配置

在访问131

131配置

配置lvs

[root@node-lvs-master ~]# ipvsadm -C
[root@node-lvs-master ~]# ipvsadm -A -t 192.168.1.117:80 -s wlc #添加 vip
[root@node-lvs-master ~]# ipvsadm -a -t 192.168.1.117:80 -r 172.10.100.130:80 -m #添加子节点
[root@node-lvs-master ~]# ipvsadm -a -t 192.168.1.100:80 -r 172.10.100.131:80 -m

然后请求,发现 state一直都是在SYN_RECV状态,上面我们访问了2个子节点都是可以正常访问的。那也就是说VIP 节点有问题,SYN_RCVD是TCP三次握手的中间状态,是服务端口(监听端口,如应用服务器的80端口)收到SYN包并发送[SYN,ACK]包后所处的状态。这时如果再收到ACK的包,就完成了三次握手,建立起TCP连接。也就是说目前还没建立连接,是什么原因呢?

[root@server ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:34  SYN_RECV    192.168.1.103:57450 192.168.1.117:80   172.10.100.131:80
TCP 00:59  SYN_RECV    192.168.1.103:57545 192.168.1.117:80   172.10.100.131:80
TCP 00:35  SYN_RECV    192.168.1.103:57451 192.168.1.117:80   172.10.100.130:80
TCP 00:59  SYN_RECV    192.168.1.103:57547 192.168.1.117:80   172.10.100.131:80
TCP 00:59  SYN_RECV    192.168.1.103:57546 192.168.1.117:80   172.10.100.130:80

排查防火墙是关闭的,查看ipvsadm 进程,果然,进程没开启

[root@server ~]# systemctl status ipvsadm -l
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2017-07-09 00:03:03 EDT; 11s ago
  Process: 3007 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=1/FAILURE)
 Main PID: 3007 (code=exited, status=1/FAILURE)

Jul 09 00:03:03 server systemd[1]: Starting Initialise the Linux Virtual Server...
Jul 09 00:03:03 server bash[3007]: /bin/bash: /etc/sysconfig/ipvsadm: No such file or directory
Jul 09 00:03:03 server systemd[1]: ipvsadm.service: main process exited, code=exited, status=1/FAILURE
Jul 09 00:03:03 server systemd[1]: Failed to start Initialise the Linux Virtual Server.
Jul 09 00:03:03 server systemd[1]: Unit ipvsadm.service entered failed state.
Jul 09 00:03:03 server systemd[1]: ipvsadm.service failed.    

奇怪,启动失败,提示/etc/sysconfig/ipvsadm没有这个文件

    [root@server ~]# touch /etc/sysconfig/ipvsadm
[root@server ~]# systemctl restart ipvsadm
[root@server ~]# systemctl status ipvsadm -l
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sun 2017-07-09 00:04:50 EDT; 2s ago
  Process: 3021 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)
 Main PID: 3021 (code=exited, status=0/SUCCESS)

Jul 09 00:04:50 server systemd[1]: Starting Initialise the Linux Virtual Server...
Jul 09 00:04:50 server systemd[1]: Started Initialise the Linux Virtual Server.

然后发现 ipvs表没了,然后重新添加,额,提示内存分配问题。这又是什么鬼!!

   [root@server ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
[root@server ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@server ~]# ipvsadm -C
[root@server ~]# ipvsadm -A -t 192.168.1.117:80 -s wlc
[root@server ~]# ipvsadm -a -t 192.168.1.117:80 -r 172.10.100.130:80 -m
[root@server ~]# ipvsadm -a -t 192.168.1.100:80 -r 172.10.100.131:80  -m
Memory allocation problem

尝试重启下,发现直接报错, 于是卸载了 ipvsadm,发现还是无法访问。

lvs的算法

常见的有八种

  • 轮询调度:RR 按依次循环的方式请求调度到不同的服务器,特点是简单,平均分配给每台服务器
  • 加权轮询调度:WRR,对RR的一种补充和优化,给每台服务器一个权重,假如A为1,B为2,则优先调度A,权重值越高处理的请求越多
  • 最小连接调度:LC,把请求调度到连接数最小的服务器上
  • 加权最小连接调度 WLC,给每个服务器一个权值,调度尽可能保证每台服务器的均衡
  • 基于局部性最少的连接:lblc,请求数据包的目标IP地址的一种调度算法,先根据目标IP地址寻找最近的该目标地址的所使用的服务器,如果服务器可用并且有能力处理请求,则调度算法会尽可能的选择相同的服务器,否则选择其他
  • 带复制的基于局部性的最少连接:lblcr,它记录的不是一个目标IP与另外一台服务器直接的连接记录,它维护的是一个目标IP到一组服务器直接的映射关系,防止单点负载过高
  • 目标地址散列调度:DH,根据目标地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载高,发往该服务器的请求会会固定发往该服务器。
  • 源地址散列调度:SH,与上面的类似,但是它是根据源地址散列算法进行静态分配固定的服务器资源。

ipvs的命令详解

选项:

选项:

-A 添加一个虚拟服务,使用IP地址、端口号、协议来唯一定义一个虚拟服务
-E 编辑一个虚拟服务
-D 删除一个虚拟服务
-C 清空虚拟服务
-R 从标准输入中还原虚拟服务规则
-S 保存虚拟服务规则到标准输出,输入的规则可以使用-R导入还原
-a 在虚拟服务中添加一个真实的服务器
-e 在虚拟服务中编辑一台真是的服务器
-d 在虚拟的服务中删除一台真是的服务器
-L 显示虚拟服务器列表
-t 使用tcp协议,该参数后需跟主机与端口
-u 使用UDP,该参数后需跟主机与端口
-s 使用LVS所采用的调度算法
-r 设置真是服务器的IP和端口信息
-g 设置LVS工作模式为DR直连路由模式
-i 设置LVS工作模式为TUN隧道模式
-m 设置LVS的工作模式为NAT模式
-w 设置服务器的权重
-c 链接状态 需要配合L使用
-n 数字格式输出