文章目录
- 一、名词解释
- 1、高可用集群
- 2、LVS
- 3、Keepalived
- 二、搭建流程
- 1、安装Docker
- 2、安装Nginx
- 3、安装Keepalived
- 4、编写nginx_check.sh脚本
一、名词解释
1、高可用集群
对于中小型互联网公司,产品所承受的请求量还是比较低的,所以一般使用单节点Nginx + 多服务集群,这种方式就能够满足需求。
但是有些公司产品请求量是非常大的,此时单台Nginx可能没办法满足需求(如果单节点宕机,整个系统崩溃),此时就会考虑搭建Nginx高可用集群
,通过LVS
提供统一的访问入口,将请求负载均衡到我们的Nginx集群。
当某个Nginx节点宕机,Keepalived
会进行监控,备用节点也会继续向外提供服务,确保程序还是正常运行,这就是高可用集群的魅力
2、LVS
LVS(Linux Vritual Server)
,大白话翻译过来就是一种负载均衡调度器,可以虚拟出来一个IP地址(公网IP),这样可以为我们的Nginx集群生成一个唯一的访问IP地址,该IP一般称之为VIP(Vriutal IP,虚拟IP)
,用户访问虚拟IP就可以实现Nginx集群的负载均衡功能
3、Keepalived
LVS只提供负载均衡功能,但是不能监控Nginx节点状态。如果某Nginx节点宕机,就没办法处理客户端发送过来的请求,造成服务不可用!
Keepalived
基于 VRRP
协议实现的保证集群高可用,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。
VRRP
协议保证当主机的下一路由器出现故障时,由另外一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。
二、搭建流程
我使用的是两台阿里云ESC(2核2G服务器),IP地址分别为:
47.94.210.20:22
(Master)8.218.185.242:22
(Backup)
大家可以在Windows本地安装虚拟机来代替。
1、安装Docker
两台ESC分别安装好Docker
2、安装Nginx
两台ESC安装好Nginx,
按照第5小节执行完毕后,两台服务器执行下方命令,此时Nginx容器启动成功:
# 进入 /usr/local/nginx/html
cd /usr/local/nginx/html
# 创建nginx首页(两台服务器首页内容要区分,第二台服务内容可以为"Backup Nginx")
echo "Master Nginx" > index.html
# 启动容器
docker run \
--name nginx \
-p 443:443 -p 80:80 \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/ssl:/etc/nginx/ssl/ \
--privileged=true -d --restart=always nginx
3、安装Keepalived
两台ESC分别安装Keepalived:
# 通过yum工具安装Keepalived
yum install -y keepalived
- 操作主节点keepalived配置文件
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
配置内容如下:
! Configuration File for keepalived
# Keepalived 检测脚本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # nginx宕机以后,自动开启shell
interval 2 # 检测时间间隔
weight -20 # 如果条件成立,权重为-20
}
vrrp_instance VI_1 {
state MASTER # 主、备标识
interface eth0 # 网卡
virtual_router_id 51 # 主、备需要相同
mcast_src_ip 47.94.210.20 # 本机IP
priority 100 # 优先级(主节点大)
advert_int 1 # 心跳检测间隔
authentication {
auth_type PASS
auth_pass 1111
}
# 将 chk_nginx 加入instance 配置块
track_script {
chk_nginx
}
# 虚拟IP
virtual_ipaddress {
192.168.200.16
}
}
- 操作备节点keepalived配置文件
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
配置内容如下:
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 8.218.185.242
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.200.16
}
}
4、编写nginx_check.sh脚本
两台ESC分别执行:
# 编辑脚本
vim /etc/keepalived/nginx_check.sh
内容如下:
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
docker restart nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
# 脚本文件授权
chmod 777 /etc/keepalived/nginx_check.sh