在Docker和Kubernetes上运行MongoDB微服务

简介: 本文讲的是在Docker和Kubernetes上运行MongoDB微服务【编者的话】本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB...
本文讲的是在Docker和Kubernetes上运行MongoDB微服务【编者的话】本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB服务,非常的干货~

介绍

想尝试在笔记本电脑上运行MongoDB么?希望通过执行一个简单的命令,然后就有一个轻量级、自组织的沙盒么?并可再通过一条命令就可以移除所有的痕迹么?

需要在多个环境中运行相同的应用程序栈?创建自己的容器镜像,使得开发、测试、操作和支持团队启动一份完全相同的环境。

容器正在改变整个软件生命周期;它覆盖了从最初的技术试验到通过开发、测试、部署和支持的概念证明。

阅读微服务:容器和编排白皮书

编排工具管理者多个容器如何创建、升级和高可用。编排同样管理着容器如何连接,并利用多个微服务容器创建稳定的应用服务。

丰富的功能、简单的工具、强大的API让容器和编排得到DevOps团队的青睐。DevOps工程师将它们整合到持续集成(CI)和持续交付(CD)工作流中。

本篇文章将探索你在尝试运行和编排MongoDB容器时遇到的问题,并描述如何克服这些问题。

对于MongoDB的思考

采用容器和编排运行MongoDB带来了一些新的思考:
  • MongoDB数据库节点是有状态的。若一个容器挂了,并且被重新编排,数据丢失是不能接受的(虽然它可以从其他节点中恢复数据,但是很费时)。为解决这个问题,Kubernetes中的卷抽象(Volume abstraction)特性将用于映射MongoDB数据文件夹到一个持久化地址,避免容器的失败或重编排。
  • 同一组MongoDB数据库备份节点之间需要通信,即使是在重编排之后。同一冗余备份集合的节点必须知道全部其他节点的地址,但是当某个容器重编排之后,它的IP地址会变化。例如,所有Kubernetes内的容器共享一个IP地址,当pod被重编排之后这个地址就会改变。在Kubernetes中,这个问题可以通过联系Kubernetes服务与MongoDB节点来解决,采用Kubernetes的DNS服务提供主机名给重编排之后的服务。
  • 一旦每个独立的MongoDB节点(每个节点在单独容器中)启动起来,备份集合必须初始化,并把每个节点加入进来。这需要编排工具提供额外的逻辑。特别是备份集合中只有一个MongoDB节点时,必须执行rs.initiate和rs.add命令。
  • 如果编排框架提供自动化重编排容器功能(如Kubernetes的特性),那么这可以提高MongoDB的容灾性,节点会在挂掉之后自动重新创建,恢复到完整冗余水平且不需要人工干预。
  • 当编排框架掌控所有容器的状态时,它并不管理容器内的应用或者备份数据。这就意味着采用一个有效的管理和备份方案很重要,如MongoDB Cloud Manager,包括MongoDB Enterprise Advanced和MongoDB Professional两部分。考虑到需要创建镜像,可采用你倾向的MongoDB版本和MongoDB Automation Agent。

利用Docker和Kubernetes实现MongoDB冗余备份

如前一节所述,MongoDB这类分布式数据库在利用编排框架(如Kubernetes)进行部署时需要额外考虑。本节将对这部分细节进行分析,并介绍如何实现。

首先,我们在一个单独的Kubernetes集群(同一个数据中心内,并不存在物理上的冗余备份)中创建整个MongoDB冗余集合。如果跨多个数据中心进行创建,其步骤也差异不大,后续将会介绍。

备份中的每个成员都运行在独自的pod中,只暴露其ip地址和端口。固定的IP地址对于外部应用和其他冗余备份节点非常重要,它决定了哪些pod将被重新部署。

下图展示了其中一个pod与关联的冗余控制器和服务的关系。

1.png


