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

相关推荐

  • SQL Server 2012 故障转移群集最佳实践

    一、Windows server  2012 系统主域的安装配置 功能介绍:  SQL Server 故障转移群集在网络上显示为一台计算机上的单个 SQL Server 实例。在群集内部,一次只有一个节点拥有群集资源组,满足针对该故障转移群集实例的所有客户端请求。在出现故障(硬件故障、操作系统故障、应用程序或服务故障)或进行计划升级时,组…

    Linux干货 2015-10-27
  • 浅谈正则表达式

    1.       什么是正则表达式 基本说来,正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。本文将用<<regex>>来表示一段具体的正则表达式。 一段文本就是最基本的模式,简单的匹配相同的文本。   2. &n…

    Linux干货 2016-08-12
  • 源码编译安装Apache

    编译安装Apache 系统环境:centos 7.2 前提: 提供开发工具及开发环境 开发工具:make, gcc等 开发环境:开发库,头文件 glibc:标准库 方式: 通过“包组”提供开发组件 centos 6 [root@centos6 ~]# yum groupinstall "Develo…

    Linux干货 2016-08-24
  • 内核编译

    单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。 内核组成部分核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;: kernel: 内核 kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/ [ ]: N [M]: M [*…

    Linux干货 2015-11-06
  • 文本处理工具

    首先介绍一下wc 这个工具,一看到这个词,我不禁捧腹大笑,这不是我们经常要去的地方吗?其实我们都错了,厕所的正确翻译为toilet,为什么叫wc 呢?这中间还有个故事,在这里就大概说一下吧。 很早以前,厕所Toilet里都有水箱watercloset, 人们一提到water closet就想到了toilet,因此watercloset就成了toil…

    2017-07-29
  • 马哥教育网络21期+第十二周练习博客中

    4、建立httpd服务器(基于编译的方式进行),要求:  提供两个基于名称的虚拟主机: (a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access; (b)www2.stuX.com,页面文件目录为/web…

    Linux干货 2016-10-17