使用Lvs+Nginx集群搭建高并发架构的实现示例
高并发站点不仅要考虑网站后端服务的稳定,还需要考虑服务能否接入巨大流量、承受巨大流量,如下图:
1:流量接入,可以采用lvs+nginx集群,这种方式能接入的qps能高达数百万
2:通过lvs实现nginx集群,nginx+tomcat实现后端服务集群,完成了从接入层流量处理到后端服务集群高并发处理
1. lvs介绍
lvs(linux virtual server),即linux虚拟服务器。它用于多服务器的负载均衡,工作在网络四层,可以实现高性能,高可用的服务器集群技术,它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。是基于tcp/ip做的路由和转发,稳定性和效率极高。
一个lvs集群往往包含以下角色:
1:ds:director server。虚拟服务,负责调度
2:rs:real server。后端真实的工作服务器。
3:vip:向外部直接面向用户请求,作为用户请求的目标的ip地址
4:dip:director server ip,ds的ip
5:rip:real server ip,后端服务器的ip地址
6:cip:client ip,访问客户端的ip地址
2. lvs 负载均衡模式
lvs提供了3种负载均衡模式,每种负载均衡模式适用的场景有差异,我们来讲解一下这三种负载均衡模式。
2.1 nat
用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去。rs需要设定网关为分发器的内网ip。用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器称为瓶颈。在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源。
2.2 tun
这种模式需要有一个公共的ip配置在分发器和所有的rs上,我们把它叫做vip。客户端请求的目标ip为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标ip改为rs的ip,这样数据包就到了rs上。rs接收数据包后,会还原原始数据包,这样目标ip为vip,因为所有rs上配置了这个vip,所以他会认为是它自己。
2.3 dr模式
和ip tunnel较为相似,不同的是,它会把数据包的mac地址修改为rs的mac地址。真实服务器将响应直接返回给客户。
这种方式没有ip隧道的开销,对集群中的真实服务期也没有必须支持ip隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。
3. lvs dr模式配置
综合上面分析,我们可以得出结论,dr模式性能效率比较高,安全性很高,因此一般公司都推荐使用dr模式。我们这里也配置dr模式实现lvs+nginx集群。
我们准备了3台机器:首先确保三台机器都安装了nginx。
1:192.168.183.133 (ds) 192.168.183.150 对外提供服务 2:192.168.183.134 (rs) 192.168.183.150 真实服务处理业务流程 3:192.168.183.135 (rs) 192.168.183.150 真实服务处理业务流程
vip:192.168.183.150
3.1 vip配置
关闭网络配置管理器(每台机器都要做)
systemctl stop networkmanager systemctl disable networkmanager
配置虚拟ip(vip 192.168.183.133中配置)
在/etc/sysconfig/network-scripts
创建文件ifcfg-ens33:1
,内容如下:
bootproto=static device=ens33:1 onboot=yes ipaddr=192.168.183.150 netmask=255.255.255.0
重启网络服务:
service network restart
我们可以看到在原来的网卡上面添加了一个虚拟ip 150。
同时需要对192.168.183.134
、192.168.183.135
构建虚拟机ip,但只是用于返回数据,而不能被用户访问到,这时候需要操作ifcfg-lo
。
ipaddr=127.0.0.1,这里127.0.0.1属于本地回环地址,不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。
netmask=255.255.255.255
192.168.183.134
:
将ifcfg-lo
拷贝一份ifcfg-lo:1
,并修改ifcfg-lo:1
配置,内容如下:
刷新lo:
ifup lo
查看ip可以发现lo下多了150ip。
192.168.100.133
知行和上面相同的操作。
3.2 lvs集群管理工具安装
ipvsadm用于对lvs集群进行管理,需要手动安装。ds安装即可。
安装命令:
yum install ipvsadm
版本查看:
ipvsadm -ln
效果如下:
3.3 地址解析协议
在192.168.183.134
和192.168.183.135
中操作。
arp_ignore和arp_announce参数都和arp协议相关,主要用于控制系统返回arp响应和发送arp请求时的动作。这两个参数很重要,特别是在lvs的dr场景下,它们的配置直接影响到dr转发是否正常。
arp-ignore:arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应(0~8,2-8用的很少)
配置文件:/etc/sysctl.conf
,将如下文件拷贝进去:
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
刷新配置:
sysctl -p
添加路由:此时如果无法识别route,需要安装相关工具yum install net-tools
。
route add -host 192.168.183.150 dev lo:1
添加了一个host地址,目的是用于接收数据报文,接收到了数据报文后会交给lo:1处理。(防止关机失效,需要将上述命令添加到/etc/rc.local中)
添加完host后,可以查看一下:route -n
,能明显看到效果。
上述配置我们同样要在192.168.183.135
中配置。
3.4 集群配置
ipvsadm命令讲解:
ipvsadm -a:用于创建集群
ipvsadm -e:用于修改集群
ipvsadm -d:用于删除集群
ipvsadm -c:用于清除集群数据
ipvsadm -r:用于重置集群配置规则
ipvsadm -s:用于保存修改的集群规则
ipvsadm -a:用于添加一个rs节点
ipvsadm -e:用于修改一个rs节点
ipvsadm -d:用于删除一个rs节点
添加集群tcp服务地址:(外部请求由该配置指定的vip处理)
ipvsadm -a -t 192.168.183.150:80 -s rr
参数说明:
- -a:添加集群配置
- -t:tcp请求地址(vip)
- -s:负载均衡算法
负载均衡算法:
算法 | 说明 |
---|---|
rr | 轮询算法,它将请求依次分配给不同的rs节点,也就是rs节点中均摊分配。这种算法简单,但只适合于rs节点处理性能差不多的情况 |
wrr | 加权轮训调度,它将依据不同rs的权值分配任务。权值较高的rs将优先获得任务,并且分配到的连接数将比权值低的rs更多。相同权值的rs得到相同数目的连接数。 |
wlc | 加权最小连接数调度,假设各台rs的全职依次为wi,当前tcp连接数依次为ti,依次去ti/wi为最小的rs作为下一个分配的rs |
dh | 目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的rs |
sh | 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的rs |
lc | 最小连接数调度(least-connection),ipvs表存储了所有活动的连接。lb会比较将连接请求发送到当前连接最少的rs. |
lblc | 基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台rs,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的rs,并以它作为下一次分配的首先考虑。 |
ds中配置rs(2个)节点:
ipvsadm -a -t 192.168.183.150:80 -r 192.168.183.134:80 -g ipvsadm -a -t 192.168.183.150:80 -r 192.168.183.135:80 -g
参数说明:
- -a:给集群添加一个节点
- -t:指定vip地址
- -r:指定real server地址
- -g:表示lvs的模式为dr模式
添加了节点后,我们通过ipvsadm -ln查看,可以看到多了2个节点。
此时集群列表中客户端请求数据和tcp通信数据会持久化保存,为了更好看到效果,我们可以把时间设置成2秒保存,如下命令:
ipvsadm --set 2 2 2
此时我们请求http://192.168.183.150/
测试
可以发现请求会在两台nginx轮询切换。
到此这篇关于使用lvs+nginx集群搭建高并发架构的实现示例的文章就介绍到这了,更多相关lvs nginx集群搭建高并发内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: Redis分布式锁如何自动续期的实现
下一篇: redis专属链表ziplist的使用