我在Mesos上運行Docker容器的經驗
下面的這篇博客出自John Omernik之手,他是Big Data Analytics的Data Enthusiast和VP,還是Zions Bank的Fraud Center of Excellence的經理,Zions Bank是家頂級的金融服務公司。在這篇博客中,作者分享了他是怎么利用新技術如Mesos和Docker來使用MapR文件系統的,并編寫了一個可以簡 化流程的腳本。
我的技術棧
正如在此博客中我所寫到的,我想和你分享我如何在一個單集群中使用Docker容器來運行分析作業。我們在Zions研究這個技術(當然,我也會在家運行它),該技術是在MapR平臺和 MapR-FS之上運行的Apache Mesos。我的目標是嘗試構建一個無處不在的計算平臺。為了分析,我運行了Spark和 Myriad(運行MapR和該領域的其他技術的話會產生較大的開發工作量)。我用Myriad來運行MapReduce作業。我將Kafka和Storm同時運行于Mesos,與MapR文件系統一起使用,或跟當前環境協同使用。當在Mesos上運行Docker容器時,MapR會提供了極大的幫助。有一個例子是我在Docker內部運行的服務,這個服務是Hive metastore服務。因為Hive metastore需要一個關系型數據庫來持久化表的元數據,其需要我同時部署一個MySQL服務實例。我在一個基于Mesos的Docker內通過 Marathon來發布該實例,而不是在集群之外的獨立服務器上部署MySQL。由于MySQL存儲的數據非常重要,我想確認如果容器崩潰或其宿主機死 掉,Marathon是否可以創建新的容器并接管其離線的所有完好的數據。MapR-FS的NFS功能可以很容易實現這點,因為它有隨機讀寫的能力并且能 為一個數據庫維持負載的高性能。
利用MapR文件系統
一個需要我解決的問題是當一個MySQL數據庫被啟用,需要對數據庫文件進行獨占訪問。我想要預防另一個 Docker容器的意外啟動,而產生對數據庫文件的訪問,這是因為如果你想要你的數據庫文件保持完整性,那么有兩個MySQL實例訪問相同的文件將不是一 個好事。所以我對這個問題進行了深入研究,并同Ted Dunning和Keys Botzum在MapR上開始了研究,我請教他們,“我如何使用一個鎖?” 盡管從傳統的Unix角度看,MapR NFS不支持鎖定,但MapR卻支持啟用鎖定的文件系統標準,這種鎖定是通過創建目錄和新建文件來啟用。聽取了他們的建議,我寫了一個腳本,實現了鎖定模式,這種模式允許可靠的持久性數據存儲。這就意味著別人也可以從中獲得好處,所以我將該腳本分享于此。
這里分為兩部分,第一部分是,“我想lock文件并且讓其成為獨占式的”。這里并不支持,但另一方面,MapR卻支持 semantics,它能夠創建一個目錄并且是唯一一個能夠創建該目錄的,這也是我在該腳本中所使用的。我想能夠創建一些東西,這樣我的Docker容器 可以檢測到并且說,“有其他人正在使用這個數據,我需要關閉。”我的腳本可以阻止擁有兩個不同的MySQL實例或Hive Metastore在我的集群之上運行,但我仍然有能力在我的集群的任意節點運行MySQL。這里對其運行在哪沒有任何限制。 Mesos社區嘗試去解決該問題,其中一種方式是將數據持久化到不同的框架上——所以你可以使用該數據塊——并且包含在未來的版本中。但MapR擁有高性 能的文件系統,而且在我的所有節點上都可用,因此我想更好的利用它。
為Docker容器處理文件系統鎖而寫的代碼
基本上講,這段代碼就像一個墊片,我調用該代碼而不是啟用我期望在Mesos中直接啟用的 任何進程,該代碼會檢測每個我設定的特定目錄。例如,如果是MySQL或Minecraft Docker容器,它會針對每個容器檢測一個單獨的地址。我的Minecraft服務器在MapR-FS中有一個地址;這正是其檢測并決定是否它可以在該 目錄上擁用一個獨占鎖并運行。如果它不能夠這樣做——它發現有些進程也對該目錄上鎖,它會知曉它不能夠運行并關掉該容器。這就保證了我不會有多于一個的 相同類型的Docker容器。我不想兩個Minecraft服務器運行,因為他們將工作在相同的數據之上,因而導致文件損壞。這里是我為Docker容器處理文件系統鎖而寫的代碼:
#!/bin/bashThe location the lock will be attempted in
LOCKROOT="/minecraft/lock" LOCKDIRNAME="lock" LOCKFILENAME="mylock.lck"
This is the command to run if we get the lock.
RUNCMD="./start.sh"
Number of seconds to consider the Lock stale, this could be application dependent.
LOCKTIMEOUT=60 SLEEPLOOP=30
LOCKDIR=${LOCKROOT}/${LOCKDIRNAME} LOCKFILE=${LOCKDIR}/${LOCKFILENAME}
if mkdir "${LOCKDIR}" &>/dev/null; then echo "No Lockdir. Our lock"
This means we created the dir!
The lock is ours
Run a sleep loop that puts the file in the directory
while true; do date +%s > $LOCKFILE ; sleep $SLEEPLOOP; done &
Now run the real shell scrip
$RUNCMD else
Pause to allow another lock to start
sleep 1 if [ -e "$LOCKFILE" ]; then echo "lock dir and lock file Checking Stats" CURTIME=
date +%s
FILETIME=cat $LOCKFILE
DIFFTIME=$(($CURTIME-$FILETIME)) echo "Filetime $FILETIME" echo "Curtime $CURTIME" echo "Difftime $DIFFTIME"if [ "$DIFFTIME" -gt "$LOCKTIMEOUT" ]; then echo "Time is greater then Timeout We are taking Lock" # We should take the lock! First we remove the current directory because we want to be atomic rm -rf $LOCKDIR if mkdir "${LOCKDIR}" &>/dev/null; then while true; do date +%s > $LOCKFILE ; sleep $SLEEPLOOP; done & $RUNCMD else echo "Cannot Establish Lock file" exit 1 fi else # The lock is not ours. echo "Cannot Estblish Lock file - Active " exit 1 fi
else
# We get to be the locker. However, we need to delete the directory and recreate so we can be all atomic about rm -rf $LOCKDIR if mkdir "${LOCKDIR}" &>/dev/null; then while true; do date +%s > $LOCKFILE ; sleep $SLEEPLOOP; done & $RUNCMD else echo "Cannot Establish Lock file - Issue" exit 1 fi
fi fi
End</pre>
在MapR上運行開源軟件:支持的非常好
有些人可能會因為使用一個“混合體”如MapR而擔憂。我的意思是你想要運行的大部分工具都將 成為開源軟件,當然文件系統不會。這正是對開源社區一些人的挑戰,因為有些人會想,“我想運行Spark;我想運行如Mesos這樣的程序,如果我同時想 運行其他的程序如MapR,誰會給我提供支持?誰會幫助我讓它運行起來?如果我在標準的Apache HDFS上運行, 從社區的角度上來講,很多人將會獲得幫助。”這正是人們的恐懼之一(當開源與閉源捆綁使用)。
但我所發現的例子是,MapR可通過資源如answers.mapr.com,也可以通過直接交互與社區很好地融合,如果這里有些事情我不能解決是因為我所需要的代碼不存在,MapR總是樂于和我一起工作并幫助我了解將會發生什么。
給那些想在MapR之上運行Mesos和Docker的人們一些建議
最開始確定給予MapR大量的資源,然后把剩下的資源給 Mesos。當前, 我傾向于“一半一半”,因為我沒有官方安裝包,我僅僅是安裝了MapR和Mesos,然后講,“不錯,一起運行的很好。”事情已經運作良好,但是我可以直 觀看到沖突,這取決于我如何調用資源。MapR正在解決某些問題,在不久的將來他們嘗試動態的在MapR和Mesos之間合理利用資源。
其他在MapR上使用Mesos的有趣項目
我可以在這里很容易的講出針對一些科目的議題!我目前所做的與其相關的一些東西非常有趣—— 在集群上從運行MySQL數據庫到運行我孩子的Minecraft服務器,我可以做任何事情。我發現了一件非常神奇的事情——它真的可以做任何事情。我的 孩子們非常喜歡它。在VM中運行Minecraft服務器和在集群中的Docker里運行之間沒有任何問題。所有的Minecarft世界的數據是通過 NFS服務保存于MapR-FS。對于我來說,其真正解決了一個問題,因為MapR能夠做到其他技術做不到的一些事情。我不知道HDFS上的文件如何做的 隨機讀寫;我并不知道如何在HDFS中運行Minecraft——但我能夠用MapR-FS來實現。
正如我所提到的,我正在通過Mesos,使我個人的家庭網絡運行于MapR上,因為這里有很多有趣的方式來使用它。當然,很少有人會做該層面的集 成。我這樣做了,是因為這可以讓我了解MapR和Mesos是如何一起工作的。同時,我使用一個開源的基于linux的DVR,叫做 MythTV,它可以讓你能夠錄 TV。 我現在將它運行在一個VM里,并且我的目標是嘗試將它運行于我的集群中的Docker里,僅僅是嘗試看我是否能夠實現。
我非常享受使用技術比如基于MapR的Mesos和Docker,并且我期望你會發現我為持久化Docker存儲而寫的這段代碼非常有用。
原文連接:My Experience with Running Docker Containers on Mesos(翻譯:張明峰 審校:魏小紅)
================================================
譯者介紹
張明鋒, 數人科技資深DevOps,infrastructure工程師。專注于分布式系統和IDC(系統,網絡,存儲等)架構。對系統、數據庫、網絡、存儲有深刻了解。日常開發使用Golang、C、C++、Python、Shell。
來自:http://dockone.io/article/495