LVS负载均衡集群(干货来袭)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS负载均衡集群(干货来袭)相关的知识,希望对你有一定的参考价值。

提升服务器响应能力的方式:

Scale On:向上扩展

升级服务器硬件

Scale Out:向外扩展

增加服务器个数

集群类型:

LB: Load Balance负载均衡集群

并发处理能力

HA: High Availability高可用集群

在线时间/(在线时间+故障处理时间)

99%,99.9%,99.99%,99.999%

HPC:High Performance Computer 高性能集群

并行处理集群

分布式存储:分布式文件系统

将大任务切割成小任务,分别进行处理计算的机制

脑裂 split-brain

两个集群节点不对称,节点2认为节点1已经挂掉了,但节点1因为繁忙等原因没有挂掉,此时会产生集群脑裂

有可能导致两个节点同时读写同一个文件系统,导致数据错乱 

STONITH:Shoot The Other Node In The Head

为避免产生集群脑裂,可以借助STONITH设备彻底使某个节点失效 

FENCE

拒绝某个节点访问集群资源

节点级别隔离:STONITH 

资源级别隔离


为避免集群分裂,高可用集群至少要有奇数个节点


负载均衡集群


实现调度器的方式:

Hardware

F5

Citrix,Netscaler

A10

Software

四层

LVS

七层:反向代理 

nginx

http,smtp,pop3,imap

haproxy

http,tcp(mysql,smtp)



LVS-----Linux Virtual Server


LVS:

ipvsadm:管理集群的命令行工具

ipvs:工作在内核上


LVS角色:

前端:Director

vip:Director上对外提供服务的IP

DIP:Director上与Real Server通信的IP

CIP:客户端的IP地址

后端:Real Server 

RIP:Real Server上网卡IP



LVS类型:

LVS-NAT

1、集群节点与Director必须在同一个IP网络中

2、real server的网关要指向Director的DIP

3、RIP通过是私有地址,仅用于各集群节点间的通信

4、Director负责所有通信,进、出的数据都要经过Director

5、Director支持端口映射,对外提供服务的端口与real server的服务端口可以不一致

6、Real server可以使用任意操作系统

7、较大规模应用场景中,Director易成为系统瓶颈

LVS-DR

1、集群节点与Director必须在同一个物理网络中

2、RIP地址可以是公网IP或者私有地址

3、Director只负责处理入站请求,响应报文由Real server直接发往客户端

4、Real Server不能将网关指向DIP,直接指向前端路由网关地址

5、Director不支持端口映射

LVS-TUNNEL

1、集群节点可以跨越互联网,可以不在一个物理网络中

2、RIP必须是公网IP地址

3、Director只负责处理入站请求,响应报文由Real Server直接发往客户端

4、只有支持隧道功能的OS才能用于Real Server

5、不支持端口映射



LVS调度算法:

静态调度方法

rr:Round Robin轮询

wrr:Weight Round Robin 加权轮询

sh:Source hash  源地址Hash,只要来自同一个客户端的用户请求全都转发至同一个Real Server 

dh:Destination hash 将同样的请求发送到同一个real server 

动态调度方法

lc: least connection 最少连接

active*256+inactive

wlc:weight least connection 加权最少连接,默认调度方法

(active*256+inactive)/weight

sed:shorest expire delay 最少期望延迟

(active+1)*256/weight

nq: never queue 永不排队

LBLC:Local Base Least Connection  基本本地的最少连接

将同一个客户端的请求发送到同一个Real Server,并考虑当前服务器的连接数

LBLCR:Local Base Least Connection Replication 基于本地的带复制功能的最少连接




ipvsadm工具的使用:

管理集群服务

添加 -A  -t|u|f  service-address  [-s scheduler]

-t:tcp协议的集群

-u:udp协议的集群

service-address:  IP:port

-f:firewallmark   fwm防火墙标记

service-address: Mark Number


修改 -E

删除 -D  -t|u|f  service-address


示例1:定义172.16.100.1的80端口为集群服务

# ipvsadm -A -t 172.16.100.1:80 -s rr


管理集群服务中的real server

添加 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

service-address    之前定义好的集群服务

-r server-address 某real server的IP地址;在NAT模型中,可以使用IP:PORT格式做端口映射

[-g|i|m] 表示LVS类型

-g  DR模型  默认模型

-i TUNNEL模型

-m NAT模型

[-w weight] 定义real server的权重 

修改 -E

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



查看

ipvsadm -L|l [options]

options:

-n:以数字形式显示地址及端口

--stats 显示统计信息

--rate 数据传输速率

--timeout 显示tcp/tcp-fin/udp会话超时时间

# ipvsadm -L -n --timeout 

Timeout (tcp tcpfin udp): 900 120 300

-c 显示客户端的连接数



删除所有集群服务

-C:清空ipvs规则


保存ipvs规则

-S

# ipvsadm -S > /path/to/somefile

