Mesos实战

Mesos是一个托管于Apache基金会的项目。旨在抽象了传统机房中全部服务器的CPU、内存存储资源,并提供了一系列的方法支持任务在多机器之间的调度和故障转移。用他们自己的话说“A distributed systems kernel”也就是说是一个分布式的内核。(就当前来说还远)。

这一次我们就从部署一个典型的Mesos集群开始,顺便提一下Mesos的几个框架类型。改日再弄一个将某某框架整合进Mesos的文档。

首先是一个典型的Mesos的逻辑图,Mesos集群主要有master和slave两个部分组成,顾名思义master提供了任务接口,并将任务发送至slave执行,master也支持备份机制,当然思路只不过是通过zookeeper这个知名的“铲屎官”来实现的。而在slaver端,在接受到了任务请求之后就会起一个excecutor执行任务,不同的任务框架对应的excecutor是不同的。同时,考虑到了安全性等因素,task并非直接执行在slave的“裸操作系统”之上,任务的执行需要启动一个相对隔离的沙盒。总而言之,就Litrin个人的理解,当下的Mesos更接近一个“基于沙盒容器技术的任务和资源调度系统”。对于资源这一块没什么说的,对于任务来说,Mesos可以通过可定制化的framework框架来执行。如图所示的,就当下来说既然Hadoop和spark这类的分布式计算如此的流行,那自然少不了对于这些个框架的支持。

说一下环境,此次我总共准备了4台Openstack虚拟机Ubuntu1404。10.239.21.100作为master, 10.239.21.202~204分别对应了slave-01~03。(之所以把IP和hostname错开分配就是为了逼疯处女座:))。由于slave和master在安装甚至于配置过程中几乎没有区别。我这次直接将master做成了image然后clone了3套slave。如果你采用物理机操作的话类似的操作要完整的重复4遍,而且要保证安装的时候使用的用户一致。

首先,准备编译环境,下载安装包

 $ sudo apt-get update
 $ sudo apt-get install openjdk-7-jdk autoconf libtool build-essential python-dev python-boto libcurl4-nss-dev libsasl2-dev maven libapr1-dev libsvn-dev

 $ wget http://www.apache.org/dist/mesos/0.23.0/mesos-0.23.0.tar.gz
 $ tar vzxf mesos-0.23.0.tar.gz
开始编译,这个过程有点长,而且中途还要通过MVP下载Java的依赖包,非常耗时,而且由于GFW的缘故中途断线的几率非常高,请保持好网络连接。如果有下载失败的报错,建议再试几次。
 #官方文档之前还有一步./bootstrap,实测除了会报找不到文件之外,然并卵。
 $ ./configure --prefix=/usr/local/mesos
 $ make -j8
 $ make -j8 install
成功之后,/usr/local/mesos目录下应该已经安装好了mesos。所有的配置文件放置在/usr/local/mesos/etc/mesos,目前只有几个*.template可供参考,通常我会建议你改名之后使用,但说实话,这配置文件只会往坑里带人。我下文将一一介绍各个文件:
文件名 用途 内容
masters 所有的master节点IP地址,一行一个IP。 10.239.21.100
slaves 同上,不过是slave节点 10.239.21.202
10.239.21.203
10.239.21.204
mesos-deploy-env.sh 连接各个节点时需要的公共环境变量 export SSH_OPTS=” -o ConnectTimeout=10″ #设置ssh时10秒timeout
mesos-master-env.sh 启动master节点时的环境变量 IP=`ifconfig eth0 | head -2 | tail -1 | awk ‘{print $2}’ | cut -c 6-` #获取本机IPexport MESOS_ip=${IP}
export MESOS_work_dir=/var/lib/mesos
mesos-slave-env.sh 同上,不过是slave节点 export MESOS_master=10.239.21.100:5050 #master节点的IP和端口,5050是默认端口export MESOS_log_dir=/var/log/mesos
export MESOS_work_dir=/var/lib/mesos
export MESOS_containerizers=docker,mesos #卖个关子的配置

IP=`ifconfig eth0 | head -2 | tail -1 | awk ‘{print $2}’ | cut -c 6-`
export MESOS_ip=${IP}

#在这里的环境变量将会在slave的沙河中生效
export env_1=hello
export env_2=world

在/var下建立必要的目录
    $ mkdir -p /var/log/mesos
    $ mkdir -p /var/lib/mesos
 接下来的一步几乎没有在任何文档中提及,但这一步对于生产环境来说非常重要。那就是建立SSH互信。(具体原因请参考这里
    $ mkdir ~/.ssh
    $ cd ~/.ssh
    $ ssh-keygen
    $ cat id_rsa.pub >> authorized_keys
如果你是不断的重复安装过程的话,以上过程只能在一台机器上执行一次,然后再将用户目录下的.ssh分别拷贝到每台主机的同一目录即可。
大致上完成了,我就在这里结束,然后将主机克隆出3份。对应的就是10.239.21.202~204了!
等机器完成启动后就可以尝试启动整个集群了
    $ cd /usr/local/mesos/sbin
    $ ./mesos-start-cluster.sh

Starting mesos-master on 10.239.21.100
ssh -o ConnectTimeout=2 10.239.21.100 /usr/local/mesos/sbin/mesos-daemon.sh mesos-master </dev/null >/dev/null
Starting mesos-slave on 10.239.21.202
ssh -o ConnectTimeout=2 10.239.21.202 /usr/local/mesos/sbin/mesos-daemon.sh mesos-slave </dev/null >/dev/null
Starting mesos-slave on 10.239.21.203
ssh -o ConnectTimeout=2 10.239.21.203 /usr/local/mesos/sbin/mesos-daemon.sh mesos-slave </dev/null >/dev/null
Starting mesos-slave on 10.239.21.204
ssh -o ConnectTimeout=2 10.239.21.204 /usr/local/mesos/sbin/mesos-daemon.sh mesos-slave </dev/null >/dev/null
看懂没?我解释一下,其实这就是个批量ssh到各个主机上各自启动对应服务的脚本!
 通过浏览器访问http://10.239.21.100:5050的webUI,点击slaves你可以看到所有的slave都连接成功。
 mesos-slaves
冒烟测试一把,在集群中执行一个sleep 100看看
    $ /usr/local/mesos/bin/mesos-execute --command="sleep 100" --name="test" --master=10.239.21.100:5050
I0820 09:27:48.867080 18556 sched.cpp:157] Version: 0.23.0
I0820 09:27:48.879843 18564 sched.cpp:254] New master detected at master@10.239.21.100:5050
I0820 09:27:48.881845 18564 sched.cpp:264] No credentials provided. Attempting to register without authentication
I0820 09:27:48.890270 18564 sched.cpp:448] Framework registered with 20150819-122935-1679159050-5050-16243-0090
Framework registered with 20150819-122935-1679159050-5050-16243-0090
task test submitted to slave 20150818-154615-1679159050-5050-21165-S5
Received status update TASK_RUNNING for task test
无报错,然后去web首页看看,可以看到这个叫test的任务已经在203的沙盒中跑起来了。
 mesos-web-tasks
讲到这,mesos的部署就完成了。然而就像之前的LAMP部署时,重要的并非是框架而是内容。下次我将会在这个基础之上讲讲如何利用Mesos跑几个任务。

 

推荐阅读:
任何一个合理的应用程序的运行时
在虚拟机的日常使用和开发中,我
之前我们通过几个概念简单的介绍

“Mesos实战”的3个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据