Apache Mesos 是一款基于多资源(内存、CPU、磁盘、端口等)调度的开源集群管理套件,能使容错和分布式系统更加容易使用。其采用了Master/Slave结构来简化设计,将Master作的尽量轻量级,仅保存了各类计算框架(Framwork)和Mesos Slave的状态信息,这些状态很容易在Mesos出现故障时被重构,因此使用zookeeper解决master单点故障问题。java
Mesos Master充当全局资源调度器角色,采用某种策略算法将某个Save
上的空闲资源分配给某个Famework,而各类Framework则是经过本身的调度器向master注册进行接入,master slave则是收集任务状态和启动各个Framework的Executor。其架构图以下:python
基本术语:linux
- Mesos master: 负责管理各个Framework和Slave,并将Slave 上的资源分配给各个Framework。
- Mesos Slave:负责管理本节点上的各个Mesos Task,为各个Executor分配资源。
- Framework:计算框架,如:Hadoop、Spark等,能够经过MesosSchedulerDiver接入Mesos。
- Executor:执行器,在Mesos Slave上安装,用于启动计算框架中的Task。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。其中Master 选举能够说是 ZooKeeper 最典型的应用场景了。生产环境中Zookeeper是以宕机个数过半来让整个集群宕机的,因此master至少三个节点。nginx
Marathon是一个Mesos框架,可以支持运行长服务,好比web应用等。是集群的分布式Init.d,可以原样运行任何Linux二进制发布版本,如Tomcat Play等等,能够集群的多进程管理。也是一种私有的Pass,实现服务的发现,为部署提供提供REST API服务,有受权和SSL、配置约束,经过HAProxy实现服务发现和负载平衡。web
版本内核须要3.10以上算法
cat /etc/redhat-release //查看Linux版本 uname -r //查看内核版本(须要内核3.10以上)
环境以下所示:docker
主机 | IP地址 | 安装软件包 |
---|---|---|
master | 192.168.26.150 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/zookeeper-3.4.10.tar.gz/ marathon-0.15.2.tgz |
master1 | 192.168.26.139 | jdk-8u91-linux-x64.tar.gz/ mesos-0.25.0.tar.gz /zookeeper-3.4.10.tar.gz |
master2 | 192.168.26.140 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/zookeeper-3.4.10.tar.gz |
slave | 192.168.26.141 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/docker |
slave1 | 192.168.26.142 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/docker |
步骤以下所示:apache
关闭全部主机的防火墙和安全性策略json
systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ cd /usr/local mv jdk1.8.0_91/ java vim /etc/profile export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar source /etc/profile
(1)安装开发工具vim
yum groupinstall -y "Development Tools"
(2)添加apache-maven源
为Mesos提供项目管理和构建自动化工具的支持
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
(3)安装相关依赖包
yum install -y apache-maven python-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel apr-util-devel subversion-devel
(4)配置WANdiscoSVN网络源
vim /etc/yum.repos.d/wandisco-svn.repo [WANdiscoSVN] name=WANdisco SVN Repo 1.9 enabled=1 baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/ gpgcheck=1 gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
vim /etc/profile export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so source /etc/profile
tar zxvf mesos-0.25.0.tar.gz -C /opt/ mv /opt/mesos-0.25.0/ /root/ cd /root/mesos-0.25.0 mkdir build cd build ../configure make //等待时间长(在线状态) make check make install
Mesos-master负责维护slave集群的心跳,从salve提取资源信息,配置以前作好相应的解析工做。
hostnamectl set-hostname master #修改相应的主机名 vim /etc/hosts #修改hosts文件 192.168.26.131 master 192.168.26.139 master1 192.168.26.140 master2 192.168.26.141 slave 192.168.26.142 slave1 ln -sf /root/mesos-0.25.0/build/bin/mesos-master.sh /usr/sbin/mesos-master
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0
参数:
--work_dir:运行期数据存放路径,包含sandbox、slavemeta等信息
--log_dir:Mesos日志存放路径
--[no-]hostname_lookup: 是否从DNS获取主机名,本例中关闭了此配置,直接显示IP。
--ip: Mesos进程绑定的IP。
http://l92.168.26.150:5050
Mesos-slave负责接收并执行来自Mesos-master传递的任务以及监控任务状态,收集任务使用系统的状况,配置以前作好解析工做。
hostnamectl set-hostname slave vim /etc/hosts #修改hosts文件 192.168.26.150 master 192.168.26.139 master1 192.168.26.140 master2 192.168.26.141 slave 192.168.26.142 slave1 ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave #建立连接文件
yum install docker -y systemctl start docker.service systemctl enable docker.service
注意docker服务启动失败,解决方案请参考博客https://blog.51cto.com/11134648/2162785。
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.26.148:5050 --no-hostname_lookup --ip=0.0.0.0
注意当启动失败时,有可能连接文件没有生效,使用以下命令
cd /root/mesos-0.25.0/build/bin/ ./mesos-slave.sh --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.26.150:5050 --no-hostname_lookup --ip=0.0.0.0
使用浏览器再次对master的5050端口进行访问
http://:192.168.26.150:5050
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz tar zxvf zookeeper-3.4.10.tar.gz -C /home/q/ cd /home/q/zookeeper-3.4.10/ mv conf/zoo_sample.cfg conf/zoo.cfg
以server.A=B:C:D 格式定义各个节点的相关信息,其中A是一个数字,表示第几号服务器;B是这个服务器的IP地址;C为与集群中的Leader服务器交换信息的端口;D是在leader挂掉时专门进行Leader选举时所用的端口。
cd /home/q/zookeeper-3.4.10/conf vim zoo.cfg dataDir=/home/q/zookeeper-3.4.10/data //从新定义Datadir的位置 dataLogDir=/home/q/zookeeper-3.4.10/datalog server.1=192.168.26.150:2888:3888 server.2=192.168.26.139:2888:3888 server.3=192.168.26.140:2888:3888
scp zoo.cfg 192.168.26.139:/home/q/zookeeper-3.4.10/conf/ scp zoo.cfg 192.168.26.140:/home/q/zookeeper-3.4.10/conf/
master主机上(/home/q/zookeeper-3.4.10/)
mkdir data datalog echo 1 > data/myid cat data/myid
master1主机上(/home/q/zookeeper-3.4.10/)
mkdir data datalog echo 2 > data/myid cat data/myid
master2主机上(/home/q/zookeeper-3.4.10/)
mkdir data datalog echo 3 > data/myid cat data/myid
master主机
./bin/zkServer.sh start conf/zoo.cfg
master1主机
./bin/zkServer.sh start conf/zoo.cfg
master2主机
./bin/zkServer.sh start conf/zoo.cfg
./bin/zkServer.sh status
注意先kill掉以前启动的Mesos-master进程
master主机
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.26.150:2181/mesos --quorum=2
master1主机
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.26.139:2181/mesos --quorum=2
master2主机
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.26.140:2181/mesos --quorum=2
注意先kill掉以前启动的Mesos-master进程
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --no-hostname_lookup --ip=0.0.0.0
注意当启动失败时,,有可能连接文件没有生效,使用以下命令
cd /root/mesos-0.25.0/build/bin/ ./mesos-slave.sh --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --no-hostname_lookup --ip=0.0.0.0
http://192.168.26.140:5050
若指定的是非Leader状态下的Mesos-master地址,页面会自行跳转至处于leader状态的Mesos-master地址。
使用Marathon向Mesos发送任务。
wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz tar zxvf marathon-0.15.2.tgz -C /home/q/ cd /home/q/marathon-0.15.2 ./bin/start --hostname 192.168.26.150 --master zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --http_address 0.0.0.0 //将Marathon安装到多Mesos-master环境的master主机上
http://192.168.26.150:8080/
(1)在首页点击Create按钮,建立一个测试任务echo “hello world”
(2)建立成功之后在applications页面能够看到该任务
Marathon会自动注册到Mesos中,能够在Mesos web的Framework页面中看到注册信息。
能够在Mesos Web首页看到测试任务在不停的执行中
(4)在节点slave主机查看任务的相关信息
(5)删除测试任务
在节点slave中操做
cd /root vim demo.json { "id":"basic-0", "cmd":"while [true]; do echo 'hello Marathon'; sleep 5; done", "cpus":0.1, "mem":10.0, "instances":1 } //查看Marathon网站有新添加任务 curl -X POST -H "Content-type:application/json" http://192.168.26.150:8080/v2/apps -d@demo.json
(1)在节点slave建立docker的nginx请求任务
cd /root vim nginx.json { "id":"/nginx", //应用惟一的ID "container":{ //marathon启用docker格式 "type":"DOCKER", "docker":{ "image":"nginx", //nginx镜像 "network":"HOST", //网络为HOST模式 "parameters":[], "privileged":false, "forcePullImage":false //是否强制更新镜像 } }, "cpus":0.1, "mem":32.0, "instances":1 } //查看Marathon网站有新添加任务 curl -X POST -H "Content-type:application/json" http://192.168.26.150:8080/v2/apps -d@nginx.json
(2)在Marathon页面查看
能够在建立的Nginxd任务下看到该任务发送给主机
(3)用命令行方式查看主机下载的docker镜像
docker images
docker ps -a
(4)访问slave主机上运行着的Nginx服务
http://192.168.26.141