LVS的基础使用


  • LVS的介绍

    • A:什么是LVS
    • B:cluster(集群的概念)
    • C:LVS的介绍
  • LVS的使用
    • A:ipvsadm命令的使用

♣一:LVS的介绍

A:什么是lvs

LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器,也是少量开源软件中国人开发的软件。现在已经集成到linux内核中,lvs是一个高效率的负载均衡器,能通过自身的算法将互联网中大量的请求按照分配到不通的机器上进行访问。从而达到服务器的高效利用。再好的软件也有短板,lvs虽然高效,但是功能单一,为了满足lvs的功能,可以通过ldirectord弥补lvs的短板。

B:cluster(集群的概念)

当一家公司随着业务扩展,访问量增加,传统的架构已经不能满足当前的业务,需要对提供服务的服务器进行扩展,这个时候就需要n台服务器组成一个服务器组,由组里面的服务器来进行服务的提供,这个组就叫做集群,集群是有了,那么问题也就来了,这集群里面的机器服务部署的一样的,用户访问的时候我应该由那台机器去提供服务了,如果服务提供的方式是组里面的第一台先提供10万的访问量,到11的时候由组里面的第二台机器来提供服务,那么必然会出现部分机器始终处于高运作中,部分机器又没有提供服务,属于闲置状态。为了解决这个问题,lvs就出现了,lvs就可以均匀的或者按照一定比例的形式自由调度用户的访问量,不再出现部分忙部分闲置的状态。                                                                                                                      分布式系统:fastdfs,ceph,lustre,hadoop,giusterfs,spark等。

在集群的负载均衡功能上延伸了一些硬件和软件的工具,例如,硬件的F5,citrix netscaler,A10,软件的:lvs,nginx,haproxy,ats,peribal,pound等。

负载均衡的会话保持:

session sticky绑定

如果是用户登录访问了一个网页,在从页面1点击到页面2的时候,页面会重新加载,如果没有会话保持,页面2用户的访问可能会被调度到第二台机器上,然而用户是没有在第二台机器上登录过的,这个时候用户要访问页面2就需要重新登录,会话保持相当于建议了一张表,专门记录访问的ip,当页面请求始终来自一个ip的话,就始终帮你往第一次登录的机器上调度,会话保持有一个致命伤就是如果很多机器出去访问的时候都是一个ip的话,这个负载均衡就会变得不够灵活。

cookie

既然session sticky存在缺陷,那我们就点对点的记录访问信息,当用户访问服务器会随之生成cookie的信息并发送到访问者的机器上,当这个机器下次在访问的时候会带上这个cookie的信息,访问机和被访问机拿到相当于一式两份的合同一样,下次访问直接就给调度到cookie生成的机器上。

session replication

每台机器拥有全部的session,当用户访问机器1的时候,产生的session会被服务器复制发送到组内的全部机器,这样即使你访问到了2机器,也不会需要用户重新登录,这种类型的方式不适合用户量访问过大的场景,比较占用内存。

session server

专门的session服务器,在服务器的后端专门搭建一个存session的服务器,用户访问的session都存在专门的服务器上即可,前面服务器需要取session的时候就去找session服务器就行了。

服务能负载均衡了,但是节点故障如何解决了,这个时候就需要keepalived等高可用的服务来解决。

C:LVS的介绍:

VS:virtual server(负责调度)

RS:real server(负责提供真正的服务)

L4:四层路由器或交换机

VS根据请求报文的目标ip和目标协议及端口将其调度转发至某RS,这个调度的过程是通过算法来实现的。

lvs相关的命令:

ipvsadm:用户空间的命令行工具,规则管理器,需要单独安装

ipvs:直接工作在内核的框架

lvs集群的类型:

lvs-nat:通过请求报文中的客户端目标ip和端口修改为某跳出的rs的ip和端口实现转发,这种类型下rs的ip和端口应该在同一ip网络,请求的报文必须由vs转发,vs容易出现性能瓶颈,支持端口映射,最后lvs必须是linux服务器,rs可以是任意操作系统。

