0
点赞
收藏
分享

微信扫一扫

nginx+keepalived 如何实现高可用

(目录)

Keepalived的作用

是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived 安装

   cd  /home
   yum install gcc gcc-c++ openssl openssl-devel #安装Keepalived需要的扩展
   wget  https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
   tar -zxvf keepalived-1.2.18.tar.gz
   cd keepalived-1.2.18
  ./configure --prefix=/usr/local/keepalived
   make && make install

将 keepalived 安装成 Linux 系统服务

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/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 /usr/sbin/
chkconfig keepalived on
主机 备用
192.168.34.170 192.168.34.129

按照keepalived的按照方法分别给上述2台服务器按照keepalived。

配置 keepalived.conf 【/etc/keepalived】

<font color="red">192.168.34.170</font>

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx.sh" ## 检测 nginx 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.34.104 #虚拟IP
    }
    track_script {
        chk_nginx
    }
}

==192.168.34.129==

! Configuration File for keepalived

global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 79
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.34.104
    }
    track_script {
        chk_nginx
    }
}

nginx 配置

2台服务器一样。

upstream blogs{
   server 192.168.34.170:80;
   server 192.168.34.129:80;
   #upsync 192.168.34.170:8500/v1/kv/upstreams/nginx_test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
   #upsync_dump_path /vhost/server_test.conf;
   #include /vhost/server_test.conf;
}
server{
     listen 8080;
     server_name 192.168.34.104;
     index index.html index.php;
     
     location ~ \.php$ {
        proxy_pass http://blogs;
     }  
}

==/etc/keepalived/nginx.sh==

检测nginx状态的脚本文件

#! /bin/bash
START_NGINX="service nginx start"
LOG_FILE="/usr/local/nginx/logs/nginx_upstreams.log"
HAPS=`ps -C nginx --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check nginx status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
   echo $START_HAPROXY >> $LOG_FILE
   /usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf
   sleep 3
   if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
      echo "start nginx failed, killall keepalived" >> $LOG_FILE
      killall keepalived
      service keepalived stop
   fi
fi

开启keepalived

service keepalived start

linux 输入ip a

ip a

==192.168.34.170== image.png <font color="red">192.168.34.129</font> image.png

开始测试

image.png

pkill -9 nginx #关掉nginx进程

在这里插入图片描述 ==注:如果发现nginx.sh文件无法运行,可能是文件权限的问题,修改 文件nginx.sh 的权限就好了==

发现nginx自己又启动成功了。

如果nginx启动失败了,虚拟IP 192.168.34.104 会漂移到 备份机【192.168.34.129】上 image.png image.png 当主机 【192.168.34.170】修复成功后,就会立马抢占虚拟IP! image.png 综上 keepalived的高可用算是完成了。

可能遇到的问题

上述主机恢复后会立马抢占虚拟IP,这样可能会造成一定的延时。 解决方法也很简单:可以采用不抢占的模式

==keepalived.conf==

  ! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx.sh" ## 检测 nginx 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}

vrrp_instance VI_1 {
    state state BACKUP
    nopreempt
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.34.104
    }
    track_script {
        chk_nginx
    }
}

2台服务器的 state 都为 BACKUP,并加入了nopreempt这个参数。 这样keepalived将会从2台服务器中根据 priority 的值推选出一个Master。这样如果这台Master宕机了,另一个就成为了Master,而且当另一台服务器修复后,也不会发生抢占。

举报

相关推荐

0 条评论