lvs简介: LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器.

Lvs 的集群工作模式有3种:VS/NAT,vs/tun,vs/dr.

Lvs的调度算法:

LVS的算法分为两大类:
静态算法:只是根据算法进行调度并不考虑后端REALSERVER的实际连接情况
rr-论调算法,假如有两台服务器A,B,第一个请求给A,第二个给B,第三个给A依次往复
wrr-加权论调,假如有两台服务器A,B,A的性能是B的两倍,则在论调的同时给A上面分配的请求也大致会是B上面的两倍
dh-假如调度器的后面是两台缓存服务器A,B而不是真正的REALSERVER,则会尽可能的把相同请求或者把同一用户的请求转发到同一个缓存服务器上面以提高缓存命中率
sh-假如公司有两台防火墙让员工上网,则会把某个员工往外的访问及向内返回的请求结果定向到同一台防火墙上面,方便防火墙做established的状态检测

动态算法:前端的调度器会根据后端REALSERVER的实际连接情况来分配请求
活动链接:当前有数据包传输
非活动链接:当前连接出于建立状态但是没有数据传输
lc-同时检查后端REALSERVER上面活动状态和非活动状态的连接数使用(活动连接数*256+非活动连接数)数字小的将接收下次访问请求
wlc-加权的lc,使用(活动连接数*256+非活动连接数)/权重,数字小的将接收下次访问请求,是最常用的算法
sed-不考虑非活动状态,使用(活动状态+1)*256,数字小的将接收下次访问请求,+1主要是为了提高权重大的服务器的响应能力
nq-假设有两台服务器A,B,权重比为10:1,按照sed算法,只有当A服务器已经响应了10个请求之时两者的计算数值才相同,为了避免权重小的服务器过于空闲,nq沿用sed算法但是确保让每个服务器都不空闲,只有在不考虑非活动连接的情况下nq才能取代wlc算法
lblc-在dh的基础上面考虑后台服务器的负载能力
lblcr-在lblc的基础上,假设有A,B两台缓存服务器,某个用户第一次访问被重定向到A,第二次访问时A负载很大,B过于空闲这时也会打破原来的规则把客户的第二次访问重定向给B

案例:

       在公司的内部有两台web服务器,为了实现群集的负载均衡,通过lvs服务器来实现对web服务器流量的分发。

公司的内部服务器。

web1 192.168.10.2

Web2 192.168.10.3

分发服务器director

外卡地址 192.168.2.1

内卡地址 192.168.10.1

常用的调算法

CONFIG_IP_VS_RR=m

CONFIG_IP_VS_WRR=m

CONFIG_IP_VS_LC=m

CONFIG_IP_VS_WLC=m

CONFIG_IP_VS_LBLC=m

CONFIG_IP_VS_LBLCR=m

CONFIG_IP_VS_DH=m

CONFIG_IP_VS_SH=m

CONFIG_IP_VS_SED=m

CONFIG_IP_VS_NQ=m

FILES

/proc/net/ip_vs

/proc/net/ip_vs_app

/proc/net/ip_vs_conn

/proc/net/ip_vs_stats

/proc/sys/net/ipv4/vs/am_droprate

/proc/sys/net/ipv4/vs/amemthresh

/proc/sys/net/ipv4/vs/drop_entry

/proc/sys/net/ipv4/vs/timeout_synrecv

/proc/sys/net/ipv4/vs/timeout_synsent

/proc/sys/net/ipv4/vs/timeout_timewait

/proc/sys/net/ipv4/vs/timeout_udp

一:server1的搭建

Webserver1

clip_image002

clip_image004

clip_image006

[root@zzu ~]# yum install http*

clip_image008

[root@zzu ~]# service httpd restart

二:server2的搭建

同一,此处省略

三:director的搭建

1:配置好网络参数

[root@zzu ~]# ifconfig

eth0 Link encap:Ethernet HWaddr 00:0C:29:F7:49:EF

inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fef7:49ef/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:5917 errors:0 dropped:0 overruns:0 frame:0

