负载均衡LVS之高可用

1.负载均衡LVS

1.1.LVS(Linux Virtual Server)介绍

。。 Lvs是Linux Virtual Server的简写,意思为Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在LINUX/UNIX平台下实现负载均衡集群功能,该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一

。。LVS官方文档:http://www.linuxvirtualserver.org

1.2.IPVS(LVS)软件工作层次图

。。LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server),我们使用该软件配置LVS时候,不能直接配置内核中的IPVS,而需要使用IPVS的管理工具ipvsadm进行管理,然而也可用keepalived软件直接管理ipvs内核模块,并不是通过ipvsadm来管理ipvs。

1.3.LVS小结

1、真正实现调度的工具是IPVS内核模块,工作在Linux内核层面。

2、LVS自带的IPVS命令行管理工具是ipvsadm

3、keepalived实现管理IPVS(配置文件)及负载均衡器的高可用

4、Red hat工具Piranha web管理实现调度的工具IPVS

1.4.LVS相关术语

名称
缩写
说明
虚拟机IP地址(virtual ip address)
vip
vip为Director用于向客户端计算机提供
服务的IP地址,比如,www.xionghaier.cn域名
就要解析到vip上提供服务
真实IP地址(Real Server IP address)
RIP
在集群下面节点上使用的IP地址,物理IP地址
Director的IP地址(Director ip adress)
DIR
Director用于连接内外网络的IP地址,物理网卡
上的IP地址是负载均衡器上的IP
客户端主机IP地址(client ip address)
CIP
客户端用户计算机请求集群服务器的IP地址,
该地址用作发送给集群的请求的源IP地址。

2.LVS集群的4种工作模式介绍与原理讲解

LVS的四种工作模式

缩写及全拼:

NAT(Network Address Translation

TUN(Tunneling)

DR(Direct Routing

FULLNAT(Full Network Address Translation)

2.1.DR模式

。。VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与真实服务器RS都有一块网卡连在同一物理网段上,即必须在同一个网段上,即必须在同一个局域网环境

2.1.1.lvs dr模式应用特点

  1. 所有集群节点RS必须和Director在相同的物理网段(即同一个局域网中)上。
  2. 所有客户端入战(而不是出战)请求由Director首先接收,并转发给集群节点RS。
  3. 集群节点RS,通常来说最好带外部IP,而不使用Director及某固定机器作为默认网关,以便将数据包直接回复给客户端计算机,且不会产生回包的瓶颈。
  4. 所有集群节点RS必须在lo网卡上绑定VIP地址(掩码255.255.255)以便验证通过目的IP非RS节点的数据包。
  5. 由于所有集群节点RS上必须在lo网卡上绑定VIP地址,因此,带来额外的arp响应问题,即集群节点RS默认会响应原本由客户端发往Director VIP的数据包。因此,我们要对所有集群节点RS做ARP抑制处理,把响应VIP的请求交给LVS Director。
  6. 很多操作系统都可以在集群内部的RS真实服务器上,只要该操作系统支持TCP/IP协议,并能够实现ARP隐藏,就可以作为RS节点,如windows、linux、unix、
  7. LVS/DR模式不需要开启调度器的内核转发功能,这点和LVS/NAT模式是不同的。
  8. LVS/DR Director(服务器数量100台)可以比LVS-NAT Director(服务器数量10-20台)承受更多的并发请求和转发更多的服务器的数量。
  9. RS与lvs需要有外网IP

2.2. NAT模式-网络地址转换

Virtual Server via Network Address Translation(VS/NAT)

2.2.1. 图解nat模式

NAT模式

用户通过vip进行访问,lvs接收到数据包后把目标ip改为一台RS服务器的ip地址,数据包到达RS服务器,RS服务器接收处理请求后返回给lvs,lvs接收到数据包后把源ip改为vip返回给用户

3. LVS的三种模式优缺点比较


VS/NAT
VS/TUN
VS/DR
Real Server 节点服务器
config dr gw
tunneling
Non-arp device/tie vip
Server Network(网络)
private
LAN/WAN
LAN
Server Network (节点数量)
low (10~20)
High (100)
High (100)
Real Server Gateway
load balancer
own router(能出网)
own router(能岀网)
优点
地址和端口转换
WAN环境
性能最高
缺点
瓶颈大效率低
系统需要支持隧道协议
不能跨出LAN

 

NAT模式:

1、NAT技术将请求的报文(通过DNAT方式改写)和响应的报文(通过SNAT方式改写),通过调度器地址重写然后在转发给内部的服务器,报文返回时在改写成原来的用户请求的地址。

2、只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信

3、每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP)这样才能确保数据报文返回时任然经过调度器LB

4、由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最对10-20台节点

5、NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的)

