高并发高可用架构设计之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 @ 2023-03-10 10:23  masy  阅读(871)  评论(0编辑  收藏  举报