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

LVS的基础使用的更多相关文章

  1. 【Services】【Web】【LVS】lvs基础概念

    1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...

  2. KVM虚拟机网络基础及优化说明

    一个完整的数据包从虚拟机到物理机的路径是: 虚拟机--QEMU虚拟网卡--虚拟化层--内核网桥--物理网卡 KVM的网络优化方案,总的来说,就是让虚拟机访问物理网卡的层数更少,直至对物理网卡的单独占领 ...

  3. Mysql双主热备+LVS+Keepalived高可用部署实施手册

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  4. LVS + Keepalived 理论

    LVS 纯理论: VRRP协议与工作原理 在现实的网络环境中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障通信就会失效,因此这种通信模式当中,路由器就成了 ...

  5. Mysql双主热备+LVS+Keepalived高可用操作记录

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  6. Mysql双主 keepalived+lvs实现mysql高可用性

    MySQL复制 能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.但是MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现 ...

  7. lvs负载简介,原理,常见使用案例及Keepalived高可用

    Lvs简介 基础概念 LVS(Linux Virtual Server)即Linux虚拟服务器,是由张文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中(2.6及以上版本内核) ...

  8. Web基础架构:负载均衡和LVS

    在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等). 一.负载均 ...

  9. [转]Web基础架构:负载均衡和LVS

    以下内容转载自:http://www.importnew.com/11229.html 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服 ...

随机推荐

  1. C# 反射(转)

    什么是反射 Reflection,中文翻译为反射.        这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’.‘模块(Module)’.‘类型 ...

  2. es6 添加事件监听

    //定义被侦听的目标对象 }; //定义处理程序 var interceptor = { set: function (receiver, property, value) { console.log ...

  3. PAT1057 stack(分块思想)

    1057 Stack (30分)   Stack is one of the most fundamental data structures, which is based on the princ ...

  4. LeetCode 947. Most Stones Removed with Same Row or Column

    原题链接在这里:https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/ 题目: On a 2D plane ...

  5. etcd增删改查

    ![image-20191209191301618](C:\Users\AneroKissinger\AppData\Roaming\Typora\typora-user-images\image-2 ...

  6. 使用docker 实现MySQL主从同步/读写分离

    1. 利用 docker 实现 mysql 主从同步 / 读写分离 为了保证数据的完整和安全,mysql 设计了主从同步,一个挂掉还可以用另个.最近重构论坛,想来改成主从吧.担心失误,就先拿 dock ...

  7. 2019.12.07 java基础

    编译时报错,叫做编译失败 class Demo01 { public static void main(String[] args) { int a; a=12; System.out.println ...

  8. struct tcphdr

    包含在/usr/src/linux/include/linux/tcp.h struct tcphdr { __be16 source; __be16 dest; __be32 seq; __be32 ...

  9. leetcode 删除一张表中重复邮箱的数据,并且保留最小id 的 那条

    /* create view testview as SELECT subject,MIN(Id) as id FROM test GROUP BY subject; select * FROM te ...

  10. 利用Shell命令与HDFS进行交互

    以”./bin/dfs dfs”开头的Shell命令方式 1.目录操作 在HDFS中为hadoop用户创建一个用户目录(hadoop用户) 在用户目录下创建一个input目录, HDFS的根目录下创建 ...