码头工人群体第二部分:重新安排运费


欢迎回来!回去check out Part I学习如何安装我们将要使用的环境!

集群重调度的重分发服务器节点故障

如果你注意到part 1,我们用--experimental旗帜。这包括以下功能rescheduling containers on node failure从Swarm 1.1.0开始。

这篇文章的这一部分将着重于部署一个Redis容器,并测试实验性重调度特性的当前状态。

注意:重调度是非常实验性的,并且有缺陷。我们将通过一个例子,并回顾我们通过已知的错误。

如果您希望在群集主机出现故障时重新计划您的容器,那么您需要部署带有特定标志的容器。一种方法是使用以下标志:--restart=always -e reschedule:on-node-failure或者带有标签,例如-l 'com.docker.swarm.reschedule-policy=["on-node-failure"]'。下面的示例将使用环境变量方法。

首先,让我们部署一个带有重调度标志的Redis容器和一个由Flocker管理的卷。

$ docker volume create -d flocker --name testfailover -o size=10G

# note: overlay-net was created in Part 1.
# note: `--appendonly yes` tells Redis to persist data to disk.
$ docker run -d --net=overlay-net --name=redis-server  --volume-driver=flocker -v testfailover:/data --restart=always -e reschedule:on-node-failure redis redis-server --appendonly yes
465f490d8a80bb53af4189dfec0c595490ebb454f91ded65b9da2edcb4264c2d


接下来,SSH进入运行Redis容器的Docker主机,查看appendonly.aof我们指示Redis用于持久性的文件。文件应该位于容器的Flocker卷挂载点上,并且不包含任何数据。

$ cat /flocker/9a0d5942-882c-4545-8314-4693a93fde19/appendonly.aof
# there should be NO data here yet :)


接下来,让我们连接到Redis服务器并添加一些键/值。之后,再次查看appendonly.aof文件的内容,以显示Redis正在正确存储数据。

$ docker run -it --net=overlay-net --rm redis sh -c 'exec redis-cli -h "redis-server" -p "6379"'
redis-server:6379>
redis-server:6379> SET mykey "Hello"
OK
redis-server:6379> GET mykey
"Hello"


查看我们的Flocker卷内的数据,验证Redis是否正常工作。

$ cat /flocker/9a0d5942-882c-4545-8314-4693a93fde19/appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$5
mykey
$5
Hello


测试故障转移

现在,我们要测试故障转移场景,确保我们的Flocker卷将存储在Redis中的数据移动到新的Docker主机,Swarm在那里重新调度容器。

为此,让我们将Docker指向我们的Swarm管理器,并使用docker events命令。

要启动测试,请运行shutdown -h now运行Redis容器来模拟节点故障。您应该会看到与节点和容器死亡相关的事件(如下)。

这些事件告诉我们,由于主机出现故障,需要删除、断开或卸载容器及其资源(网络、卷)。您在下面看到的事件是:

  • 容器杀死
  • 容器模具
  • 网络断开
  • 集群引擎断开
  • 卷卸载
  • 集装箱停靠站
2016-03-08T21:25:45.832049184Z container kill f3d724a37bdf040baac5a06616e39956610d5409acf9ed62508d43b84f79410d (com.docker.swarm.id=48d1d26490c4943fdb98e6f08be9b62003cd5105e06d9bad94dde2e5913c374b, com.docker.swarm.reschedule-policies=["on-node-failure"], image=redis, name=redis-server, node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22, signal=15)

2016-03-08T21:25:45.975166262Z container die f3d724a37bdf040baac5a06616e39956610d5409acf9ed62508d43b84f79410d (com.docker.swarm.id=48d1d26490c4943fdb98e6f08be9b62003cd5105e06d9bad94dde2e5913c374b, com.docker.swarm.reschedule-policies=["on-node-failure"], image=redis, name=redis-server, node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22)


2016-03-08T21:25:46.422580116Z network disconnect 26c449979ac794350e3a3939742d770446494a9d17adc44650e298297b70704c (container=f3d724a37bdf040baac5a06616e39956610d5409acf9ed62508d43b84f79410d, name=overlay-net, node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22, type=overlay)