lvs-dr:直接路由模式,也是lvs的默认模式,通过请求报文重新封装一个mac首部进行转发。

lvs-tun:在原请求ip报文之外新加一个ip首部

lvs-fullnat:修改请求报文的源和目标ip

lvs的调度算法:

静态调度算法:(根据算法本身进行调度,不考虑服务器的压力)

RR:轮询算法

WRR:加权轮询(根据设置的权重来进行分派)

SH:源哈希算法,(session绑定)

DH:目标地址哈希算法,(查看上次源地址被调度在那台机器上,下次过来还是往这台机器上调度)

动态调度算法:(根据每个rs当前的负载均衡状态及调度算法进行调度)

LC:适用于长连接应用(最少连接,检测后台服务器的链接数,链接数越少就往越少的机器调度,计算公式:activeconns(活动链接)*256+inactiveconns(不活动链接),根据这个公式计算出相应的指,指越小,就代表连接越少,这种算法是不会考虑到后台机器的配置的,会造成本来性能很好的机器的链接数反而越少的情况。

WLC:默认调度方法,在LC的基础上加上了一个权重,计算公式:activeconns(活动链接)*256+inactiveconns(不活动链接)/权重,解决上面因机器配置导致的分配不合理的情况。

wlc也存在不饿合理的情况,例如所有机器都是新搭建的,没有用户访问的情况下,上面的计算公式计算出来的指都是0,这种情况下会分配给第一台,恰好第一台机器性能不好,又将面临上面的机器配置的问题。

SED:初始连接高权重优先,既然wlc会面临第一次或者计算公式计算出来的指无法评判出那个优先级高的时候,那么就在原有基础上加一个初始权重高的提供服务,(activeconns+1(活动链接))*256/权重。

sed也存在一个问题,就是按照公式计算,例如权重高的机器设置权重10,低性能的机器为1,权重10第一次访问的数据是25.6,第二次是51.2,权重1机器第二次计算就是512了,那这样算下去,权重高的机器会一直在提供服务,权重低的机器就一直在等待。

NQ:第一轮均匀分配,后续SED,上面的计算公式

LBLC:根据负载情况进程正向代理。

LBLCR:带复制功能的LBLC,解决LBLC的负载不均问题。DH,LBLC和LBLCR运营商用的比较多。

[root@ansible ~]# grep -i -C 10 'ipvs' /boot/config-2.6.32-573.el6.x86_64
# IPVS scheduler
#
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

内核收录的ipvs算法

♣一:LVS的使用

A:ipvsadm命令的使用

要配置ipvs需要安装ipvsadm的包

[root@ansible ~]# rpm -ql ipvsadm
/etc/rc.d/init.d/ipvsadm
/etc/sysconfig/ipvsadm-config 配置文件
/sbin/ipvsadm 主程序
/sbin/ipvsadm-restore 规则重置工具
/sbin/ipvsadm-save 规则保存工具
/usr/share/doc/ipvsadm-1.26
/usr/share/doc/ipvsadm-1.26/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz
[root@ansible ~]#

ipvsadm包的构成

ipvsadm的核心功能就是对集群服务的增,删,改,

增删改:ipvsadm -A(增加)|E (修改)|D(删除) -t|u|f service-address(具体服务器的ip) -s (调度算法,默认是WLC算法) -p

-t:tcp协议 ,VIP:TCP_PORT(tcp的端口)    u:udp协议 ,VIP:UDP_PORT   -f:firewall mark

对集群的rs的增,删,改

增删改:ipvsadm -a(增加)|e(修改)|d(删除) -t|u|f service-address -r server-address(集群服务器地址) -g|i|m -w(权重)

-g:getway,dr模型,默认    -i:tun模型   -m:nat模型

网络环境:

client:182.82.0.200(桥接,CIP)

lvs:192.168.219.200(DIP),182.82.0.200(VIP)

real service:192.168.219.137和192.168.219.138(RIP),配置网关指向lvs机器

修改ip_forward配置

[root@lvs network-scripts]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@lvs network-scripts]# sysctl -p 让其生效
net.ipv4.ip_forward = 0
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 = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_forward = 1
[root@lvs network-scripts]# sysctl -a | grep ip_f
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@lvs network-scripts]#

ip_forward

关闭防火墙和selinux,在lvs服务器上安装ipvsadm的包,在real上搭建httpd服务,提供网页,在lvs机器上访问测试

[root@lvs network-scripts]# curl 192.168.219.137
<h1
hello woord!
</h1
[root@lvs network-scripts]# curl 192.168.219.138
<h1
hello lvs
</h1
[root@lvs network-scripts]#

lvs服务器访问测试

[root@localhost yum.repos.d]# ipvsadm -A -t 182.82.0.200:80 -s rr
采用rr模式
[root@localhost yum.repos.d]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138 -m
[root@localhost yum.repos.d]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.137 -m 因为我们采用的是rr模式,-m就不需要指定权重,轮询调度
[root@localhost yum.repos.d]# ipvsadm -Ln 查看我们刚才配置的信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 182.82.0.200:80 rr
-> 192.168.219.137:80 Masq 1 0 0
-> 192.168.219.138:80 Masq 1 0 0
[root@clent Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@clent Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@clent Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@clent Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@clent Desktop]#
可以看到提供服务的机器是轮换来进行的

rr模式

[root@localhost Desktop]#  netstat -anptu | grep 8080
tcp 0 0 :::8080 :::* LISTEN 3541/httpd
tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48889 TIME_WAIT -
tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48894 TIME_WAIT -
tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48891 TIME_WAIT -
tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48886 TIME_WAIT -
tcp 0 0 ::ffff:192.168.219.138:8080 ::ffff:182.82.0.100:48896 TIME_WAIT -
修改real服务器端口为8080
[root@localhost Desktop]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138:8080 -m
[root@localhost Desktop]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 182.82.0.200:80 rr
-> 192.168.219.137:80 Masq 1 0 0
-> 192.168.219.138:8080 Masq 1 0 0
[root@localhost Desktop]#
修改lvs服务器的端口映射成8080,
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]#client进行访问

端口映射

