[关闭]
@yangwenbo 2022-03-14T08:28:43.000000Z 字数 37109 阅读 571

lvs+keeplived

lvs+keepalived集群架构服务

1.LVS功能详解

1.1 LVS(Linux Virtual Server)介绍

LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。

1.2 企业网站LVS集群架构图

image.png-727.2kB

1.3 IPVS软件工作层次图

image.png-24.3kB

从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而需要使用ipvs管理工具ipvsadm进行管理,或者通过Keepalived软件直接管理ipvs。

1.4 LVS体系结构与工作原理简单描述

  • LVS集群负载均衡器接受服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。
  • LVS虚拟服务器的体系结构如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在他们的前端有一个负载调度器(Load Balancer)。 负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响不需要作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。

1.5 LVS 基本工作过程图

LVS基本工作过程如下图所示:
image.png-480.3kB
为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:

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

LVS集群内部的节点称为真实服务器(Real Server),也叫做集群节点。请求集群服务的计算机称为客户端计算机。
与计算机通常在网上交换数据包的方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通信。
不同架构角色命名情况如下图:

image.png-422.2kB

1.6 LVS集群的3种常见工作模式介绍与原理讲解

  • IP虚拟服务器软件IPVS
    • 在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的,高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商业化的IP负载均衡调度器产品都是使用NAT的方法,如Cisco的额LocalDirector,F5,Netscaler的Big/IP和Alteon的ACEDirector。
    • 在分析VS/NAT 的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),他们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术。淘宝开源的模式FULLNAT.

  • LVS的四种工作模式
    • NAT(Network Address Translation)
    • TUN(Tunneling)
    • DR(Direct Routing)
    • FULLNAT(Full Network Address Translation)
1.6.1 NAT模式-网络地址转换<==收费站模式(了解即可)

Virtual Server via Network Address Translation(VS/NAT)
调度时:目的IP改成RIP(DNAT)
返回时:源IP改成VIP(SNAT)
image.png-106.8kB

image.png-107.4kB

1.6.2 NAT模式特点小结:
  • NAT技术将请求的报文(DNAT)和响应的报文(SNAT),通过调度器地址重写然后在转发发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
  • 只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
  • 每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
  • 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
  • NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的)
  • 所有NAT内部RS节点只需要配置私有LAN IP即可。
  • 由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)
1.6.3 TUN模式-(了解即可)

image.png-97.9kB
增加一个IP头部。通过IP隧道进行通信(可以跨网段找到RS节点)

1.6.4 TUN模式特点小结:
  • 负载均衡器通过把请求的报文通过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
  • 由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址。
  • 由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销。TUN模式适合LAN/WAN。
  • TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
  • 所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
  • LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
  • 直接对外的访问业务,例如:Web服务做RS节点,最好用公网IP地址。不直接对外的业务,例如:MySQL,存储系统RS节点,最好用内部IP地址。
1.6.5 DR模式-直接路由模式(重点)

Virtual Server via Direct Routing(VS/DR)

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

image.png-104.2kB
只修改目标MAC地址,通过MAC找到RS节点(无法跨网段找到RS节点)

1.6.6 DR模式特点小结:
  • 通过在调度器LB上修改数据包的目的MAC地址实现转发。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
  • 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式相比)
  • 因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(缺点)
  • RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP
  • 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(缺点)
  • 当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
  • 总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单,易用,高效。日2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT模式)
  • 直接对外的访问业务,例如:Web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQl,存储系统RS节点,最好只用内部IP地址。
1.6.7 FULLNAT模式-(了解即可)

image.png-177.4kB

image.png-217.9kB

image.png-170.2kB
淘宝的LVS应用模式

1.6.8 FULLANT特点:
  • 源IP改成不同的VIP和目的IP改成RIP
  • RS处理完毕返回时,返回给不同的LVS调度器
  • 所有LVS调度器之间通过session表进行Client Address的共享

1.7 LVS的调度算法

  • LVS的调度算法决定了如何在集群节点之间分布工作负荷。
  • 当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别:
  • 固定调度方法:rr,wrr,dh,sh
  • 动态调度算法:wlc,lc,lblc,lblcr,SED,NQ

10种调度算法见如下表格(rr,wrr,wlc重点):

算法 说明
rr 轮循调度,它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简单,但是只适合于RS节点处理性能相差不大的情况
wrr 权重轮循,它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数
dh 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS
sh 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS
wlc 加权最小连接数调度,实际连接数除以权值,最小的RS作为分配的RS
lc 最小连接数调度,连接数最小的RS作为分配的RS
lblc 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台RS节点
lblcr 基于地址带重复最小连接数调度
SED 最短的期望的延迟(不成熟)
NQ 最小队列调度(不成熟)

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

  • 一般的网络服务,如Http,Mail,MySQL等,常用的LVS调度算法为:
    • 基本轮叫调度rr算法
    • 加权最小连接调度wlc
    • 加权轮叫调度wrr算法
  • 基于局部性的最少链接LBLC和带复制的基于局部性最少链接LBLCR主要适用于Web Cache和Db Cache集群,但是我们很少这样用。(都是一致性哈希算法)
  • 源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
  • 最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务。

实际使用中,这些算法的适用范围不限于这些。我们最好参考内核中的连接调度算法的实现原理,根据具体业务需求合理的选型。

1.9 LVS集群的特点

LVS集群的特点可以归结如下:

1.9.1 功能:

实现三种IP负载均衡技术和10种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每个虚拟服务都有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie 和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of service)攻击,实现了三种防卫策略:有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行检测,能及时将故障屏蔽,实现系统的高可用性。主,从调度器能周期性地进行状态同步,从而实现更高的可用性。

1.9.2 适用性

(1)后端真实服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。

(2)负载均衡调度器LB能够支持绝大多数的TCP和UDP协议:

协议 内容
TCP HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等
UDP DNS,NTP,TCP,视频,音频流播放协议等

无需对客户机和服务作任何修改,可适用大多数Internet服务。

(3)调度器本身当前不支持windows系统。支持大多数的Linux和UINIX系统。

1.9.3 性能

LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s

1.9.4 可靠性

LVS服务器集群软件已经在很多大型的,关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。

1.9.5 软件许可证

LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。

1.10 LVS的官方中文阅读资料

标题 地址
LVS项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html

2. 手动实现LVS的负载均衡功能(DR模式)

2.1 安装LVS软件

2.1.1 LVS应用场景说明

(1)数据库及memcache等对内业务的负载均衡环境

管理IP地址 角色 备注
192.168.200.95 LVS调度器(Director) 对外提供服务的VIP为192.168.200.250
192.168.200.96 RS1 (真实服务器)
192.168.200.97 RS2 (真实服务器)

特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡

(2)web服务或web cache等负载均衡环境

外部IP地址 内部IP地址 角色 备注
192.168.43.95 192.168.200.95 LVS调度器(Director) 对外提供服务的VIP为192.168.200.250
192.168.43.96 192.168.200.96 RS1(真实服务器)
192.168.43.97 192.168.200.97 RS2(真实服务器)

