第五章 LVS负载均衡群集
技能展示
1.了解群集的结构与工作模式
2.学会配置NFS共享服务
3.学会构建LVS负载均衡群集
集群技术概述
**互联网中,站点对硬件性能、响应速度、服务稳定性、数据可靠性的要求很高。(单台服务器难以承担所有访问的需要)
。使用大型机(价格昂贵)
。专用负载分流设备
。构建集群服务器(通过整合多台相对价格低廉的普通服务器,以同一个地址对外提供服务)
。LVS——-企业中常用的一种群集(cluster)服务(Linux Virtual Server虚拟服务器)
1.群集的含义
*Cluster,集群、群集
*由多台主机(至少两台节点服务器)构成,但对外只表现为一个整体,只提供一个访问接口(域名或ip)
2.群集的类型
1)。负载均衡(Load Balancer)群集
*提高应用系统的响应能力。获得高并发、高负载(LB)的整体性能。例(DNS轮询、应用层交换、反向代理)等。
2)高可用(High Available)群集
*提高应用系统的可靠性。例(故障切换、双击热备、多机热备)
*工作方式:a.双工:所有节点同时在线
b。主从:主节点在线,从节点在主节点发生故障时自动切换为主节点。
3)高性能运算(High Performance Computer)群集【用的较少】
*提高应用系统的CPU运算速度,扩展硬件资源和分析能力。例(云计算、网格计算),依赖于‘分布式计算’‘并行计算’。
必要时可以合并使用几种群集模式
3.负载均衡的结构
第一层,负载调度器(Load Balancer或Director)(至少一个)
*访问这个群集系统的唯一入口。对外为VIP地址(虚拟ip/群集ip地址)。通常配置主、从双机热备,确保高可用性。
第二层,服务器池(Server Pool)(大量真实服务器)
*每个节点都有独立的rip(真实ip),只处理调度器分发的客户机请求。
*某个节点暂时失效时,负责调度器的容错机制将其隔离。错误排除后再重新纳入服务器池。
第三层,共享存储(Share Storage)
*为服务器池提供稳定、一致的文件存取服务,确保群集的统一性。
*可使用NAS设备或提供NFS共享服务的专用服务器。
4.负载均衡的工作模式(基于ip、端口、内容等。基于ip效率最高)
*基于ip:
。【地址转换(NAT)模式】
*调度器为服务器节点的网关,客户机的访问入口和各节点的回应出口。
*服务器和调度器使用私有ip,在同一物理网络。安全性优于下两个。
【IP隧道(TUN)模式】
*开放式网络结构。
*调度器为客户机访问入口
*节点服务器都具有独立的公网ip,分散在不同的地方,直接回应客户机。
*通过专用ip隧道与调度器互相通信。
【直接路由(DR)模式】
*半开放式
*调度器只为客户机访问入口
*节点服务器集中在一起,和调度器在同一物理网络。通过本地连接。
*节点服务器直接回应客户机。
*nat只需要一个公网ip,最易用,安全性好,许多硬件负载均衡设备采用。
*DR和TUN,负载能力更强大,适用范围更广,节点安全性稍差。
关于LVS虚拟服务器
1.Linux Virtual Server
*Linux内核的一部分。
*针对Linux内核的负载均衡解决方案
*1998年5月,由我国的章文嵩博士创建
*官方网站:http://www.linuxvirtualserver.org/
【加载模块】
[root@localhost ~]# modprobe ip_vs
【确认内核对LVS的支持】
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
2.LVS的负载调度算法
*轮询(Round Robin)
。按照顺序轮流分配,不管实际连接数和系统负载
*加权轮询(Weighted Round Robin)
。自动查询各节点的负载情况,动态调整其权重。
*最少连接(Least Connections)
。优先分配给连接数最少的节点
*加权最少连接(Weighted Least Connections)
。服务器节点性能差异大时,自动调整权重。权重高的承担更大比例的活动连接负载。
……
使用ipvsadm工具(LVS群集管理工具)
1.创建虚拟服务器
yum -y install ipvsadm
ipvsadm -v
【调度器的vip必须是本机实际已启用的ip地址】
ipvsadm -A -t 202.1.1.1:80 -s rr
-A 添加虚拟服务器
-t vip地址及tcp端口
-s 负载调度算法(轮询rr 、加权轮询wrr 、最少连接lc 、加权最少连接 wlc)
2.添加、删除服务器节点
ipvsadm -a -t 202.1.1.1:80 -r 192.168.10.1:80 -m -w 1
-a 添加真实服务器
-t vip地址及tcp端口
-r rip地址及端口
-m 使用nat群集模式(-g DR 模式、 -i TUN模式)
-w 设置权重(0时暂停节点)
ipvsadm -a -t 202.1.1.1:80 -r 192.168.10.2:80 -m -w 1
ipvsadm -a -t 202.1.1.1:80 -r 192.168.10.3:80 -m -w 1
ipvsadm -a -t 202.1.1.1:80 -r 192.168.10.4:80 -m -w 1
【删除节点】
ipvsadm -d -r 192.168.10.4:80 -t 202.1.1.1:80
【删除整个虚拟服务器】
ipvsadm -D -r 202.1.1.1:80
3.查看群集及节点情况
ipvsadm -ln
*Masq NAT模式
- Route DR模式
4.保存负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
cat /etc/sysconfig/ipvsadm
service ipvsadm stop
service ipvsadm start
NFS共享存储服务(负载均衡群集常用)
1.Network File System,网络文件系统
*依赖于RPC(远端过程调用)
*需安装nfs-utils(NFS共享发布和访问)、rpcbind(rpc支持)软件包
*系统服务:nfs、rpcbind
*共享配置文件:/etc/exports
2.使用NFS发布共享资源
*安装nfs-utils、rpcbind软件包
yum -y install nfs-utils rpcbind
chkconfig nfs on
chkconfig rpcbind on
*设置共享目录
【目录位置 客户机地址(权限操作)】
/etc/exports
【将文件夹/opt/wwwroot共享给172.16.16.0/24使用,允许读写操作】
vi /etc/exports
/opt/wwwroot 172.16.16.0/24(rw【读写】,sync【同步写入】,no_root_squash【客户机以root身份访问时赋予本地root权限】)
*启动NFS服务程序
【先启动rpcbind,再启动nfs】
service rpcbind start
service nfs start
netstat -anpt |grep rpcbind
*查看本机发布的NFS共享目录
showmount -e
*从客户机上查看服务器的共享情况
showmount -e 服务器ip
3.在客户机中访问NFS共享资源(如果是群集服务,nfs服务器与客户机间最好使用专用网络连接,确保稳定性)
*安装rpcbind软件包,并启动rpcbind服务(客户机)
yum -y install rpcbind nfs-utils
chkconfig rpcbind on
service rpcbind start
showmount -e 服务器ip
*手动挂载NFS共享目录
mount 172.16.16.172:/opt/wwwroot /var/www/html
tail -1 /etc/mtab
vi /var/www/html/index.html
*fstab自动挂载设置
vi /etc/fstab
172.16.16.172:/opt/wwwroot /var/www/html nfs defaults,_netdev 0 0
请思考:
常见的服务器群集有哪几种类型?
使用ipvsadm建立LVS群集的基本过程是什么?
如何配置、使用NFS共享目录?
构建LVS-NAT群集
【案例环境】
1.LVS调度器作为Web服务器池的网关
2.使用轮询(rr)调度算法
【配置过程】
1.LVS调度器的配置:SNAT策略、LVS-NAT策略
2.Web节点服务器的配置:httpd服务
3.访问http://172.16.16.172/,并验证群集分配情况
构建LVS-DR群集
LVS/DR模式原理剖析(FAQs)
LVS有LVS-DR,LVS-NAT,LVS-TUN三种模式,本文介绍了有关LVS-DR模式的相关原理,以FAQs的方式呈现。在DR模式下,调度器与实际服务器都有一块网卡连在同一物理网段上。vs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确。
- LVS/DR如何处理请求报文的,会修改IP包内容吗?
1.1 vs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,vs/dr本身主要做这么几个事:
1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;
2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;
3)在hash table中记录连接信息。
vs/dr做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。
数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client
1.2 前面已作了回答,vs/dr不会修改IP包的内容.
- RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?
2.1 既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。
在lo上配置vip能够完成接收包并将结果返回client。
2.2 答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。
- RealServer为什么要抑制arp帧?
这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是作几点说明,就当是补充吧。
3.1
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
这两条是可以不用的,因为arp对逻辑接口没有意义。
3.2 如果你的RS的外部网络接口是eth0,那么
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/eth0/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。
- LVS/DR load balancer(director)与RS为什么要在同一网段中?
从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。
- 为什么director上eth0接口除了VIP另外还要配一个ip(即DIP)?
5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。
5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。
- LVS/DR ip_forward需要开启吗?
不需要。因为director跟realserver是同一个网段,无需开启转发。
- director的vip的netmask一定要是255.255.255.255吗?
lvs/dr里,director的vip的netmask 没必要设置为255.255.255.255,也不需要再去
route add -host $VIP dev eth0:0
director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊.
- LVS/DR如何进行tcp的三次握手?
【案例环境】
1.LVS调度器只作为Web访问入口
2.Web访问出口由各节点服务器分别承担
【配置过程 —— LVS调度器】
1.外网接口eth0、群集接口eth0:0
【关闭防火墙、网络管理服务】
service iptables stop
chkconfig iptables off
service NetworkManager stop
chkconfig NetworkManager off
setenforce 0
【配置虚拟ip,与公有ip在一个网段】
cp ifcfg-eth1 ifcfg-eth1:0
vi ifcfg-eth1:0
DEVICE=eth1:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=173.16.16.200
NETMASK=255.255.255.0【根据需要可以配置成255.255.255.255】
ifup eth1:0
ifconfig eth1:0
eth1:0 Link encap:Ethernet HWaddr 00:0C:29:65:16:13
inet addr:173.16.16.200 Bcast:173.16.16.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
2.调整/proc内核参数,关闭重定向响应
vi /etc/sysctl.conf
……
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
……
sysctl -p
3.配置LVS-DR群集策略
service ipvsadm status
service ipvsadm stop
ipvsadm -A -t 172.16.16.200:80 -s rr
ipvsadm -a -t 172.16.16.200:80 -r 172.16.16.10 -g -w 1
ipvsadm -a -t 172.16.16.200:80 -r 172.16.16.20 -g -w 1
service ipvsadm save
chkconfig ipvsadm on
【配置过程 —— Web节点服务器】
1.外网接口eth0、群集接口lo:0
【关闭防火墙、网络管理、selinux,不再赘述】
setenforce 0
vi ifcfg-lo:0
DEVICE=lo:0
IPADDR=173.16.16.200【vip虚拟ip】
NETMASK=255.255.255.255【必须为32位全1掩码】
ONBOOT=yes
ifup lo:0
ifconfig lo:0
2.调整/proc内核参数,关闭ARP响应
vi /etc/sysctl.conf
……
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
……
sysctl -p
3.添加到群集IP地址的本地路由记录
vi /etc/rc.local
……
【保存路由记录】
/sbin/route add -host 173.16.16.200 dev lo:0
route add -host 173.16.16.200 dev lo:0
4.配置并启用httpd服务
service rpcbind start
service nfs start
showmount -e 192.168.10.100
mount 192.168.10.100:/web1 /var/www/html
service httpd restart
【测试LVS-DR群集】