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
下一篇 2016-10-30

相关推荐

  • N26-博客作业-week2

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。   cp:copy 复制文件和路径 cp [OPTION]… [-T] SOURCE DEST cp [OPTION]… SOURCE… DIRECTORY cp [OPTION]… -t DIRECTORY SOURCE&…

    Linux干货 2017-02-12
  • 马哥教育网络班22期+第5周课程练习

    1、显示当前系统上root、fedora或user1用户的默认shell;     cat /etc/passwd | grep -E '^(root|fedora|user1)\>' | awk -F …

    Linux干货 2016-10-17
  • 第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。                 使用到命令chmod &nbsp…

    Linux干货 2017-02-02
  • 如何编译源码安装

    #include <stdio.h> main() {printf(“Hello World!\n”); } gcc -o hello hello.c 在编写hello.c的时候出现问题一直找不到,后来发现是因为我安装的gcc有问题 我在安装的时候是用rpm -ivh gcc –nodeps忽略依赖关系直接安装…

    2017-08-19
  • iptables学习笔记   Netfilter:是Linux操作系统核心层内部的一个数据包处理模块。   Hook point:数据包在Netfilter中的挂载点。(PRE_ROUTIN   ,INPUT,OUTPUT,FORWARD,POST_ROUTING)   iptables 规则组成:四张表+五条链(Ho…

    Linux干货 2016-12-05
  • N22-第六周作业

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s@[[:space:]]\+@#&@g    2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符; :%s#…

    Linux干货 2016-09-26