载入此前的规则

-R

# ipvsadm -R < /path/to/somefile



各节点之间的时间偏差不应该超过1秒钟

NTP:Network Time Protocol



NAT模型LVS集群案例

环境如下:rhel 6.3服务器3台,IP地址规则如下

rhel-1: 作为调度器Director   vmnet1 10.1.1.1   vmnet8 192.168.1.1

rhel-2: web服务器1   vmnet 8  192.168.1.2  网关 192.168.1.1

rhel-3:web服务器2 vmnet8  192.168.1.3 网关 192.168.1.1


按照如上要求,分别配置3台服务IP地址及网关


1、两台web服务器分别安装httpd,并建立测试测试网页,保证本机可以正常访问


2、在10.1.1.1上验证内核是否支持ipvs模块

# grep -i "vs" /boot/config-2.6.32-279.el6.i686 

# CONFIG_GENERIC_TIME_VSYSCALL is not set

CONFIG_HIBERNATION_NVS=y

CONFIG_IP_VS=m

CONFIG_IP_VS_IPV6=y


3、在10.1.1.1上安装ipvsadm管理工具

# rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm 

warning: /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

Preparing...                  ########################################### [100%]

   1:ipvsadm                ########################################### [100%]


4、定义10.1.1.1的80端口为集群服务,并将两台real server添加到该集群服务中

# ipvsadm -A -t 10.1.1.1:80 -s rr 

# ipvsadm -a -t 10.1.1.1:80 -r 192.168.1.2 -m 

# ipvsadm -a -t 10.1.1.1:80 -r 192.168.1.3 -m 


5、查看集群状态

# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.1.1.1:80 rr

  -> 192.168.1.2:80               Masq    1      0          0         

  -> 192.168.1.3:80               Masq    1      0          0     


6、打开10.1.1.1服务器上的ipv4.forward转发功能,并在客户端测试访问;

# sysctl -p

net.ipv4.ip_forward = 1

在客户端浏览器输入http://10.1.1.1可查看到real server网页,点击刷新,网页内容在两台服务器间相互切换

查看集群数据统计信息

# ipvsadm -L -n --stats 

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  10.1.1.1:80                        23      120      102    14795    11135

  -> 192.168.1.2:80                     11       59       51     7595     5554

  -> 192.168.1.3:80                     12       61       51     7200     5581

保存ipvsadm规则

# service ipvsadm save

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [确定]


7、调整集群调度算法为wrr,并分别指定192.168.1.2的权重为3,192.168.1.3的权重为1

# ipvsadm -E -t 10.1.1.1:80 -s wrr  

# ipvsadm -e -t 10.1.1.1:80 -r 192.168.1.2 -m -w 3  

# ipvsadm -e -t 10.1.1.1:80 -r 192.168.1.3 -m -w 1  

# ipvsadm -L -n 

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.1.1.1:80 wrr

  -> 192.168.1.2:80               Masq    3      0          0         

  -> 192.168.1.3:80               Masq    1      0          0  


8、清空ipvsadm统计数据,并在客户端重新浏览网页,查看ipvsadm统计数据

# ipvsadm -Z -t 10.1.1.1:80

# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  10.1.1.1:80                        22      111      107    15473    10494

  -> 192.168.1.2:80                     17       83       82    11712     7684

  -> 192.168.1.3:80                      5       28       25     3761     2810

观察以上数据,权重为3的192.168.1.2 web服务器,数据量大概为192.168.1.3的3倍左右


LVS-DR模型 


避免Real Server向外通告VIP,可采用如下办法:

1、在前端路由做IP与MAC静态绑定

2、arptables

3、kernel parameter

arp_ignore:接收到arp请求时的响应级别

0:默认值,只要有请求进入,只要本地配置了此IP,都向外通告

1:仅仅在请求的目标IP是本地地址,并且该地址是配置在请求进入的网卡时,才给予响应

arp_announce:将自己的IP地址及MAC地址的对应关系向外通告时的通告级别

0:默认值,使用本地的任何接口上的任何地址都向外通告

1:尽可能试图仅向目标网络通告与其网络匹配的接口地址

2:仅将与本地接口匹配的网络向外通告



Linux路由转发特性,回应报文从哪个网络接口发出,则以该网络接口的地址作为报文的源IP地址使用;在配置LVS-DR模型时,Real Server上的VIP地址一般都是配置在lo网卡的别名上,例如lo:1. 为保证Real Server在给客户端进行报文响应时,仍可以使用lo:1的地址作为源地址,需要在Real SServer上配置路由,明确指定响应报文以lo:1的地址作为响应的源地址。




LVS DR模型示例

环境IP规则如下:

Director调度器:

DIP eth0   10.1.1.1

VIP eth0:0 10.1.1.254


Real Server 1

RIP eth0 10.1.1.2

VIP lo0:0 10.1.1.254


Real Server 2

