离线centOS7使用keepalived+docker+nginx构建高可用

离线centOS 7使用keepalived+docker+nginx构建高可用

环境条件:两台centos7的服务器;

IP nginx端口
192.168.6.136 80
192.168.6.138 80

一、下载

  1. 下载keepalived需要的环境包,为以下几种依赖:**
    gcc-c++
    pcre pcre-devel
    zlib zlib-devel
    openssl-devel
    popt-devel
    initscripts
    net-tools

    如果能连接外网直接使用yum,无法连接外网下载rpm包:http://www.rpmfind.net/linux/rpm2html/search.php,搜索需要的包下载
  2. 下载keepalived,下载地址:https://www.keepalived.org/download.html,我这里下载的是https://www.keepalived.org/software/keepalived-2.0.6.tar.gz 版本

二、安装keepalived

1
2
3
4
        tar -zxvf keepalived-2.0.6.tar.gz;  #解压
        cd keepalived-2.0.6;  #进入解压目录
         ./configure --prefix=/usr/local/keepalived; #编译
         make && make install; #安装

安装成功后会有/usr/local/keepalived目录,如果安装过程报错,一般就是少包,看步骤一是否缺少包。

1
/usr/local/keepalived 目录下结构:

在这里插入图片描述

三、将keepalived 安装成系统服务

1
2
3
4
5
6
7
8
9
10
    mkdir /etc/keepalived  #创建目录
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/  #拷贝主要文件
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    ln -s /usr/local/sbin/keepalived /usr/sbin/
    systemctl daemon-reload  #重新加载
    systemctl start keepalived.service #启动
    #如果有错误执行下面命令替换下
    cd /usr/sbin/
    rm -f keepalived  
    cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/

常用命令:

1
2
3
4
5
6
    systemctl daemon-reload  #重新加载
    systemctl start keepalived.service #启动
    systemctl stop keepalived.service #停止
    systemctl enable keepalived.service  #开机启动
    systemctl disable keepalived.service #取消开机启动
    systemctl status keepalived.service  #服务状态

四、配置keepalived

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    cd /etc/keepalived  #进入配置目录下
    mv keepalived.conf  keepalived.conf.backup #备份原来配置
    vim keepalived.conf
    #配置文件如下

vrrp_script  chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER   #指定为master
    interface ens33 #网卡名
    virtual_router_id 121 #路由id需要一致
    mcast_src_ip 192.168.6.136 #广播本机ip
    priority 100       #权重
    nopreempt
    advert_int 1      #检测时间 1s
    authentication {   #认证
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
       192.168.6.100     #虚拟ip,得是统一ip段的
    }
}

添加心跳检测脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim nginx_check.sh
#以下是脚本内容
#!/bin/bash

# 容器名称
containerName=nginx
currTime=`date +"%Y-%m-%d %H:%M:%S"`

# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`

if [ "${exist}" != "true" ]; then
        #如果关闭了可以重启我们这里方便测试跳过
        # docker restart  ${containerName}
        # 记录
        echo "${currTime} 重启docker容器,容器名称:${containerName}" >> /mnt/xvde1/ms_ctynyd/scripts/wbwf_monitor.log
   
fi

五、docker中安装Nginx

1
2
3
4
5
6
7
8
9
docker pull nginx #下载nginx镜像
docker run -d --name nginx nginx:latest #启动一个镜像
mkdir /usr/share/; #创建nginx页面目录
docker cp nginx:/etc/nginx /etc/ #拷贝出配置文件
docker cp nginx:/usr/share /usr/share #拷贝出基础页面
docker stop nginx;#停止容器
docker rm nginx;#删除容器
#映射端口和数据卷,确保宿主机的80端口没被占用
docker run -it -d  --name nginx --restart=always  -p 80:80 -v /etc/nginx/:/etc/nginx/ -v /usr/share/nginx:/usr/share/nginx --privileged  nginx

修改nginx的默认页面

1
vi /usr/share/nginx/html/index.html

将Welcome to nginx!修改成Welcome to nginx! Master

六、构建另一个服务器的环境

1,将上面的步骤环境在操作一遍

2,配置keepalived.conf如下:
需要修改的就是mcast_src_ip 、state 、priority 这三个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vrrp_script  chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP   #指定为BACKUP
    interface ens33 #网卡名
    virtual_router_id 121 #路由id需要一致
    mcast_src_ip 192.168.6.138 #广播本机ip
    priority 80       #权重
    nopreempt
    advert_int 1      #检测时间 1s
    authentication {   #认证
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
       192.168.6.100     #虚拟ip,得是统一ip段的
    }
}

3,修改nginx的默认页面

1
vi /usr/share/nginx/html/index.html

将Welcome to nginx!修改成Welcome to nginx! Slave

1
2
systemctl restart keepalived.service #重启keepalived
systemctl status keepalived.service #检测一下日志

如果日志输出一下内容则没问题
在这里插入图片描述

七、测试

1.客户端测试:
打开dos窗口->输入:curl 192.168.6.100
在这里插入图片描述

2,现在我们把docker容器的nginx停了看一下

1
docker stop nginx

重开dos窗口:
在这里插入图片描述

3,docker重启nginx

1
docker restart nginx

在这里插入图片描述

大功告成,楼主在搭建的时候遇到了很多坑。需要耐心,如果错误了细心看了keepalived的日志解决。