我在Mesos上运行Docker容器的经验

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是我在Mesos上运行Docker容器的经验,【编者的话】下面的这篇博客出自John Omernik之手,他是Big Data Analytics的Data Enthusiast和VP,还是Zions Bank的Fraud Center of Excellence的经理,Zions Bank是家顶级的金融服务公司。
本文讲的是我在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文件系统一起使用,或跟当前环境协同使用。
apache-mesos-logo.jpg

当在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/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服务器,我可以做任何事情。我发现了一件非常神奇的事情——它真的可以做任何事情。我的孩子们非常喜欢它。在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。

原文发布时间为: 2015-07-07
本文作者:Dataman数人科技
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:我在Mesos上运行Docker容器的经验
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
101
分享
相关文章
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
363 182
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
288 93
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
65 23
容器化AI模型的监控与治理:确保模型持续稳定运行
在前几篇文章中,我们探讨了AI模型的容器化部署及构建容器化机器学习流水线。然而,将模型部署到生产环境只是第一步,更重要的是确保其持续稳定运行并保持性能。为此,必须关注容器化AI模型的监控与治理。 监控和治理至关重要,因为AI模型在生产环境中面临数据漂移、概念漂移、模型退化和安全风险等挑战。全面的监控涵盖模型性能、数据质量、解释性、安全性和版本管理等方面。使用Prometheus和Grafana可有效监控性能指标,而遵循模型治理最佳实践(如建立治理框架、定期评估、持续改进和加强安全)则能进一步提升模型的可信度和可靠性。总之,容器化AI模型的监控与治理是确保其长期稳定运行的关键。
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
345 15
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
51 14
docker安装nginx,前端项目运行
通过上述步骤,你可以轻松地在Docker中部署Nginx并运行前端项目。这种方法不仅简化了部署流程,还确保了环境的一致性,提高了开发和运维的效率。确保按步骤操作,并根据项目的具体需求进行相应的配置调整。
197 25
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等