0x00 背景
nginx做负载均衡与反向代理,来达到分发请求的目的,但是不能很好的避免单点故障,假如nginx服务器宕机,那么所有的服务也会跟着瘫痪 。keepalived+nginx,就能很好的解决这一问题。
主机: Master 192.168.1.211
备机: Node 192.168.1.210
虚拟IP: 192.168.1.212
0x01 Keepalived介绍
Keepalived
Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
VRRP
在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。 VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器。VRRP协议使用选择策略从路由器组中选出一台作为主控,负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。当由于某种原因主控路由器发生故障时,备份路由器能在几秒钟的时延后升级为主路由器。由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
0x02 安装Ngnix
分别在主备两台机器上安装Nginx,并配置。详情请看:Nginx 代理Http及TCP请求
0x03 安装Keepalived
1. 创建Keepalived源码目录
mkdir /home/${user}/soft // ${user} 为用户目录
mkdir /home/${user}/soft/keepalived
2. 下载Keepalived源码并解压
cd /home/${user}/soft/keepalived
wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz
tar -xzvf keepalived-1.2.22.tar.gz
3. 安装相关依赖
yum install popt-devel
yum install openssl-devel
yum install popt-devel
4. 源码编译
cd /home/${user}/soft/keepalived/keepalived-1.2.22 // 该目录为源码目录 ${user}为用户目录
./configure --prefix=/opt/keepalived/
make
make install
5. 安装成功后,会在/opt/keepalived目录下产生相关文件,由于Keepalived的相关程序都是以系统目录为基础的,所以需要将编译安装之后的文件安装到系统中,操作如下:
cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /opt/keepalived/sbin/keepalived /usr/sbin/
cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
6. 检查安装是否成功
/etc/init.d/keepalived start // 启动
/etc/init.d/keepalived restart // 重启
/etc/init.d/keepalived stop // 停止
7. 修改主从配置文件
Master 配置文件(/etc/keepalived/keepalived.conf)
! Configuration File for keepalived
global_defs {
#notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
## jutao@htdf.cc
# }
# notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
# smtp_server localhost #指定smtp服务器地址
# smtp_connect_timeout 30 #指定smtp连接超时时间
router_id Master #运行keepalived机器的一个标识
}
vrrp_script chk_nginx {
script "/opt/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight 2 #如果条件成立的话,则权重 2
}
vrrp_instance VI_1 {
state MASTER #MASTER 表示主机 BACKUP 表示备
interface wlan0 #wlan0 表示网络接口名称,根据主机选择
virtual_router_id 51 # 虚拟ID 主备必须相同,才可以相互访问到
mcast_src_ip 192.168.1.211 # 本机真实IP
priority 100 # 权重, 优先级越高,数值越大,0-255
advert_int 1 # 1S检查一次
nopreempt # 主机崩溃重启后,则抢占
authentication { # 访问密码,主备相同,才可互访
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx #执行 Nginx 监控的服务
}
virtual_ipaddress { # 虚拟IP,可多个
192.168.1.212/24
}
}
}
Node配置文件
! Configuration File for keepalived
global_defs {
#notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
## jutao@htdf.cc
# }
# notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
# smtp_server localhost #指定smtp服务器地址
# smtp_connect_timeout 30 #指定smtp连接超时时间
router_id NodeA #运行keepalived机器的一个标识
}
vrrp_script chk_nginx {
script "/opt/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight 2 #如果条件成立的话,则权重 2
}
vrrp_instance VI_1 {
state BACKUP
interface wlan0
virtual_router_id 51
mcast_src_ip 192.168.1.210
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.1.212/24
}
}
8. Nginx状态检查脚本,存放位置/opt/keepalievd/目录下,主备都有
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
`/opt/nginx/sbin/nginx`
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
9. 重启网络与Keepalievd服务
/etc/init.d/netword restart
/etc/init.d/keepalived restart
0x04 测试Keepalived+Nginx
1. 打开浏览器,输入虚拟地址
2. 关掉主服务器(192.168.1.211)Nginx,执行命令
/opt/nginx/sbin/nginx -s stop
3. 打开浏览器,输入虚拟地址
页面仍然显示,则Keepalived+Nginx集群已搭建完成