一、什么是高可用?
nginx做负载均衡,能达到分发请求的目的,但是不能很好的避免单点故障。
1、nginx集群单点问题
- 分发器宕机怎么处理?
假如nginx服务器挂掉了,那么所有的服务也会跟着瘫痪 。
一种方法是人为监控,发现主分发器宕机后,立马登录备分发器,并给它分配虚ip。
另一种办法是用软件来替代人来监控,自动登录备分发器,分配虚ip。 - 数据服务器宕机怎么处理?
分发器可以自动判断数据服务器的存活状态,不对宕机服务器要数据。
2、Keepalived介绍
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使 其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
总结来说:Keepalived软件是一个监控+自愈的软件。
运行协议是VRRP,主分发器的keepalived会向网络中发组播,宣告自己还活着,组播地址:224.0.0.18。
$ tcpdump -nn -vvv -i ens33 vrrp #查看组播的包
192.168.31.40 > 224.0.0.18: vrrp 192.168.31.40 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20, addrs: 192.168.31.213 auth "1111^¥##"
输出解析:192.168.31.40是master,目标地址是224.0.0.18,使用的协议是VRRPv2版本,虚拟id是51,优先级是100,简单验证类型,一秒发一次,长度20字节,虚Ip是192.168.31.213, 验证的密码是111#$Z%#
二、keepalived安装管理
1、keepalived下载
keepalived官网下载地址
linux下载keepalived软件:
$ wget http://www.keepalived.org/software/keepalived-2.0.8.tar.gz
2、keepalived安装
使用如下shell脚本keepalived_instll.sh安装keepalived软件。
$ sh keepalived_install.sh
#keepalived安装脚本
#!/bin/bash
pkg=keepalived-2.0.8.tar.gz tar xf $pkg
yum -y install kernel-devel
ln -s /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/ /usr/src/linux
cd keepalived-2.0.8/
yum install openssl-* -y
./configure --prefix=/usr/local/keepalived
make
make install
mkdir -pv /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
3、启动keepalived
$ systemctl start keepalived
三、构建高可用集群
1、试验环境准备
主机名 | IP | 角色 | 系统 | 配置 | 软件 |
---|---|---|---|---|---|
Master.ayitula.com | 192.168.31.40 | 主分发器 | centos7.5 | 2核4G | Nginx+keepalived |
Backup.ayitula.com | 192.168.31.41 | 备分发器 | centos7.5 | 2核4G | Nginx+keepalived |
Web01.ayitula.com | 192.168.31.42 | 数据服务器1 | centos7.5 | 2核4G | Nginx |
Web02.ayitula.com | 192.168.31.43 | 数据服务器2 | centos7.5 | 2核4G | Nginx |
2、软件环境部署步骤
1)分发器:nginx+keepalived
2)数据服务器:Nginx
3)配置Nginx分发器
4)配置数据服务器页面(web01 web02)
5)配置keepalived.conf
6)测试
3、配置Nginx集群
upstream web {
server 192.168.31.42 max_fails=2 fail_timeout=3; # 超时时间3秒内失败2次认为服务器死了
server 192.168.31.43 max_fails=2 fail_timeout=3;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
4、配置keepalived
(1)主分发器keepalived
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx { # 定义一个脚本
script "/etc/keepalived/nginx_pid.sh" # 脚本路径
interval 2 # 探针,此处是每两秒执行一次脚本
fall 1 # 失败次数 1
}
vrrp_instance nginx { # 定义名为nginx实例
state MASTER # 主机状态
interface ens33 # 网卡
mcast_src_ip 192.168.31.40 # 发组播
virtual_router_id 51 # 虚拟id
priority 100 # 优先级
advert_int 1 # 探针,一秒发一次组播
authentication {
auth_type PASS
auth_pass 1111 # 密码
}
track_script {
check_nginx
}
virtual_ipaddress { # 虚ip
192.168.31.213/24
}
}
(2)备分发器keepalived
#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_pid.sh"
interval 2
fall 1
}
vrrp_instance nginx {
state BACKUP
interface ens33
mcast_src_ip 192.168.31.41
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.31.213/24
}
}
5、编写关联脚本nginx_pid.sh
#!/bin/bash
nginx_kp_check () {
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 1
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
}
nginx_kp_check
脚本原理:该脚本检查nginx进程是否存在,如果进程没了,说明分发器挂了,尝试启动分发器,1秒后检查分发器启动没有,如果没有启动直接关闭keepalived,停止发组播,备就自动开始工作了。
四、故障测试
1、分发器宕机测试
分发器由keepalived来管理
$ watch -n1 killall nginx # 每隔一秒杀死一次所有nginx
2、数据服务器宕机测试
数据服务器则由nginx来管理。使用如下两个参数就可实现对数据服务器管理:
- max_fails
允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误; - fail_timeout
失败超时时间,在连接Server时,如果在超时时间之内超过max_fails指定的失败次数,会认为在fail_timeout时间内Server不可用,默认为10s
upstream web {
server 192.168.31.42 max_fails=2 fail_timeout=3; # 超时时间3秒内失败2次认为服务器死了
server 192.168.31.43 max_fails=2 fail_timeout=3;
}