提示:
这个表格一般是提供Web或Web cache负载均衡的情况,此种情况特点为双网卡环境。这里把192.168.0.200/24假设为内网卡,192.168.200.200/24假设为外网卡。

2.1.2 实验一概述

image.png-31.8kB

内部IP(eth0) 网卡模式 外部IP(eth1) 网卡模式 角色 备注
192.168.200.95 NAT8 LVS负载均衡器 VIP:192.168.200.250 网关为:192.168.200.99
192.168.200.96 NAT8 Web01节点 网关为:192.168.200.99
192.168.200.97 NAT8 Web02节点 网关为:192.168.200.99
192.168.200.98 NAT8 内网客户端 网关为:192.168.200.99
192.168.200.99 NAT8 192.168.43.99 桥接 网关型防火墙 双网卡均无网关
192.168.43.100 桥接 外网客户端 不配网关
2.1.3 两台Web配置简单的http服务(NginxWeb02同理)

(1)安装依赖软件包

  1. [root@ApacheWeb01 ~]# yum -y install gcc gcc-c++ make cmake unzip tree
  2. [root@ApacheWeb01 ~]# rpm -qa gcc gcc-c++ make cmake unzip tree
  3. gcc-c++-4.4.7-4.el6.x86_64
  4. tree-1.5.3-2.el6.x86_64
  5. make-3.81-20.el6.x86_64
  6. gcc-4.4.7-4.el6.x86_64
  7. cmake-2.6.4-5.el6.x86_64
  8. unzip-6.0-1.el6.x86_64

(2)源码编译构建apache服务

  1. #为了避免冲突,若系统中已经安装httpd服务,务必删除
  2. [root@ApacheWeb01 ~]# rpm -q httpd
  3. package httpd is not installed
  4. #源码构建apache
  5. [root@ApacheWeb01 ~]# tar xf httpd-2.2.17.tar.gz -C /usr/src/
  6. [root@ApacheWeb01 ~]# cd /usr/src/httpd-2.2.17/
  7. [root@ApacheWeb01 httpd-2.2.17]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make && make install
  8. #以下省略。。。
  1. [root@ApacheWeb01 httpd-2.2.17]# cd /usr/local/httpd/
  2. [root@ApacheWeb01 httpd]# ls
  3. bin build cgi-bin conf error htdocs icons include lib logs man manual modules
  4. [root@ApacheWeb01 httpd]# ln -s /usr/local/httpd/bin/* /usr/local/bin/
  5. [root@ApacheWeb01 httpd]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
  6. [root@ApacheWeb01 httpd]# chmod +x /etc/init.d/httpd
  1. [root@ApacheWeb01 httpd]# cd /usr/local/httpd/htdocs/
  2. [root@ApacheWeb01 htdocs]# echo "`hostname -I` I am apache" > index.html
  3. [root@vWeb01 htdocs]# cat index.html
  4. 192.168.200.96 I am apache
  5. [root@ApacheWeb01 htdocs]# cd /usr/local/httpd/conf
  6. [root@ApacheWeb01 conf]# awk '/#ServerName/{print NR,$0}' httpd.conf
  7. 97 #ServerName www.example.com:80
  8. [root@ApacheWeb01 conf]# sed -i -e '97 s/#//;s/example/yunjisuan/' httpd.conf
  9. [root@ApacheWeb01 conf]# sed -n '97p' httpd.conf
  10. ServerName www.yunjisuan.com:80
  11. [root@ApacheWeb01 conf]# /etc/init.d/httpd start
  12. [root@ApacheWeb01 conf]# netstat -antup | grep httpd
  13. tcp 0 0 :::80 :::* LISTEN 53295/httpd
  1. [root@ApacheWeb01 conf]# echo "`hostname -I` www.yunjisuan.com" >> /etc/hosts
  2. [root@ApacheWeb01 conf]# tail -1 /etc/hosts
  3. 192.168.200.96 www.yunjisuan.com
  4. [root@ApacheWeb01 conf]# curl www.yunjisuan.com
  5. 192.168.200.96 I am apache

(3)开启apache状态页

要打开apache的ServerStatus页面,需要在httpd.conf文件最下边加入代码段

  1. [root@ApacheWeb01 conf]# pwd
  2. /usr/local/httpd/conf
  3. [root@ApacheWeb01 conf]# tail -7 /usr/local/httpd/conf/httpd.conf
  4. ExtendedStatus On
  5. <location /server-status>
  6. SetHandler server-status
  7. Order Deny,Allow
  8. Deny from all
  9. Allow from 127.0.0.1
  10. </location>
  1. #最后,重启动apache即可
  2. [root@ApacheWeb01 conf]# /etc/init.d/httpd restart

(4)下载apache zabbix模版并解压

  1. #从如下地址下载apache zabbix模版:
  2. [root@ApacheWeb01 ~]# wget https://github.com/lorf/zapache/archive/master.zip
  3. #解压zip格式压缩文件
  4. [root@ApacheWeb01 ~]# unzip master
  5. [root@ApacheWeb01 ~]# ls -d zapache-master/
  6. zapache-master/
  7. [root@ApacheWeb01 ~]# tree zapache-master/
  8. zapache-master/
  9. ├── httpd-server-status.conf.sample
  10. ├── README.md
  11. ├── userparameter_zapache.conf.sample
  12. ├── zapache
  13. ├── zapache-template-active.xml
  14. └── zapache-template.xml
  15. 0 directories, 6 files
2.1.4 开始安装LVS

以下的安装都是在LVS LB 192.168.200.95上

(1)下载相关软件包

  1. wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz # <===适合5.x系统
  2. wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz # <===适合6.x系统

