DC/OS的存储功能
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,从而数据永远丢不了,即便服务器挂了,数据也是在的。
对于Docker,可以通过Docker Volume Plugin来做这件事情。
对于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作为外部存储。