RIP eth0 10.1.1.3

VIP lo:0 10.1.1.254


1、按上述要求配置各主机的IP地址及路由

Director:

# ifconfig eth0:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255

# route add -host 10.1.1.254 dev eth0:0   >>>响应目的地址为10.1.1.254的请求包时,以eth0:0作为源地址


配置Real Server的VIP时,必须先修改arp_ignore和arp_announce参数

Real Server 1:

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 

# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

# ifconfig lo:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255

# route add -host 10.1.1.254 dev lo:0


Real Server 2:

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 

# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 

# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 

# ifconfig lo:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255

# route add -host 10.1.1.254 dev lo:0


2、分别在两台real server上搭建web服务,并使用Director测试访问两台服务器的web服务正常

# curl http://10.1.1.2

10.1.1.2 Pag:wq

# curl http://10.1.1.3

10.1.1.3 Page



3、在Director上配置ipvsadm规则 ,添加集群服务

# rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm

# ipvsadm -A -t 10.1.1.254:80 -s wrr

# ipvsadm -a -t 10.1.1.254:80 -r 10.1.1.2 -g -w 2

# ipvsadm -a -t 10.1.1.254:80 -r 10.1.1.3 -g -w 1

# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.1.1.254:80 wrr

  -> 10.1.1.2:80                  Route   2      0          0         

  -> 10.1.1.3:80                  Route   1      0          0        


4、在客户机浏览器中输入 http://10.1.1.254测试访问网页




脚本实现DR模型LVS集群:

real server脚本 :

#!/bin/bash


vip=10.1.1.254


# stop NetworkManager

service NetworkManager stop &> /dev/null

chkconfig NetworkManager off


# stop iptables and SELinux

service iptabels stop &> /dev/null

chkconfig iptables off

setenforce 0 &> /dev/null


# Define the kernel arguments arp_ignore arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255

route add -host $vip dev lo:0




Director脚本示例

#!/bin/bash


vip=10.1.1.254

vport=80

rs1_ip=10.1.1.2

rs2_ip=10.1.1.3

rs1_weight=2

rs2_weight=1

net=eth0



case $1 in 

  start)

    # Config vip and route 

    ifconfig $net:0 $vip broadcast $vip netmask 255.255.255.255

    route add -host $vip dev $net:0 &> /dev/null


    # install ipvsadm software

    mount /dev/cdrom /mnt &> /dev/null

    if i rpm -q ipvsadm &> /dev/null; then

       rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm &> /dev/null

    fi


    ipvsadm -C 

    ipvsadm -A -t $vip:$vport -s wlc

    ipvsadm -a -t $vip:$vport -r $rs1_ip -g -w $rs1_weight

    ipvsadm -a -t $vip:$vport -r $rs2_ip -g -w $rs2_weight

    ;;

  stop)

    ipvsadm -C 

    echo "ipvs cluster have been deleted"

    ipvsadm -L -n

    ;;

  save)

    ipvsadm -S > /etc/ipvs.info

    echo "ipvs rules is saved in /etc/ipvs.info"

    ;;

  status)

    ipvsadm -L -n 

    ;;

  *)

    echo "Usage:`basename $0` { start | stop | status | save }"

    ;;

esac




curl命令常用选项:

--cacert <file>  CA证书文件

--capath <directory> CA目录

--compressed 要求返回是压缩的形势

--connect-timeout <seconds> 设置最大请求时间

-H/--header <line> 自定义头信息传递给服务器

-i/--include 输出时包括protocol头信息

-I/--head 只显示文档信息

--interface <interface> 使用指定网络的接口或地址

-s/--silent 静音模式,不输出任何内容 

-u/--user <user[:password]> 设置服务器的用户和密码

-p/--proxytunnel 使用HTTP代理 



lvs后端服务器健康状态检查脚本

#!/bin/bash


vip=10.1.1.254

vport=80

rs1_server=10.1.1.2

rs2_server=10.1.1.3

rs1_weight=2

rs2_weight=1


while true;do

  # check real server-1

  if ! curl --connect-timeout 1 http://$rs1_server &> /dev/null;then

    if ipvsadm -L -n | grep $rs1_server &> /dev/null; then 

      ipvsadm -d -t $vip:$vport -r $rs1_server &> /dev/null

    fi

   fi

  if  curl --connect-timeout 1 http://$rs1_server &> /dev/null;then

    if ! ipvsadm -L -n | grep $rs1_server:$vport &> /dev/null; then

以上是关于LVS负载均衡集群(干货来袭)的主要内容,如果未能解决你的问题,请参考以下文章

超详细!一文带你了解 LVS 负载均衡集群!

LVS负载均衡集群

基于lvs实现4层负载均衡

Nginx七层负载均衡 #yyds干货盘点#

负载均衡(集群介绍,lvs介绍,LVS调度算法,NAT模式搭建)

LVS负载均衡集群服务搭建详解