使用 Lvs + Nginx 集群搭建高并发架构
Posted 、楽.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 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+keepalived+nginx搭建高可用负载均衡集群(详细配置步骤讲解)
一.准备工作
首先我们要准备四台虚拟机如下表所示:
主机 | IP |
MASTER | 192.168.204.130 192.168.204.208(VIP) |
real_server1 | 192.168.204.135 |
real_server2 | 192.168.204.137 |
BACKUP | 192.168.204.138 |
1.在主机和备机上都要安装LVS和keepalived:
安装LVS:yum install ipvsadm -y
安装keepalived:需要先安装依赖库:
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
然后yum install keepalived -y
我们需要在主机上配置一个虚拟ip,这个我们可以直接在keepalived.conf中配置,现在不需要着急
2.在两台真实服务器上都要安装nginx:
安装nginx也需要先安装依赖库:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
然后:yum install nginx -y
接下来我们就要查看每台服务器的防火墙以及slinux是否关闭,时间是否同步,如果不知道如何修改,具体的修改方式在前面的博客都有具体讲.
二.nginx服务器的配置
.为了更好的区分两台nginx服务器,我们需要修改一下nginx的html配置.
cd /usr/share/nginx/html
然后编辑index.html文件具体配置如下:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<h2>This is RealServer-1 for Nginx:192.168.204.135 </h2>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
这里需要注意的是我们要将nginx的IP修改为本机IP
然后我们可以访问一下nginx的网页,结果如下图所示:
另外一台真实服务器的nginx配置也和上面一样
注意:如果你的nginx页面并不显示刚刚新加的IP信息的话,我们就要查看对应的nginx下的default.conf文件配置的路径是否与我们现在的路径一致,如果遇到上面的问题的具体解决办法如下:首先我们要进到/etc/nginx/conf.d目录下,编辑default.conf文件,如下:
我们要注意上面的箭头所指的文件路径要与我们刚才配置的index.html的路径保持一致,否则将无法识别!!!!!两台nginx服务器配置好了之后就可以开始后续操作了.
三.keepalived的具体配置
vim /etc/keepalived/keepalived.conf
(第一部分如上图所示,把不需要的注销掉)
(第二部分的箭头所指是VIP,也就是虚拟地址,随便设置一个就可以了,最好和真实IP保持同一网段)
(第三部分的第一个IP地址为虚拟IP,端口默认为你default.conf里所配置的端口,大多为80端口,第二个IP是我们的真实主机1的IP地址,第三个IP为真实主机2的IP地址,剩下的信息按照上图配置保持一致即可,另外的多余信息注销掉)
另外一台备机的配置跟上面差不多,需要修改的地方有第二张图的第二行state要改为BACKUP.
切记:每一次修改配置文件之后都需要重启服务才能生效!!!!!!!!!!
四.真实主机的环境配置
配置两台真实服务器上的回环地址,具体步骤如下:
cd /etc/sysconfig/network-scripts/
然后编辑回环地址:vim ifcfg-lo,具体配置如下图:
添加上箭头所指的两行,IP为上面配置的虚拟IP,其他保持上图一致.
接下来我们需要调整内核参数,关闭arp响应,具体操作如下所示:
vim /etc/sysctl.conf
我们需要在文件的末尾添加上如上图所示的四行内容.另外一台真实主机做相同配置即可.
五.测试
我们在网页上访问虚拟IP时不断刷新可以在两台真实主机上来回跳转即可,这个时候就凸显了我们最开始修改nginx的html文件的重要性了,不然无法分别是否发生跳转.
如果跳转成功就说明本次服务搭建完成.
六.排错及排错思路
首先我们要养成遇到问题首先查看日志的思维,如果是服务无法跳转那么我们先查看一下主机是绑定两台真实服务器:
保证两台真实服务器都存在了之后我们再查看一下信息:
Lvs模块设置超时时间:ipvsadm --set 1 2 1
Keepalived.conf需要注释persistence_timeout 1
Nginx.conf需要改配置keepalive_timeout 1
如果上述操作均已完成之后还是无法实现页面跳转,那么我们就要再次查看报错日志,
真实服务器查看报错日志方式:tail -f /var/log/nginx/error.log
主备查看日志: vim /var/log/message shift+g跳转到最后一行,查看具体报错信息.
本次分享就这些,希望对大家的学习有所帮助!!!
以上是关于使用 Lvs + Nginx 集群搭建高并发架构的主要内容,如果未能解决你的问题,请参考以下文章
使用Nginx1.9.9+Keepalived1.2.x搭建高可用负载均衡集群