Centos7环境利用docker快速构建Nginx+Keepalived双主高可用集群实现负载均衡

Keepalived介绍:
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

准备工作:

1.环境两台CentOS7版本的系统
查看系统版本:

cat /etc/redhat-release,这种方法只适合Redhat系的Linux

2.安装docker和docker-compose
注意版本,我这个版本是可以的

centos7离线安装docker,docker-compose

3.服务ip
两台服务器ip为:

10.10.11.79,10.10.11.81
keepalived的虚拟ip为10.10.11.77,10.10.11.78

下面开始部署:

宿主机上建立文件目录:

目录结构:

  • node_1
    • docker-compose.yml
    • Dockerfile
    • keepalived.conf
    • nginx.conf
  • node_2 同上

在这里插入图片描述
分别用于部署在两台不同的服务器上

每一个节点都需要四个文件,下面详细配置一下四个文件。

1.nginx.conf

配置master nginx.conf:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    server
    {
        listen  80;
		default_type text/plain; 
		# client_body_in_single_buffer on; 
		return 200 'im master.......\n'; 
    }
}

从节点nginx.conf配置:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    server
    {
        listen  80;
		default_type text/plain; 
		# client_body_in_single_buffer on; 
		return 200 'im slave.......\n'; 
    }
}

如果已经up 起来的容器后续修改了nginx的conf文件,主从都要重新docker-compose up一下,不然会不生效。

2.Dockerfile

制作keepalived docker镜像,两个节点的配置文件内容相同。
这里需要注意一下:
如果keepalived.conf,你修改了,那么之前生成的镜像要删掉重新制作。

FROM osixia/keepalived
MAINTAINER nanlist

ADD ./keepalived.conf /container/service/keepalived/assets/keepalived.conf

3.docker-compose.yml

两个节点的配置文件内容相同。
这里有两个地方需要注意一下:
1.启动之前要查看一下nginx 的端口是否被占用了,两个节点要用相同的端口。
2.提前在宿主机上建立好挂载目录/etc/cluster/nginx.conf,并把步骤1的nginx.conf文件放进去。

version: '2'

services:
  keepalived:
    build: ./
    depends_on:
      - nginx
    network_mode: "host"
    cap_drop:
      - NET_ADMIN
    privileged: true
    restart: on-failure:3
  nginx:
    image: nanlist/nginx1.23.1:v1.0
    ports:
      - "82:80"
    volumes: 
      - "/etc/cluster/nginx.conf:/etc/nginx/nginx.conf"
    restart: on-failure:3
     

4.keepalived.conf

默认使用双BACKUP,nopreempt非抢占模式,根据自己服务器的实际情况进行修改:

  - interface # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
  - auth_pass # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
  - unicast_peer # 另外一台的服务器ip
  - virtual_ipaddress # 定义虚拟ip(VIP),可多设,每行一个 

这个文件 两个节点的配置是不一样的,

node1:

global_defs {  

}  
  
vrrp_instance VI_1 {  
    state BACKUP  
    interface ens192  # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 51  # 虚拟路由编号,主从要一至
    priority 150 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
    nopreempt
    authentication {  
        auth_type PASS  # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
        auth_pass 1111  # 指定认证所使用的密码。最多8位
    }  
    unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
        10.10.11.81
    }
    virtual_ipaddress {  # 指定VIP地址
        10.10.11.77
    }  
    notify "/container/service/keepalived/assets/notify.sh"
}  
  
vrrp_instance VI_2 {  
    state BACKUP  
    interface ens192  # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 52  # 虚拟路由编号,主从要一至
    priority 99  # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
    nopreempt
    authentication {  
        auth_type PASS  # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
        auth_pass 1111  # 指定认证所使用的密码。最多8位
    }  
    unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
        10.10.11.81
    }
    virtual_ipaddress {  # 指定VIP地址
         10.10.11.78
    }  
    notify "/container/service/keepalived/assets/notify.sh"
}  

node2:

global_defs {  
   
}  
  
vrrp_instance VI_1 {  
    state BACKUP  
    interface ens192  # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 51  # 虚拟路由编号,主从要一至
    priority 99 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
    nopreempt
    authentication {  
        auth_type PASS  # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
        auth_pass 1111  # 指定认证所使用的密码。最多8位
    }  
    unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
        10.10.11.79
    }
    virtual_ipaddress {  # 指定VIP地址
        10.10.11.77
    }  
    notify "/container/service/keepalived/assets/notify.sh"
}  
  
vrrp_instance VI_2 {  
    state BACKUP  
    interface ens192  # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 52  # 虚拟路由编号,主从要一至
    priority 150 # 优先级,数值越大,获取处理请求的优先级越高 master要大于slave
    nopreempt
    authentication {  
        auth_type PASS  # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
        auth_pass 1111  # 指定认证所使用的密码。最多8位
    }  
    unicast_peer { # 另外一台的服务器ip,如果是多台就配多个ip
        10.10.11.79
    }
    virtual_ipaddress {  # 指定VIP地址
         10.10.11.78
    }  
    notify "/container/service/keepalived/assets/notify.sh"
}  

每个节点这个四个文件都配置好以后,可以启动了。

执行

启动:

docker-compose -f docker-compose.yml up -d

停止:

docker-compose down

查看日志:

docker-compose logs

验证

如果有一台Nginx服务器挂了,Keepalived会自动在备Nginx服务器上选一台当主服务器.
1.可以把其中一台宿主机中的nginx的容器停掉,然后访问两个虚拟ip,发现是可以漂移的。而且等待两秒钟,nginx容器会自动重启。

2.直接把其中一台服务器的nginx容器和keepalived容器全部停掉模拟服务器宕机的场景,访问两个虚拟ip发现也是可以切换的。但是这种情况 容器不会自动重启,只能手动重启。

猜你喜欢

转载自blog.csdn.net/u010797364/article/details/129022103