TX packets:4726 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:552498 (539.5 KiB) TX bytes:599760 (585.7 KiB)

Interrupt:67 Base address:0x2000

eth1 Link encap:Ethernet HWaddr 00:0C:29:F7:49:F9

inet addr:192.168.10.1 Bcast:192.168.10.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fef7:49f9/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:916 errors:0 dropped:0 overruns:0 frame:0

TX packets:902 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:94742 (92.5 KiB) TX bytes:112395 (109.7 KiB)

Interrupt:67 Base address:0x2080

[root@zzu ~]# vim /etc/sysctl.conf 开启数据包的转发功能

net.ipv4.ip_forward = 1

[root@zzu ~]# sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

2:安装ipvsadm的rpm包

[root@zzu ~]# yum install -y ipvsadm

[root@zzu ~]# ipvsadm -A -t 192.168.2.1:80 -s rr

[root@zzu ~]# ipvsadm –a -t 192.168.2.1:80 -r 192.168.10.2:80 –m -w 1

[root@zzu ~]# ipvsadm –a -t 192.168.2.1:80 -r 192.168.10.3:80 –m -w 1

3:测试lc

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 lc

-> 192.168.10.3:80 Masq 1 0 0

-> 192.168.10.2:80 Masq 1 0 11

10.2的连接数已经为11,而10.3的连接数竟然为0.

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 lc

-> 192.168.10.3:80 Masq 1 0 1

-> 192.168.10.2:80 Masq 1 0 11

4:测试rr

[root@zzu ~]# ipvsadm -A -t 192.168.2.1:80 -s rr

[root@zzu ~]# ipvsadm -a -t 192.168.2.1:80 -r 192.168.10.2:80 -m 使用nat的工作模式

[root@zzu ~]# ipvsadm -a -t 192.168.2.1:80 -r 192.168.10.3:80 -m

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 rr

-> 192.168.10.3:80 Masq 1 0 0

-> 192.168.10.2:80 Masq 1 0 0

clip_image002[6]

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 rr

-> 192.168.10.3:80 Masq 1 0 4

-> 192.168.10.2:80 Masq 1 0 3

5.测试wrr

[root@zzu ~]# ipvsadm -E -t 192.168.2.1:80 -s wrr

[root@zzu ~]# ipvsadm -e -t 192.168.2.1:80 -r 192.168.10.3:80 -m -w 1

[root@zzu ~]# ipvsadm -e -t 192.168.2.1:80 -r 192.168.10.2:80 -m -w 3

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 wrr

-> 192.168.10.3:80 Masq 1 0 0

-> 192.168.10.2:80 Masq 3 0 0

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 wrr

-> 192.168.10.3:80 Masq 1 0 2

-> 192.168.10.2:80 Masq 3 0 5

6:测试dh算法

[root@zzu ~]# ipvsadm -E -t 192.168.2.1:80 -s dh

[root@zzu ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.2.1:80 dh

-> 192.168.10.3:80 Masq 1 0 0

-> 192.168.10.2:80 Masq 1 0 11

常用指令的说明:

service ipvsadm save  保存ipvs-table表格

service ipvsadm panic 清空ipvs-table表格

service ipvsadm  start|stop|restart

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

ipvsadm -a|e -t|u|  service-address -r server-address
               [-g|i|m]  [-w weight]

-A  增加虚拟服务  -E 表示修改 -t -u tcp/udp协议 -s 指定调度算法

-a 增加虚拟的映射关系 -r 真是服务器的地址  -w 权重的大小

-g -i -m 三种不用的工作模式

-g, --gatewaying  Use gatewaying (direct routing). This is the default.

           -i, --ipip  Use ipip encapsulation (tunneling).

           -m, --masquerading  Use masquerading (network access translation, or NAT).

-Z, --zero
ipvsadm -Z -t 207.175.44.110:80

例子:

ipvsadm -A -t 207.175.44.110:80 -s rr
      ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m
      ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m
      ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m
      ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m
      ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m

欢迎加入郑州阳仔的网络工程师自由交流群--132444800(请注明自己的身份,就说是51cto的博友)