(2)安装准备命令

  1. [root@LVS ~]# lsmod | grep ip_vs #查看linux内核是否有ipvs服务
  2. [root@LVS ~]# uname -r #查看内核版本
  3. 2.6.32-431.el6.x86_64
  4. [root@LVS ~]# cat /etc/redhat-release #查看系统版本
  5. CentOS release 6.5 (Final)
  6. [root@LVS ~]# yum -y install kernel-devel #光盘安装
  7. [root@LVS ~]# rpm -qa kernel-devel
  8. kernel-devel-2.6.32-431.el6.x86_64
  9. [root@LVS ~]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/
  10. drwxr-xr-x. 22 root root 4096 Sep 24 18:49 /usr/src/kernels/2.6.32-431.el6.x86_64/
  11. #安装完就会出现此目录
  12. [root@LVS ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #做一个软连接
  13. [root@LVS ~]# ll -d /usr/src/linux/
  14. drwxr-xr-x. 22 root root 4096 Sep 24 18:49 /usr/src/linux/
  15. [root@LVS ~]# ll /usr/src/
  16. total 8
  17. drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug
  18. drwxr-xr-x. 3 root root 4096 Sep 24 18:48 kernels
  19. lrwxrwxrwx. 1 root root 39 Sep 24 18:50 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/

特别注意:
此ln命令的链接路径要和uname -r输出结果内核版本对应,工作中如果做安装虚拟化可能有多个内核路径
如果没有/usr/src/kernels/2.6.32-431.el6.x86_64/路径,很可能是因为缺少kernel-devel软件包。可通过yum进行安装
centos5.x版本不能用ipvs1.26

(3)安装lvs命令:

  1. [root@LVS rpm]# pwd
  2. /root/rpm
  3. [root@LVS rpm]# yum -y install createrepo
  4. [root@LVS rpm]# which createrepo
  5. /usr/bin/createrepo
  6. [root@LVS rpm]# createrepo -v .

image.png-8.9kB

  1. [root@LVS rpm]# cat /etc/yum.repos.d/CentOS-Media.repo
  2. [c6-media]
  3. name=CentOS-$releasever - Media
  4. baseurl=file:///media/CentOS/
  5. file:///media/cdrom/
  6. file:///media/cdrecorder/
  7. gpgcheck=1
  8. enabled=1
  9. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
  10. [rpm]
  11. name=rpm
  12. baseurl=file:///root/rpm/
  13. gpgcheck=0
  14. enabled=1
  15. [root@LVS rpm]# yum -y clean all
  16. [root@LVS rpm]# yum makecache
  1. [root@LVS rpm]# yum -y install libnl* popt* #需要通过公网源安装
  1. #去掉[rpm]本地源yum安装依赖包
  2. [root@LVS ~]# yum -y install gcc gcc-c++ make cmake
  3. [root@LVS ~]# rpm -qa gcc gcc-c++ make cmake
  4. gcc-c++-4.4.7-4.el6.x86_64
  5. make-3.81-20.el6.x86_64
  6. gcc-4.4.7-4.el6.x86_64
  7. cmake-2.6.4-5.el6.x86_64
  8. [root@LVS ~]# tar xf ipvsadm-1.26.tar.gz -C /usr/src/
  9. [root@LVS ~]# cd /usr/src/ipvsadm-1.26/
  10. [root@LVS ipvsadm-1.26]# make && make install #直接编译不需要./configure
  11. [root@LVS ipvsadm-1.26]# which ipvsadm
  12. /sbin/ipvsadm
  13. [root@LVS ipvsadm-1.26]# /sbin/ipvsadm #以绝对路径执行一下,一致可以看见版本信息
  14. IP Virtual Server version 1.2.1 (size=4096)
  15. Prot LocalAddress:Port Scheduler Flags
  16. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  17. [root@LVS ipvsadm-1.26]# lsmod | grep ip_vs #执行完/sbin/ipvsadm就会有信息
  18. ip_vs 125220 0
  19. libcrc32c 1246 1 ip_vs
  20. ipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
  21. #==>出现这个内容就表示LVS已经安装好,并加载到了内核
  • LVS安装小结:
    • CentOS5.X安装lvs,使用1.24版本。
    • CentOS6.X安装lvs,使用1.26版本。
    • 安装lvs后,要执行ipvsadm把ip_vs模块加载到内核。

2.2 手动配置LVS负载均衡服务

2.2.1 手工添加lvs转发

(1)配置LVS虚拟IP(VIP)

  1. [root@LVS ~]# ifconfig eth0:0 192.168.200.250 broadcast 192.168.200.250 netmask 255.255.255.0 up
  2. [root@LVS ~]# ifconfig eth0:0
  3. eth0:0 Link encap:Ethernet HWaddr 00:0C:29:36:4B:93
  4. inet addr:192.168.200.250 Bcast:192.168.200.250 Mask:255.255.255.0
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

(2)手工执行配置添加LVS服务并增加两台RS

  1. [root@LVS ~]# ipvsadm -C #清空ipvs历史设置
  2. [root@LVS ~]# ipvsadm --set 30 5 60 #设置超时时间(tcp tcpfin udp)(实验建议不写)
  3. [root@LVS ~]# ipvsadm -A -t 192.168.200.250:80 -s rr -p 20(实验不写-p 20
  4. #说明:
  5. -A:添加一个虚拟路由主机(LB
  6. -t:指定虚拟路由主机的VIP地址和监听端口
  7. -s:指定负载均衡算法
  8. -p:指定会话保持时间
  1. [root@LVS ~]# ipvsadm -a -t 192.168.200.250:80 -r 192.168.200.96:80 -g -w 1
  2. [root@LVS ~]# ipvsadm -a -t 192.168.200.250:80 -r 192.168.200.97:80 -g -w 1
  3. #说明:
  4. -a:添加RS节点
  5. -t:指定虚拟路由主机的VIP地址和监听端口
  6. -r:指定RS节点的RIP地址和监听端口
  7. -g:指定DR模式
  8. -w:指定权值

(3)查看lvs配置结果

  1. [root@LVS ~]# ipvsadm -L -n
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. TCP 192.168.200.250:80 rr
  6. -> 192.168.200.96:80 Route 1 0 0
  7. -> 192.168.200.97:80 Route 1 0 0

(4)ipvs配置删除方法

  1. [root@lvs01 ~]# ipvsadm -D -t 192.168.200.250:80 -s rr #删除虚拟路由主机
  2. [root@lvs01 ~]# ipvsadm -d -t 192.168.200.250:80 -r 192.168.200.96:80
  3. #删除RS节点

此时,可以打开浏览器访问http://192.168.200.250体验结果,如果没意外,是无法访问的。(RS将包丢弃了)

image.png-296.8kB

2.2.2 手工在RS端绑定
  1. #在ApacheWeb01上操作
  2. [root@ApacheWeb01 ~]# ifconfig lo:0 192.168.200.250/32 up #掩码必须设置32
  3. [root@ApacheWeb01 ~]# ifconfig lo:0
  4. lo:0 Link encap:Local Loopback
  5. inet addr:192.168.200.250 Mask:0.0.0.0
  6. UP LOOPBACK RUNNING MTU:16436 Metric:1
  7. #在ApacheWeb02上操作
  8. [root@ApacheWeb02 ~]# ifconfig lo:0 192.168.200.250/32 up #掩码必须设置32
  9. [root@ApacheWeb02 ~]# ifconfig lo:0
  10. lo:0 Link encap:Local Loopback
  11. inet addr:192.168.200.250 Mask:0.0.0.0
  12. UP LOOPBACK RUNNING MTU:16436 Metric:1
2.2.3 浏览器http://192.168.200.250测试LVS转发效果

image.png-9.5kB

image.png-9.9kB

注意:
在测试时候你会发现刷新看的都是同一个RS节点
这是因为浏览器的缓存问题
等一段时间以后,刷新就会重新负载均衡到新RS节点了

2.2.4 关于DR模式RS节点的ARP抑制的问题

image.png-297.6kB

  • 因为在DR模式下,RS节点和LVS同处一个局域网网段内。
  • 当网关通过ARP广播试图获取VIP的MAC地址的时候
  • LVS和节点都会接收到ARP广播并且LVS和节点都绑定了192.168.200.250这个VIP,所以都会去响应网关的这个广播,导致冲突现象。
  • 因此,我们需要对RS节点做抑制ARP广播的措施。
  1. #NginxWeb02同理
  2. [root@ApacheWeb01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  3. [root@ApacheWeb01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  4. [root@ApacheWeb01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  5. [root@ApacheWeb01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
2.2.5 配置网关型防火墙

防火墙的双网卡都不要设置网关,因为自己的就网关

  1. [root@网关型iptables ~]# ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. inet6 ::1/128 scope host
  6. valid_lft forever preferred_lft forever
  7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  8. #内网网卡
  9. link/ether 00:0c:29:4a:41:4e brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.200.99/24 brd 192.168.200.255 scope global eth0
  11. inet6 fe80::20c:29ff:fe4a:414e/64 scope link
  12. valid_lft forever preferred_lft forever
  13. 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  14. #外网网卡
  15. link/ether 00:0c:29:4a:41:58 brd ff:ff:ff:ff:ff:ff
  16. inet 192.168.43.99/24 brd 192.168.43.255 scope global eth1
  17. inet6 fe80::20c:29ff:fe4a:4158/64 scope link
  18. valid_lft forever preferred_lft forever
  19. [root@网关型iptables ~]# route -n
  20. Kernel IP routing table
  21. Destination Gateway Genmask Flags Metric Ref Use Iface
  22. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  23. 192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  24. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  25. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  1. #防火墙不需要配置网关,因此没有默认路由信息
  2. [root@网关型iptables ~]# head /etc/sysctl.conf
  3. # Kernel sysctl configuration file for Red Hat Linux
  4. #
  5. # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
  6. # sysctl.conf(5) for more details.
  7. # Controls IP packet forwarding
  8. net.ipv4.ip_forward = 1 #修改为1
  9. # Controls source route verification
  10. net.ipv4.conf.default.rp_filter = 1
  11. [root@网关型iptables ~]# sysctl -p #让配置即刻生效
  12. net.ipv4.ip_forward = 1
  13. net.ipv4.conf.default.rp_filter = 1
  14. net.ipv4.conf.default.accept_source_route = 0
  15. kernel.sysrq = 0
  16. kernel.core_uses_pid = 1
  17. net.ipv4.tcp_syncookies = 1
  18. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  19. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  20. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  21. kernel.msgmnb = 65536
  22. kernel.msgmax = 65536
  23. kernel.shmmax = 68719476736
  24. kernel.shmall = 4294967296

特别提示:
ApacheWeb01,ApacheWeb02,LVS负载均衡器,以及内网客户端均将网关设置成网关型防火墙的eth0:192.168.200.99

2.2.6 配置内网客户端

内网客户端用于模拟lvs应用于内网的负载均衡情况
比如lvs数据库读负载均衡,比如lvs memcached缓存组负载均衡
由于这类型的负载均衡请求都是由内网服务器发起,因此用内网客户端来模拟

  1. #内网客户端访问测试
  2. [root@内网Client ~]# hostname -I
  3. 192.168.200.98 #内网客户端IP
  4. [root@内网Client ~]# route -n #默认路由为网关防火墙
  5. Kernel IP routing table
  6. Destination Gateway Genmask Flags Metric Ref Use Iface
  7. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  8. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  9. 0.0.0.0 192.168.200.99 0.0.0.0 UG 0 0 0 eth0
  10. [root@内网Client ~]# curl 192.168.200.250
  11. 192.168.200.96 I am apache
  12. [root@内网Client ~]# curl 192.168.200.250
  13. 192.168.200.97 I am apache
  14. [root@内网Client ~]# curl 192.168.200.250
  15. 192.168.200.96 I am apache
  16. [root@内网Client ~]# curl 192.168.200.250
  17. 192.168.200.97 I am apache
  18. #从上面可以看出,内网客户端模拟访问lvs负载均衡器,成功!
2.2.7 配置外网客户端

外网客户端模拟的是lvs转发外网用户访问需求给RS节点处理的情况
模拟外网客户端,要求客户端不能配置任何网关

image.png-19.4kB

由于外网客户端要访问内网的LVS需要经过网关防火墙的跳转,因此需要在防火墙服务器上做iptables的DNAT和SNAT,配置如下:

  1. [root@网关型iptables ~]# hostname -I
  2. 192.168.200.99(内网网卡) 192.168.43.99 (外网网卡)
  3. [root@网关型iptables ~]# route -n
  4. Kernel IP routing table
  5. Destination Gateway Genmask Flags Metric Ref Use Iface
  6. 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  7. 192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  8. 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
  9. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  1. [root@网关型iptables ~]# iptables -t nat -A PREROUTING -i eth1 -d 192.168.43.99 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.250
  2. [root@网关型iptables ~]# iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.43.99
  3. [root@网关型iptables ~]# iptables -t nat -L -nv
  4. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  5. pkts bytes target prot opt in out source destination
  6. 0 0 DNAT tcp -- eth1 * 0.0.0.0/0 192.168.43.99 tcp dpt:80 to:192.168.200.250
  7. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  8. pkts bytes target prot opt in out source destination
  9. 0 0 SNAT all -- * eth1 192.168.200.0/24 0.0.0.0/0 to:192.168.43.99
  10. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  11. pkts bytes target prot opt in out source destination

进行外网客户端访问LVS负载均衡器测试
image.png-18.2kB

特别提示:
由于浏览器缓存及LVS默认会话保持等影响,个人简单的测试切换RS的几率要很多次并且间隔一定时间访问才行。尽可能关闭浏览器换不同的客户端IP来测试,效果更明显一些。用单机测试是有这种情况(负载均衡的算法倾向于一个客户端IP定向到一个后端服务器,以保持会话连贯性),如果用两三台机器去测试也许就不一样。
在测试访问的同时可以通过ipvsadm -Lnc来查看访问结果,如下所示:

  1. [root@LVS ~]# ipvsadm -lnc
  2. IPVS connection entries
  3. pro expire state source virtual destination
  4. TCP 01:45 FIN_WAIT 192.168.43.100:53085 192.168.200.250:80 192.168.200.96:80
  5. TCP 01:47 FIN_WAIT 192.168.43.100:53087 192.168.200.250:80 192.168.200.96:80
  6. TCP 01:48 FIN_WAIT 192.168.43.100:53088 192.168.200.250:80 192.168.200.97:80
  7. TCP 01:46 FIN_WAIT 192.168.43.100:53086 192.168.200.250:80 192.168.200.97:80

2.3 arp抑制技术参数说明

2.3.1 arp_ignore-INTRGER
  • 定义对目标地址为本地IP的ARP询问不同的应答模式
    • 0(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。
    • 1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求
    • 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
    • 3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
    • 4-7:保留未使用
    • 8:不回应所有(本地地址)的arp查询。
2.3.2 arp_announce-INTEGER
  • 对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口。
    • 0(默认值):在任意网络接口(eth0,eth1,lo)上的任何本地地址
    • 1:尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用。此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
    • 2:对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送。限制了使用本地的vip地址作为优先的网络接口。

2.4 开发脚本配置LVS负载均衡器端

2.4.1 LVS负载均衡器端自动配置脚本:
  1. [root@LVS ~]# cat ipvs_server.sh
  2. #!/bin/bash
  3. # author:Mr.yang
  4. #LVS scripts
  5. . /etc/init.d/functions
  6. VIP=192.168.200.250
  7. SUBNET="eth0:`echo $VIP | awk -F "." '{print $4}'`"
  8. PORT=80
  9. RIP=(
  10. 192.168.200.96
  11. 192.168.200.97
  12. )
  13. function start(){
  14. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  15. stop
  16. fi
  17. ifconfig $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
  18. ipvsadm -C
  19. ipvsadm --set 30 5 60
  20. ipvsadm -A -t $VIP:$PORT -s rr -p 20
  21. for ((i=0;i<${#RIP[*]};i++))
  22. do
  23. ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1
  24. done
  25. }
  26. function stop(){
  27. ipvsadm -C
  28. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  29. ifconfig $SUBNET down
  30. fi
  31. route del -host $VIP dev eth0 &>/dev/null
  32. }
  33. case "$1" in
  34. start)
  35. start
  36. echo "ipvs is started"
  37. ;;
  38. stop)
  39. stop
  40. echo "ipvs is stopped"
  41. ;;
  42. restart)
  43. stop
  44. echo "ipvs is stopped"
  45. start
  46. echo "ipvs is started"
  47. ;;
  48. *)
  49. echo "USAGE:$0 {start | stop | restart}"
  50. esac
2.4.2 RS节点Web服务器端自动配置脚本
  1. [root@LVS ~]# cat rs_server.sh
  2. #!/bin/bash
  3. # author:Mr.yang
  4. # RS_sever scripts
  5. . /etc/rc.d/init.d/functions
  6. VIP=192.168.200.250
  7. case "$1" in
  8. start)
  9. echo "start LVS of REALServer IP"
  10. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  11. /sbin/ifconfig $interface $VIP broadcast $VIP netmask 255.255.255.255 up
  12. route add -host $VIP dev $interface
  13. echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  14. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  15. echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  16. echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
  17. ;;
  18. stop)
  19. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  20. /sbin/ifconfig $interface down
  21. echo "STOP LVS of REALServer IP"
  22. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  23. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
  24. echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
  25. echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
  26. ;;
  27. *)
  28. echo "Usage: $0 {start|stop}"
  29. exit 1
  30. esac

3. 企业LVS负载均衡高可用最优方案(LVS+Keepalived)

3.1 实验二概述

image.png-31.7kB

内部IP(eth0) 网卡模式 外部IP(eth1) 网卡模式 角色 备注
192.168.200.94 NAT8 192.168.100.50 NAT(仅主机) LVS负载均衡主服务器 VIP:192.168.200.240 网关为:192.168.200.99
192.168.200.95 NAT8 192.168.100.100 NAT(仅主机) LVS负载均衡副服务器 VIP:192.168.200.250 网关为:192.168.200.99
192.168.200.96 NAT8 Web01节点 网关为:192.168.200.99
192.168.200.97 NAT8 Web02节点 网关为:192.168.200.99
192.168.200.100 NAT8 Nginx反向代理 网关为:192.168.200.99
192.168.200.98 NAT8 内网客户端 网关为:192.168.200.99
192.168.200.99 NAT8 192.168.43.99 桥接 网关型防火墙 双网卡均无网关
192.168.43.100 桥接 外网客户端 不配网关

3.2 LVS负载均衡器主和备安装LVS软件

过程略

3.3 两台Web服务器安装Nginx,一台实现Nginx反向代理

3.3.1 安装Nginx软件
  1. [root@lb ~]# yum install -y pcre-devel openssl-devel gcc gcc-c++ make curl
  2. [root@lb ~]# rpm -qa pcre-devel openssl-devel gcc gcc-c++ make curl
  3. gcc-c++-4.4.7-4.el6.x86_64
  4. pcre-devel-7.8-6.el6.x86_64
  5. make-3.81-20.el6.x86_64
  6. gcc-4.4.7-4.el6.x86_64
  7. openssl-devel-1.0.1e-15.el6.x86_64
  8. curl-7.19.7-37.el6_4.x86_64
  1. [root@lb ~]# useradd -s /sbin/nologin -M www
  2. [root@lb ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
  3. [root@lb ~]# cd /usr/src/nginx-1.10.2/
  4. [root@lb nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install
  5. 以下省略。。。
  6. [root@lb nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
3.3.2 配置用于测试的(两台)Web服务

将在两台NginxWeb服务器的节点上操作:配置并查看Web服务器的配置结果

  1. [root@NginxWeb01 conf]# pwd
  2. /usr/local/nginx/conf
  3. [root@NginxWeb01 conf]# cat nginx.conf
  4. worker_processes 1;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include mime.types;
  10. default_type application/octet-stream;
  11. sendfile on;
  12. keepalive_timeout 65;
  13. log_format main '$remote_addr-$remote_user[$time_local]"$request"'
  14. '$status $body_bytes_sent "$http_referer"'
  15. '"$http_user_agent""$http_x_forwarded_for"';
  16. server {
  17. listen 80;
  18. server_name bbs.yunjisuan.com;
  19. location / {
  20. root html/bbs;
  21. index index.html index.htm;
  22. }
  23. access_log logs/access_bbs.log main;
  24. }
  25. server {
  26. listen 80;
  27. server_name www.yunjisuan.com;
  28. location / {
  29. root html/www;
  30. index index.html index.htm;
  31. }
  32. access_log logs/access_www.log main;
  33. }
  34. }
3.3.3 配置完成后检查语法,启动Nginx服务(两台Web)
  1. [root@NginxWeb01 conf]# nginx -t
  2. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  3. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  4. [root@NginxWeb01 ~]# /usr/local/nginx/sbin/nginx
  5. [root@NginxWeb01 ~]# netstat -antup | grep nginx
  6. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 56374/nginx
3.3.4 填充测试文件数据(两台Web),如下:
  1. [root@NginxWeb01 ~]# mkdir /usr/local/nginx/html/{www,bbs}
  2. [root@NginxWeb01 ~]# echo "`hostname -I `www" >> /usr/local/nginx/html/www/index.html
  3. [root@NginxWeb01 ~]# cat /usr/local/nginx/html/www/index.html
  4. 192.168.200.96 www
  5. [root@NginxWeb01 ~]# echo "`hostname -I `bbs" >> /usr/local/nginx/html/bbs/index.html
  6. [root@NginxWeb01 ~]# cat /usr/local/nginx/html/bbs/index.html
  7. 192.168.200.96 bbs
3.3.5 配置解析两台Web的IP和主机名后,用curl测试一下
  1. #NginxWeb01
  2. [root@NginxWeb01 ~]# tail -2 /etc/hosts
  3. 192.168.200.96 www.yunjisuan.com
  4. 192.168.200.96 bbs.yunjisuan.com
  5. [root@NginxWeb01 ~]# which curl
  6. /usr/bin/curl
  7. [root@NginxWeb01 ~]# curl www.yunjisuan.com
  8. 192.168.200.96 www
  9. [root@NginxWeb01 ~]# curl bbs.yunjisuan.com
  10. 192.168.200.96 bbs
  1. #NginxWeb02
  2. [root@NginxWeb02 ~]# tail -2 /etc/hosts
  3. 192.168.200.97 www.yunjisuan.com
  4. 192.168.200.97 bbs.yunjisuan.com
  5. [root@NginxWeb02 ~]# which curl
  6. /usr/bin/curl
  7. [root@NginxWeb02 ~]# curl www.yunjisuan.com
  8. 192.168.200.97 www
  9. [root@NginxWeb02 ~]# curl bbs.yunjisuan.com
  10. 192.168.200.97 bbs
3.3.6 进行一个简单的Nginx负载均衡配置
  1. [root@lb conf]# pwd
  2. /usr/local/nginx/conf
  3. [root@lb conf]# cat nginx.conf
  4. worker_processes 1;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include mime.types;
  10. default_type application/octet-stream;
  11. sendfile on;
  12. keepalive_timeout 65;
  13. upstream www_server_pools {
  14. server 192.168.200.96:80 weight=1;
  15. server 192.168.200.97:80 weight=1;
  16. }
  17. server {
  18. listen 80;
  19. server_name www.yunjisuan.com;
  20. location / {
  21. proxy_pass http://www_server_pools;
  22. proxy_set_header host $host;
  23. }
  24. }
  25. }
3.3.7 检查语法,启动Nginx反向代理服务
  1. [root@lb conf]# nginx -t
  2. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  3. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  4. [root@lb conf]# /usr/local/nginx/sbin/nginx
  5. [root@lb conf]# netstat -antup | grep nginx
  6. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3876/nginx
3.3.8 检查负载均衡测试结果,Linux作为客户端的测试结果如下:
  1. [root@lb ~]# hostname -I #这里是lb负载均衡器IP
  2. 192.168.200.100
  3. [root@lb ~]# tail -1 /etc/hosts
  4. 192.168.200.100 www.yunjisuan.com
  5. 192.168.200.100 bbs.yunjisuan.com
  6. ---------------------------------------------------------------------
  7. [root@lb ~]# which curl
  8. /usr/bin/curl
  9. [root@lb conf]# curl www.yunjisuan.com
  10. 192.168.200.96 www #可以看出两个Web节点按照1:1的比例被访问.
  11. [root@lb conf]# curl www.yunjisuan.com
  12. 192.168.200.97 www #可以看出两个Web节点按照1:1的比例被访问.
  13. [root@lb conf]# curl www.yunjisuan.com
  14. 192.168.200.96 www
  15. [root@lb conf]# curl www.yunjisuan.com
  16. 192.168.200.97 www
  17. [root@lb conf]# curl bbs.yunjisuan.com
  18. 192.168.200.96 bbs #可以看出两个Web节点按照1:1的比例被访问.
  19. [root@lb conf]# curl bbs.yunjisuan.com
  20. 192.168.200.97 bbs #可以看出两个Web节点按照1:1的比例被访问.
  21. [root@lb conf]# curl bbs.yunjisuan.com
  22. 192.168.200.96 bbs
  23. [root@lb conf]# curl bbs.yunjisuan.com
  24. 192.168.200.97 bbs
3.3.9 手工在RS端绑定(NginxWeb02同理操作)
  1. [root@NginxWeb01 ~]# ifconfig lo:0 192.168.200.240/32 up
  2. [root@NginxWeb01 ~]# ifconfig lo:1 192.168.200.250/32 up
  3. [root@NginxWeb01 ~]# ifconfig lo:0 #主VIP
  4. lo:0 Link encap:Local Loopback
  5. inet addr:192.168.200.240 Mask:0.0.0.0
  6. UP LOOPBACK RUNNING MTU:16436 Metric:1
  7. [root@NginxWeb01 ~]# ifconfig lo:1 #副VIP
  8. lo:1 Link encap:Local Loopback
  9. inet addr:192.168.200.250 Mask:0.0.0.0
  10. UP LOOPBACK RUNNING MTU:16436 Metric:1

3.4 LVS负载均衡器主(备)安装Keepalived软件

  1. [root@LVS ~]# yum -y install keepalived #光盘本地yum源安装即可
  2. [root@LVS ~]# which keepalived
  3. /usr/sbin/keepalived

3.5 启动及检查Keepalived服务的命令如下:(主备同步操做)

  1. [root@LVS ~]# /etc/init.d/keepalived start
  2. Starting keepalived: [ OK ]
  3. [root@LVS ~]# ps -ef | grep keep | grep -v grep
  4. root 1441 1 0 22:47 ? 00:00:00 /usr/sbin/keepalived -D
  5. root 1443 1441 0 22:47 ? 00:00:00 /usr/sbin/keepalived -D
  6. root 1444 1441 0 22:47 ? 00:00:00 /usr/sbin/keepalived -D
  7. #提示:启动后有3个Keepalived进程表示安装正确
  8. [root@LVS ~]# ip add | grep 192.168
  9. inet 192.168.200.94/24 brd 192.168.200.255 scope global eth0
  10. inet 192.168.200.240/24 brd 192.168.200.240 scope global secondary eth0:0
  11. inet 192.168.100.50/24 brd 192.168.100.255 scope global eth1
  12. #提示:默认情况会启动三个VIP地址
  13. [root@LVS ~]# /etc/init.d/keepalived stop
  14. Stopping keepalived: [ OK ]
  15. #提示:测试完毕后关闭服务,上述测试需要同时在lb01和lb02两台服务器上进行

3.6 仅实现LVS负载均衡器主和备的keepalived高可用功能

3.6.1 LVS负载均衡器主的keepalived配置文件内容如下

  1. [root@LVS keepalived]# pwd
  2. /etc/keepalived
  3. [root@LVS keepalived]# cat keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. 1773464408@qq.com
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 127.0.0.1
  11. }
  12. smtp_connect_timeout 30
  13. router_id yang1
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER
  17. interface eth1
  18. virtual_router_id 55
  19. priority 150
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. virtual_ipaddress {
  26. 192.168.200.240/24 dev eth0 label eth0:1
  27. }
  28. }
  29. vrrp_instance VI_2 {
  30. state BACKUP
  31. interface eth1
  32. virtual_router_id 56
  33. priority 100
  34. advert_int 1
  35. authentication {
  36. auth_type PASS
  37. auth_pass 1111
  38. }
  39. virtual_ipaddress {
  40. 192.168.200.250/24 dev eth0 label eth0:2
  41. }
  42. }

3.6.2 LVS负载均衡器副的keepalived配置文件内容如下

  1. [root@LVS keepalived]# pwd
  2. /etc/keepalived
  3. [root@LVS keepalived]# cat keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. 1773464408@qq.com
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 127.0.0.1
  11. }
  12. smtp_connect_timeout 30
  13. router_id yang2
  14. }
  15. vrrp_instance VI_1 {
  16. state BACKUP
  17. interface eth1
  18. virtual_router_id 55
  19. priority 100
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. virtual_ipaddress {
  26. 192.168.200.240/24 dev eth0 label eth0:1
  27. }
  28. }
  29. vrrp_instance VI_2 {
  30. state MASTER
  31. interface eth1
  32. virtual_router_id 56
  33. priority 150
  34. advert_int 1
  35. authentication {
  36. auth_type PASS
  37. auth_pass 1111
  38. }
  39. virtual_ipaddress {
  40. 192.168.200.250/24 dev eth0 label eth0:2
  41. }
  42. }

