问题的提出

我这段时间花了一些时间详细了解了下类似Mesos这种分布式OS的思路,我们目前是每套系统部署在独立的机器上,要想部署多套系统就必须部署在多台机器上,同时考虑到每套系统的高可用,就需要更多的机器,这样的设计无论是从成本还是从维护的角度都是非常糟糕的,所以需要有一个更好的架构设计来支持此类场景。

解决思路

主要的思路是受Google Borg和Apache Mesos的启发,详见Reference中的两篇论文

设计上我们要做到架构与业务无关抽象,所以这里不会设计具体业务场景,而是对业务场景抽象,这些业务要么是一种计算,要么是一种服务,架构上支持计算和服务的场景即可。

这个场景下的系统肯定是需要多机分布式的,我的核心想法是硬件资源化。这里就需要转换一下目前的思路,过去我们的程序是直接依附在物理机器的操作系统上的,应用程序对机器是有实际感知的。

新的模式下应用程序(被抽象为服务或计算)运行在自己的容器环境中,容器负责向应用程序提供资源,另外由资源调度器负责收集硬件资源,并决定给容器划分资源。换言之应用程序并不感知物理机器的存在,也不知道自己运行在哪台机器上,他的运行环境是一个分布式的资源调度系统给予的。

image

所以比较恰当的一个比喻还是把所谓的“分布式资源调度系统”理解为一个分布式OS,他对上可以支持各种服务和计算程序的运行,下面可以接管N台服务器管理他们提供的CPU、内存、硬盘、GPU,可以做到服务器的动态增删对上层服务/计算透明。

image

关键技术

资源隔离(cgroups)

资源隔离是整个架构的核心模块,cgroup是linux内核提供的对资源进行限制使用的功能,它能够控制给相关“服务”和“计算”模块提供可控的资源,可以参照下面的相关reference,可以非常方便的在/sys/fs/cgroup(默认目录)操作各个进程的cpu,内存,硬盘的使用情况,像手术刀一样精确。这个技术也是我们把多机的资源拆碎、揉开、合理分配的基础。

容器隔离(lxc/docker)

lxc是Linux container的缩写,它的技术组成中就包括cgroup,它是更高级别的隔离,不仅仅可以做到资源的使用的分配和隔离,借助于linux的chroot功能,还可以把不同“服务”和“计算”完全放到不同的容器中,类似于放到不同的虚拟机中,互相不可见。可以防止因为系统崩溃造成的滚雪球效应。

docker是对lxc的包装,操作上对用户更友好,实现了一样的功能。

资源状态发现,上线、下线

整个分布式的OS要能够支持资源的发现、上线、下线,即有新的物理机器加入到OS中要能够动态发现这台机器,可以在后续的使用中有新的服务或计算任务可以直接分发到这台机器上。

同样的有机器掉电、卡死也要能够动态发现,并且把在这台机器上运行的task移动到其他机器上。

弹性服务

服务或计算可以指定需要的资源的上下界,如某个特定的服务申请2~4个cpu,分布式框架可以根据集群使用的情况以及该服务运行的具体情况,动态决定如何给这个进程分配资源,保证最小可用还是最大性能。

上面提到运行的服务可能会切换机器,所以依赖服务的客户端也要能支持根据DNS动态发现服务。

负载均衡

分布式框架要比较好的支持集群上每台物理机的资源分配的均衡,避免有的机器闲置,有的机器压力太大

程序贴近数据

分布式框架对集群的管理上,如哪些计算和服务启在哪台物理机上要有一定的逻辑,比如最基本的逻辑就是程序贴近数据原则(类似Hadoop)。因为在多库多区的场景下,数据库或其他数据资源同样也涉及拆分到不同的机器上,所以很基本的一个优化就是如果A库区的某个服务访问数据特别频繁,那就尽量把这个服务和它所需要的数据启在同一台物理机上。

高可用

“资源状态发现,上线、下线”已经谈到了启动的服务和计算的高可用,另外分布式框架自身也支持master/slave模式抢占支持高可用,也要包括从灾难中恢复(所有主从程序全挂)

监控

要实现对分布式框架各种资源使用的监控,够后续发现问题,调试,改进。

对于程序要求

分布式框架尽量把对应用程序的开发影响降到最小,目前想到的是,因为分布式框架可能会改变服务运行的容器,所以要求提供kill回调,当框架杀掉进程前可以用于做安全处理,这是一个可选项,如果程序足够健壮可能并不需要实现。

Reference

paper:

Large-scale cluster management at Google with Borg

Mesos: A Platform for Fine-Grained Resource Sharing in the Data Center

CGroups:

https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/Resource_Management_Guide/index.html

http://xiezhenye.com/2013/10/%E7%94%A8-cgroups-%E7%AE%A1%E7%90%86-cpu-%E8%B5%84%E6%BA%90.html

http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation

https://help.ubuntu.com/lts/serverguide/cgroups.html

http://coolshell.cn/articles/17049.html

lxc

https://linuxcontainers.org/

https://help.ubuntu.com/lts/serverguide/lxc.html

https://stgraber.org/2013/12/20/lxc-1-0-blog-post-series/

https://github.com/waseemh/lxc-java

联系我: