高并发高可用架构设计之Nginx部署

本篇文章主要搭建nginx的双机热备搭建,实现Nginx的高可用。
以下介绍LVS+keepalived+nginx部署。
先来简单介绍下nginx吧:
nginx以占用内存小,并发高著称,常用作反向代理和负载均衡。
nginx高可用方案使用最广的是LVS+keepalived+双机热备,接下来说下怎么部署。

nginx高可用


上图为nginx的负载均衡架构图,解决了web容器的的单点故障和高并发的问题,当LVS的master节点故障时,LVS的backup节点会替代主节点;但是当一台nginx故障时,请求将会打到另一台上。

LVS

LVS(Linux Virtual Server)即Linux虚拟服务器,实现了基于IP的数据请求负载均衡调度方案;是四层负载均衡。
流程是:客户端发出请求,会先到DNS服务器上,之后解析到LVS负载均衡调度器上,LVS会虚拟出来一个外网IP(即VIP),此时客户端用户会连接到这个VIP,LVS会根据指定的调度算法确定具体要连接到哪一台nginx服务器上。如下图:

keepalived

主要使用keepalived来做nginx的健康检测和高可用,keepalived的高可用是通过VRRP协议实现的。VRRP协议保证当主机的下一个路由器出现故障时,由另外一个路由器代替出现故障的路由器进行工作,从而保证网络通信的连续性和可靠性。
LVS实现负载均衡,但他并不知道nginx是否正常运行,即使nginx挂掉,LVS依旧会把请求发送到挂掉的服务器。
keepalived实现了真机故障隔离和负载均衡器间的失败切换,防止单点故障。

Nginx双机热备

双机热备是指一台服务器提供服务,另一台处于备用状态,当主机挂掉后,备用机器会代替主机继续服务。双机热备主要解决nginx单点故障问题。

搭建

准备四台服务器,我搭建时使用的是CentOS7。

主机:192.168.2.130,做nginx1;
主机:192.168.2.131,做nginx2;
主机:192.168.2.132,做keepalived的master节点;
主机:192.168.2.133,做keepalived的backup节点;
虚拟IP(VIP):192.168.2.150
服务器安装依赖

yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel yum install -y libnl libnl-devel yum install -y libnfnetlink-devel

安装Nginx

在192.168.2.130和192.168.2.131两台机器上安装nginx,命令如下

#创建文件夹 mkdir /usr/local/nginx #复制nginx安装包到文件中 cp nginx-1.22.1.tar.gz /usr/local/nginx/ #解压缩 cd /usr/local/nginx/ tar -zxvf nginx-1.22.1.tar.gz #执行安装命令 ./configure --with-http_stub_status_module --with-http_ssl_module make && make install #启动nginx服务 cd /usr/local/nginx/sbin/ ./nginx #查看nginx服务 ps -ef|grep nginx #要想访问需要开放nginx接口,或者关闭防火墙,关闭防火墙命令如下 systemctl stop firewalld.service

安装keepalived

在192.168.2.132和192.168.2.133两台机器上安装keepalived,命令如下

#解压缩 tar -zxvf keepalived-2.0.20.tar.gz #安装 ./configure --prefix=/usr/local/keepalived --sysconf=/etc make && make install #启动 cd /usr/local/keepalived/sbin/ ./keepalived #为了方便启动,将Keepalived注册到Linux系统,进入到解压的keepalived目录(注意:这里是一开始解压的目录,不是keepalived安装目录) #进到文件夹下 cd keepalived-2.0.20/keepalived/etc/ #执行如下命令,若提示重复,直接覆盖即可 sudo cp init.d/keepalived /etc/init.d/ sudo cp sysconfig/keepalived /etc/sysconfig/ #使配置生效 systemctl daemon-reload #启动keepalived systemctl start keepalived.service #停止keepalived systemctl stop keepalived.service #重启keepalived systemctl restart keepalived.service

安装ipvsadm

用于查看lvs转发及代理情况的工具,只需要在 192.168.2.132和 192.168.2.133上安装即可

#执行 yum install ipvsadm -y

配置nginx服务器

在 192.168.2.130和 192.168.2.131构建虚拟网络接口子接口

#进到/etc/sysconfig/network-scripts文件夹中 cd /etc/sysconfig/network-scripts #复制ifcfg-lo并命令为ifcfg-lo:1 cp ifcfg-lo ifcfg-lo:1 #修改复制的文件 vi ifcfg-lo:1 #修改内容如下 DEVICE=lo:1 IPADDR=192.168.2.150 NETMASK=255.255.255.255 #重启网络 service network restart #配置ARP vim /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

添加一个host,去接收报文交给lo:1处理

#这样添加重启后会失效 route add -host 192.168.2.150 dev lo:1 #查看 route -n #添加开启自启动 echo "route add -host 192.168.2.150 dev lo:1" >> /etc/rc.local

配置keepalived

配置keepalived的mater节点
修改keepalived文件

vim /etc/keepalived/keepalived.conf

修改内容如下

global_defs { router_id LVS_132 # 设置lvs的id,在一个网络内唯一标识 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写 interface ens33 #网卡id 换成你自己电脑的网卡id,查看:ip addr virtual_router_id 41 #虚拟id,主备要一致 priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR advert_int 1 #检查间隔,默认为1s authentication { #密码主备一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.150 #设置虚拟IP(VIP) } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual_server 192.168.2.150 80 { delay_loop 6 #健康检查时间,单位:秒 lb_algo rr # 配置负载均衡的算法,默认为轮询 lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式 persistence_timeout 5 #设置会话持久化的时间 protocol TCP #协议 -t #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.2.130 80 { weight 1 #轮询的默认权重配比设置为1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.2.131 80 { weight 1 #轮询的默认权重配比设置为1 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } }

保存退出,重启keepalived服务
systemctl restart keepalived

配置keepalived的backup节点,操作如上,配置文件内容如下

global_defs { router_id LVS_133 # 设置lvs的id,在一个网络内唯一标识 } vrrp_instance VI_1 { state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写 interface ens33 #网卡id 换成你自己电脑的网卡id,查看:ip addr virtual_router_id 41 #虚拟id,主备要一致 priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR advert_int 1 #检查间隔,默认为1s authentication { #密码主备一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.150 #设置虚拟IP(VIP) } } #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80 virtual_server 192.168.2.150 80 { delay_loop 6 #健康检查时间,单位:秒 lb_algo rr # 配置负载均衡的算法,默认为轮询 lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式 persistence_timeout 5 #设置会话持久化的时间 protocol TCP #协议 -t #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.2.130 80 { weight 1 #轮询的默认权重配比设置为1 #设置健康检查 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址 real_server 192.168.2.131 80 { weight 1 #轮询的默认权重配比设置为1 TCP_CHECK { #检查的80端口 connect_port 80 #检查超时时间 connect_timeout 2 #重试的次数 nb_get_retry 3 #间隔时间 delay_before_retry 3 } } }

ipvsadm操作

查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接
ipvsadm -Lnc

测试

访问VIP,即192.168.2.150,可看到展示nginx访问页面,多刷新几次,可看到nginx两台机器在轮询访问。
将nginx服务停掉一台,看到访问会都到还运行的机器上;将keepalived的master节点停掉,请求依然好用,说明backup起作用了。

posted @   masy  阅读(957)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示