3.7 实战演练

3.7.1 在主LVS上进行如下操作:
  1. [root@LVS ~]# /etc/init.d/keepalived start
  2. Starting keepalived: [ OK ]
  3. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  4. inet 192.168.200.240/24 brd 192.168.200.240 scope global secondary eth0:0
  5. inet 192.168.200.250/24 scope global secondary eth0:2
  6. #由于副LVS还没开服务,所以主备VIP都显示在主LVS上
3.7.2 在副LVS上进行如下操作:
  1. [root@LVS ~]# /etc/init.d/keepalived start
  2. Starting keepalived: [ OK ]
  3. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  4. inet 192.168.200.250/24 brd 192.168.200.250 scope global secondary eth0:0
  5. #在主LVS开启的情况下,副LVS开启服务后,只显示了vrrp_instance VI_2实例副LVS作为主模式的VIP 192.168.200.250
  1. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  2. inet 192.168.200.240/24 brd 192.168.200.240 scope global secondary eth0:0
  3. #现在主LVS上只有192.168.200.240了

如果出现脑裂现象,不妨执行以下内容:

  1. [root@LVS ~]# ifconfig eth0:0 192.168.200.240 broadcast 192.168.200.240 netmask 255.255.255.0 down #把之前设置的VIP关掉
  2. [root@LVS ~]# ifconfig eth0:0 192.168.200.250 broadcast 192.168.200.250 netmask 255.255.255.0 down #把之前设置的VIP关掉

