nginx高可用(keepalived)

整体规划

介绍

本文主要介绍Linux环境下,搭建keepalived+Nginx实现nginx高可用

整体架构

一.部署单体nginx

1.依赖下载

yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

2.下载Nginx 

nginx: download

cd /usr/local/src/
##官网下载nginx源码包 nginx-1.24.0版本重新加载配置文件,如果新配置文件有误,则新配置文件不会生效,其他版本暂未测试
wget https://nginx.org/download/nginx-1.24.0.tar.gz

3.编译安装 Nginx

##解压
tar -zxvf nginx-1.24.0.tar.gz
##切换目录
cd nginx-1.24.0
## 配置nginx
./configure --prefix=/usr/local/nginx
## make 编译 、make install  安装
make && make install
##测试 Nginx 是否安装成功
/usr/local/nginx/sbin/nginx -t

4.关闭防火墙或开放80端口

##开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent

##查看防火墙的状态
firewall-cmd --state;
##临时关闭防火墙
systemctl stop firewalld.service
##永久关闭防火墙,防止防火墙开机自启
systemctl disable firewalld

5.设置 Nginx 开机启动

vi /etc/rc.local
##加入
/usr/local/nginx/sbin/nginx

6.配置 Nginx

 vi /usr/local/nginx/conf/nginx.conf

反向代理及负载均衡配置

在默认配置的基础上加上如下配置


   upstream kai {
        ##tomcat服务器1,权重越高被分配到的几率越大
        server 192.168.0.61:80 weight=1;
        ##tomcat服务器2
        server 192.168.0.62:80 weight=1;
    }
    # 虚拟主机
    server {
        listen       80;
        server_name localhost;# 浏览器访问域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        # 路由
        location / {
            # 访问根目录
            root   html;
            # 入口文件
            index  index.html index.htm
            #请求转向kai定义的服务器列表
            proxy_pass http://kai;
            #设置代理服务器与后端服务器建立连接的超时时间,单位为秒,默认是60s。
            proxy_connect_timeout 1s;
        }

7.启动nginx

 ##启动服务
 /usr/local/nginx/sbin/nginx
##upstream的负载均衡,四种调度算法##
#调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
upstream webhost {
server 192.168.0.5:6666 weight=2;
server 192.168.0.7:6666 weight=3;
}
#调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
upstream webhost {
ip_hash;
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
hash $request_uri;
}

二.部署nginx集群

Keepalived for Linux )

1.上传或下载 keepalived

上传或下载 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目录

2.解压安装

##切换目录
cd /usr/local/src

##解压keepalived
tar -zxvf keepalived-1.2.18.tar.gz

##切换目录
cd keepalived-1.2.18

##
./configure --prefix=/usr/local/keepalived

## make 编译 、make install  安装
make && make install

3.安装成 Linux 系统服务

复制 keepalived 服务脚本到默认的地址

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
##创建软链接,相当于快捷方式
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

设置 keepalived 服务开机启动

# chkconfig keepalived on

4.编辑 Keepalived 配置文件

mkdir /etc/keepalived
vi /etc/keepalived/keepalived.conf

(1) MASTER 节点配置文件(192.168.0.85)

注意修改下方标红的配置

! Configuration File for keepalived
global_defs {
     ## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP
     router_id nginxKeep1 ## 标识本节点的字条串,通常为 hostname
} 
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight -20 ## 如果条件成立,权重-20
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP ## 主节点为 MASTER, 对应的备份节点为 BACKUP
    interface ens33 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 我的是 eth0
    virtual_router_id 33 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    mcast_src_ip 192.168.0.85 ## 本机 IP 地址
    priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
    nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
    ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111 ## 真实生产,按需求对应该过来
    }
    ## 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx ## 执行 Nginx 监控的服务
    } #
    # 虚拟 IP 池, 两个节点设置必须一样
    virtual_ipaddress {
        192.168.0.87 ## 虚拟 ip,可以定义多个
    }
}

(2)BACKUP 节点配置文件(192.168.0.86)

注意下方标红的配置

! Configuration File for keepalived
global_defs {
     router_id nginxKeep2
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 33
    mcast_src_ip 192.168.0.86
    priority 90
        nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.0.87
    }
}

5.编写 Nginx 状态检测脚本

两台nginx服务器都需要创建

 vi /etc/keepalived/nginx_check.sh

编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh 

脚本描述:每两秒检查一次,如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,

keepalied将虚拟 ip 绑定到 BACKUP 机器上。 内容如下:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived
fi
fi

保存后,赋执脚本行权限:

chmod +x /etc/keepalived/nginx_check.sh

6.启动 Keepalived

service keepalived start

常用命令

 ##启动服务
 /usr/local/nginx/sbin/nginx
 ##重新加载服务
 /usr/local/nginx/sbin/nginx -s reload
 #停止服务
 /usr/local/nginx/sbin/nginx -s stop
 ##查看进程
 ps -ef | grep nginx
 ##nginx配置文件
  vi /usr/local/nginx/conf/nginx.conf
 
##启动keepalived
service keepalived start
##查看keepalived状态
service keepalived status
##关闭keepalived
service keepalived stop
service keepalived restart

ip抢占问题

发现问题

问题描述:例如有两台服务器31、32

 31和32的KEEPALIVED都没起来,先把31的KEEPALIVED的服务起来,30的地址在31上,然后再起来32的KEEPALIVED的服务,30的地址就会强制漂到32上, 存在这个抢占现象

也就是说,后启动的keepalived机器会抢夺虚拟IP

解决过程

配置

测试

修改后的配置

测试

解决方法

使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能

nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。 因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值