6、所有NAT内部RS节点只需要配置私有LAN IP即可

7、由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward = 1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)。

DR模式:

1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP

2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式比)

3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)

4、需要注意RS节点的VIP的绑定(lo:vip/32,lol:vip/32)和ARP抑制问题,在lo网卡上绑定VIP,抑制arp解析

5、强调:RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲;只要RS可以出网即可,不是必须配置外网IP。

6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的目的端口(和NAT区别)

7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统,真实服务器RS节点可以是WINDOWS系统

8、总的来说DR模式效率很高,但是配置也比较麻烦,因此,访问量不是特别大的公司可以用haprixy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT模式)

9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。

TUN模式:

1、负载均衡器通过把请求的报文通过IP隧道的方式(请求的报文不经过原目的地址的改写(包括MAC)),而是直接封装成另外的IP报文,转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户

2、由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址

3、由于调度器LB只处理入战请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定的系统开销。TUN模式适合LAN/WAN

4、TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题

5、所有的RS服务器都要绑定VIP,抑制ARP,配置复杂

6、LAN环境一般采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还的同步

7、直接对外的访问业务,例如:web服务做RS节点,最好用公网IP地址,不直接对外的业务,例如:MySQL存储系统RS节点,最好用内部IP地址

4. LVS的调度算法

LVS的调度算法决定了如何在集群节点之间分布工作负荷。

当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入战请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr,SED,NQ(后两种官方站点没提到,编译LVS,make过程可以看到rr|wrr|wlc|lblc|lblcr|dh|sh|sed|nq

10种调度算法见如下表格:

算法
说明
rr
轮询调度(Round-Robin)它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求,
这种算法简单,但是只适合于RS节点处理性能相差不大的情况
wrr
加权轮询调度(Weighted Round-Robin)它将依据不同RS节点的权值分配任务,权值较高
的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到
相同数目的连接数
dh
目的地址哈希调度(Destination Hashing)以目的地址为关键字查找一个静态hash表来
获得需要的RS
sh
源地址哈希调度(Source Hashing)以源地址为关键字查找一个静态hash表来获得需要的RS
wlc
加权最小连接数调度(Weighted Least)假设各台RS的权值依次为wi(I=1..n)当前的TCP
连接依次为Ti(I=1..n)依次选取Ti/Wi为最小的RS作为下一个分配的RS
lblc
基于地址的最小连接数调度(Locality-Based Least-Connection)将来自同一目的地址
的请求分配给同一台RS节点,如果这台服务器尚未满负荷,分配给连接数最小的RS,并以它
为下一次分配的首先考虑
lblcr
基于地址带重复最小连接数调度(Locality-Based Least-Connection With Replication)
对于某一目的地址,对应有一个RS子集。对此地址请求,为它分配子集中连接数最小RS:如果子
集中所有服务器均已满负荷,则从集群中选择一个连接数较小服务器,将它加入到此子集并分
配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。
SED
最短的期望的延迟(Shortest Expected Delay Scheduling SED)(SED)

基于wlc算法。例如

ABC三台机器分别权重123,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它
可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算

A(1+1)/1

B(1+2)/2

C(1+3)/3

根据运算结果,把连接交给C
NQ
最小队列调度(Never Queue Scheduling NQ)(NQ)

无需队列。如果有台real server的连接数=0就直接分配过去,不需要在进行sed运算

 

4.1.LVS的调度算法的生产环境选型

  • 一般的网络服务,如Http、mail、mysql等,常用的lvs调度算法为:
  • 基本轮询调度rr算法:round robin
  • 加权最小连接调度wlc。weighted least connection
  • 加权轮询调度wrr算法
  • 基于局部性的最小连接LBLC和带复制的基于局部性最少连接LBLCR主要适用于Web cache和Db cache集群,但是我们很少这样用。一致性哈希
  • 源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
  • 最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务,实际使用中,这些算法的适合范围不限于这些,我们最好参考内核中的连接调度算法的实现原理;

5.系统环境

主机名
管理IP地址
角色
备注
lb01
192.168.56.5
LVS调度器(Director)
对外提供服务的VIP为192.168.56.3
lb02
192.168.56.6
web02
192.168.56.7
RS2(真实服务器)
web01
192.168.56.8
RS1(真实服务器)
[root@lvs01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@lvs01 ~]# uname -a
Linux lvs01 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@lvs01 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
 Active: inactive (dead)
[root@lvs01 ~]# getenforce 
Disabled

5.1.测试环境准备

1.安装nginx及配置

#!/bin/bash
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#yum -y install epel-release
yum install -y pcre pcre-devel openssl openssl-devel
mkdir -p /home/dilusense/tools
cd /home/dilusense/tools
yum install -y wget
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar xf nginx-1.10.2.tar.gz 
cd nginx-1.10.2/
useradd -s /sbin/nologin -M www
 ./configure --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module \ 
 --with-http_ssl_module
make && make install
ln -s /application/nginx-1.10.2 /application/nginx
echo 'export PATH=$PATH:/application/nginx/sbin/' >>/etc/profile
source /etc/profile
/application/nginx/sbin/nginx

2.创建测试环境web01.web02

~]# for dir in www bbs blog ;do mkdir /application/nginx/html/$dir;done
~]# for dir in www bbs blog ;do echo "`hostname` $dir" >/application/nginx/html/$dir/xionghaizi.html;done