3.8 添加LVS的负载均衡规则

以下操作过程,在LVS主和备上完全一样

  1. [root@LVS ~]# ipvsadm -C
  2. [root@LVS ~]# ipvsadm -A -t 192.168.200.240:80 -s rr
  3. [root@LVS ~]# ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.96:80 -g -w 1
  4. [root@LVS ~]# ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.97:80 -g -w 1
  5. [root@LVS ~]# ipvsadm -A -t 192.168.200.250:80 -s rr
  6. [root@LVS ~]# ipvsadm -a -t 192.168.200.250:80 -r 192.168.200.96:80 -g -w 1
  7. [root@LVS ~]# ipvsadm -a -t 192.168.200.250:80 -r 192.168.200.97:80 -g -w 1
  8. [root@LVS ~]# ipvsadm -Ln
  9. IP Virtual Server version 1.2.1 (size=4096)
  10. Prot LocalAddress:Port Scheduler Flags
  11. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  12. TCP 192.168.200.240:80 rr
  13. -> 192.168.200.96:80 Route 1 0 0
  14. -> 192.168.200.97:80 Route 1 0 0
  15. TCP 192.168.200.250:80 rr
  16. -> 192.168.200.96:80 Route 1 0 0
  17. -> 192.168.200.97:80 Route 1 0 0

