1、LVS群集技术基础
html
根据企业的环境不一样,群集所提供的功能也是各不相同。采用的技术也是各有千秋,然而他们从总体上来看,须要了解一些关于集群的供共同特征。node
不管是那种群集第一点都是没必要须使用两台服务器,而对外就是一个总体,只提供一个访问入口。集群能够分为如下三种linux
负载均衡群集:主要的做用是提升对客户端的响应能力,均匀的调用服务器资源。未来自客户端的请求分发给多个服务器节点,从而缓解整个系统的压力。nginx
高可用群集:这种群集技术主要是实现网络中服务器的单点故障,服务的连续性以及减小服务的中断时间。web
高性能运算群集:这类群集是将全部服务器的CPU资源进行整合从而可以提升CPU的运算速度,这种群集适合大数据处理算法
2、群集负载均衡的分层结构vim
图1典型的负载均横群集结构centos
第一层,负载调度器:这是访问群集的惟一入口,也就是说客户端的访问请求的目标地址都是这个负载调度器,对外使用的全部服务器都使用一个共有的VIP也就是群集IP,一般会配置主从两台服务器来实现。缓存
第二层,服务器池:群集所提供的应用服务(如HTTP、FTP等),其中每一个节点都有本身的真实IP,只处理调度器分配的客户端请求,当某个节点宕机时,调度器将会将其隔离,等待错误排除以后再从新加入到服务器池。安全
第三层,共享存储:为服务器池中的节点提供存储,确保服务器池内的主机提供的内容都是相同的。在Linux/UNIX中,共享存储可使用NAS设备,或者是提供NFS的共享服务器。
3、负载均横的工做模式
关于群集的负载调度技术,能够基于IP、端口进行分发,其中基于IP的是效率最高的。基于IP的负载平衡模式中,常见的有地址转换、IP隧道和直接路由三种工做模式
图2三种负载均横模式示意图比较
地址转换:简称NAT模式,相似于防火墙的私有网络结构,负载调度器做为全部服务器的网关,即做为客户端的访问入口,也是各个节点应答的出口,服务器使用私网地址与调度器位于同一物理网络,这种工做模式安全性比较好,可是当访问量过大时将会成为整个网络的瓶颈。
IP隧道:简称TUN模式,采用开放式的网络结构,调度器仅做为客户端的访问入口,各个节点分布在互联网的其余不一样位置,具备独立的公网IP地址,经过专用的IP隧道与负载调度器通讯,这种工做模式其性能较差,安全也得不到保障。
直接路由方式:采用半开放式的网络结构,必须与调度器在一个物理网络中的同一网段内。这种工做模式也是最经常使用的,性能最好的,安全性也可以获得保障。
2、LVS虚拟服务器
Linux Virtual Server 是针对linux内核开发的一个负载均衡项目,由我国的章文嵩不博士在1988年5月建立,官方站点位于http://www.linuxvritualserver.org/。LVS实际上就是至关于一个IP地址的虚拟化应用,未基于IP地址和内容请求分发的负载均衡提出了一种高效的解决办法。
LVS如今已经成为了Linux内核的一部分,默认编译模块为ip_vs模块,必要时可以自动调用。在Cetnos6中一下操做能够加载ip_vs模块,并查看当前系统中ip_vs模块的版本信心。
[root@centos1 ~]# modprobe ip_vs
[root@centos1 ~]# 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
[root@centos1 ~]#
下面介绍一下LVS负载均衡主要的调度算法,以及如何使用Ipvsadm工具管理工具
1、LVS的负载均衡算法
针对不一样的网络和服务器配置需求,LVS调度器提供多种不一样的负载均衡调度算法,其中最经常使用的四种算法分别是轮询、加权轮询、最少链接以及加权最少链接
轮询:将接收到的客户端请求顺序分配到各个服务器节点,无论服务器的真实负载
加权轮询:根据真实的服务器处理能力轮流分配收到的访问请求,调度器根据服务器的真实负载动态的调整权重。
最少链接:根据服务器的真实链接数而将客户端请求分配给链接最少的服务器节点
加权最少链接:在服务器节点性能差别较大时建议使用,权重高的节点能够承担更大的链接负载。
我我的认为第一种不是特别好,剩下的三种都是比较不错的算法。
2、安装ipvsadm管理工具
ipvsadm是在负载调度器上使用的LVS群集管理工具,经过调用ip_vs模块来添加、删除服务器节点。在centos6中须要手动安装ipvsadm-1.26.2.e16.x86_64软件包
[root@centos1 ~]# yum -y install ipvsadm
[root@centos1 ~]# ipvsadm -v
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
接下来咱们先不介绍ipvsadm工具的使用,咱们首先利用nfs创建一个共享存储在搭建一个环境来进行讲解。
3、安装nfs-utils、rpcbind软件包
root@centos2 ~]# yum -y install nfs-utils rpcbind
[root@centos2 ~]# chkconfig nfs on
[root@centos2 ~]# chkconfig rpcbind on
在启动服务时应先启动rpcbind再启动nfs,由于nfs依赖于rpcbind
3.1创建共享目录以及共享目录
[root@centos2 ~]# mkdir /opt/html
vi /etc/exports
/opt/html 192.168.1.0/24(rw,sync,no_root_squash)
第一个字段为共享目录
第二个字段为访问源IP(也就是能够被那些IP地址访问)小括号比份内是权限列表这些IP地址都具备那些权限。
rw具备读写 ro内容只读 sync表示同步写入(内存和硬盘之间同步写入) no_root_squash表示当客户端使用root访问时赋予本地root的权限,当一个目录分配给不一样主机时可使用空格隔开。如下是赋予不一样权限的格式(不是我这个共享所须要的格式,这里只是演示)
/opt/html 192.168.1.150(rw) 192.168.1.200(ro)
接下来咱们将这两个服务启动
[root@centos2 ~]# service rpcbind start
[root@centos2 ~]# service nfs start
能够经过一下方式验证,查看一下本机的NFS目录
[root@centos2 ~]# showmount -e 127.0.0.1
Export list for 192.168.1.1:
/opt/html 192.168.1.0/24
因为默认的nfs监听端口是动态的,咱们没法创建防火墙规则,因此咱们经过修改/etc/sysconfig/nfs文件将其端口固定。
vim /etc/sysconfig/nfs
MOUNTD_PORT="825"
STATD_PORT="909"
LOCKD_TCPPORT="4004"
LOCKD_UPPORT="4004"
RQUOTAD_PORT="909"
经过lsof -nPi 查看使用mount须要经过哪些端口
[root@centos2 ~]# lsof -nPi
rpc.mount 1834 root 7u IPv4 15868 0t0 UDP *:825
rpc.mount 1834 root 8u IPv4 15872 0t0 TCP *:825 (LISTEN)
rpc.mount 1834 root 9u IPv6 15876 0t0 UDP *:825
rpc.mount 1834 root 10u IPv6 15880 0t0 TCP *:825 (LISTEN)
能够看出TCP的 825号端口正在监听mount操做,因此咱们在防火墙上创建825容许入站的规则
[root@centos2 ~]# iptables -I INPUT -p tcp --dport 825 -j ACCEPT
创建一个测试页到共享目录下
[root@centos2 ~]# echo "test lvs Cluster" > /opt/html/index.html
这样咱们的共享存数就搭建完成了,这时咱们就能够搭建咱们的实验环境了。
图3
上图的实验拓扑为NET模式,后面咱们会演示DR模式的LVS
咱们使用两台web服务器做为节点,一台服务器做为调度器同时做为网关,一台服务器最为存储服务器。其中调度器为双网卡,一个连接互联网,一个连接局域网。
存储咱们已经搭建完成了,这里咱们就不在搭建了,咱们首先将两台web服务器启动,使用nginx服务来搭建web站点,注意防火墙。
1、创建虚拟服务器,提供http的负载均衡而且算法使用轮询(rr)算法
-使用-A新建虚拟服务器 -t 指定监听地址 -s 指定算法
[root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s rr
2、添加节点主机到虚拟服务器中
[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.1.3:80 -m -w 1
[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.1.4:80 -m -w 1
[root@centos1 ~]# service ipvsadm save
[root@centos1 ~]# service ipvsadm start
3、配置节点主机
node_1:192.168.1.3
[root@centos3 ~]# nginx
[root@centos3 ~]# mount 192.168.1.2:/opt/html /var/www/html/
[root@centos3 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
node_1:192.168.1.4
[root@centos4 ~]# nginx
[root@centos4 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
4、配置NAT转发规则而且配置防火墙规则
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@centos1 ~]# sysctl -p
[root@centos1 ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eht1 -j SNAT --to 172.16.16.172
[root@centos1 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@centos1 ~]# iptables -I INPUT -p tcp --sport 80 -j ACCEPT
[root@centos1 ~]# service iptables save
5、客户端测试
这就是NAT模式的配置,比较简单可是在实际生产环境下应用的很少,只适合一些小型企业
这里我在来介绍一下ipvsadm工具的选项
ipvsadm
-A 建立虚拟服务器
-t 指定群集IP地址
-r添加节点服务器
-s 指定算法 rr 轮询 wrr 加权轮询 lc 最少链接 wlc 加权最少链接
-m 指定为NAT模式
-g 指定为DR模式
-i 指定为TUN模式
-w 指定权重
-l 列出服务器池内各节点状态
-c 列出详细的访问信息
-v 输出ipvsadm版本信息
NAT模式的lvs总结的来所他的原理就是:调度器收到来自客户端的请求将目标地址改成节点服务器的IP地址,节点服务器在应答时直接应答给客户端目标地址为客户端的IP地址,可是因为是NAT模式因此调度器也就成为了节点服务器的惟一出口。
3、直接路由模式
1、准备环境
在DR模式群集中,LVS仅负责做为客户端访问的入口,并不做为服务器节点应答的出口。服务器池中内每台节点都各自接入Internet,发送给客户端的应答不须要通过LVS负载调度器,以下图所示
图6
这里咱们IP地址都使用共有地址网段来体现,服务器节点采用双网卡,一块用于应答客户端请求,一块链接共享存储,在实际的生产环境下,能够链接一台交换机。在实际生产环境下通常咱们会采用服务器节点都是私有地址,而经过路由器转换为公网IP这样就不会增长成本了。
这种方式入站,出站的数据包被分别处理,因为在服务器池中的节点主机应答客户端时,须要使用群集的IP地址应答,因此还须要在各个节点中的lo网卡中配置一个虚拟网卡,而且子网掩码为32位。
2、配置负载调度器。
如今的网络环境,与前面的网络环境不一样,也就是另一个实验环境,咱们从新开始搭建。
1)加载ip_vs模块并安装ipvsadm工具
[root@centos1 ~]# modprobe ip_vs
[root@centos1 ~]# yum -y install ipvsadm
2)配置群集IP地址(配置在eth0的虚拟接口eth0:0)
[root@centos1 ~]# cd /etc/sysconfig/network-scripts/
[root@centos1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@centos1 network-scripts]# vim ifcfg-eth0:0
DEVICE=eth0:0
TYPE=Ethernet
UUID=342c9eb9-6125-43a7-94be-729c5cb1d96d
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=172.16.16.172
NETMASK=255.255.255.0
[root@centos1 ~]# service network restart
3)调整内核参数
对于DR群集模式来讲,因为LVS负载调度器和各个节点公用一个VIP,应该关闭内核的重定向功能也就是管理ICMP重定向报文
[root@centos1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
注释:net.ipv4.tcp_syncookies = 1
当出现SYN等待队列溢出时,启用cookies来处理,可防范少许SYN×××。
net.ipv4.ip_forward = 1
启用IP转发功能,作NAT服务或者路由时才会用到。
net.ipv4.icmp_echo_ignore_broadcasts = 1
忽略广播icmp包
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
恶意用户可使用IP重定向来修改远程主机中的路由表,在设计良好的网络中,末端的重定向设置是不须要的,发送和接受重定向信息包都要关闭。
net.ipv4.conf.all.accept_source_route = 0
禁用icmp源路由选项
net.ipv4.conf.all.forwarding = 0
不转发源路由帧,若是作NAT建议开启。
net.ipv4.tcp_max_syn_backlog = 8192
定义backlog队列容纳的最大半链接数,若是配置高能够设置的更高
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
定义SYN链接的重试次数,默认是5,下降这个值以提升系统性能。
net.ipv4.tcp_fin_timeout = 10
决定了它保持在FIN-WAIT-2状态的时间,默认是60,下降这个值以提升系统性能。
net.ipv4.tcp_rfc1337 = 1
启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST包。却省为0。
[root@centos1 ~]# sysctl -p
4)配置负载平衡策略
[root@centos1 ~]# service ipvsadm stop //清除原有策略
[root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s wrr
[root@centos1 ~]# ipvsadm -a -t172.16.16.172:80 -r 172.16.16.177:80 -g -w 1
[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178:80 -g -w 1
[root@centos1 ~]# service ipvsadm save
5)配置防火墙
[root@centos1 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
2、配置服务器节点
使用DR模式时,节点服务器也须要配置VIP地址,由于客户端请求的是群集IP地址,目标MAC地址是LVS的,节点服务器回应时应该以群集IP回应,不然客户端不能成功接收。还须要调整内核的ARP响应参数阻止更新VIP的MAC地址,由于客户端在发送ARP请求的时候IP地址是群集地址,这是全部的节点都配置了VIP这时客户端的ARP缓存内就会出现多条重复的IP单丝对用的MAC地址确不相同,这回致使客户端没法正确找到调度器。
1)172.16.16.177 配置虚拟VIP地址 (多台几点之间配置同样)
在每一个节点上,一样须要配置VIP地址172.16.16.172,但此地址只做为发送web响应的源地址,并不须要监听客户端的访问请求,所以使用lo:0来承载虚拟VIP地址,并添加一条路由记录,将访问VIP的数据包限制在本机,避免通讯紊乱
[root@centos4 ~]# cd /etc/sysconfig/network-scripts/
[root@centos4 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@centos4 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=172.16.16.172
NETMASK=255.255.255.255
ONBOOT=yes
[root@centos4 network-scripts]# ifdown lo
[root@centos4 network-scripts]# ifup lo
[root@centos4 network-scripts]# cd
[root@centos4 ~]# vim /etc/rc.local
/sbin/route add -host 172.16.16.172 dev lo:0
[root@centos4 ~]# route add -host 172.16.16.172 dev eth0 //临时生效
2)调整内核参数
[root@centos4 ~]# vim /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
[root@centos4 ~]# sysctl -p
以上配置为忽略ARP更新请求解析其余网卡的MAC以及禁止lo网卡宣告本身的MAC地址
注释:arp_ignore:定义对目标地址为本地IP的ARP询问不一样的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应
4-7 - 保留未使用
8 -不回应全部(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制: 肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送.
3)配置防火墙
[root@centos4 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
4)启动HTTP服务
[root@centos4 ~]# service httpd start
3、创建共享存储
[root@centos2 ~]# mkdir /opt/wwwroot
[root@centos2 ~]# vim /etc/exports
/opt/wwwroot 192.168.1.0/24(rw,sync,no_root_squash)
[root@centos2 ~]# service rpcbind restart
[root@centos2 ~]# service nfs start
vim /etc/sysconfig/nfs
将IPTABLES关闭,或者经过修改内核的方式创建防火墙规则,这里我就直接将防火墙关闭。
[root@centos2 ~]# echo "aaaaaaa" >/opt/wwwroot/index.html
4、服务器节点挂在共享存储到/var/www/html
[root@centos4 ~]# mount 192.168.1.250:/opt/wwwroot /var/www/html/
5、测试LVS
图8
能够经过ipvsadm -lnc 查看分配的状况。
今天咱们经过以上实验发现了两个问题,一个是调度器的单点故障,第二个就是当摸一个服务器节点出现故障时,调度器并不知道,还会分配任务给出现故障的服务器节点,这样就会出现客户端访问失败的状况,为了不这样的状况发生,咱们在下一次会学习使用keepalived实现调度器的双击热备而且动态添加和删除服务器节点。实现服务器节点的健康检查。