lvs负载均衡

lvs工作在内核中,当接收客户端请求,并没有将接收到的请求
送到用户程序空间,而是直接在内核进行转发到了后端服务器
 
lvs根据目标请求报文的目标ip和port将其转发至后端主机集群中的某一个
根据调度算法来分发至后端的某个主机,响应客户端请求
 
tcp协议应用在内核中,lvs不需要监听在套接字上面,文件数就没有限制
nginx和haproxy都要监听在套接字,有文件套接字限制
 
lvs支持tcp、udp、AH、EST、AH_EST、SCTP等诸多协议
 
实现lvs的NAT模型:
通过修改请求报文的的目标ip地址(同时可能会修改目标端口)至挑选
出RS的RIP地址实现转发
1、RS应该和DIP使用私网(内网)地址,且RS的网关要指向DIP
2、请求和响应报文都要经由director转发,极高的负载环境中,director
可能会成为性能瓶颈
3、支持端口映射      RS可以定义为8080
4、RS可以使用任意OS
5、RS的RIP和director的DIP必须在同一ip网络中(同一网段)
director:
  VIP:客户端请求的IP(公网提供访问)172.16.118.249,eth0
  DIP:使用内网与RS一起,192.168.23.2,eth1
具体配置:

[root@wadeson ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:4D:19:A6
TYPE=Ethernet
UUID=e00a22ce-9c20-4495-896f-7323b984425e
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=172.16.118.249
GATEWAY=172.16.118.254
NETMASK=255.255.255.0

[root@wadeson ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
UUID=e00a22ce-9c20-4495-896f-7323b984425e
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.23.2
NETMASK=255.255.255.0

由于需要在此主机上配置负载集群服务,需要安装ipvsadm:

yum -y install ipvsadm

后端RS配置:

  RS1:192.168.23.4,eth0

  RS2:192.168.23.5,eth1

具体配置:

到这里,所有关于ip网络的配置已经完成了,确保RS后端服务器的web服务已经可以正常访问了:

[root@wadeson ~]# curl http://192.168.23.4
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://192.168.23.5
<h1>test 192.168.23.5 html</h1>

然后开始在director上创建集群服务

[root@wadeson ~]# ipvsadm -A -t 172.16.118.249:80 -s rr

  ipvsadm -A|E -t|u|f service-address [-s scheduler]

然后添加RS到集群中:

[root@wadeson ~]# ipvsadm -a -t 172.16.118.249:80 -r 192.168.23.4 -m   这里RS默认的端口为80,因为

支持端口映射,所以这里可以修改为8080

  ipvsadm -a|e -t|u|f service-address -r server-address

  [-g|i|m] [-w weight] [-x upper] [-y lower]      -m为指定为NAT模式

查看列表信息:

[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr  

-> 192.168.23.4:80 Masq 1 0 0

再次添加一个RS:

[root@wadeson ~]# ipvsadm -a -t 172.16.118.249:80 -r 192.168.23.5 -m
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr
-> 192.168.23.4:80 Masq 1 0 0
-> 192.168.23.5:80 Masq 1 0 0

集群服务,RS配置已经完成,然后进行访问:

[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.5 html</h1>
[root@wadeson ~]# curl http://172.16.118.249
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 rr
-> 192.168.23.4:80 Masq 1 0 5
-> 192.168.23.5:80 Masq 1 0 5

负载均衡调度算法:

静态方法:仅根据算法本身进行调度
  RR:round robin轮询(起点公平,一人一个)
  WRR:weight RR加权的RR,能者多劳(根据权重分配)
  SH:source hash源地址hash,实现session保持
    将来自于同一ip的请求始终调度至同一RS
  DH:destination hash目标地址hash(类似去缓存拿数据)
    将对同一个目标的请求始终发往同一个RS
动态方法:根据算法及后端(RS)的当前负载状态进行调度
  Overhand=负载,较小,就被挑选
  LC:least connection(RS的连接最小就被调度到该台RS)
    Overhand=Active*256+Inactive
  WLC:weight least connection
    Overhand=(Active*256+Inactive)/权重
  SED:shortest expect delay最短期望延迟,算法WLC的改进
    Overhand=(Active+1)*256/weight
  NQ:never queue,SED的改进
  LBLC:locality-based LC,即为动态的DH算法(如果请求的是
    从来没有缓存过的数据,那么就发往RS负载较小的机子)
    正向代理情形下的cache server调度
LBLCR:可以复制的LBLC

修改调度算法,将rr轮询算法改为sh:

[root@wadeson ~]# ipvsadm -E -t 172.16.118.249:80 -s sh
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 sh
-> 192.168.23.4:80 Masq 1 0 0
-> 192.168.23.5:80 Masq 1 0 0

然后观察效果:

[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# curl http://172.16.118.249:80
<h1>test 192.168.23.4 html</h1>
[root@wadeson ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.118.249:80 sh
-> 192.168.23.4:80 Masq 1 0 6      只有这一台响应
-> 192.168.23.5:80 Masq 1 0 0

将规则保存下来:

  ipvsadm -S > /etc/sysconfig/ipvsadm

清空规则:

  ipvsadm -C

删除定义的集群服务:
  [root@wadeson ~]# ipvsadm -D -t 172.16.118.249:80

  [root@wadeson ~]# ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn

ipvsadm -L:
-n:基于数据格式显示地址和端口
-c:显示connection状态
--states:显示统计的数据
--rate:显示速率
--sort:排序
--exact:显示精确值,不做单位换算
原文地址:https://www.cnblogs.com/jsonhc/p/7217866.html