3.9 启动LVS主和备的keepalived服务

  1. #在主LVS上
  2. [root@LVS ~]# /etc/init.d/keepalived start
  3. Starting keepalived: [ OK ]
  4. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  5. inet 192.168.200.240/24 scope global secondary eth0:1
  6. #在副LVS上
  7. [root@LVS ~]# /etc/init.d/keepalived start
  8. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  9. inet 192.168.200.250/24 scope global secondary eth0:2

3.10 内网客户端进行访问测试

  1. [root@内网Client ~]# curl 192.168.200.240
  2. 192.168.200.96 bbs
  3. [root@内网Client ~]# curl 192.168.200.240
  4. 192.168.200.97 bbs
  5. [root@内网Client ~]# curl 192.168.200.240
  6. 192.168.200.96 bbs
  7. [root@内网Client ~]# curl 192.168.200.240
  8. 192.168.200.97 bbs
  9. [root@内网Client ~]# curl 192.168.200.250
  10. 192.168.200.96 bbs
  11. [root@内网Client ~]# curl 192.168.200.250
  12. 192.168.200.97 bbs
  13. [root@内网Client ~]# curl 192.168.200.250
  14. 192.168.200.96 bbs
  15. [root@内网Client ~]# curl 192.168.200.250
  16. 192.168.200.97 bbs
  17. #在LVS主上进行访问连接查询
  18. [root@LVS ~]# ipvsadm -Lnc
  19. IPVS connection entries
  20. pro expire state source virtual destination
  21. TCP 00:31 FIN_WAIT 192.168.200.98:46263 192.168.200.240:80 192.168.200.97:80
  22. TCP 00:29 FIN_WAIT 192.168.200.98:46260 192.168.200.240:80 192.168.200.96:80
  23. TCP 00:30 FIN_WAIT 192.168.200.98:46261 192.168.200.240:80 192.168.200.97:80
  24. TCP 00:30 FIN_WAIT 192.168.200.98:46262 192.168.200.240:80 192.168.200.96:80
  25. #在LVS副上进行访问连接查询
  26. [root@LVS ~]# ipvsadm -Lnc
  27. IPVS connection entries
  28. pro expire state source virtual destination
  29. TCP 01:48 FIN_WAIT 192.168.200.98:39253 192.168.200.250:80 192.168.200.97:80
  30. TCP 01:48 FIN_WAIT 192.168.200.98:39252 192.168.200.250:80 192.168.200.96:80
  31. TCP 01:47 FIN_WAIT 192.168.200.98:39251 192.168.200.250:80 192.168.200.97:80
  32. TCP 01:46 FIN_WAIT 192.168.200.98:39250 192.168.200.250:80 192.168.200.96:80
  1. #在LVS主上停掉keepalived服务
  2. [root@LVS ~]# /etc/init.d/keepalived stop
  3. Stopping keepalived: [ OK ]
  4. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  5. [root@LVS ~]#
  6. #在LVS副上查看VIP
  7. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  8. inet 192.168.200.250/24 scope global secondary eth0:2
  9. inet 192.168.200.240/24 scope global secondary eth0:1
  10. #再次在内网客户端上进行访问测试
  11. [root@内网Client ~]# curl 192.168.200.240
  12. 192.168.200.96 bbs
  13. [root@内网Client ~]# curl 192.168.200.240
  14. 192.168.200.97 bbs
  15. [root@内网Client ~]# curl 192.168.200.240
  16. 192.168.200.96 bbs
  17. [root@内网Client ~]# curl 192.168.200.240
  18. 192.168.200.97 bbs
  19. [root@内网Client ~]# curl 192.168.200.250
  20. 192.168.200.96 bbs
  21. [root@内网Client ~]# curl 192.168.200.250
  22. 192.168.200.97 bbs
  23. [root@内网Client ~]# curl 192.168.200.250
  24. 192.168.200.96 bbs
  25. [root@内网Client ~]# curl 192.168.200.250
  26. 192.168.200.97 bbs
  27. #在LVS副上进行访问连接查询
  28. [root@LVS ~]# ipvsadm -Lnc
  29. IPVS connection entries
  30. pro expire state source virtual destination
  31. TCP 01:32 FIN_WAIT 192.168.200.98:39262 192.168.200.250:80 192.168.200.97:80
  32. TCP 01:33 FIN_WAIT 192.168.200.98:39263 192.168.200.250:80 192.168.200.96:80
  33. TCP 01:24 FIN_WAIT 192.168.200.98:46278 192.168.200.240:80 192.168.200.96:80
  34. TCP 01:25 FIN_WAIT 192.168.200.98:46279 192.168.200.240:80 192.168.200.97:80
  35. TCP 01:24 FIN_WAIT 192.168.200.98:46277 192.168.200.240:80 192.168.200.97:80
  36. TCP 01:34 FIN_WAIT 192.168.200.98:39264 192.168.200.250:80 192.168.200.97:80
  37. TCP 01:22 FIN_WAIT 192.168.200.98:46276 192.168.200.240:80 192.168.200.96:80
  38. TCP 01:31 FIN_WAIT 192.168.200.98:39261 192.168.200.250:80 192.168.200.96:80
  39. #开启LVS主上的keepalived服务
  40. [root@LVS ~]# /etc/init.d/keepalived start
  41. Starting keepalived: [ OK ]
  42. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  43. inet 192.168.200.240/24 scope global secondary eth0:1
  44. #查看LVS副上VIP资源是否释放
  45. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  46. inet 192.168.200.250/24 scope global secondary eth0:2

