什么是高可用性?
- 高可用性: 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
上执行:
再次查看服务信息,可以看到 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 测试参考资料
常见问题
未经许可,不得转载!如有需求,私信作者。
网友评论