nginx+Keepalived实现高可用
实验环境
主机名/ip | nginx01/172.16.10.10 nginx02/172.16.10.11 |
---|
关闭防火墙和selinux | systemctl stop firewalld systemctl disable firewalld sed -i "s/.*SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config reboot | vip | 172.16.10.100 | 添加hosts解析 | cat >> /etc/hosts << EOF 172.16.10.10 nginx01 172.16.10.11 nginx02 EOF |
1.1 部署nginx
?[root@nginx01 ~]# yum -y install pcre-devel zlib-devel gcc gcc-*
?[root@nginx01 ~]# tar zxf nginx-1.12.0.tar.gz -C /usr/src
?[root@nginx01 ~]# cd nginx-1.12.0/
?[root@nginx01 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
?[root@nginx01 nginx-1.12.0]# make && make install
?[root@nginx01 nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
?[root@nginx01 nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
?[root@nginx01 nginx-1.12.0]# nginx
?[root@nginx01 nginx-1.12.0]# echo "nginx 01" > /usr/local/nginx/html/index.html
1.2 部署Keepalived
1.2.1 安装Keepalived
?# 安装Keepalived
?[root@nginx01 ~]# yum -y install keepalived
1.2.2 修改Keepalived配置文件
?[root@nginx01 ~]# vim /etc/keepalived/keepalived.conf
?! Configuration File for keepalived
?global_defs {
? ? router_id LVS_DEVEL
?}
?## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
?##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
?##并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中
?vrrp_script check_nginx { ? ? ?## Keepalived定时执行check_nginx
? ? ? ? script "/etc/keepalived/nginx_check.sh" ? ##脚本路径
? ? ? ? interval 1 ? ? ? ##每1秒检查一次
? ? ? ? weight -2 ? ? ? ##每失败一次优先级减少2
?}
??
?vrrp_instance VI_1 {
? ? state MASTER ? ? ? ? ? ?# 两个 DS,一个为 MASTER 一个为 BACKUP
? ? interface ens33 ? ? ? ? # 当前 IP 对应的网络接口,通过 ifconfig 查询
? ? virtual_router_id 62 ? ?# 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样
? ? priority 200 ? ? ? ? ? ?# 优先级值设定:MASTER 要比 BACKUP 的值大
? ? advert_int 1 ? ? ? ? ? ?# 通告时间间隔:单位秒,主备要一致
? ? authentication { ? ? ? ?# 认证机制,主从节点保持一致即可
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? track_script { ? ? ?# vrrp_instance需要执行的脚本
? ? ? ? check_nginx ? ? # 脚本为全局定义的脚本
? ? }
? ? virtual_ipaddress {
? ? ? ? ?172.16.10.100/24 ? ? ? # VIP,可配置多个
? ? }
?}
??
?# web 配置
?virtual_server 172.16.10.100 80 {
? ? delay_loop 3 ? ? ? ? ? ? ? ? ? ?# 设置健康状态检查时间
? ? lb_algo rr ? ? ? ? ? ? ? ? ? ? ?# 调度算法,这里用了 rr 轮询算法
? ? lb_kind DR ? ? ? ? ? ? ? ? ? ? ?# 这里测试用了 Direct Route 模式
? ? protocol TCP
? ? ? ? real_server 172.16.10.10 80 {
? ? ? ? weight 1
? ? ? ? TCP_CHECK {
? ? ? ? ? ? connect_timeout 10
? ? ? ? ? ? retry 3 ? ?
? ? ? ? ? ? delay_before_retry 3
? ? ? ? ? ? connect_port 80
? ? ? ? }
? ? }
?}
1.2.3 创建Keepalived需要执行的定时脚本
?# 获取nginx进程的数量
?[root@nginx01 ~]# vim /etc/keepalived/nginx_check.sh
?#!/bin/bash
?num=$(ps -ef | grep nginx | grep process | grep -v grep |wc -l)
?if [ $num -eq 0 ]
?then
? ? ? ? systemctl stop keepalived
?fi
??
?# 或者 通过查看nginx的状态
?[root@nginx01 ~]# vim /etc/keepalived/nginx_check.sh
?#!/bin/bash
?nestat -napt | grep nginx &> /dev/null
?if [ $? -ne 0 ]
?then
? systemctl stop keepalived
?fi
1.2.4 启动Keepalived
?[root@nginx01 ~]# systemctl start keepalived
?[root@nginx01 ~]# systemctl enable keepalived
1.3 验证
?# 通过客户机循环访问172.16.10.100,停止nginx01节点,看是否进行转移
?# 客户机
?[root@yan ~]# for i in $(seq 1 100);do curl 172.16.10.100;sleep 1;done
?#nginx01 节点
?[root@nginx01 ~]# nginx -s stop
?# 观察客户机变化
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 01
?nginx 02
?nginx 02
?nginx 02
?nginx 02
?nginx 02
?nginx 02
?nginx 02
?nginx 02
??
|