3.web01与web02配置文件内容:

[root@web01 ~]# cat /application/nginx/conf/nginx.conf
[root@web02 conf]# egrep -v "^$" nginx.conf
worker_processes 1;
events {
 worker_connections 1024;
}
http {
 include mime.types;
 default_type application/octet-stream;
 sendfile on;
 keepalive_timeout 65;
 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
 server {
 listen 80;
 server_name blog.xionghaier.org;
 location / {
 root html/blog;
 index index.html index.htm;
 }
 access_log logs/access_bbs.log main;
 }
 server {
 listen 80;
 server_name www.xionghaier.org;
 location / {
 root html/www;
 index index.html index.htm;
 }
 access_log logs/access_www.log main;
 }
}

4.加载使配置文件生效

~]# nginx -s reload

5.进行测试

~]# curl -H Host:www.xionghaier.org 192.168.56.8/xionghaizi.html
~]# curl -H Host:blog.xionghaier.org 192.168.56.8/xionghaizi.html
~]# curl -H Host:www.xionghaier.org 192.168.56.7/xionghaizi.html
~]# curl -H Host:blog.xionghaier.org 192.168.56.7/xionghaizi.html

6.添加windows的host解析 C:\Windows\System32\drivers\etc

192.168.56.7    blog.xionghaier.org www.xionghaier.org

5.2.开始安装LVS

5.2.1.yum安装ipvsadm

~]# yum install -y ipvsadm
~]# rpm -qa ipvsadm
ipvsadm-1.27-7.el7.x86_64
~]# rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm
/usr/sbin/ipvsadm-restore
/usr/sbin/ipvsadm-save
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz

~]# ipvsadm
~]# lsmod |grep ip_vs    ##加载的内核模块
ip_vs 140944 0 
nf_conntrack 105745 1 ip_vs
libcrc32c 12644 2 xfs,ip_vs
~]# ln -s /usr/src/kernels/`uname -r` /usr/src/linux
命令说明:
此ln命令的链接路径要和uname -r输出结果内核版本对应,企业中安装虚拟化可能有多个内核路径

6.手动配置LVS(DR模式)负载均衡服务

6.1.手工添加LVS转发

1.手动在lb01添加VIP 192.168.56.3

~]# ifconfig eth0:0 192.168.56.3/24 up   ##别名
~]# ip addr add 192.168.56.3/24 dev eth0 label eth0:0

6.2.配置LVS

