美文网首页@Docker程序员Spring Boot
Docker Swarm + HAProxy 实现高可用

Docker Swarm + HAProxy 实现高可用

作者: Anoyi | 来源:发表于2017-09-03 18:02 被阅读1242次

    什么是高可用性?

    • 高可用性: 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 测试

    参考资料

    常见问题

    未经许可,不得转载!如有需求,私信作者。

    相关文章

      网友评论

      • 2e65a883d696:请问你的work1 work2 work3 三个节点是怎么虚拟出来的
        Anoyi:@hansonwang 用docker-machine创建三个虚拟机
        2e65a883d696:@Anoyi 您的文章我大致看了一下,还是不明白如何虚拟出192.168.99.101,192.168.99.102,192.168.99.103这三个节点,能否烦请明示一下,你是在一台macbook pro上能虚拟出三个IP吗?
        Anoyi:@hansonwang 看下我的其他文章
      • ideal9527:贼强
        Anoyi:@mingliao17 这么晚还不休息,你也是强

      本文标题:Docker Swarm + HAProxy 实现高可用

      本文链接:https://www.haomeiwen.com/subject/tyadjxtx.html