综上,至此基于LVS的keepalived高可用功能实验完毕

3.11 通过Keepalived对LVS进行管理的功能实现

  1. [root@LVS keepalived]# pwd
  2. /etc/keepalived
  3. [root@LVS keepalived]# cat keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. 1773464408@qq.com
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 127.0.0.1
  11. }
  12. smtp_connect_timeout 30
  13. router_id yang1
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER
  17. interface eth1
  18. virtual_router_id 55
  19. priority 150
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. virtual_ipaddress {
  26. 192.168.200.240/24 dev eth0 label eth0:1
  27. }
  28. }
  29. vrrp_instance VI_2 {
  30. state BACKUP
  31. interface eth1
  32. virtual_router_id 56
  33. priority 100
  34. advert_int 1
  35. authentication {
  36. auth_type PASS
  37. auth_pass 1111
  38. }
  39. virtual_ipaddress {
  40. 192.168.200.250/24 dev eth0 label eth0:2
  41. }
  42. }
  43. virtual_server 192.168.200.240 80 { #虚拟主机VIP
  44. delay_loop 6
  45. lb_algo rr #算法
  46. lb_kind DR #模式
  47. nat_mask 255.255.255.0 #掩码
  48. # persistence_timeout 50 #会话保持
  49. protocol TCP #协议
  50. real_server 192.168.200.96 80 { #RS节点
  51. weight 1 #权重
  52. TCP_CHECK { #节点健康检查
  53. connect_timeout 8 #延迟超时时间
  54. nb_get_retry 3 #重试次数
  55. delay_before_retry 3 #延迟重试次数
  56. connect_port 80 #利用80端口检查
  57. }
  58. }
  59. real_server 192.168.200.97 80 { #RS节点
  60. weight 1
  61. TCP_CHECK {
  62. connect_timeout 8
  63. nb_get_retry 3
  64. delay_before_retry 3
  65. connect_port 80
  66. }
  67. }
  68. }
  69. virtual_server 192.168.200.250 80 {
  70. delay_loop 6
  71. lb_algo rr
  72. lb_kind DR
  73. nat_mask 255.255.255.0
  74. # persistence_timeout 50
  75. protocol TCP
  76. real_server 192.168.200.96 80 {
  77. weight 1
  78. TCP_CHECK {
  79. connect_timeout 8
  80. nb_get_retry 3
  81. delay_before_retry 3
  82. connect_port 80
  83. }
  84. }
  85. real_server 192.168.200.97 80 {
  86. weight 1
  87. TCP_CHECK {
  88. connect_timeout 8
  89. nb_get_retry 3
  90. delay_before_retry 3
  91. connect_port 80
  92. }
  93. }
  94. }

