文档章节

LVS

crayzer_yixiu
 crayzer_yixiu
发布于 2016/09/17 10:15
字数 2288
阅读 171
收藏 2
LVS

负载均衡解决方案

  • 硬件解决方案
    • FB BIG-IP
    • Citrix NetScaler
    • A10
  • 软件解决方案
    • 四层:传输层
      • LVS能够在第四层对IP和端口进行配置,不能感知上层的协议
    • 七层:应用层http(http ajp https...)
      •  nginx
      • haproxy
      • httpd

Lvs简介

  • lvs是linux virtual server的简写,意即linux虚拟服务器,是一个四层负载均衡饿开源项目;
  • linux内核从2.6.10版本之后就继承lvs,之前的内核版本可以通过打补丁的方式安装
  • lvs:工作在linux内核中,基于netfilter,工作在input链上;
  • 官网:http://www.linuxvirtualserver.org/
  • 作者:章文嵩博士
  • ipvs:继承在linux的内核的虚拟服务器
    • 负责四层负载均衡
  • ipvsadm:ipvs的用户空间管理工具
    • # yum install ipvsadm

lvs调度算法

  • 四种静态:
    • rr(Round-robin)轮询调度
    • wrr(Weighted RR)加权轮询
    • dh(Destination Hash)目标地址散列
    • sh(Source Hash)原地址散列(类似nginx的ip_hash)
  • 动态调度调度方法:
    • lc(Least-Connection)最少连接数
    • wlc(Weighted LC)加权最少链接数(默认)
    • sed(Shortest Expected Delay) 最短期望延迟
    • nq(Never Queue)不排队调度
    •  LBLC(Locality-Based Least Connections Scheduling)基于本地的是最少链接
    • LBLCR(Locality-Based Least Connections with Replication Scheduling)基于本地的带复制功能的最少链接

lvs调度算法的优缺点:

  • RR轮询:
    • 最简单的调度算法,采用轮询方式;
    • 实现无状态调度
    • 缺点:
      • 不适合用服务器性能不一致;
      • 不适用使用session。除非使用session服务器(memcache)
  • WRR加权轮询
    • 权重较大的服务器,分配较多链接请求
    • 缺点:
      • 不能解决session问题
  • SH原地址Hash
    • 静态算法,针对原地址的负载均衡
    • 除非超载,否则尽可能将同一个ip调度到同一个服务器处理,类似nginx的ip绑定
    • 缺点:
      • 部分解决了session问题,但是上游服务器挂了,一样会session丢失
  • DH目标地市Hash
    • 同上,将目标地址hash,是针对目标地址的负载均衡。
  • LC最小链接:
    • 将新的请求分配给当前连接数最少的服务器
    • 调度器记录所有服务器的当前连接数,可以将负载均衡分配给较少链接的服务器
    • overhead=(activeconns<<<8)+inactconns,调度到overhead最小的服务器。
  • WLC加权最少连接
    • 同上,增加了权重
    • 算法调度新建链接尽可能保证已建立的链接和其权重成正比
    • overhead=activeconns*50 + inactconns
    • load=overhead/weight
    • 然后比较load的大小,取load最小的
  • SED最短预期延时
    • 起点公平,有限从权重大的服务器建立链接
    • (activeconns + 1)/weight
  • NQ不排队
    • SED的改进
    • 如果发现有空闲的集群,就不用去权重大、性能好的服务器去排队
  • LBLC基于局部性的最少链接
    • 它是针对请求报文的目标IP地址的负载均衡调度器,目前主要是用于cache集群系统
  • LBLCR带复制的基于局部性最少链接
    • 它也是针对目标地址的负载均衡,目前主要用于cache集群系统
    • 与LBLC算法的不同之处是它要维护从一个目标地址IP到一组服务器的映射。而LBLC算法卫华从一个目标IP地址到一台服务器的映射

实现模型

  • NAT:地址转化
  • DR:直接路由
  • TUN:隧道
  • FULLNAT(淘宝)

lvs名词

  • VIP:虚拟服务器地址
    • 对外暴露的供客户端访问的地址
  • DIP:转发的网络地址
    • Director上内网网段地址
  • RIP:真是服务器地址
    • 后台正真处理用户请求的服务器地址
  • CIP:客户端IP地址
    • 发请求的客户端IP

LVS-NAT

  • 基于NAT实现(VS/NAT)
    • 优点:
      • 实现简单
      • 对于客户端来说整个集群是透明的,很多的隐藏了内部网络
      • 不占用公网IP
    • 缺点:
      • 请求报文,相应报文都要经过Director,不能高负荷,压力大
  • 基于NAT实现,修改原地址、目标地址(VS/FULLNAT-阿里巴巴开源)
    • 优点:
      • 除了有NAT的好处,还可以更容易跨内网网段路由,适合内网服务器多,理由复杂场景

LVS-DR

 

  • 基于直接路由实现
    • Mac地址替换,经过本地交换路由,交由Real Server处理
    • Real Server上阻止对VIP的ARP广播和相应
    • 优点:
      • 实现了请求和相应处理的分离,减少了Director的负荷,提升处理性能
    • 缺点:
      • 修改Mac地址,不支持端口映射

LVS-TUN

  • 基于IP隧道技术实现
    • 将原始数据报文进行封装,到达目标服务器解包
    • Real Server也必须有VIP。但不暴露
    • 优点:
      • 和DR类似,减少了Director的压力
      • 可以跨网段,甚至可以跨广域网路由
    • 缺点:
      • 相对于DR来说使用隧道技术开销大
      • 相应时间上慢于DR模型

LVS内核参数

  • DR模型中RS也有VIP,它和Director在同一个网络中,不作特殊处理,一定会IP冲突
  • 要组织RS广播和相应ARP请求
  • 需要调整Linux内核参数
  • 查看/proc/sys/net/ipv4/conf 参数
  • 以eth0为例
  • arp_ignore
    • 定义对目标地址为本机IP地址请求的ARP询问的不同应答方式
    • 0 - 任意网络接口收到请求,所有接口都答应
    • 1 - 只在来访的网络接口上作出应答,但是要求目标IP配置在其上。
    •    - VIP并没有配置在eth0上,所以不响应

       

  • arp_announce
    • 为网络接口上,向外发送ARP请求的IP包中的宣称的本地IP地址,定义不同程度的级别。
    • 0 - 缺省,配置在任意接口上的任意本地地址
    • 1 - 如果可能,选择和目标地址位于同一个子网络的地址。否则,使用级别2的结果
    • 2 - 有限使用住地址
    •    -  所谓主地址,其实就是eth0上的地址

lvs命令

###临时配置
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_annunce
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 

###永久配置
# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
# sysctl -p
  • 管理集群服务
    ### 添加:-A -t|u|f service-address [-s scheduler]
    – -t: TCP 协议集群
    – -u: UDP 协议集群
    service-address: IP:PORT
    - 修改:-E
    - 删除:-D -t|u|f service-address
    # ipvsadm -A -t 172.16.23.80:80 -s rr
    - 意思是,在IP:Port上增加一个调度,按照rr的策略
    # ipvsadm -E -t 172.16.23.80:80 -s wrr
    - 意思是,修改电镀算法为wrr

     

  • 管理集群的RS

    - 添加: -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
    -t|u|f service-address:事先定义好的某个集群服务
    -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射
    [-g|i|m]: -g: DR、-i: TUN􆾝-m: NAT
    [-w weight]: 定义服务器权重
    # ipvsadm -A -t 172.16.23.80:80 -s wrr
    # ipvsadm -a -t 172.16.23.80:80 -r 192.168.23.80:8080 -m -w 1
    # ipvsadm -a -t 172.16.23.80:80 -r 192.168.23.81:80 -m -w 5
    # ipvsadm -A -t 192.168.23.100:80 -s rr
    # ipvsadm -a -t 192.168.23.100:80 -r 192.168.23.81:80 -g
    # ipvsadm -a -t 192.168.23.100:80 -r 192.168.23.80:80 -g
    - 修改:-e
    - 删除:-d -t|u|f service-address -r server-address
    
    - 查看:-L|l [options]
    -n: 数字格式显示主机地址和端口
    --stats:统计数据
    --rate:速率
    --timeout: 显示tcp、tcpfin和udp的会话超时时长
    -c: 显示当前的ipvs链接状况
    列出规则
    # ipvsadm -L -n
    列出链接
    # ipvsadm -L -n -c
    - 清除所有规则:-C
    
    - 保存规则到stdout:-S,--save
    - 从stdin恢复规则-R,--restore
    # ipvsadm -S > /path/to/somefile
    # ipvsadm -R < /path/form/somefile
    
    # service ipvsadm start
    # chkconfig ipvsadm on

     

  • 规则

    规划
    ld1 eth0:0 VIP 192.168.214.200/32 eth0 DIP 192.168.214.201/24 rr 
    ld2 eth0 RIP 192.168.214.202/24 lo:0 192.168.214.200/32
    ld3 eth0 RIP 192.168.214.203/24 lo:0 192.168.214.200/32
    所有IP都是静态的
    
    ld2、ld3上
    这里使用nginx负载均衡配置的tomcat
    
    修改内核参数
    # vim /etc/sysctl.conf
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.eth0.arp_announce = 2
    net.ipv4.conf.eth0.arp_ignore = 1
    # sysctl -p
    cat /proc/sys/net/ipv4/conf/all/arp_ignore
    cat /proc/sys/net/ipv4/conf/all/arp_announce
    cat /proc/sys/net/ipv4/conf/eth0/arp_ignore
    cat /proc/sys/net/ipv4/conf/eth0/arp_announce
    
    配置IP
    永久配置方式
    # cd /etc/sysconfig/network-scripts
    ld2的ifcfg-eth0中内容如下
    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.214.202
    NETMASK=255.255.255.0
    GATEWAY=192.168.214.2
    
    ld3的ifcfg-eth0中内容如下
    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.214.203
    NETMASK=255.255.255.0
    GATEWAY=192.168.214.2
    
    ld2、ld3上ifcfg-lo:0中内容如下
    # vim ifcfg-lo:0
    DEVICE=lo:0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.214.200
    NETMASK=255.255.255.255
    BROADCAST=192.168.214.200
    
    配置完,重启network
    # service network restart
    
    ld1上
    配置IP
    # cd /etc/sysconfig/network-scripts
    ifcfg-eth0内容如下
    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.214.201
    NETMASK=255.255.255.0
    GATEWAY=192.168.214.2
    
    ifcfg-eth0:0内容如下
    DEVICE=eth0:0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.214.200
    NETMASK=255.255.255.255
    BROADCAST=192.168.214.200
    
    
    配置完,重启network
    # service network restart
    
    # yum install ipvsadm
    
    # ipvsadm -A -t 192.168.214.200:8080 -s rr
    # ipvsadm -a -t 192.168.214.200:8080 -r 192.168.214.202:8080 -g
    # ipvsadm -a -t 192.168.214.200:8080 -r 192.168.214.203:8080 -g
    # ipvsadm -L -n
    http://192.168.214.200:8080/
    firefox演示,可以多个浏览器看看
    
    
    持久化,以防重启后丢失配置
    # ipvsadm -S -n > /etc/sysconfig/ipvsadm
    # ipvsadm-save -n > /etc/sysconfig/ipvsadm 
    
    也可以启动服务,它的脚本会自动持久化配置
    # chkconfig --level 3 ipvsadm on
    # service ipvsadm start
    可以重启试一试
    

     

© 著作权归作者所有

共有 人打赏支持
上一篇: LVS + Keepalived
crayzer_yixiu
粉丝 26
博文 57
码字总数 87921
作品 0
杭州
高级程序员
私信 提问

暂无文章

分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
2
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
1
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0
android自定义viewgroup画背景

设计部要求背景实现一个背景边框带圆弧的效果: 所以想着用自定义控件画一个背景。 为了方便,继承的是LinearLayout,在onMeasure中先获取控件宽高: @Overrideprotected void onMeasure(in...

醉雨
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部