DevOPS

Linux之lvs集群

2016-03-07  本文已影响928人  魏镇坪

Linux系统之lvs集群

集群的基本思想

由于现代化业务上线的需求, 单服务器已经不能满足业务的需要, 业务服务器需要承载更的访问请求.或者单台服务器故障(SPOF,single point of failure)将导致所有服务不可用. 此情况下, 需要把各种相同的业务服务器连合起来为某个相同的业务提供服务.以达到高并发,快速响应的需求.集群技术和Linux操作系统实现了一个高性能和高可用的服务器, 具有很好的可伸缩性,很好的可靠性, 很好的可管理性.

集群的类型

LB: 负载均衡集群(Load Balancing)
HA: 高可用集群(High avaliability)
HP: 高性能计算集群(high performance)

将多个CPU通过总线连接起来,共同进行计算,以达到计算效率

DS: 分布式系统(distributed system)

分布式存储系统是最常见的, 例如hadoop

负载均衡构建需要考虑的问题

LB集群的实现方式划分

LB集群的协议层划分

HA集群的实现

缓存都是KV格式的数据,即key=value的格式, 其查找数据的时间是o(1),即查询时间是恒定的

业务系统构建思路

LVS简介

LVS是Linux Virtual Server和简称,也就是linux虚拟服务器,这是由章文嵩博士发起的一个开源项目, 它的官方网站是www.linuxvirtualserver.org,现在LVS已经是Linux内核标准的一部分,使用LVS可达到的技术目标是: 通过LVS的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集, 它具有良好的可靠尾,可拓展和可操作性. 从而以低廉的成本实现最优的性能. LVS从1998年开始,发展到现在已经是一个比较成熟的项目了.利用LVS技术可实现高性能, 高可压缩的网络服务. 例如WWW服务,FTP服务, MAIL服务等

LVS的工作原理

LVS工作在内核的INPUT链上,请求的数据报文首先到达PREROUTING链,再通过路由发现到达本机的IP地址,却送往INPUT链, 强行改变数据包的流程,送往POSTROUTING链,再送往内部服务器(转发到内部服务器类似于iptables的DNAT,但它不更改目标IP(也可以更改目标IP)).LVS工作在四层,根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(其是根据调度算法).支持TCP,UDP,SCTP,AH,ESP,AH_ESP等协议的众多服务

LVS的集群术语

LVS的类型

注意:前三种为标准类型,fullnat为后来添加的类型,内核默认可能不支持,需要重新编译内核
lvs-nat(MASQUERADE)

可以理解为多目标DNAT(iptables),可修改IP和端口,通过将请求报文的目标地址和目标端口修改为挑选的某RS的RIP和端口实现

lvs-dr(GATAWAY)

Director将接收到的请求报文源IP和目标IP都不做修改,而是将源MAC设定自己的MAC,目标MAC设定目标RS的MAC,而通过交换机发送给RS server,当RS server拆解后发现源目标IP不是自己,此时要在RS上配置VIP,即RS服务器有RIP和VIP,此时有如下难道:

lvs-tun(IPIP)

Director收到报文后,原IP和目标IP不动, 再封装一个源IP和目标IP,源IP为DIP,目标IP为RIP,确保每个RIP要有一个VIP,RS主机接收到报文后,回应时源IP为VIP,目标IP为CIP

lvs-fullnat

Director收到报文后, 将源IP(CIP)修改为(DIP),目标地址(VIP)修改为(RIP),转发给RIP, 当RS主机收到报文后,回应时,源IP为RIP,目标IP为VIP.Director收到报文后,将源IP修改为自己(VIP), 目标IP修改为CIP

lvs计算活动连接和非活动连接的方式:

LVS的调度方法

静态方法(公根据算法本身进行调度,不考虑后端服务器的运行状态,负载的效果有限)
动态方法(根据算法及各RS的当前的负载状态进行评估,如果负载较小的会负载下一个请求,其根据overhead值来分配请求)

ipvsadm/ipvs

ipvsadm

工作于用户空间,用户空间的命令行工具, 用于管理集群服务,及集群服务上的RS等,其是一个CLI工具

ipvs

工作于内核空间,工作在netfilter INPUT勾子之上的程序代码,其集群功能依赖于Ipvsadm工具定义规则, 一个ipvs主机至少应该有一个RS,其也可以同时定义多个cluster service

