keepalived 部署 nginx 高可用案例

ip分配

ip

备注

10.1.1.51

服务1

10.1.1.52

服务2

10.1.1.53

虚拟ip

nginx

# 创建目录 /opt/nginx 并拷贝安装文件到该目录mkdir -p /opt/nginx# 切换到安装目录cd /opt/nginx# 离线安装yum localinstall -y nginx-1.24.0-1.el7.ngx.x86_64.rpm# 自启动systemctl enable --now nginx# 关闭防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service# 复制 安装文件到另一个服务scp -r /opt/nginx/ root@10.1.1.52:/opt/scp -r /opt/keepalive/ root@10.1.1.52:/opt/

# nginx的目录路径

nginx的sbin目录:/usr/sbin/nginx

静态文件目录:/usr/share/nginx/html

全局配置文件:/etc/nginx/nginx.conf

自定义配置文件目录:/etc/nginx/conf.d

keepalived-51-主

# 创建目录 /opt/keepalived 并拷贝安装文件到该目录mkdir -p /opt/keepalived# 切换到安装目录cd /opt/keepalived# 离线安装(需要rpm安装包)yum localinstall -y *.rpm# 复制原配置文件备份cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

# 编辑配置文件,不同节点配置不同,注释部分按需修改

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {router_id NG_HA # 可自定义名称,不同keepalived集群的标识名不能相同!同集群内节点名称可相同
}
vrrp_script chk_nginx {script "/etc/keepalived/checkNG.sh" # 检查服务启动的脚本interval 3 # 心跳检测间隔
}
vrrp_instance VI_1 {state BACKUP  # 主从节点配置,从节点设置为:BACKUP(非抢占模式下,两个节点都设置为BACKUP)interface ens192 # 绑定网卡,根据实际情况修改,可使用"ip a"命令获取网卡名virtual_router_id 52 # 注意:同一网段中的VRID不能重复,同一个集群中的要保持一致priority 100 # 优先级,主节点设置为:100、从节点设置为:90nopreempt # 非抢占模式advert_int 1 # 检查间隔时间authentication {auth_type PASSauth_pass 2024}virtual_ipaddress {10.1.1.53 # VIP,根据实际情况修改}track_script {chk_nginx }
}
EOF
# 添加健康检查脚本
vim /etc/keepalived/checkNG.sh
# 脚本内容 (检查nginx程序是否存在,如果不存在则尝试重启nginx,重启失败后,关闭当前节点的keepalived,让其它节点成为主节点)#!/bin/bash
if [[ `ps -C nginx --no-header | wc -l` -eq 0 ]]; thensystemctl start nginxsleep 2if [[ `ps -C nginx --no-header | wc -l` -eq 0 ]]; thensystemctl stop keepalivedfi
fi
# 启动脚本增加权限chmod +x /etc/keepalived/checkNG.sh# 设置开机自启动并启动keepalivedsystemctl enable --now keepalived

keepalived-52-从

与主节点的不同配置的地方,修改该配置部分的优先级 priority 参数低于主节点的。

# 编辑配置文件,不同节点配置不同,注释部分按需修改

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {router_id NG_HA # 可自定义名称,不同keepalived集群的标识名不能相同!同集群内节点名称可相同
}
vrrp_script chk_nginx {script "/etc/keepalived/checkNG.sh" # 检查服务启动的脚本interval 3 # 心跳检测间隔
}
vrrp_instance VI_1 {state BACKUP  # 主从节点配置,从节点设置为:BACKUP(非抢占模式下,两个节点都设置为BACKUP)interface ens192 # 绑定网卡,根据实际情况修改,可使用"ip a"命令获取网卡名virtual_router_id 52 # 注意:同一网段中的VRID不能重复,同一个集群中的要保持一致priority 80 # 优先级,主节点设置为:100、从节点设置为:90nopreempt # 非抢占模式advert_int 1 # 检查间隔时间authentication {auth_type PASSauth_pass 2024}virtual_ipaddress {10.1.1.53 # VIP,根据实际情况修改}track_script {chk_nginx }
}
EOF

原理

基于VRRP协议来实现,VRRP虚拟路由冗余协议,主要用来解决单点故障问题。

keepalived高可用抢占式与非抢占式

抢占:

会发生两次切换,默认是抢占式,对于并发访问非常高的站点,不建议配置抢占式,因为至少会发生两次VIP地址漂移。在master和backup的配置不对等的时候,尤其是master性能高而backup性能低时,建议使用抢占式。

非抢占:

配置步骤建议如下:

两个节点的state都必须都配置为backup

两个节点都在vrrp_instance中添加nopreempt参数。

其中一个节点的优先级高于另一个节点的优先级。

两台服务器都设置为backup后,那么哪个节点为主节点就完全由优先级来决定了。

配置方法:

#Mastervrrp_instance VI_1 {state BACKUPpriority 100nopreempt}#Backupvrrp_instance VI_1 {state BACKUPpriority 80nopreempt}

参考:

http://t.csdnimg.cn/9VSuJ