我在mesos上運行docker的經驗

jopen 9年前發布 | 8K 次閱讀 Mesos
 
我在mesos上運行docker的經驗

我的技術棧

正如在此博客中我所寫到的,我想和你分享我如何在一個單集群中使用docker容器來運行分析作業。該技術我們在 Zions 研究的是在 MapR 平臺和 MapR-FS 之上運行的 Apache Mesos.我的目標是嘗試構建一個無處不在的計算平臺。為了分析,我運行Spark和 Myriad (在該領域針對 MapR 和其他的平臺需要更多的開發)。Myriad 是我正在用來運行 MapReduce 作業。我同時使用運行于 mesos 之上的 Kafka 和 Storm,與 MapR 文件系統一起使用,或跟當前環境協同使用。

MapR 提供了極大的幫助當其運行 mesos 之上 Docker 容器。一個例子是我運行于 docker 內部的 Hive metastore 服務。因為 Hive metastore 需要一個關系型數據庫來持久化表的元數據, 其需要我同時部署一個 MySQL 服務實例。 我在一個基于 Mesos 的 Docker 內通過Marathon來發布該實例而不是通過部署 MySQL 在集群之外的獨立服務器上。 由于 MySQL 存儲的數據非常重要,我想確認如果容器崩潰或其宿主機死掉,Marathon 可以創建新的容器并接管其離線的所有完好的數據。MapR-FS 的 NFS 功能非常簡單將其實現,因為其隨機讀寫的能力和為一個數據庫維持負載的高性能。

利用 MapR 文件系統

一個需要我解決的問題是當一個 MySQL 數據庫被啟用,其需要針對數據庫文件的獨占訪問。我想防止意外啟動的另一個 Docker 容器將運行在這些文件之上,這是因為擁有兩個實例的 MySQL 訪問相同的文件將不是一個好事如果你想你的數據庫文件保持一致性。所以我與 Ted Dunning 和 Keys Botzum 在 MapR 對其進行了深入的了解,我請教他們,“我如何使用一個鎖?” 盡管 MapR NFS 在傳統的 Unix 角度不支持鎖定, MapR 支持通過創建目錄和新建文件的文件系統標準的啟用鎖定。

使用他們的建議,我寫了一個腳本實現了鎖定模式其允許可靠的持久性數據存儲。其意味著別人也可以從中獲得好處,所以我將該腳本分享于此。

這里分為兩部分,第一部分是, “我想在該文件上行使用一個鎖并且我想其為獨占式”。這里并不支持,但另一方面, MapR 支持語義上的創建一個目錄并唯一可能的創建該目錄,這也是我再該腳本中所使用的,我想能夠創建一些東西我的 Docker 容器可以發現并且說, “有些人同時使用該數據,我需要關閉。” 我的腳本防止有兩個不同實例的 MySQL 或 Hive Metastore 運行于我的集群之上,但我仍然有能力在我的集群的任意節點運行 MySQL .

這里對其運行在哪沒有任何限制。 Mesos 社區嘗試去解決該問題的一種方式是將數據持久化到不同的框架上-所以你可以使用該數據塊-并且其在未來的版本中被包含。但 MapR 擁有高性能的文件系統在我的所有節點上都可用,因此我想更好的利用它。

為Docker容器處理文件系統鎖而寫的我的代碼

基本上講,這段代碼運行如一個墊片,我調用該代碼而不是啟用我期望在Mesos中直接啟用的任何進程,該代碼會檢測每個我設定的特定目錄。例如, 如果是 MySQL 或 Minecraft Docker 容器, 其會針對容器檢測一個單獨的地址。 我的 Minecraft 服務器在 MapR-FS中有一個地址;這正是其檢測并決定如果它可以在該目錄上擁用一個獨占鎖并運行。如果它不能夠這樣做-它發現有些進程也對該目錄上鎖,其會知 曉它不能夠運行并關掉該容器。這就保證了我不會有多于一個的 相同類型的 Docker 容器。我不想兩個 Minecraft 服務器運行,因為他們將工作在相同的數據之上,因而導致文件損壞。

這里是我為 Docker 容器處理文件系統鎖而寫的代碼:

#!/bin/bash

#The 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

在 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 服務器。 所有的 Minecarft 世界的數據是通過 NFS 服務保存于 MapR-FS。對于我,其真正解決了一個問題, 因為 MapR 能夠做到其他技術做不到的一些事情.我不知道 HDFS 上的文件如何做的隨機讀寫;我并不知道如何讓 Minecraft 運行于 HDFS之上-但我能夠用 MapR-FS 來實現。

正如我所提到的,我已經工作于是我的家庭網絡運行于 基于 MapR 的 Mesos 之上,因為這里有很多有趣的方式來使用它。當然,很少的一部分人將做該層面的集成。我做此的原因是我了解 MapR 和 Mesos 是如何一起工作的。同時,我使用一個開源的基于 linux 的 DVR “ MythTV ”,其使你能夠錄 TV。 我現在將它運行在一個 VM 里,并且我的目標是嘗試將它運行于我的集群中的 Docker 中,僅僅是嘗試看我是否能夠實現。

我非常享受使用技術比如 基于 MapR 的 Mesos 和 Docker,并且我期望你會發現我為持久化 Docker 存儲而寫的這段代碼非常有用。

原文連接

張明鋒,資深devops,infrastructure工程師。專注于分布式系統和IDC(系統,網絡,存儲等)架構。對系統、數據庫、網絡、存儲有深刻了解。日常開發使用golang,c,c++,python,shell.google fans。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!