LB Cluster 负载均衡集群 —-lvs 配置详解

lvs :

ipvs scheduler:

根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种:

1、静态方法:仅根据算法本身进行调度;

  • RR:roundrobin,轮询;

  • WRR:Weighted RR,加权轮询;

  • SH:Source Hashing,实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;

  • DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS;

2、动态方法:主要根据每RS当前的负载状态及调度算法进行调度;

Overhead=

LC:least connections
    Overhead=activeconns*256+inactiveconns
WLC:Weighted LC
    Overhead=(activeconns*256+inactiveconns)/weight
SED:Shortest Expection Delay
    Overhead=(activeconns+1)*256/weight
NQ:Never Queue

LBLC:Locality-Based LC,动态的DH算法;
LBLCR:LBLC with Replication,带复制功能的LBLC;

ipvsadm/ipvs:

ipvs:
查看系统是不是已经编译了ipvs

~]# grep -i -C 10 "ipvs" /boot/config-3.10.0-327.el7.x86_64

支持的协议工作在传输层:TCP, UDP, AH, ESP, AH_ESP, SCTP;

定义ipvs集群:

  • 定义集群服务

       定义哪一类请求(协议)是属于负载均衡集群,要根据协议的目标IP和端口,
       来判定集群类型!
  • 添加服务上的RS

ipvsadm命令:

1.管理集群服务:增、改、删;

  • 增A、改E:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
  • 删:-D

ipvsadm -D -t|u|f service-address

service-address:定义的集群服务本身的地址。
    -t|u|f:
        -t: TCP协议的端口,VIP:TCP_PORT
        -u: TCP协议的端口,VIP:UDP_PORT
        -f:firewall MARK,定义在PREROUTING,是一个数字,用来打标记;以便于定义多个端口的服务为一个集群!

[-s scheduler]:指定集群的调度算法,默认为wlc;

2.管理集群上的RS:增、改、删;

  • 增a、改e:

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

ipvsadm -d -t|u|f service-address -r server-address

server-address:
    Rserver rip[:port]

选项:
    lvs类型:
        -g: gateway, dr类型
        -i: ipip, tun类型
        -m: masquerade, nat类型

    -w weight:权重;

3.清空定义的所有内容:

ipvsadm -C

这就能清空所有的集群服务!

4.查看:

ipvsadm -L|l [options]
     --numeric, -n:显示端口不要去解析
     --exact:显示精确值,不要做单位换算

     --connection, -c:显示每一个主机上当前连接的数量
     --stats:统计数据
     --rate :output of rate information

5.保存和重载:

ipvsadm -S == ipvsadm-save

ipvsadm -R == ipvsadm-restore

实例1.lvs-net模式实验

1.实验前提
(1)调度器:centos6.8,双网卡 eth0 10.1.6.68;eth1为vmnet1模式 192.168.0.1;安装ipvsadm打开核心转发功能
~]# echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth1 192.168.22.1/24 up
(2)RealServer:均为centos7.2安装好相应的服务网卡为vmnet1模式ip 192.168.22.11 ip 192.168.22.22
添加默认路由
route add default gw 192.168.22.1

2、测试

RealServer开通web服务并添加测试页面
LB Cluster 负载均衡集群 ----lvs 配置详解
用10.1.6.68主机测试发现正常

3.添加集群服务
LB Cluster 负载均衡集群 ----lvs 配置详解

4.测试
LB Cluster 负载均衡集群 ----lvs 配置详解

5.换个算法再测试一下
LB Cluster 负载均衡集群 ----lvs 配置详解

LB Cluster 负载均衡集群 ----lvs 配置详解

负载均衡集群的设计要点:

(1) 是否需要会话保持;
(2) 是否需要共享存储;
    共享存储:NAS, SAN, DS(分布式存储)
    数据同步:

        课外作业:rsync+inotify实现数据同步

lvs-nat:

设计要点:
    (1) RIP与DIP在同一IP网络, RIP的网关要指向DIP;
    (2) 支持端口映射;

实践作业(博客):负载均衡一个php应用;
    测试:(1) 是否需要会话保持;(2) 是否需要共享存储;

lvs-dr:

LB Cluster 负载均衡集群 ----lvs 配置详解
这种模型就是负载均衡器接收到报文时在报文的首部添加一层MAC地址,再通过交换机(这里只能是交换机)转发到后端主机,后端主机接收到报文拆解后发现目标地址是lo上的地址就经lo进入input链进行响应,响应的结果就又从lo接口出去,这样就保证了源ip为请求ip,发送到路由器到客户端。这里可以不经过交换机。

dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:

  • (1) 在前端网关做静态绑定;

  • (2) 在各RS使用arptables;

  • (3) 在各RS修改内核参数,来限制arp响应和通告的级别;
    限制响应级别:arp_ignore

      0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
      1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;

    限制通告级别:arp_announce

      0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
      1:尽量避免向非直接连接网络进行通告;
      2:必须避免向非本网络通告;

RS的预配置脚本:个Rs均适用

#!/bin/bash
#
vip=10.1.0.5
mask='255.255.255.255'

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $mask broadcast $vip up
    route add -host $vip dev lo:0
    ;;
stop)
    ifconfig lo:0 down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ;;
    *) 
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac

测试web

  • V server配置

LB Cluster 负载均衡集群 ----lvs 配置详解

  • 客户端测试
    LB Cluster 负载均衡集群 ----lvs 配置详解

