Docker Swarm + HAProxy 实现高可用

http://www.jianshu.com/p/096244610e15

 

什么是高可用性?

  • 高可用性: High Availability (简称 HA)
  • 可用性 (Availability) = 可靠性 (Reliability) + 可维护性 (Maintainability)
  • 自动检测、自动切换、自动恢复
  • 主从方式、互备方式、集群方式

集群的三大核心概念

  • 集群 (Cluster)
  • 节点 (Node)
  • 服务 (Service)

本文将介绍 Docker Swarm + HAProxy 来实现服务的高可用性

环境信息

  • 本机 Mac
  • Docker Version 17.06.1-ce-mac24 (18950)

创建节点(虚拟机)

预期的四个节点

在 Mac 执行如下命令创建节点

$ docker-machine create manager1
$ docker-machine create work1
$ docker-machine create work2
$ docker-machine create work3

查看节点信息

进入节点(虚拟机)

再开启另外的4个窗口,分别执行

$ docker-machine ssh manager1
$ docker-machine ssh work1
$ docker-machine ssh work2
$ docker-machine ssh work3

进入节点

初始化集群

1、初始化 Manager

Manager

manager1 节点上执行

docker swarm init --advertise-addr 192.168.99.100`

初始化集群

命令成功后,会有提示,如何将 worker 加入集群,即 docker swarm ... 这行命令。

提示:如果忘记此处的 token,可以使用 docker swarm join-token worker 命令查看。

2、将 work1,work2,work3 加入集群

work1,work2,work3

在 work1, work2, work3 上分别执行,此行命令详见上一步中的提示

docker swarm join --token SWMTKN-1-1rt31l3671hig69vkfqha994rydnwr67gxt6o0suv71zzobpgn-b930rnc1pzewxv9h73plq58rd 192.168.99.100:2377

向集群中添加 worker

笔记:集群中加入worker的命令是
docker swarm join --token [token] [manager-ip]:[manager-port]

创建服务

此处以 nginx 为例。首先,创建有 2 个副本的 nginx 服务,在 manger1 上执行

$ docker service create --replicas 2 \
-d \
-p 8080:80 \
--name any-nginx \
registry.docker-cn.com/library/nginx

提示:此处用到了镜像加速仓库

执行完毕之后,查看服务列表信息

$ docker service ls

服务列表

查看服务信息

$ docker service ps vv

笔记:查看服务信息命令 docker service ps [服务ID]

服务列表

从服务信息可以看到 nginx 已运行在 manager1 和 work1 上

服务信息

分别访问 http://192.168.99.100:8080 和 http://192.168.99.101:8080 ,会得到如下结果:

nginx服务

分别在 manager1 和 work1 上查看容器运行情况,结果如下:

容器运行情况

服务的扩容与缩容

将 any-nginx 扩容为 3 份,在 manager1 上执行

$ docker service scale any-nginx=3

再次查看服务信息,可看到 any-nginx.3 在 work2 上运行

服务信息

服务信息

服务高可用测试

目前,有3个运行的容器保证服务的可用性,如果其中一个容器意外关闭,会发生什么情况呢?

将 work2 上正在运行的容器关闭,在 work2 上执行:

关闭 work2 上正在运行的容器

再次查看服务信息,可以看到 any-nginx.3 在 work2 上自动重启了

关闭 work2 之后

另外一个问题,如果 work2 宕机了,会发生什么情况?

Mac 上关闭 work2 节点:

$ docker-machine stop work2

关闭 work2 节点

关闭 work2 节点

不难看出 work2 节点关闭之后,work3 节点自动启动了 any-nginx.3,保证了整个集群运行的还是 3 个副本。

补充:若work1,work2,work3全部关闭,manager1 上将运行 3 个 any-nginx 容器。此处不演示。

总结:在内存允许的条件下,docker swarm 集群会稳定运行指定数量的容器,具有自我修复的能力,以此来保证服务的高可用性!

使用 HAProxy 来添加外部负载均衡

添加 HAProxy

此处 HAProxy 将运行于本机,以下命令均在本机操作。

1、创建 HAProxy 配置文件 haproxy.cfg

$ vim haproxy.cfg
global
    daemon
    maxconn 25600
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
frontend http-in
    bind *:80
    default_backend servers
backend servers
    server server1 192.168.99.100:8080 maxconn 32 check
    server server2 192.168.99.101:8080 maxconn 32 check
    server server3 192.168.99.102:8080 maxconn 32 check
    server server4 192.168.99.103:8080 maxconn 32 check

2、创建 Dockerfile 自定义镜像

$ vim Dockerfile
FROM haproxy
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

3、制作镜像

$ docker build -t any-haproxy .

4、启动 HAProxy

$ docker run -d -p 8080:80 any-haproxy

启动 HAProxy

5、测试,访问 http://127.0.0.1:8080/

HAProxy 测试

参考资料

常见问题

Leave a Reply

Your email address will not be published. Required fields are marked *