mesos&marathon架構說明
Mesos實作了兩級排程架構,它可以管理多種類型的應用程式。第一級排程是Master的守護程序,管理Mesos叢集中所有節點上運作的Slave守護程序。叢集由實體伺服器或虛拟伺服器組成,用于運作應用程式的任務,比如Hadoop和MPI作業。第二級排程由被稱作Framework的“元件”組成。Framework包括排程器(Scheduler)和執行器(Executor)程序,其中每個節點上都會運作執行器。Mesos能和不同類型的Framework通信,每種Framework由相應的應用叢集管理。上圖中隻展示了Hadoop和MPI兩種類型,其它類型的應用程式也有相應的Framework。
Mesos Master協調全部的Slave,并确定每個節點的可用資源, 聚合計算跨節點的所有可用資源的報告,然後向注冊到Master的Framework(作為Master的用戶端)發出資源邀約。Framework可以根據應用程式的需求,選擇接受或拒絕來自master的資源邀約。一旦接受邀約,Master即協調Framework和Slave,排程參與節點上任務,并在容器中執行,以使多種類型的任務,比如Hadoop和Cassandra,可以在同一個節點上同時運作.
mesos的體系結構和工作流
Slave是運作在實體或虛拟伺服器上的Mesos守護程序,是Mesos叢集的一部分。
Framework由排程器(Scheduler)應用程式和任務執行器(Executor)組成,被注冊到Mesos以使用Mesos叢集中的資源。
- Slave 1向Master彙報其空閑資源:4個CPU、4GB記憶體。然後,Master觸發配置設定政策子產品,得到的回報是Framework 1要請求全部可用資源。
- Master向Framework 1發送資源邀約,描述了Slave 1上的可用資源。
- Framework的排程器(Scheduler)響應Master,需要在Slave上運作兩個任務,第一個任務配置設定<2 CPUs, 1 GB RAM>資源,第二個任務配置設定<1 CPUs, 2 GB RAM>資源。
- 最後,Master向Slave下發任務,配置設定适當的資源給Framework的任務執行器(Executor),接下來由執行器啟動這兩個任 務(如圖中虛線框所示)。 此時,還有1個CPU和1GB的RAM尚未配置設定,是以配置設定子產品可以将這些資源供給Framework 2。
mesos工作流程
1.叢集中的所有slave節點會和master定期進行通信,将自己的資源資訊同步到master,master由此獲知到整個叢集的資源狀況
2.mater會和已注冊、受信任的Framework進行互動,定期将最新的資源情況發送給Framework,當Framework前端有工作需求時,将選擇接收資源,否則拒絕
3.前端使用者送出了一個工作需求給Framework
4.Framework接收slave master發過來的資源資訊
5.Framework依據資源資訊向slave發起任務啟動指令,開始排程工作
Mesos是經典的二層架構,Master隻負責管理資源,Framework負責任務排程,它們兩者都可以直接給slave通信;Master保持着通用性,輕量性,它和Framework、Slave之間的的互動更多的是狀态資訊同步;在Slave上有兩類程序:一類為Manager,用來與Master通信,互動狀态資訊,另一類則是由Framework實作的具體Executor,它負責任務的運作,對于Manager而言,他看到的所有Executor、Task都是一緻的容器,而不管這些任務具體執行什麼樣的業務邏輯;
最大最小公平算法将最小的資源配置設定最大化,并将其提供給使用者,確定每個使用者都能獲得公平的資源份額,以滿足其需求所需的資源;
mesos&marathon安裝說明如下:
伺服器角色說明
master ——>192.168.229.128 ——> zookeeper,mesos-master,mesos-slave,marathon,docker
slave1 ——>192.168.229.132 ——> zookeeper,mesos-master,mesos-slave,marathon,docker
slave2 ——>192.168.229.133 ——> zookeeper,mesos-master,mesos-slave,marathon,docker
修改hostname和綁定hosts
echo "master" > /etc/hostname #192.168.229.128
echo "slave1" > /etc/hostname #192.168.229.132
echo "slave2" > /etc/hostname #192.168.229.133
cat /etc/hosts #三台機器都需要綁定
192.168.229.128 master
192.168.229.132 slave1
192.168.229.133 slave2
重新開機系統,使之生效
版本說明
mesos-1.0.1
marathon-1.1.1
zookeeper-3.4.6
docker-1.11.2
mesos安裝
- tar -zxvf mesos-1.0.1.tar.gz
- cd mesos-1.0.1
- mkdir build
- cd build
- ../configure
- make -j8
- make check
- make install
編譯過程中出現的問題:
1.找到libmesos.so檔案所在目錄,這裡是拷貝到/usr/local/lib目錄下
2.在/etc/ld.so.conf中加入include /usr/local/lib
3.執行/sbin/ldconfig –v 更行配置檔案
find / -name libmesos-1.0.1.so
vim /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf #添加
include /usr/local/mesos-1.0.1/build/src/.libs/
/sbin/ldconfig -v
marathon安裝
tar -zxvf marathon-1.1.1.tgz
cd marathon-1.1.1/bin
啟動marathon,出現報錯内容如下:
mesos-master marathon[3611]: Exception in thread "main" java.lang.UnsupportedClassVersionError: mesosphere/marathon/Main : Unsupported major.minor version 52.0
解決方法:It worked. Marathon needs jdk8.
zookeeper安裝
zk的安裝和啟動不做說明,主要配置檔案如下(zoo.cfg):
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
clientPort=2181
server.1=192.168.229.128:3888:4888
server.2=192.168.229.132:3888:4888
server.3=192.168.229.133:3888:4888
安裝到此完成;
mesos master啟動
192.168.229.128上:
mkdir -p /data1/mesos1/ && touch /data1/mesos1/log
cd /usr/local/mesos-1.0.1/build/bin &&./mesos-master.sh --ip=192.168.229.128 --zk=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --quorum=2 --work_dir=/data1/mesos1/ --external_log_file=/data1/mesos1/log --cluster=paas
192.168.229.132上:
mkdir -p /data1/mesos1/ && touch /data1/mesos1/log
cd /usr/local/mesos-1.0.1/build/bin && ./mesos-master.sh --ip=192.168.229.132 --zk=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --quorum=2 --work_dir=/data1/mesos1/ --external_log_file=/data1/mesos1/log --cluster=paas
192.168.229.133上:
mkdir -p /data1/mesos1/ && touch /data1/mesos1/log
cd /usr/local/mesos-1.0.1/build/bin && ./mesos-master.sh --ip=192.168.229.133 --zk=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --quorum=2 --work_dir=/data1/mesos1/ --external_log_file=/data1/mesos1/log --cluster=paas
mesos slave啟動
192.168.229.128上:
mkdir -p /data1/mesos_slave1/
cd /usr/local/mesos-1.0.1/build/bin && ./mesos-slave.sh --master=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --containerizers=mesos,docker --hostname=master --ip=192.168.229.128 --work_dir=/data1/mesos_slave1/
192.168.229.132上:
mkdir -p /data1/mesos_slave1/
cd /usr/local/mesos-1.0.1/build/bin && ./mesos-slave.sh --master=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --containerizers=mesos,docker --hostname=slave1 --ip=192.168.229.132 --work_dir=/data1/mesos_slave1/
192.168.229.133上:
mkdir -p /data1/mesos_slave1/
cd /usr/local/mesos-1.0.1/build/bin && ./mesos-slave.sh --master=zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --containerizers=mesos,docker --hostname=slave2 --ip=192.168.229.133 --work_dir=/data1/mesos_slave1/
marathon啟動
192.168.229.128上:
cd /usr/local/marathon-1.1.1/bin && ./start --master zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --zk zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/marathon
192.168.229.132上:
cd /usr/local/marathon-1.1.1/bin && ./start --master zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --zk zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/marathon
192.168.229.133上:
cd /usr/local/marathon-1.1.1/bin && ./start --master zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/mesos --zk zk://192.168.229.128:2181,192.168.229.132:2181,192.168.229.133:2181/marathon
使用說明
1.打開http://192.168.229.132:5050/#/ 檢視
這裡可以看到我們定義cluster為我們定義的paas,master server位址:192.168.229.128:5050 ,無論我們進入master,slave1,slave2 這三台任意一台中master server的位址都為192.168.229.128,這裡是通過zk選舉的master,如果128 挂掉後,master server會被其他伺服器取代
2.檢視slave資源情況即Agents Tab
3.檢視Frameworks頁面,可以看到現在frameworks使用的是marathon slave1主機,同mesos master一樣,這裡無論marathon任何一個down掉,其他的marthon都會頂上,也是使用zk來做選舉,點選slave1,即可跳轉到marathon管理界面
4.通路marathon管理界面(slave01:8080/ui/#/apps)
5.建立一個docker應用,建立5個instances(前提:已将docker image存放在3台機器上,可以直接run)
點選Create Application 完成應用的建立,然後檢視狀态已為Runing
檢視5個詳細執行個體
點選slave1:31289,跳轉到對應的應用中
From: http://ttxsgoto.blog.51cto.com/4943095/1854661/
另一篇文章用圖和說明對mesos的原理作了比較好的闡述: http://www.jdon.com/artichect/managing-docker-clusters-using-mesos-and-marathon.html
附錄及本地叢集試驗中存在的問題:
1. 安裝mesos需要的依賴包
http://mesos.apache.org/gettingstarted/
2. local方式啟動mesos-master, mesos-slave及test-xxx均正常
# Start mesos master (Ensure work directory exists and has proper permissions).
$ .
/bin/mesos-master
.sh --ip=127.0.0.1 --work_dir=
/home/hadoop/bigdata/mesos/mesos_master &
# Start mesos slave.
$ .
/bin/mesos-slave
.sh --master=127.0.0.1:5050
--work_dir=
/home/hadoop/bigdata/mesos/mesos_slave &
# Visit the mesos web page.
$ http:
//127
.0.0.1:5050
# Run C++ framework (Exits after successfully running some tasks.).
$ .
/src/test-framework
--master=127.0.0.1:5050
# Run Java framework (Exits after successfully running some tasks.).
$ .
/src/examples/java/test-framework
127.0.0.1:5050 //沒有--master選項
# Run Python framework (Exits after successfully running some tasks.).
$ .
/src/examples/python/test-framework
127.0.0.1:5050 ////沒有--master選項
3. 叢集方式啟動mesos-master時,報錯 "Unable to finish the recover protocol in 10secs"
很多說是端口被firewall blocked或被其它應用占用,本地試驗中沒有firewall,端口也沒被占用,還需要後續再研究。
https://stackoverflow.com/questions/32910539/mesosphere-high-availability-cluster-failing-to-elect-leader-but-logs-show-no (