[root@lvs01 ~]# ipvsadm-save -n         ##保存当前的lvs的规则,可以用 ipvsadm-restore 恢复
[root@lvs01 ~]# ipvsadm -C              ## -C 清空lvs所有规则
[root@lvs01 ~]# ipvsadm --set 30 5 60   ##设置cdp udp超时时间

[root@lvs01 ~]# ipvsadm -A -t 192.168.56.3:80 -s wrr -p 20
命令说明:
-A 添加虚拟主机服务器
-t tcp协议
-s 轮询算法rr wrr wlc
-p 会话保持 默认是300

[root@lvs01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.56.3:http wrr persistent 20
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.56.3:80 wrr persistent 20

########################################################################################
# 添加web(RS)服务器                                                                     #
########################################################################################
[root@lvs01 ~]# ipvsadm -a -t 192.168.56.3:80 -r 192.168.56.7:80 -g -w 1
[root@lvs01 ~]# ipvsadm -a -t 192.168.56.3:80 -r 192.168.56.8:80 -g -w 1
命令说明:
-a 添加rs服务器
-r real server rs ip
-g dr模式
-w 1 weight 权重
-t 192.168.56.3:80 使用tcp协议,负载均衡的IP地址是192.168.56.3:80

[root@lvs01 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.56.3:80 wrr persistent 20
 -> 192.168.56.7:80 Route 1 0 0 
 -> 192.168.56.8:80 Route 1 0 0

[root@lvs01 ~]# ipvsadm-save -n 
-A -t 192.168.56.3:80 -s wrr -p 20
-a -t 192.168.56.3:80 -r 192.168.56.7:80 -g -w 1
-a -t 192.168.56.3:80 -r 192.168.56.8:80 -g -w 1

###备份和恢复
[root@lvs01 ~]# ipvsadm-save -n > /tmp/ipvs.save
[root@lvs01 ~]# ipvsadm-restore < /tmp/ipvs.save

6.2.1绑定VIP及抑制arp

1.手工在RS端绑定,每台real server端执行

~]# ip addr add 192.168.56.3/32 dev lo label lo:0  ##或者执行下面命令
~]# ifconfig lo:0 192.168.56.3/32 up 
~]# route add -host 192.168.56.3 dev lo

########################################################################################
# web01及web02添加arp抑制内容                                                           #
########################################################################################
~]# cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
~]# sysctl -p

##检测验证
[root@lvs01 ~]# curl -H Host:blog.xionghaier.org 192.168.56.7/xionghaizi.html
web02 blog
[root@lvs01 ~]# curl -H Host:blog.xionghaier.org 192.168.56.8/xionghaizi.html
web01 blog

2.添加windows的host解析 C:\Windows\System32\drivers\etc

192.168.56.3    blog.xionghaier.org www.xionghaier.org

7.LVS高可用keepalived

7.1.安装keepalived及配置

下载阿里源
https://opsx.alibaba.com/mirror
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache  ##>==生成缓存
安装keepalived并启动
yum install -y keepalived
systemctl start keepalived.service
systemctl status keepalived.service
注意:需要关闭防火墙及selinux

########################################################################################
# lb01及lb02配置文件内容                                                                #
########################################################################################

~]# cp /etc/keepalived/keepalived.conf{,.default}
~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
 notification_email {
 443060965@qq.com
 }
 notification_email_from Alexandre.Cassen@firewall.loc
 smtp_server 192.168.200.1
 smtp_connect_timeout 30
 router_id LVS_01            ##lb02 router_id LVS_02
}

vrrp_instance VI_1 {
 state MASTER                ##lb02 state BACKUP
 interface eth0
 virtual_router_id 51
 priority 150                ##lb02 priority 100
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.56.3/24 dev eth0 label eth0:1
 }
}

virtual_server 192.168.56.3 80 {
 delay_loop 6
 lb_algo wrr
 lb_kind DR
 nat_mask 255.255.255.0
 persistence_timeout 50
 protocol TCP

 real_server 192.168.56.7 80 {
 weight 1
 TCP_CHECK {
 connect_timeout 8
 nb_get_retry 3
 delay_before_retry 3
 connect_port 80
 }
 }
 real_server 192.168.56.8 80 {
 weight 1
 TCP_CHECK {
 connect_timeout 8
 nb_get_retry 3
 delay_before_retry 3
 connect_port 80
 }
 }
} 