[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s wrr
修改之前的rr格式为wrr格式
[root@localhost Desktop]# ipvsadm -d -t 182.82.0.200:80 -r 192.168.219.138:8080
[root@localhost Desktop]# ipvsadm -a -t 182.82.0.200:80 -r 192.168.219.138:8080 -m -w 3
[root@localhost Desktop]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 182.82.0.200:80 wrr
-> 192.168.219.137:80 Masq 1 0 4
-> 192.168.219.138:8080 Masq 3 0 5
[root@localhost Desktop]#
修改138的real服务器的信息,增加权重为3.默认是1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
You have new mail in /var/spool/mail/root
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello woord!
</h1
[root@www8080 Desktop]#
可以看到访问138三次,访问1次137real机器

wrr模式

[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s sh
[root@localhost Desktop]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 182.82.0.200:80 sh
-> 192.168.219.137:80 Masq 1 0 0
-> 192.168.219.138:8080 Masq 3 0 0
[root@localhost Desktop]#
修改wrr模式为sh模式
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200
<h1
hello lvs
</h1
[root@www8080 Desktop]#可以看到只要是同一个地址进来的,就一直调度到同一台real服务器。

sh模式

[root@localhost Desktop]# ipvsadm -E -t 182.82.0.200:80 -s dh
[root@localhost Desktop]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 182.82.0.200:80 dh
-> 192.168.219.137:80 Masq 1 0 0
-> 192.168.219.138:8080 Masq 3 0 0
[root@localhost Desktop]#
[root@www8080 Desktop]# curl 182.82.0.200/index.html
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200/index.html
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200/index.html
<h1
hello lvs
</h1
[root@www8080 Desktop]# curl 182.82.0.200/index.html
<h1
hello lvs
</h1
[root@www8080 Desktop]#
目标地址哈希和源地址哈希可以是相反的,目标地址内容不一致调度可能就给调度带另外的机器上去了

dh模式

lvs的扩展命令

清空所有定义的内容:ipvsadm -C

清空计数器:ipvsadm -Z -t|uf  调度器地址

查看:ipvsadm -exact:扩展信息,精准值  -c:当前ipvs的连接输出 -stats:统计信息  -rate:输出速率信息

root@lvs Desktop]# ipvsadm -Ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:48 TIME_WAIT 182.82.0.100:43728 182.82.0.200:80 192.168.219.137:80
TCP 01:48 TIME_WAIT 182.82.0.100:43730 182.82.0.200:80 192.168.219.137:80
TCP 01:49 TIME_WAIT 182.82.0.100:43733 182.82.0.200:80 192.168.219.138:8080
TCP 01:49 TIME_WAIT 182.82.0.100:43734 182.82.0.200:80 192.168.219.137:80
TCP 01:49 TIME_WAIT 182.82.0.100:43735 182.82.0.200:80 192.168.219.138:8080
TCP 01:49 TIME_WAIT 182.82.0.100:43732 182.82.0.200:80 192.168.219.137:80
TCP 01:48 TIME_WAIT 182.82.0.100:43729 182.82.0.200:80 192.168.219.138:8080
TCP 01:47 TIME_WAIT 182.82.0.100:43727 182.82.0.200:80 192.168.219.138:8080
TCP 01:49 TIME_WAIT 182.82.0.100:43731 182.82.0.200:80 192.168.219.138:8080
可以看到访问的ip流向信息

ipvsadm -Ln -c

ipvs规则信息存放的文件

ipvs连接信息存放的文件

[root@lvs Desktop]# cat /proc/net/ip_vs_conn
Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData
TCP B6520064 AB55 B65200C8 0050 C0A8DB8A 1F90 TIME_WAIT 115
TCP B6520064 AB57 B65200C8 0050 C0A8DB8A 1F90 TIME_WAIT 116
TCP B6520064 AB56 B65200C8 0050 C0A8DB89 0050 TIME_WAIT 116
TCP B6520064 AB54 B65200C8 0050 C0A8DB89 0050 TIME_WAIT 114
[root@lvs Desktop]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP B65200C8:0050 rr
-> C0A8DB8A:1F90 Masq 1 0 2
-> C0A8DB89:0050 Masq 1 0 2
[root@lvs Desktop]# 可以看到连接的信息和规则信息

ip_vs ,ip_vs_conn

最新文章

  1. 爬虫--Scrapy
  2. SharePoint 2013: Search Architecture in SPC202
  3. c++ 迭代器库
  4. C#实现万年历(农历、节气、节日、星座、属相、生肖、闰年等)
  5. c语言函数---M
  6. 新型I/O架构引领存储之变(四)
  7. Vim正则通配符使用心得
  8. 在引用阿里云库或其他库的时候,经常发生框架不兼容(原因是系统采用:Microsoft .NET Framework 4 Client Profile ),请改为Microsoft .NET Framework 4
  9. A - Black Box 优先队列
  10. Java中的Graphics2D类基本使用教程
  11. mysql 之审计 init-connect+binlog完成审计功能
  12. 数链剖分(树的统计Count )
  13. 《转载》Python3安装Scrapy
  14. hibernate-注解及配置
  15. (转)rpm2cpio和cpio
  16. SICP读书笔记 3.5
  17. 通过代码来操作SQLite的示例
  18. 编程技巧:使用异或操作符(XOR)交换两数值
  19. easyui图标大全
  20. Hero In Maze(BFS广搜)

热门文章

  1. 与你一起学习MS Project&mdash;&mdash;理论篇:项目管理与Project
  2. python中的assert
  3. 树莓派linux shell
  4. 基于Ubuntu1604+ROS-kinetic+roscpp的激光雷达定位算法从零开始移植
  5. 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理
  6. 3、kafka工作流程
  7. Oracle定时任务执行存储过程备份日志记录表
  8. 转载:Base64编解码介绍
  9. arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
  10. Ingress-nginx 部署使用