以下内容已屏蔽图片优化访问速度 |
---|
DC/OS的存储的管理主要分三种方式:本地临时存储(Local ephemeral storage),本地持久化存储(Local persistent volumes),外部持久化存储(External persistent volumes)。 第一种是存储方式,任务往往是无状态的,当一个任务在某台机器挂掉的时候,随时可以从另外一台机器上启动起来,当然原来机器上的数据也不会拷贝到新的机器上,启动的任务是全新的。 然而对于数据库之类的应用,使用第一种方式显然不合适,被调度到另外节点的数据库进程无法访问原来的数据,变成了空的数据库。 第二种方式可以部分解决有状态的服务的问题。 在创建服务的时候,指定持久化的存储路径 { "containerPath": "data", "mode": "RW", "persistent": { "size": 500 } } 这个data路径会创建在容器里面/mnt/mesos/sandbox下面,这个路径会对应于物理机器上的一个路径。在创建服务的时候,所有的服务的资源,包含CPU,内存,硬盘都被预留reserved,从而当这个服务挂掉的时候,还是会从同样的机器上启动起来,容器内部的/mnt/mesos/sandbox路径还是会被mount为相同的主机路径,所以在容器里面还是能够看到data这个目录,数据原封不动的放在那里。哪怕某个服务scale为0,资源还是被预留,从而再scale为1的时候,还是可以使用原来的路径,直到服务被terminate才不再预留。 然而当一台服务器挂掉的时候,服务会永远部署不成功,数据也就永远丢掉了。 第三种方式称为外部持久化存储,也就是说容器mount的路径不再是本地的路径,而是外部的统一存储,例如Ceph,GlusterFS,Amazon EBS,OpenStack Cinder等,这些外部存储都有自己的高可用机制,而且当容器在一台机器上挂了之后,可以将对于的存储数据的路径从这台机器上umount,然后在新的机器上mount,从而数据永远丢不了,即便服务器挂了,数据也是在的。 [IMG] 对于Docker,可以通过Docker Volume Plugin来做这件事情。 [IMG] 对于Mesos容器,则需要通过Docker Volume Isolator来实现,因而需要加载docker/volume。它通过执行dvdcli调用Docker Volume Plugin的API来创建volume。 "container": { "type": "MESOS", "volumes": [ { "containerPath": "test-rexray-volume", "external": { "size": 100, "name": "my-test-vol", "provider": "dvdi", "options": { "dvdi/driver": "rexray" } }, "mode": "RW" } ] } 可以通过上面的json使用rexray来创建AWS EBS的volume作为外部存储。 |