########################################################################################
# lb01及lb02执行命令验证                                                                #
########################################################################################
~]# ipvsadm-save -n
-A -t 192.168.56.3:80 -s wrr -p 50
-a -t 192.168.56.3:80 -r 192.168.56.7:80 -g -w 1
-a -t 192.168.56.3:80 -r 192.168.56.8:80 -g -w 1
~]# ipvsadm -C
~]# ipvsadm-save -n
~]# systemctl restart keepalived.service 
~]# ipvsadm-save -n
-A -t 192.168.56.3:80 -s wrr -p 50
-a -t 192.168.56.3:80 -r 192.168.56.7:80 -g -w 1
-a -t 192.168.56.3:80 -r 192.168.56.8:80 -g -w 1

1).keepalived配置文件注释说明

global_defs {
 notification_email {
 49000448-@qq.com            #设置报警邮件地址,可设置多个
 }
 notification_email_from Alexandre.Cassen@firewall.loc   #设置 邮件的发送地址
 smtp_server 192.168.200.1   #设置 smtp server 地址
 smtp_connect_timeout 30     #设置 连接 smtp server的超时时间
 router_id LVS_01            #设置 keepalived 服务器的一个标识。发邮件时显示在邮件主题中的信息 
}

vrrp_instance VI_1 {         #vrrp 实例部分定义 
 state MASTER                #指定 keepalived 的角色,可选值:MASTER|BACKUP 分别表示(主|备)
 interface eth0              #指定网络接口
 virtual_router_id 51 #虚拟路由表示,是一个数字,同一个vrrp 实例使用唯一的标识, 默认值是51 ;MASTER和BACKUP 的 同一个vrrp_instance下这个标识必须保持一致
 priority 150 #定义优先级,数字越大,优先级越高; 同一个 vrrp_instance 下,MASTER 优先级必须大于 BACKUP 
 advert_int 1                #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
 authentication {            #设置验证类型和密码
 auth_type PASS              #设定验证类型,主要有: PASS 和 AH 两种
 auth_pass 1111              #设置验证密码,在一个 vrrp_instance 下, MASTER 和 BACKUP必须使用相同的密码才能通信 
 }
 virtual_ipaddress {         #设置虚拟IP地址
 192.168.56.3/24 dev eno16777736 label eno16777736:1
 }
}
virtual_server 192.168.56.3 80 { #设置虚拟服务器需要指定虚拟IP地址和服务端口,IP和端口之间用空格隔开 
 delay_loop 6                #设置运行情况检查
 lb_algo wrr                 #设置负载均衡调度算法,这里设置为wrr, 即权重轮询算法
 lb_kind DR                  #设置LVS实现负载均衡的机制,有 NAT,TUN和DR三个模式可选
 nat_mask 255.255.255.0      #子网掩码
 persistence_timeout 50 #会话保持时间,单位是秒。这个选项对动态网页比较有用,为集群系统中的session共享提供了很好的解决方案 
 protocol TCP                #指定转发协议类型,有TCP和UDP

 real_server 192.168.56.7 80 {   #配置服务节点需要指定 real_server 的真实IP地址和端口,IP与端口之间用空格隔开
 weight 1                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高
 TCP_CHECK {
 connect_timeout 8           #连接超时时间
 nb_get_retry 3              #重新尝试次数
 delay_before_retry 3        #连接失败多长时间 在尝试连接
 connect_port 80             #连接端口80
 }
 }

 real_server 192.168.56.8 80 {
 weight 1 
 TCP_CHECK {
 connect_timeout 8 
 nb_get_retry 3             #重新尝试次数
 delay_before_retry 3       #连接失败多长时间 在尝试连接
 connect_port 80            #连接端口80
 }
 }
}

7.2.配置lvs之nat模式

硬件环境:

一台Director:

版本:centos7.2 - 3.10.0-327.el7.x86_64
双网卡: 
eth1: VIP:192.168.56.5/24(真实生产环境下一定将网关指向运营商的公网IP)
eth2: DIP:172.16.1.5/24(此IP必须和后台的RealSever在同一个网段内)
两台RealServer:

版本:centos7.2 - 3.10.0-327.el7.x86_64
单网卡: 
RealServer1:RIP1:192.168.56.7/24(网关必须指向Director的DIP)
RealServer2: RIP2:192.168.56.8/24(网关必须执行Director的DIP)
注意:
这里如果采用双网卡机制很容易出现,TCP连接问题,也就是syn消息收不到ack响应,所以尽量将无关的网卡警用,以免路由配置的复杂。

1).配置内核模块

清空之前所有lvs规则
Director服务器网卡信息
~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 192.168.56.5 netmask 255.255.255.0 broadcast 192.168.56.255
 inet6 fe80::20c:29ff:fefb:fc1c prefixlen 64 scopeid 0x20<link>
 ether 00:0c:29:fb:fc:1c txqueuelen 1000 (Ethernet)
 RX packets 17783 bytes 12899977 (12.3 MiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 12705 bytes 1017665 (993.8 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 172.16.1.5 netmask 255.255.0.0 broadcast 172.16.255.255
 inet6 fe80::20c:29ff:fefb:fc30 prefixlen 64 scopeid 0x20<link>
 ether 00:0c:29:fb:fc:30 txqueuelen 1000 (Ethernet)
 RX packets 31 bytes 2306 (2.2 KiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 20 bytes 1520 (1.4 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
 inet 127.0.0.1 netmask 255.0.0.0
 inet6 ::1 prefixlen 128 scopeid 0x10<host>
 loop txqueuelen 0 (Local Loopback)
 RX packets 8 bytes 400 (400.0 B)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 8 bytes 400 (400.0 B)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

########################################################################################
# Director服务器执行命令-临时生效                                                        #
########################################################################################
##开启路由转发功能
~]# echo 1 >/proc/sys/net/ipv4/ip_forward 
##关闭icmp的重定向                    
~]# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects       
~]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
~]# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
~]# echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
########################################################################################
# Director服务器执行命令-永久生效                                                        #
########################################################################################
##编辑配置文件/etc/sysctl.conf或者
cat >>/etc/sysctl.conf<<EOF
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
EOF

2).RS服务器web01.web02网关更改为负载均衡的网卡地址

 

TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="192.168.56.8"
PREFIX="24"
GATEWAY="172.16.1.5"
DNS1="192.168.56.2"

3).将RealServer加入Web集群服务

~]# ipvsadm -A -t 192.168.56.5:80 -s wrr 
~]# ipvsadm -a -t 192.168.56.5:80 -r 192.168.56.7 -m -w 1
~]# ipvsadm -a -t 192.168.56.5:80 -r 192.168.56.8 -m -w 2

~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.56.5:80    wrr
 -> 192.168.56.7:80    Masq     1      0           0 
 -> 192.168.56.8:80    Masq     2      0           0 

4).使用ab工具进行测试

~]# ab -n 100 -c 100 http://192.168.56.5/xionghaizi.html

5).在调度器Director服务器上验证测试结果

~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.56.5:80 wrr
 -> 192.168.56.7:80    Masq     1      0          68 
 -> 192.168.56.8:80    Masq     2      0          134  
6).yum安装ab命令

查看apr-util, yum-utils是否安装:

~]# rpm -qa|grep apr-util
apr-util-1.3.9-3.el6_0.1.x86_64
…
~]# rpm -qa|grep yum-utils
yum-utils-1.1.30-30.el6.noarch

若在命令执行后有结果列出(如上),则说明已安装。

否则用yum安装:

~]# yum -y install apr-util
~]# yum -y install yum-utils

建个临时目录来保存下载的安装包,并按如下顺序执行目录:

~]# mkdir abtmp
~]# cd abtmp
~]# yumdownloader httpd-tools*
~]# rpm2cpio httpd-tools-*.rpm |cpio -idmv
~]# ll usr/bin/ab
-rwxr-xr-x 1 ytadmin ytadmin 50248 Oct 1622:49 usr/bin/ab
~]# sudo cp usr/bin/ab /usr/bin

执行ab命令,应列出使用说明信息。

~]# ab
ab: wrong number of arguments
Usage: ab [options][http[s]://]hostname[:port]/path

 

 

1
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到