ipvsadm工具的安装

确认内核是否支持ipvs功能

root@Centos7 ~]# grep -i -C 2  "ip_\?vs" /boot/config-3.10.0-229.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
--
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# 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 SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8

#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m

#

ipvsadm命令的使用

管理集群服务:
管理集群服务上的RS
查看
清空规则
保存和重载
重载
计数器清零

lvs-nat的构建

1 配置192.168.12.21的网关为192.168.12.1
2 配置192.168.12.22的网关为192.168.12.1
3 配置172.16.100.67地址在网卡的别名上
4 配置两台RS server的httpd服务,并启动之
5 在VS服务器中,完成如下配置
ipvsadm -A -t 172.16.100.67:80 -s wrr
ipvsadm -a -t 172.16.100.67:80 -r 192.168.12.21 -w 1 -m
ipvsadm -a -t 172.16.100.67:80 -r 192.168.12.22 -w 3 -m

6 使用客户端连接ipvs地址的80端口
7 正常情况下,22的主机响应3次,21的主机响应一次

lvs-dr的构建

director:
    ifconfig INTERFACE_Alias $VIP netmask 255.255.255.255 broadcast $VIP up
    ipvsadm -A -t 172.16.100.9:80 -s rr
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.68 -g
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.69 -g
    
realserver
    内核参数修改:
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/INTERFACE/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/INTERFACE/arp_announce
    route add -host $VIP dev lo:0
    
说明:
    arp_announce:(通告)
        0 : 把本地的任意接口地址都向网络通告
        1 : 尽量避免向本地接口的网络通知非此网络的IP地址
        2 : 必须要使用网络中的地址去响应
    arp_ignore(响应)
        0 : 本地所有接口地址都会响应
        1 : 只对从本地接口进来,而此接口也正好是这个网络的地址
        
    Linux默认从那个接口出去, 响应的源IP就为这个接口的地址,使用route add -host $VIP dev lo:0 就是为了改变报文的源IP地址
    linux默认的arp通告,会把本地主机的所有IP地址,都通告一次

通过防火墙标记实现LVS的集群

命令:
基于firewall定义集群服务的步骤
配置示例
iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK --set-mark 3
ipvsadm -A -f 3 -s rr
ipvsadm -a -f 3 -r 172.16.100.68 -g
ipvsadm -a -f 3 -r 172.16.100.69 -g
```

####lvs presistence(持久连接)
无功lvs使用何种scheduler,其都能实现在指定时间范围内(360秒)将来自同一个IP地址的请求发往同一个RS,其是通过内部的hash表,实现方式与算法无关,是通过lvs连接模板实现,其与调度方法无关,如果在指定的时间范围内还是未断开连接请求,连接超时时间自动增加2分钟

持久连接的记录模板: /proc/net/ip_vs_conn

* ######每端口的持久(PPC):单个服务的持久
    * 配置示例:
    
    ```
    ipvsadm -A -t 172.16.100.9:80 -s rr -p
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.68 -g
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.67 -g 
    
    ipvsadm -A -t 172.16.100.9:23 -s rr -p
    ipvsadm -a -t 172.16.100.9:23 -r 172.16.100.68 -g
    ipvsadm -a -t 172.16.100.9:23 -r 172.16.100.69 -g
    
        无论使用的什么调度方法,同一个请求将都会发往同一个RS
    ```
* ######每客户端持久(PCC) 
    * 配置示例:
    
    ```
    ipvsadm -A -t 172.16.100.9:0 -s rr -p
    ipvsadm -a -t 172.16.100.9:0 -r 172.16.100.68 -g
    ipvsadm -a -t 172.16.100.9:0 -r 172.16.100.69 -g
        定义tcp或udp协议的0号端口为集群服务端口
    ```
    
* ######每防火墙标记持久(PFWNC)
    * 配置示例:
    
    ```
    iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK --set-mark 99
    iptables -t mangle -A PREROUTING  -d 172.16.100.9 -p tcp --dport 443 -j MARK --set-mark 99
    ipvsadm -A -f 99 -s rr -p
    ipvsadm -a -f 99 -r 172.16.100.68 -g
    ipvsadm -a -f 99 -r 172.16.100.69 -g
    ```
上一篇 下一篇

猜你喜欢

热点阅读