以上keepalived配置文件在LVS主和备上都进行修改。
然后在lvs服务器上通过ipvsadm -C清除之前设置的规则
重新启动keepalived服务进行测试,操作过程如下:

  1. [root@LVS ~]# ipvsadm -C #清除之前设置的规则
  2. [root@LVS ~]# ipvsadm -Ln #没有ipvs规则
  3. IP Virtual Server version 1.2.1 (size=4096)
  4. Prot LocalAddress:Port Scheduler Flags
  5. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  6. [root@LVS ~]# /etc/init.d/keepalived stop #关闭主LVS的keepalived服务
  7. Stopping keepalived: [ OK ]
  8. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250" #没有VIP
  9. [root@LVS ~]# ipvsadm -Ln #没有ipvs规则
  10. IP Virtual Server version 1.2.1 (size=4096)
  11. Prot LocalAddress:Port Scheduler Flags
  12. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  13. [root@LVS ~]# /etc/init.d/keepalived start #启动keepalived服务
  14. Starting keepalived: [ OK ]
  15. [root@LVS keepalived]# ipvsadm -Ln #出现ipvs规则
  16. IP Virtual Server version 1.2.1 (size=4096)
  17. Prot LocalAddress:Port Scheduler Flags
  18. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  19. TCP 192.168.200.240:80 rr
  20. -> 192.168.200.96:80 Route 1 0 0
  21. -> 192.168.200.97:80 Route 1 0 0
  22. TCP 192.168.200.250:80 rr
  23. -> 192.168.200.96:80 Route 1 0 0
  24. -> 192.168.200.97:80 Route 1 0 0
  25. [root@LVS ~]# ip a | egrep "192.168.200.240|192.168.200.250"
  26. #出现VIP
  27. inet 192.168.200.240/24 scope global secondary eth0:1

附录:LVS集群分发请求RS不均衡生产环境实战解决

生产环境中ipvsadm -L -n 发现两台RS的负载不均衡,一台有很多请求,一台没有。并且没有请求的那台RS经测试服务正常,lo:VIP也有。但是就是没有请求。

  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  4. TCP 192.168.200.240:80 rr
  5. -> 192.168.200.96:80 Route 1 0 0
  6. -> 192.168.200.97:80 Route 1 0 0

问题原因:

persistent 10的原因,persistent会话保持,当clientA访问网站的时候,LVS把请求分发给了52,那么以后clientA再点击的其他操作其他请求,也会发送给52这台机器。

解决办法:

到keepalived中注释掉persistent 10 然后/etc/init.d/keepalived reload,然后可以看到以后负载均衡两边都均衡了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注