深入这些配置中描述的资源,内容如下:
  • 启动核心节点mongo-node1。该节点包括了一个叫做的mongo的镜像,来源于[Docker Hub],其暴露27107端口。
  • Kubernetes的特性用于映射/data/db文件夹到持久化目录mongo-persistent-storage1;该目录为Google Cloud上创建的目录映射mongodb-disk1,用于持久化MongoDB的数据。
  • 容器由pod进行管理,标记为mongo-node,同时对rod提供一个随机生成的名字。
  • 冗余控制器命名为mongo-rc1,用于确保mongo-node1的实例一直处于运行中。
  • 负载均衡服务命名为mongo-svc-a用27017暴露端口。该服务通过pod的标签匹配正确的服务到对应的pod上,对外暴露的ip和端口给应用程序使用,同时用于冗余备份集合中各节点的通信。虽然每个容器拥有内部ip,但是当容器被重启或者移动之后它们会变更,因此不能用于冗余备份集合之间的通信。

下图展示了冗余备份及中的另一个成员信息:

2.png


90%的配置是相同的,只有几处不同:
  • 硬盘和卷的名字必须是唯一的,于是采用mongodb-disk2和mongo-persisitent-storage2。
  • Pod分配到jane实例,同时节点命名为mongo-node2,用于区分新服务与图1中的Pod
  • 冗余控制命名为mongo-rc2
  • 服务命名为mongo-svc-b,并获取一个不同的外部IP地址(本例子中,Kubernets分配为104.1.4.5)

第三个冗余备份成员的配置仿照上述的模式进行,下图展示了完整的冗余配置集合:

3.png


注意,即使配置如图3一样,在一个三个或者多个节点的Kubernetes集群上,Kubernetes可能会调度两个或者多个MongoDB冗余备份成员在同一个宿主机上。这是因为Kubernetes将三个pod视为三个独立的服务。

为了增加冗余,需要创建一个额外的 headless 服务。该服务不具备提供外部服务的能力,甚至没有外部IP地址,但是它用于通知Kubernetes这三个MongoDB Pod是属于同一个服务,于是Kubernetes会将它们调度在不同的节点上。

4.png


具体的配置文件和相关操作命令可以从 启动微服务:容器&调度说明白皮书 中找到。其中包含了三个特殊的步骤确保合并三个MongoDB到一个功能中,即本文中描述的冗余备份。

多个可用区域MongoDB冗余集合

所有冗余部件均运行在同一个GCE集群上时具有很高的风险,在同一个zone的集群也一样。如果发生一个重大事件导致可用zone离线,那么MongoDB冗余集合也就不可用。如果需要地理上的冗余备份,那么三个pod需要运行在不同的zone内。

只需要很少的改动就可以创建这样一个冗余备份集合。每一个集群需要独自的Kubernetes YAML文件来定义pod、冗余控制器和服务。然后,就可以完成一个zone的集群创建、持久化存储和MongoDB节点。
下图展示了运行在不同zone上的冗余结合:

5.png


后续内容

想学习更多关于容器和编排的内容,请阅读 启动微服务:容器&调度说明白皮书 。它提供了完整的说明,关于如何在Google容器引擎上运行Docker和Kubernetes来创建类似本文介绍的冗余备份集合。

原文链接:Running MongoDB as a Microservice with Docker and Kubernetes(翻译:陈杰)

===================================================
译者介绍

陈杰,BOSS直聘app的数据工程师,工作重心为基于用户行为的数据推荐,平时也乐于去实现一些突发的想法。在疲于配置系统环境时发现了Docker,跟大家一起学习、使用和研究Docker。

原文发布时间为:2016-07-20

本文作者:陈杰

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:在Docker和Kubernetes上运行MongoDB微服务

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2115 10
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
720 266
|
12月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
465 25
|
NoSQL 关系型数据库 MongoDB
【赵渝强老师】管理MongoDB的运行
MongoDB使用`mongod`命令启动服务器。实战中,创建目录`/data/db2`存放数据文件,并通过命令`mongod --dbpath /data/db2/ --port 1234 --fork --logpath /data/db2/db2.log --directoryperdb`启动服务。登录MongoDB后可创建数据库和集合。停止MongoDB服务器有三种方式:1) 使用`db.shutdownServer()`;2) 使用`db.adminCommand({shutdown:1, force:true})`强制关闭;3) 使用操作系统的`kill -2 PID`命令。
267 22
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
360 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
282 1
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
640 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1617 19