高并发高可用架构设计之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起作用了。