当单台服务器没法支撑庞大业务的时候,这个时候就要考虑扩展服务器的性能。html
扩展有两种方式:前端
1) scale on:向上扩展,立体式,如买更强大的服务器linux
a) 简单的说,单纯扩展服务器仍是不够的,根据木桶效应,整套东西的性能只能根据最低的环节来衡量;web
b) 服务器随着的性能的提高,价格愈来愈贵算法
2) scale out:向外扩展,分布式,使用更多的服务器,也就是集群的方式了后端
事实上智能DNS也能够实现负载:缓存
1) A记录:1个域名对应多个ip服务器
2) dns是以这种轮询的方式来响应请求(常规状况),这是这种是不均匀的负载均衡,每一个人的请求是不一样的,并且缓存服务器的存在,大部分时间是会请求同台服务器网络
3) DNS事实上是为了智能解析不一样地区的用户到最近的服务器并发
集群的主要做用就是为了提升并发处理能力,其所需的组件通常是前端的分发器,后端的服务器,也有可能单独包含health check检查设备。
LVS: linux virtual server
1) NAT:地址转换
2) DR:直接路由
3) TUN:隧道
几个名词的解释:
director:前端分发器
realserver:后端服务器,集群节点
VIP:IPVS的前端IP,接收客户端服务请求的ip
DIP: director和服务器通讯的地址
RIP:服务器和director通讯的地址
CIP:客户端发起请求的地址
LVS介绍
http://www.linuxvirtualserver.org/zh/lvs1.html
ipvs也是做为一个内核的功能的模块,ipvsadm是一个管理工具,并不是服务,这个能够类比iptables,其工做位置为用户空间/内核空间
iptables/netfilter
ipvsadm/ipvs
IPVS工做在INPUT链上,其工做和netfilter不一样,所以,若是功能有冲突的话,切记不能同时使用。
IPVS在钩子函数(链上的数据流动状况):
PREROUTING(这里能够对数据作标记,在后面LVS持久链接会讲解)
INPUT:在这里识别了请求是集群服务,会对数据包作特殊处理(按照状况而定)
OUPUT:
POSTROUTING
不通过forward链,这个本人未证明。不过从上面可知,IPVS工做在INPUT链上面。
查看内核是否编译IPVS功能,linux内核2.6版本以后都包含了这个功能,内核自己就拥有的功能,所以和发行版没有关系
[root@director ~]# grep -i "vs" /boot/config-2.6.32-358.el6.i686
# IPVS scheduler#单独列出这个10种调度算法,其实还有其余,请自行查询
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
算法简介:
rr :轮询调度
wrr:加权轮询
sh:源地址做为关键字hash查找一个RS
dh: 目的地址做为关键字hash查找一个RS
lc:最小链接调度,ipvs会存储全部的活动链接
active*256+inactive
wlc:加权的最小链接调度
(active*256+inactive)/weight
LBLC:基于地址的最小链接请求调度:未来自同一个目的地址的请求分配给同一台RS,此时这台服务器是还没有满负荷的。不然就将这个请求分配给链接数最小的RS,并以它做为下一次分配的首先考虑。
sed: 最短时间望延迟,对wlc的改进,防止第一次选择了性能较差的主机处理
(active+1)*256/weight
nq:nq: never queue,对sed的改进,最开始每一个节点都发链接,以后再按照wlc来发
cache命中率和负载是相互背离,只能找到一个中和点
非活动链接数很是多的时候,得考虑inactive,所以wlc比较理想
默认方法:wlc
安装管理工具ipvsadm
[root@director ~]# yum -y install ipvsadm
ipvsadm命令详解:
1) 管理集群服务
添加 –A -t|u|f service-address –r server-address [-s scheduler]
-t :tcp
-u : udp
-f :防火墙标记,用于单独提供多个服务绑定使用
service-address:对外服务的套接字,ip:port
默认调度算法是wlc
-w :权值,部分算法须要使用
修改 –E :使用同上
删除 –D –t|u|f service-address
# ipvsadm -A -t 172.16.100.1:80 -s rr
2) 管理集群服务的RS
添加 –a -t|u|f service-address –r server-address [-g|i|m] [-w weight]
-t :tcp
-u : udp
-f :防火墙标记,用于单独提供多个服务绑定使用
service-address:对外服务的套接字,ip:port
-g :DR模型,默认
-m : NAT masuerading
-I : tun ipip
-w :权值,部分算法须要使用
修改 –e :使用同上
删除 –d -t|u|-f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
3) 查看集群服务
-L|l
-n:数字格式显示主机地址和端口
--stats:统计数据
--rate:速率
--timeout:显示会话的超时时间
-c:显示当前IPVStcp链接状况
4) 集群的规则管理
-C:清空IPVS规则
-S: 保存规则
# ipvsadm –S > /path/to/somefile
-R:从新载入规则
#ipvsadm –R </path/to/somefile
service ipvsadm save 默认保存规则到 /etc/sysconfig/ipvsadm
如下的测试统一配置
RS1和RS2安装服务telnet-server httpd,默认配置
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
添加用户test 密码test
selinux关闭(影响实验,暂时关闭)
service iptables stop
因为高可用集群须要保证时间一致,所以能够将director配置为中继ntp服务器,realserver把经过director来更新时间.
NAT模型工做原理:
1) 集群节点必须和director在同一个IP网络中,通常都是内网地址
2) 集群节点的RIP必须把网关指向DIP
3) director负责数据报文的转发,所以容易成为系统瓶颈,只适合小规模应用
4) 支持端口映射
示例1:
配置:
director上配置
ipvsadm –A -t 192.168.80.250:80 –s rr
ipvsadm –a –t 192.168.80.250:80 –r 172.16.100.2 –m
ipvsadm –a –t 192.168.80.250:80 –r 172.16.100.3 -m
查看命令验证:
[root@localhost ~]# ipvsadm -L -c -n #查看链接
[root@localhost ~]# ipvsadm -L -n --stats #链接,数据包个数,字节总数
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.80.250:80 42 154 138 12521 12241
-> 172.16.100.2:80 21 76 68 6182 6145
-> 172.16.100.3:80 21 78 70 6339 6096
[root@localhost ~]# ipvsadm -L -n --rate #查看上面三类数据的平均值(瞬时)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.80.250:80 1 3 2 349 217
-> 172.16.100.2:80 0 1 1 169 113
-> 172.16.100.3:80 0 1 1 180 103
[root@localhost ~]# ipvsadm -L -n --timeout #查看 tcp tcpfin udp的超时退出时间
Timeout (tcp tcpfin udp): 900 120 300
http://192.168.80.250/ #切换是按照这个1:1的比例
演示规则的操做
[root@localhost ~]# service ipvsadm save #保存规则
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@localhost ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.http #保存规则到单独位置
[root@localhost ~]# cat /etc/sysconfig/ipvsadm #查看规则表的信息
-A -t 192.168.80.250:80 -s rr
-a -t 192.168.80.250:80 -r 172.16.100.2:80 -m -w 1
-a -t 192.168.80.250:80 -r 172.16.100.3:80 -m -w 2
[root@localhost ~]# ipvsadm -C #清空规则表
[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.http #从新载入规则表
DR模型的工做原理:
1. director必须有与realserver有一张网卡在同个物理网段中,必须是同个局域网
2. diector经过仅仅修改二层的源目MAC地址,将数据包(保留源目ip地址)发往真实的realserver,realserver直接把数据包发回给客户端,director只是接收请求,能够不作响应报文的转发,若是realserver把网关设置在director,则另当别论。
3. 不支持端口映射
DR有两种模型,1.VIP和DIP,RIP在同一个ip网络
2.VIP和DIP,RIP不在同一个IP网络,通常做为外网地址提供服务
补充知识点:
ip地址是属于内核的,不属于单个网卡地址。做为一台有多网卡主机(多ip),把全部的ip通告给直连的主机。这个问题能够解释一台双网卡的主机A(不开启转发功能)(不一样网段的ip),另外一台与之相连的主机B能够ping通另外一个ip.
ip响应的数据包的帧数据包的源mac地址是出接口对应网卡的mac地址
ip网络响应数据包的时候是将请求数据包进入的接口的ip做为源ip
所以以下图,client请求VIP主机时候,按理是director来接收请求,可是reaserver也一样会响应(根据ARP请求的原理),realserver的VIP并不做为这个通讯地址,仅仅为了可以识别服务而提供的。
如上:所须要解决的问题有:
1.realserver不对ARP广播请求VIP 地址响应或者是作出通告
arptables
内核的参数来修改arp的宣告和响应级别
2.须要修改diector和realserver转发数据包时候源ip保持为VIP,而不是DIP或者RIP
添加路由 route add –host VIP dev eth1:0
kernel parameter
arp_ingnore:
响应级别:
0:只要本地配置有相应地址则进行响应
1:仅仅在请求的目标地址配置在请求到达的接口上的时候,才响应
arp_announce:
通告级别
0:将本地任何接口上的任何地址向外通告
1.试图仅向目标网络通告与其网络匹配的地址
2.仅向与本地接口地址上配置的网络进行通告
[root@RS1 ~]# cd /proc/sys/net/ipv4/conf/
all/ default/ eth1/ lo/
all/是全局
eth1/是指定的网卡
都得配置
并且VIP地址配置在realserver上的时候要记得设置为不广播
ifconfig eth1:0 VIP broadcast VIP netmask 255.255.255.255 up
示例2:
1.先配置director
[root@director ~]# ifconfig eth1:0 172.16.100.1 255.255.0.0 up
[root@director ~]# route add -host 172.16.100.1 dev eth1:0
[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
2.清空配置列表
iptables -F #清空
ipvsadm -C #清空
iptables -Z #计数器清空
3.再配置RS,RS要先配置arp_ingore 和arp_announce,再配置VIP地址,最后添加路由
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce
[root@RS1 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
[root@RS2 ~]# ifconfig eth1:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
[root@RS1 ~]# route add -host 172.16.100.1 dev eth1:0
[root@RS2 ~]# route add -host 172.16.100.1 dev eth1:0
3.director配置负载集群
[root@director ~]# ipvsadm -A -t 172.16.100.1:80 -s wrr
[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.2 -w 1 -g
[root@director ~]# ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.3 -w 2 -g
4.测试访问成功
验证:
[root@director html]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 wrr
-> 127.0.0.1:80 Local 5 0 4
-> 172.16.100.2:80 Route 1 0 0
-> 172.16.100.3:80 Route 2 1 0
复杂模型,VIP,提供服务的地址为外网地址
分析数据包走向:
1.客户端发送的数据包经过专线到达diector,源目地址为CIP:VIP
2.director的INPUT链收到数据包,发现是集群服务的一个请求,根据算法,源目地址不变,修改二层帧,发送给一台RS
3.这台RS属于内网地址,将数据包发往内网出口路由器,回送数据包
示例3:
因为手头就一台笔记本电脑,所以经过虚拟机来模拟此实验。
准备:
1台物理机,3台虚拟机
Vmnet1,host-only这块网卡工做,物理机两个ip都配置在这块网卡上
配置director
[root@director ~]# ifconfig eth1:0 192.168.10.80 netmask 255.255.255.0 up
[root@director ~]# route add -host 192.168.10.80 dev eth1:0 #从eth1口转发数据包的时候保持源地址不变
[root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发功能
配置RS,先配置RS的arp响应和请求级别,all是全局
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
再配置VIP地址
[root@RS1 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up
[root@RS1 ~]# route add –host 192.168.10.80 dev eth1:0
[root@RS2 ~]# ifconfig eth1:0 192.168.10.80 broadcast 192.168.10.80 netmask 255.255.255.255 up
[root@RS2 ~]# route add –host 192.168.10.80 dev eth1:0
director上配置集群,集群调度算法为wrr,工做模式为DR
[root@director ~]# ipvsadm –A -t 192.168.10.80:80 –s wrr
[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.2 –g –w 1
[root@director ~]# ipvsadm –a –t 192.168.10.80:80 –r 172.16.100.3 –g –w 2
测试:客户端访问
使用wrr轮询 权重为1:2,访问比例大概就是1:2
[root@director ~]# ipvsadm -L -n –stats #查看状态
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.10.80:80 44 208 0 20510 0
-> 172.16.100.2:80 15 72 0 7442 0
-> 172.16.100.3:80 29 136 0 13068 0
因为是使用物理机来作客户端访问和做为这个http服务的数据包的出站网关,根据上述数据包的走向。
所以能够经过对Vmnet1进行抓包分析
本机物理机Vmnet1接口的mac地址 00:50:56:c0:00:01
director的mac地址 00:0c:29:98:5c:4a
RS1的mac地址 00:0c:29:e4:ea:ee
RS2的mac地址 00:0c:29:1c:25:e4
#client发往director
#director发往某台RS
#RS经过另外一个接口发往客户端
不管使用算法,LVS持久都能实如今必定时间内,未来自同一个客户端请求派发至此前选定的RS。
持久链接模板(内存缓冲区):
每个客户端 及分配给它的RS的映射关系;
配置方法很简单:在配置集群服务的时候添加-p参数来指定链接时长
ipvsadm -A|E ... -p timeout:
timeout: 持久链接时长,默认300秒;单位是秒;
主要应用:SSL链接会话
持久链接类型:
PPC:未来自于同一个客户端对同一个集群服务的请求,定位到以前选定的RS;单服务类型
PCC:未来自于同一个客户端对一个集群内全部服务的请求,定位到以前选定的RS;全部端口服务
PNMPP:防火墙标记链接 就是以前提升的-f选项
因为LVS应用在INPUT链上面,所以这个标记要在PREROUTING链上标记
示例4:经过示例2的例子来作继续实验
PPC:
1.将http服务设定为持久链接,时间为600s
ipvsadm -A -t 172.16.100.1 -p 600 -s wrr
ipvsadm -a -t 172.16.100.1 -r 172.16.100.2:80 -g -w 1
ipvsadm -a -t 172.16.100.1 -r 172.16.100.3:80 -g -w 2
PCC:
2.未来自同一个客户端对全部端口的请求,始终定向至此前选定的RS中去
ipvsadm -A -t 172.16.100.1 -p 600 -s wrr
ipvsadm -a -t 172.16.100.1 -r 172.16.100.2 -g -w 1
ipvsadm -a -t 172.16.100.1 -r 172.16.100.3 -g -w 1
PNMPP:
3.未来自同一个客户端访问集群的http服务和telnet服务都转发都以前选定的RS中去
iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth1 -d 172.16.100.1 -p tcp --dport 23 -j MARK --set-mark 10
ipvsadm -A -f 10 -p 600 -s wrr
ipvsadm -a -f 10 -r 172.16.100.2 -g -w 1
ipvsadm -a -f 10 -r 172.16.100.3 -g -w 2