简介
前面的一篇博客介绍了基于KeepAlived双主模型的高可用LVS的实现,详见(http://www.jianshu.com/p/0e8efc8fda3c),但是目前Nginx在企业使用的比较多,因为Nginx是基于七层的调度,工作在网路第7层,所以可以对HTTP应用实施分流策略,比如域名、结构等。相比之下,LVS并不具备这样的功能,所以Nginx可使用的场合远多于LVS。
基于这样的考量,下面将介绍一下基于KeepAlived双主模型的高可用Nginx的实现。
实验实现基于KeepAlived双主模型的高可用Nginx
需求分析
网络拓扑如下图所示
FQDN | IP |
---|---|
images.king.com | VIP1 172.18.1.100 |
app.king.com | VIP2 172.18.1.200 |
当客户端访问images.king.com的时候,是通过VIP1访问,最终后端提供服务的是WEBSRV1和WEBSRV2;当客户端访问app.king.com的时候,是通过VIP2访问,后端提供服务的是WEBSRV3和WEBSRV4。当用户访问其中一个站点的时候,单个Nginx服务器可以提供负载均衡,将前端的请求调度到后端的两台WEBSRV上,但是一台Nginx无法避免单点失败的问题,所以考虑用两台Nginx服务器配合KeepAlived来实现高可用性。同时,企业提供两个站点的服务,如果每个站点都采用两台Nginx来实现高可用性,那么需要四台Nginx服务器,成本比较高,而且正常情况下,有两台Nginx服务器处于空闲中。可以考虑采用KeepAlived + Nginx 双主模型的方式来实现这种需求。
双主模型。即针对VIP1,Nginx1是MASTER,Nginx2是BACKUP,此时,VIP1漂在Nginx1上面,Nginx1负责调度后端的WEBSRV1和WEBSRV2。针对VIP2,Nginx2是MASTER,Nginx1是BACKUP,此时,VIP2漂在Nginx2上面,Nginx2负责调度后端的WEBSRV3和WEBSRV4。当Nginx1或者Nginx2服务器的nginx服务,或者keepalived服务出现故障,亦或是一台nginx服务器的网络出现故障的时候,那么此时出故障的Nginx服务器上面的VIP将漂移到另一台Nginx服务器上面,并且原来负责的两台后端WEBSRV将由正常的Nginx服务器接管。以上是大致的实现过程。
实验环境准备
搭建上图所示的实验环境,为了突出实验的重点,上面的路由器省略,确保CLIENT和NGINX1以及NGINX2在同一个物理网络即可。CLIENT上面配置了一块网卡,IP地址是172.18.1.6。NGINX1和NGINX2上面有两块网卡,分别配置了VIP和DIP,VIP用于面向CLIENT,而DIP则用来连接后端的四台WEBSRV。
确保所有虚拟机(centos7.3)上面的防火墙和selinux处于关闭状态。
各节点时间必须同步
找一台机器A与国内一台常用的NTP服务器同步时间,企业里面其他的机器与A机器同步时间。
各节点之间通过主机名互相通信,建议使用/etc/hosts文件实现
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信
实验过程
一、配置客户端CLIENT
vim /etc/hosts
# 添加下面两行
172.18.1.100 images.king.com
172.18.1.200 app.king.com
二、在WEBSRV1和WEBSRV2上面
WEBSRV2的配置和WEBSRV1的配置大致相同,下面以WEBSRV1为例介绍一下。
# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV2,就把WEBSRV1 改为WEBSRV2
# 这里是为了便于测试才区分的
echo "WEBSRV1 images" > /var/www/html/index.html
三、在WEBSRV3和WEBSRV4上面
WEBSRV4的配置和WEBSRV3的配置大致相同,下面以WEBSRV3为例介绍一下。
# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV4,就把WEBSRV3 改为WEBSRV4
# 这里是为了便于测试才区分一下的
echo "WEBSRV3 app" > /var/www/html/index.html
四、配置NGINX1服务器
# 安装KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from node1@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.111.111.111
}
vrrp_script chk_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -20
}
vrrp_script chk_nginx {
script "killall -0 nginx &> /dev/null && exit 0 || exit 1"
interval 1
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 88
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 411fa9f6
}
virtual_ipaddress {
172.18.1.100/16
}
track_script {
chk_down
chk_nginx
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens37
virtual_router_id 66
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123fa9f6
}
virtual_ipaddress {
172.18.1.200/16
}
}
# 安装nginx
yum install nginx
# 配置nginx
vim /etc/nginx/nginx.conf
# http{}里面添加
upstream webgroup1{
server 192.168.1.14:80 weight=1;
server 192.168.1.15:80 weight=2;
server 127.0.0.1:80 backup;
}
upstream webgroup2{
server 192.168.1.16:80 weight=1;
server 192.168.1.66:80 weight=2;
server 127.0.0.1:80 backup;
}
# server{} 修改如下
server {
listen 80;
listen [::]:80;
server_name _;
root /app/website;
index index.jsp index.html;
}
# 新建/etc/nginx/conf.d/real_server.conf,添加server
vim /etc/nginx/conf.d/real_server.conf
server {
listen 172.18.1.100:80;
server_name images.king.com;
root /app/images;
location / {
proxy_pass http://webgroup1;
}
}
server {
listen 172.18.1.200:80;
server_name app.king.com;
root /app/app;
location / {
proxy_pass http://webgroup2;
}
}
# 准备目录以及sorry server
mkdir /app/website
echo "sorry server" > /app/website/index.html
mkdir /app/app
mkdir /app/images
# 启动nginx和keepalived
nginx
systemctl start keepalived
五、配置NGINX2服务器
# 安装KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from node2@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2
vrrp_mcast_group4 224.111.111.111
}
vrrp_script chk_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -20
}
vrrp_script chk_nginx {
script "killall -0 nginx &> /dev/null && exit 0 || exit 1"
interval 1
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens37
virtual_router_id 88
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 411fa9f6
}
virtual_ipaddress {
172.18.1.100/16
}
}
vrrp_instance VI_2 {
state MASTER
interface ens37
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123fa9f6
}
virtual_ipaddress {
172.18.1.200/16
}
track_script {
chk_down
chk_nginx
}
}
# 安装nginx
yum install nginx
# 配置nginx
vim /etc/nginx/nginx.conf
# http{}里面添加
upstream webgroup1{
server 192.168.1.16:80 weight=1;
server 192.168.1.66:80 weight=2;
server 127.0.0.1:80 backup;
}
upstream webgroup2{
server 192.168.1.14:80 weight=1;
server 192.168.1.15:80 weight=2;
server 127.0.0.1:80 backup;
}
# server{} 修改如下
server {
listen 80;
listen [::]:80;
server_name _;
root /app/website;
index index.jsp index.html;
}
# 新建/etc/nginx/conf.d/real_server.conf,添加server
vim /etc/nginx/conf.d/real_server.conf
server {
listen 172.18.1.200:80;
server_name app.king.com;
root /app/app;
location / {
proxy_pass http://webgroup1;
}
}
server {
listen 172.18.1.100:80;
server_name images.king.com;
root /app/images;
location / {
proxy_pass http://webgroup2;
}
}
# 准备目录以及sorry server
mkdir /app/website
echo "sorry server" > /app/website/index.html
mkdir /app/app
mkdir /app/images
# 启动nginx和keepalived
nginx
systemctl start keepalived
六、在CLIENT上进行测试
测试一:
for i in {1..15};do curl images.king.com; done
for i in {1..15};do curl app.king.com; done
按照调度算法正常进行服务调度。
测试二:
for i in {1..50};do sleep 0.5; curl images.king.com;done
for i in {1..50};do sleep 0.5; curl app.king.com;done
断开NGINX1或者NGINX2的网络,两个站点依然正常访问。
停掉其中一台NGINX的keepalived服务,两个站点正常访问。
此时,VIP1和VIP2集中在一台正常工作的NGINX服务器上面。
测试三:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉WEBSRV1或者WEBSRV2,images.king.com站点依然可以正常访问。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉WEBSRV3或者WEBSRV4,app.king.com站点依然可以正常访问。
测试四:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉NGINX1服务器上面的nginx服务,发现images.king.com依然可以访问。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉NGINX2服务器上面的nginx服务,发现app.king.com依然可以访问。
测试五:
for i in {1..50};do sleep 0.5; curl images.king.com;done
把WEBSRV1和WEBSRV2的httpd服务都停掉,发现显示的是sorry,server,前端调度器NGINX充当了WEBSRV。
for i in {1..50};do sleep 0.5; curl app.king.com;done
把WEBSRV3和WEBSRV4的httpd服务都停掉,发现显示的是sorry,server,前端调度器NGINX充当了WEBSRV。