一、概念
在软件开发中,经常提倡开发高可用的系统,但是,什么是高可用呢?
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。 ------百度百科
简而言之,就是让系统尽量不停止工作。
通过nginx的负载均衡可以让其他服务器降低负载,减小宕机的概率。但是,运行nginx的服务器可是接收着海量的请求并且还要负责转发,当它承受不了这些负载的时候,也会宕机。这时候,最常用的做法就是提前准备备用的nginx服务器来代替它,称为nginx的主备模式。
二、准备工作
首先,准备两台都安装了nginx的服务器。复习一下安装nginx的步骤,如下:
# 安装C++编译器
yum -y install gcc gcc-c++
# 下载 pcre-8.37.tar.gz
wget https://udomain.dl.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
# 解压缩
tar -xvf pcre-8.37.tar.gz
# 配置
cd pcre-8.37
./configure
# 编译和安装
make && make install
# 安装其他依赖
yum -y install zlib zlib-devel openssl openssl-devel
# 下载nginx压缩包:
wget http://nginx.org/download/nginx-1.12.2.tar.gz
# 解压缩
tar -xvf nginx-1.12.2.tar.gz
# 配置
cd nginx-1.12.2
./configure
# 编译和安装
make && make install
然后,还需要安装keepalived
用来检测nginx是否宕机,安装命令如下:
yum -y install keepalived
可用以下命令验证是否安装成功:
rpm -q -a keepalived
三、keepalived配置
keepalived
配置文件是位于/etc/keepalived
目录的keepalived.conf
。
打开后,首先看到全局定义块global defs
,这里定义了一些全局变量,我们暂时不需要修改。:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
再往下看,是vrrp_script
块,这里设置检测nginx状态的脚本信息:
vrrp_script chk_http_port {
script "/usr/local/nginx_check.sh" # 脚本的位置
interval 2 # 检测的时间间隔
weight 2
}
脚本nginx_check.sh
的内容如下,把该文件放到上面设置的目录即可:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ $A -eq 0 ];then
killall keepalived
fi
fi
然后是vrrp_instance
块,这里设置实例信息以及绑定虚拟IP:
vrrp_instance VI_1 {
state MASTER # 主服务器为MASTER,备用服务器改为BACKUP
interface eth0 # 网卡名称
virtual_router_id 51 # 主机和备机的virtual_router_id必须相同
priority 100 # 优先级,主机需要取值较大,备机取值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.239.50 # 虚拟IP地址
}
}
最后,启动nginx
和keepalived
即可:
# 启动nginx
/usr/local/nginx/sbin/nginx
# 启动keepalived服务
systemctl start keepalived.service
四、测试
在外部主机的浏览器上访问http://虚拟IP/
,跳转到nginx主页:
关闭主服务器,重新在外部主机的浏览器上访问http://虚拟IP/
,仍然能跳转到nginx主页,证明nginx主备模式配置成功。
五、原理解释
由于用户访问的是两台服务器绑定的虚拟IP,所以两台服务器都可以接收到访问这个IP的请求。这里通过keepalived
周期性检测nginx
的运行状态,当发现主服务器的nginx停止工作时,请求会发送到备用服务器,由备用服务器来处理。