如果nginx服务存在异常,上面的负载均衡架构就面临问题,服务不可用。
这个时候就会采用高可用方案了,简单的高可用是一般主从备份机制。
我们可以使用2台机器,作为主、备服务器,各自运行nginx服务。 需要一个监控程序,来控制传输主、备之间的心跳信息(我是否还活着的信息),如果备份机在一段时间内没有收到主的发送信息,则认为主已经挂了,自己上去挑大梁,接管主服务继续提供负载均衡服务。 当备再次可以从主那里获得信息时,释放主服务,这样原来的主又可以再次提供负载均衡服务了。
这里有3个角色: 一主、一备、监控程序。其中的监控程序或者软件我们可以采用Keepalived。
Keepalived类似一个工作在layer3,4&7的交换机。 Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下: Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(即我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被 非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。 Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。 Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。 ---- 来自搜狗百科
主要用作真实服务器的健康状态检查以及负载均衡的主机和备机之间故障切换实现。
一般的高可用web架构组件:LVS+keepalived+nginx
Keepalived高可用简单架构概念视图:
当主down机后,会提升备为主,保证服务可用。
当主再次上线时,备会退位,主继续服务。
Keepalived 模块化设计,主要有三个模块,分别是core
、check
和 vrrp
。
yum install -y keepalived
#下载
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
#解压
tar -zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23
#安装
./configure --prefix=/usr/local/keepalived #prefix指定安装目录
make
make install
vi /usr/local/keepalived/etc/keepalived/keepalived.conf
替换为你自身逻辑的配置文件的内容。
vi /usr/local/keepalived/etc/sysconfig/keepalived
添加以下内容:
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf" #不使用默认的,自己显示指定keepalived配置文件路径
# 因为我们使用非默认路径(/usr/local)安装keepalived,需要设置一些软链接以保证keepalived能正常启动:
ln -s /usr/local/keepalived/sbin/keepalived /usr/bin #将keepalived主程序加入到环境变量
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ #keepalived启动脚本,放到/etc/init.d/目录下就可以使用service命令便捷调用
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ #keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可
启动服务
service keepalived start
# 可以检查下服务是否正常(没有消息就是最好的消息)
chkconfig keepalived on
# 查看绑定好的虚拟ip(vip)
ip addr
# 测试
使用配置好的虚拟ip,在浏览器访问测试一下即可。
也可以这样设置,配置文件:安装完成之后,可以把配置文件放到目录: /etc/keepalived
后面则统一修改 /etc/keepalived/keepalived.conf
配置文件即可。
/etc/keepalived/keepalived.conf
启动|停止|重启服务
service keepalived start|stop|restart
检查服务
chkconfig keepalived on
查看keepalived版本
keepalived -v
Keepalived v1.2.23 (12/20,2019)
使用keepalived结合nginx,搭建一套简单的高可用集群方案。
并且测试主宕机的情况;
演示主上线的情况。
/etc/profile
文件中。在192.168.75.132、192.168.75.135分别安装keepalived并配置
#下载
mkdir /usr/local/keepalived
cd /usr/local/keepalived
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
# 或者 wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz --no-check-certificate 跳过证书验证
#解压
tar -zxvf keepalived-1.2.23.tar.gz
# cd 到解压后的目录
cd keepalived-1.2.23
# 源码安装三板斧搞起来
./configure --prefix=/usr/local/keepalived #prefix指定安装目录
make
make install
安装好后,可以看到以下目录:
在192.168.75.132(作为主)修改配置文件 keepalived.conf:
! Configuration File for keepalived
# 全局配置
global_defs {
# 发生切换时,需要通知的邮件; 一行一个用户的email地址;这里假定了几个人..
notification_email {
zs@163.com
ls@163.com
ww@163.com
}
notification_email_from admin@163.com # 发件人,谁发的;这里假定了一个管理员邮箱admin@163.com
smtp_server smtp.163.com # smtp服务器地址,这里示例使用163的公开地址
smtp_connect_timeout 30 # smtp连接超时时间设置
router_id LVS_DEVEL # 运行keepalived的一个路由标志id
}
# VRRP 配置
vrrp_instance VI_1 {
state MASTER # 配置标志,MASTER 为主;BACKUP 为备
interface eth0 # 该keepalived实例绑定的网卡; RHEL7以前可以设置为eth0,7以及之后可以设置为ens33
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 # 主、备之间检查是否一致的时间间隔:单位秒
# 认证配置 设置验证信息,主、备节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 指定虚拟IP, 主、备节点设置必须一样
# 可以设置多个虚拟ip,换行即可;随便写;这个地址是虚拟的,并不需要实体机器
# 会将该vip绑定到当前机器的网卡eth0上(因为vrrp_instance的interface指定了eth0)
192.168.75.88
}
}
在192.168.75.135(作为备)修改配置文件 keepalived.conf:
service keepalived start
ip addr
命令查看vip是否已经绑定现在把主(192.168.75.132)的keepalived关掉,在浏览器上再次访问192.168.75.88,会发现此时访问的是备(192.168.75.135)了:
综上所述,当前的架构方案,在keepalived出现问题时,是可以及时更换主备的。
我们把主的nginx服务关闭,再访问192.168.75.88,发现服务访问失败,因为此时一直访问的是主192.168.75.132的nginx。但是http://192.168.75.132:8080/服务其实是可用的。
这不是我们想要的结果,因为此时备(192.168.75.135)的nginx服务是OK的。能不能在主的nginx挂掉后,自动地切换到备的nginx服务呢?
毋庸置疑,肯定是可以的,我们还需要更多的配置。
截至目前,该方案不能保证主nginx挂掉后服务仍可用。所以,还需要继续提高高可用性。
我们需要在keepalived.conf
中增加对nginx服务的检测,根据nginx服务的状态做出一些处理。
此模块专门用于对集群中服务资源进行监控 。与此模块同时使用的还有 track_script 模块,在此模块中可以引入监控脚本、命令组合、shell 语句等 ,以实现对服务、端口等多方面的监控。
track_script 模块主要用来调用 vrrp_script 模块使 keepalived执行对集群服务资源的检测。
vrrp_script 模块中还可以定义对服务资源检测的时间间隔、权重等参数,通过 vrrp_script 和 track_script 组合,可以实现对集群资源的监控并改变优先级,进而实现 keepalived 主备节点切换。
我们可以在keepalived.conf
文件中新增一个vrrp_script
节点,来指定监控一个shell脚本文件: /etc/keepalived/check_and_start_nginx.sh
。
# 新增一个vrrp_script节点,用来监控nginx
vrrp_script chk_nginx {
script "/etc/keepalived/check_and_start_nginx.sh" # 检测nginx服务并尝试重启
interval 2 # 每2s检查一次
weight -5 # 检测失败(脚本返回非0)则优先级减少5个值
fall 3 # 如果连续失败次数达到此值,则认为服务器已down
rise 2 # 如果连续成功次数达到此值,则认为服务器已up,但不修改优先级
}
还需要在虚拟节点中增加track_script
子节点引用vrrp_script
节点:
# VRRP 配置
vrrp_instance VI_1 {
state MASTER # 配置标志,MASTER 为主;BACKUP
# ...... 省略
# 引用VRRP脚本,即在 vrrp_script 中定义的
track_script { # 引用VRRP脚本
chk_nginx
}
}
vi /etc/keepalived/check_and_start_nginx.sh
编写以下内容:
#!/bin/bash
# 查看nginx进程是否正在运行,为0则表示已经down掉
nginx_result=$(ps -C nginx --no-heading|wc -l)
if [ "${nginx_result}" = "0" ]; then
# 使用service的前提需要将nginx设置为servic; 或者直接使用nginx所在绝对路径比如: /usr/local/nginx/sbin/nginx
service nginx start # 或者使用 /usr/local/nginx/sbin/nginx
sleep 2
nginx_result=$(ps -C nginx --no-heading|wc -l)
if [ "${nginx_result}" = "0" ]; then
# 如果重启nginx服务还是不行的话,就把keepalived也停止;
# 这样会访问备keepalived,从而保证主的nginx挂掉备也能使用
/etc/rc.d/init.d/keepalived stop
fi
fi
注意!!!!: 需要加执行权限:
chmod a+x /etc/keepalived/check_and_start_nginx.sh
以下是完整的主的keepalived.conf(/etc/keepalived/keepalived.conf)文件配置:
! Configuration File for keepalived
# 全局配置
global_defs {
# 发生切换时,需要通知的邮件; 一行一个用户的email地址;这里假定了几个人..
notification_email {
zs@163.com
ls@163.com
ww@163.com
}
notification_email_from admin@163.com # 发件人,谁发的;这里假定了一个管理员邮箱admin@163.com
smtp_server smtp.163.com # smtp服务器地址,这里示例使用163的公开地址
smtp_connect_timeout 30 # smtp连接超时时间设置
router_id LVS_DEVEL # 运行keepalived的一个路由标志id
}
# 新增一个vrrp_script节点,用来监控nginx
vrrp_script chk_nginx {
script "/etc/keepalived/check_and_start_nginx.sh" # 检测nginx服务并尝试重启
interval 2 # 每2s检查一次
weight -5 # 检测失败(脚本返回非0)则优先级减少5个值
fall 3 # 如果连续失败次数达到此值,则认为服务器已down
rise 2 # 如果连续成功次数达到此值,则认为服务器已up,但不修改优先级
}
# VRRP 配置
vrrp_instance VI_1 {
state MASTER # 配置标志,MASTER 为主;BACKUP 为备
interface eth0 # 该keepalived实例绑定的网卡; RHEL7以前可以设置为eth0,7以及之后可以设置为ens33
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 # 主、备之间检查是否一致的时间间隔:单位秒
# 认证配置 设置验证信息,主、备节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 指定虚拟IP, 主、备节点设置必须一样
# 可以设置多个虚拟ip,换行即可;随便写;这个地址是虚拟的,并不需要实体机器
# 会将该vip绑定到当前机器的网卡eth0上
192.168.75.88
}
# 引用VRRP脚本,即在 vrrp_script 中定义的
track_script { # 引用VRRP脚本
chk_nginx
}
}
service keepalived start
现在主(192.168.75.132)和备(192.168.75.135)的keepalived、nginx都已经启动;
此时 浏览器访问vip : http://192.168.75.88/, 回请求到主192.168.75.132:
现在将主的keepalived关闭,再访问http://192.168.75.88/,会请求到备192.168.75.135。
再将主的keepalived启动,又会访问到主。
注意: 原来我们将主的nginx关闭,访问 http://192.168.75.88/ 时会一直调用主,导致服务不可用。现在我们在主的keepalived中配置了监控nginx服务,看他是否会尝试重启主的nginx服务并且保证给外界提供访问。
我们在主上关闭nginx服务。稍等一会,访问 http://192.168.75.88/ ,发现可以访问到主的页面,这样keepalived监控了nginx的状态并将nginx服务启动了,保证了高可用,现在不需要人工干预去启动服务了。