2016-03-08T21:25:49.818851785Z swarm engine_disconnect  (node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22)

2016-03-08T21:25:46.447565262Z volume unmount testfailover (container=f3d724a37bdf040baac5a06616e39956610d5409acf9ed62508d43b84f79410d, driver=flocker, node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22)

2016-03-08T21:25:46.448129059Z container stop f3d724a37bdf040baac5a06616e39956610d5409acf9ed62508d43b84f79410d (com.docker.swarm.id=48d1d26490c4943fdb98e6f08be9b62003cd5105e06d9bad94dde2e5913c374b, com.docker.swarm.reschedule-policies=["on-node-failure"], image=redis, name=redis-server, node.addr=10.0.57.22:2375, node.id=256G:KRWJ:D5D4:IZHE:TJUO:FHAO:6HII:ET3F:EULJ:NYFT:LBIX:4HBS, node.ip=10.0.57.22, node.name=ip-10-0-57-22)


然后,在Docker宿主死亡后的一段时间,您应该最终看到容器的事件,同一容器被重新调度(再次创建)。这是仍然有一些工作要做的地方,从1.1.3开始,在我们的测试中,我们注意到Swarm有一个运行问题Start放在容器上Created在新的码头主持人。

你应该看看Create观看时记录的事件docker events这实际上启动了容器的重新创建和它所使用的弗洛克卷的移动。

我们发现您可能需要手动Start重新计划后新主机上的容器。

注意:一些关于容器创建但没有启动的问题和其他问题被跟踪in this Docker Swarm issue

这是我们看到的事件,当容器被重新调度并在新的Docker主机上自动创建时。请注意,该IP地址已更改为与上一条消息不同的IP地址;这是因为容器被重新安排在一个新的Docker主机上。

# The node:addr was `node.addr=10.0.57.22` before being rescheduled
2016-03-08T21:27:32.010368912Z container create 1cee6bff97a4d86995dd9b126130d40be9b02c6d373e6c0faa32c05110f98475 (com.docker.swarm.id=48d1d26490c4943fdb98e6f08be9b62003cd5105e06d9bad94dde2e5913c374b, com.docker.swarm.reschedule-policies=["on-node-failure"], image=redis, name=redis-server, node.addr=10.0.195.84:2375, node.id=DWJS:ES2T:EH6C:TLMP:VQMU:4UHP:IBEX:WTVE:VTFO:E5IZ:UBVJ:ITWW, node.ip=10.0.195.84, node.name=ip-10-0-195-84)


回顾

以下是迄今为止发生的情况:


如果我们运行一个docker ps与Swarm相反,我们可以将Redis容器视为Created。因此,在这种情况下,我们可以手动启动它,Redis会备份并在新节点上运行!

$ docker ps -a
CONTAINER ID IMAGE  COMMAND       CREATED       STATUS  PORTS  NAMES
1cee6bff97a4 redis  "/entryp.."   4 minutes ago                ip-10-0-195-84/redis-server

root@ip-10-0-204-4:~# docker start redis-server
redis-server


让我们连接到Redis服务器,并确保我们添加的数据仍然保留。

$ docker run -it --net=ryan-net --rm redis sh -c 'exec redis-cli -h "redis-server" -p "6379"'
redis-server:6379> GET mykey
"Hello"


数据还在!鉴于当前的重新安排状态,不建议依赖它。

在我们的测试中,我们确实遇到过用户说容器确实启动了。我们也遇到过说重新安排根本不起作用的用户,或者如果码头工人的主人回来了,他们会得到两个相同的容器。

无论哪种方式,都有一些问题需要解决,帮助测试、报告和解决这些问题是社区工作的一部分,这样它们才能可靠地工作。我们将一路上更新这篇文章,以确保向你展示如何重新安排未来的工作!

快乐群集!一定要退房Part III

我们很乐意听取您的反馈!