分布式系统是难于理解、设计、构建 和管理的,他们将比单个机器成倍还要多的变量引入到设计中,使应用程序的根源问题更难发现。SLA(服务水平协议)是衡量停机和/或性能降低的标准,大多数现代应用程序有一个指望的弹性SLA水平,一般按"9"的数量增长(如,每个月99.9或99.99%可用性)。每一个额外的9变得愈来愈难实现。python
分布式系统一般是以静态分区,好比Akka/Play、 Spark/Hadoop、Storm和 Redis各自分区分组划分。静态分区带来的缺点是增长复杂性,随着机器数量增长,软件管理愈来愈复杂,失败管理维护愈来愈难。并且资源消耗很是不经济, 下图是静态分区下资源利用率:linux
Apache Mesos可以在一样的集群机器上运行多种分布式系统类型,更加动态有效率低共享资源。提供失败侦测,任务发布,任务跟踪,任务监控,低层次资源管理和细粒度的资源共享,能够扩展伸缩到数千个节点。Mesos已经被Twitter用来管理它们的数据中心。web
Mesos架构图以下:docker
Mesos框架是一个在Mesos上运行分布式应用的应用程序,它有两个组件:json
调度器 : 与Mesos交互,订阅资源,而后在mesos从服务器中加载任务。
ubuntu
执行器 : 从框架的环境变量 配置中得到信息,在mesos从服务器中运行任务。浏览器
下面看看其是如何实现资源调用?Mesos经过"resources offers" 分配资源,资源实际上是当前可用资源的一个快照,调度器将使用这些资源在mesos从服务器上运行任务。服务器
Mesos主从服务器调度资源的顺序图以下:架构
首先由Mesos主服务器查询可用资源给调度器,第二步调度器向主服务器发出加载任务,主服务器再传达给从服务器,从服务器向执行器命令加载任务执行,执行器执行任务之后,将状态反馈上报给从服务器,最终告知调度器 。app
从服务器下管理多个执行器,每一个执行器是一个容器,之前可使用Linux容器LXC,如今使用Docker容器。
Mesos主服务器使用Zookeeper进行服务选举和发现。它有一个注册器记录了全部运行任何和从服务器信息,使用MultiPaxos进行日志复制实现一致性。
Mesos有一个从服务器恢复机制,不管何时一个从服务器死机了,用户的任务仍是可以继续运行,从服务器会将一些关键点信息如任务信息 状态更新持久化到本地磁盘上,从新启动时能够从磁盘上恢复运行这些任务(相似Java中的钝化和唤醒)
它是一个mesos框架,可以支持运行长服务,好比web应用等。是集群的分布式Init.d,可以原样运行任何Linux二进制发布版本,如 Tomcat Play等等,能够集群的多进程管理。也是一种私有的Pass,实现服务的发现,为部署提供提供REST API服务,有受权和SSL、配置约束,经过HAProxy实现服务发现和负载平衡。
这样,咱们能够如同一台Linux主机同样管理数千台服务器,它们的对应原理以下图,使用Marathon相似Linux主机内的init Systemd等外壳管理,而Mesos则不仅包含一个Linux核,能够调度数千台服务器的Linux核,实际是一个数据中心的内核:
首先,咱们须要设置Mesos集群环境,下面咱们以在Ubuntu 14.04 vagrant 节点上设置Mesos master/slave 和 Zookeeper。安装依赖:
$ apt-get install curl python-setuptools python-pip python-dev python-protobuf
安装zookeeper:
$ apt-get install zookeeperd
安装后,Zookeeper有一个配置,每一个Zookeeper须要知道它在quorum中的位置。
$ echo 1 | sudo dd of=/var/lib/zookeeper/myid
下面设置Docker:
$ echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list
$ apt-get update && apt-get install lxc-docker
$ docker version
Client version: 1.0.0 Client API version: 1.12 Go version (client): go1.2.1 Git commit (client): 63fe64c Server version: 1.0.0 Server API version: 1.12 Go version (server): go1.2.1 Git commit (server): 63fe64c
从Docker Hub拉取一个ubuntu image
$ docker pull libmesos/ubuntu
配置Mesos:
$ curl -fL http://downloads.mesosphere.io/master/ubuntu/14.04/mesos_0.19.0~ubuntu14.04%2B1_amd64.deb -o /tmp/mesos.deb
$ dpkg -i /tmp/mesos.deb
$ mkdir -p /etc/mesos-master
$ echo in_memory | sudo dd of=/etc/mesos-master/registry
## Mesos Python egg for use in authoring frameworks
$ curl -fL http://downloads.mesosphere.io/master/ubuntu/14.04/mesos-0.19.0_rc2-py2.7-linux-x86_64.egg -o /tmp/mesos.egg
$ easy_install /tmp/mesos.egg
下载Marathon:
$ tar xvzf marathon-0.6.0.tgz
Mesos经过Deimos 管理Docker,经过pip安装Deimos:
$ pip install deimos
配置mesos 使用Deimos
$ mkdir -p /etc/mesos-slave
$ echo /usr/local/bin/deimos | sudo dd of=/etc/mesos-slave/containerizer_path
$ echo external | sudo dd of=/etc/mesos-slave/isolation
启动全部服务 :
$ initctl reload-configuration
$ service docker start
$ service zookeeper start
$ service mesos-master start
$ service mesos-slave start
##### Starting Marathon #####
$ cd marathon-0.6.0
$ ./bin/start --master zk://localhost:2181/mesos --zk_hosts localhost:2181
Marathon 在端口8080已经启动侦听,咱们能够经过浏览器访问:
curl localhost:8080/help # gives us some details about the API's
咱们经过Marathon启动一个容器的REST API提交以下:
curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" \
localhost:8080/v2/apps -d '{
"container": {"image": "docker:///libmesos/ubuntu", "options": ["--privileged"]},
"cpus": 0.5,
"cmd": "sleep 500",
"id": "docker-tester",
"instances": 1,
"mem": 300
}'
咱们经过在curl命令后选项"options"提交定制的Docker,咱们能检查syslog ,由于mesos缺省日志是放在syslog中。
Jun 27 07:24:58 vagrant-ubuntu-trusty-64 deimos[19227]: deimos.containerizer.docker.launch() exit 0 // docker run --sig-proxy --rm --cidfile /tmp/deimos/mesos/00d459fb-22ca-4af7-9a97-ef8a510905f2/cid -w /tmp/mesos-sandbox -v /tmp/deimos/mesos/00d459fb-22ca-4af7-9a97-ef8a510905f2/fs:/tmp/mesos-sandbox --privileged -p 31498:31498 -c 512 -m 300m -e PORT=31498 -e PORT0=31498 -e PORTS=31498 libmesos/ubuntu sh -c 'sleep 500'
咱们也能经过Marathon Rest API检查咱们启动任务的状态:
curl -X GET -H "Content-Type: application/json" localhost:8080/v2/apps
下面是Marathon UI得到信息的截图:
更多关于Docker任务的信息能够经过Mesos GUI在Mesos主服务器的端口5050 ,如今咱们测试一下任务的伸缩性,好比咱们须要加入更多节点服务器,有两种办法,使用GUI或经过发出put请求。
curl -X PUT -H "Content-Type: application/json" localhost:8080/v2/apps/docker-tester \
"container": {"image": "docker:///libmesos/ubuntu", "options": ["--privileged"]},
"cpus": 0.5,
"cmd": "sleep 500",
"id": "docker-tester",
"instances": 2, # increasing the instance count to 2
"mem": 300
}'
Marathon能确保全部docker进程启动运行,若是某个进程崩溃,Marathon会从新启动一样的进程,以确保每一个配置运行一个实例,还有其余开源Mesos调度器如Apache Aurora, Airbnb's Chronos. 可是marathon比较直接简单提供好的REST API用来管理容器,虽然Mesos, Marathon 和Docker还很年轻,可是提供了基于Docker的杀手级集群管理组合。