天天看點

Mesos&Marathon實作容器部署 Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)

mesos&marathon架構說明

Mesos&Marathon實作容器部署 Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)
Mesos&Marathon實作容器部署 Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)

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的體系結構和工作流

Mesos&Marathon實作容器部署 Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)
Mesos&Marathon實作容器部署 Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)

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  (

Mesosphere - High Availability Cluster failing to elect leader, but logs show no errors and cannot seem to force a leader election)

繼續閱讀