测试mysql
LB Cluster 负载均衡集群 ----lvs 配置详解

LB Cluster 负载均衡集群 ----lvs 配置详解

LB Cluster 负载均衡集群 ----lvs 配置详解

LB Cluster 负载均衡集群 ----lvs 配置详解
VS的配置脚本:

#!/bin/bash
#
vip='10.1.0.5'
iface='eno16777736:0'
mask='255.255.255.255'
port='80'
rs1='10.1.0.7'
rs2='10.1.0.8'
scheduler='wrr'
type='-g'

case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F

    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac    


课外扩展作业:vip与dip/rip不在同一网段的实验环境设计及配置实现; 

博客作业:lvs的详细应用
    讲清楚类型、调度方法;并且给出nat和dr类型的设计拓扑及具体实现;

FWM:FireWall Mark

借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;

打标记方法(在Director主机):

    # iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 

基于标记定义集群服务:
    # ipvsadm -A -f NUMBER [options]

环境为之前环境
LB Cluster 负载均衡集群 ----lvs 配置详解
不过这样两个集群是分离的

定义为同一个集群,利用iptables
LB Cluster 负载均衡集群 ----lvs 配置详解

LB Cluster 负载均衡集群 ----lvs 配置详解

我们一般建议http和https两个集群绑定在一块

lvs persistence:持久连接

持久连接模板:实现无论使用任何算法,在一段时间内,实现将来自同一个地址的请求始终发往同一个RS;

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

port Affinity:
每端口持久:每集群服务单独定义,并定义其持久性;
每防火墙标记持久:基于防火墙标记定义持久的集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity;
每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,而且可使用持久连接进行绑定;这种0端口只能适用于持久连接 -p。

保存及重载规则:

因为在此服务在centos中有系统启动脚本用rpm -ql 就能看到 /usr/lib/systemd/system/ipvsadm.service
,要是启动不了可能是没有/etc/sysconfig/ipvsadm文件 touch一下就好了
保存:建议保存至/etc/sysconfig/ipvsadm

    ipvsadm-save > /PATH/TO/IPVSADM_FILE
    ipvsadm -S > /PATH/TO/IPVSADM_FILE
    systemctl stop ipvsadm.service 

重载:    
    ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
    ipvsadm -R < /PATH/FROM/IPVSADM_FILE
    systemctl restart ipvsadm.service

考虑:

    (1) Director不可用,整个系统将不可用;SPoF
        解决方案:高可用 
            keepalived :在用到ipvs时用这个
            heartbeat/corosync
    (2) 某RS不可用时,Director依然会调度请求至此RS;
        解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用;
            keepalived
            heartbeat/corosync, ldirectord

        检测方式:
            (a) 网络层检测;意味着ping通
            (b) 传输层检测,端口探测;扫描端口。
            (c) 应用层检测,请求某关键资源;

            ok --> failure
            failure --> ok

原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/56332

(0)
qzxqzx
上一篇 2016-10-30 22:28
下一篇 2016-10-30 23:30

相关推荐

  • 用户和组命令的简单使用

    用户和组管理命令: 用户管理命令:useradd usermod userdel 组管理命令:groupadd groupmod groupdel 用户创建:useradd -u:uid 定义在/etc/login.defs -o:配合-u选项,不检查uid的唯一性 -g:gid,指明用户所属基本组,可为组名,也可以gid -c:用户的诠释信息 -d;指定用…

    Linux干货 2016-10-24
  • Week9’s homework

    Week9's homework 1、写一个脚本(1)判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin)(2)分别统计两类用户的个数;通过字符串比较来实现。 #!/bin/bash # for i in $(cat /etc/passwd |…

    Linux干货 2016-12-24
  • N21沉舟-第八周作业

    1、  请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 #网桥:链接层设备,基于MAC地址过滤。 #集线器:物理层设备,基本都属于半双工模式。集线器与网桥在现在的局域网中基本都不用了。 #二层交换机:工作在数据链路层,基本MAC转发数据,功能齐全的可支持VLAN等功能。常见的有100/1000M、16口/24口/48口。…

    Linux干货 2016-08-24
  • C语言的谜题

    这几天,本站推出了几篇关于C语言的很多文章如下所示: 语言的歧义 [酷壳链接] [CSDN链接] 谁说C语言很简单? [酷壳链接] [CSDN链接] 6个变态的C语言Hello World程序 [酷壳链接] [CSDN链接] 如何加密/弄乱C源代码 [酷壳链接] [CSDN链接] C语言的谜题 [酷壳链接] …

    Linux干货 2016-05-08
  • CentOS6删除/etc/fstab和/boot后恢复

    CentOS6删除/etc/fstab和/boot后恢复 背景: Linux CentOS系统和启动相关的文件都在/boot目录下,如果我们将/boot目录下所有的文件都删除,然后在恢复系统,那以后在遇到系统启动问题时就都可以解决了。在这基础上,在将/etc/fstab文件删除,这样更加大了修复的难度,不过这都是可以修复的,这里就将介绍如何修复。 实验环境:…

    2017-09-01
  • 数据结构知识点(list,tuple,冒泡法)

    分类 数值型 int、float、complex、bool 序列对象 字符串str、列表list、tuple 键值对 集合set、字典dict 数值型 complex:有实数和虚数部分组成 float:有整数和小数组成。只有双精度 类型转换 int(X) 返回一个整数 float(x) 返回一个浮点数 complex(x)、complex(x,y) 返回一个…

    2017-09-25