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

介绍

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

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

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

阅读微服务:容器和编排白皮书(https://www.mongodb.com/collateral/microservices-containers-and-orchestration-explained)。

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

丰富的功能、简单的工具、强大的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与关联的冗余控制器和服务的关系。

深入这些配置中描述的资源,内容如下:

启动核心节点mongo-node1。该节点包括了一个叫做的mongo的镜像,来源于Docker Hub(https://hub.docker.com/_/mongo/),其暴露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,但是当容器被重启或者移动之后它们会变更,因此不能用于冗余备份集合之间的通信。

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

90%的配置是相同的,只有几处不同:

硬盘和卷的名字必须是唯一的,于是采用mongodb-disk2和mongo-persisitent-storage2

Pod分配到jane实例,同时节点命名为mongo-node2,用于区分新服务与图1中的Pod

冗余控制命名为mongo-rc2

服务命名为mongo-svc-b,并获取一个不同的外部IP地址(本例子中,Kubernets分配为104.1.4.5)

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

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

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

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

多个可用区域MongoDB冗余集合

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

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

下图展示了运行在不同zone上的冗余结合:

作者:陈杰
来源:51CTO

在Docker和Kubernetes上运行MongoDB微服务相关推荐

  1. [KubeCon+CloudNativeCon China 2018] 在Kubernetes上运行区块链服务(BaaS)

    笔者注:本文是在2018年11月15日由Linux基金会CNCF主办的KubeCon & CloudNativeCon China 2018大会的"Running Blockchai ...

  2. 在Kubernetes上运行区块链服务(BaaS)

    本文是在2018年11月15日由Linux基金会CNCF主办的KubeCon & CloudNativeCon China 2018大会的"Running Blockchain as ...

  3. 在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics

    阿里云Kubernetes服务运行SpringCloud osswangxining大侠在 阿里云Kubernetes SpringCloud 实践进行时 系列文章中系统地介绍了如何在阿里云Kuber ...

  4. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩...

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用 ...

  5. 如何在Kubernetes上运行Apache Flink

    本文最初发布于Zalando网站Technology Blog板块,经原作者授权由InfoQ中文站翻译并分享 最近,我在用Apache Flink构建小型的流处理应用.在Zalando,我们默认使用K ...

  6. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩

    上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个UI5应用的docker镜像上传到Dock ...

  7. (九)在Kubernetes上运行人脸识别

    目录 介绍 为Kubernetes修改容器 安装Kubernetes 在Kubernetes上运行容器 下一步 在这里,我们给出了需要使用Kubernetes在真实生产环境中扩展和部署我们的AI解决方 ...

  8. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

    Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 原文:Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 转发请注明此文 ...

  9. 如何在Kubernetes上运行PostgreSQL

    通过在Kubernetes上运行PostgreSQL数据库,您可以创建统一管理的云原生生产部署,并可以灵活地部署满足您特定需求的个性化数据库即服务. 使用运算符可以让您向Kubernetes提供其他上 ...

  10. Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用

    Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用 系列文章:https://www.cnblogs.com/alunchen/p/10121379 ...

最新文章

  1. RabbitMQ 入门系列(6)— 如何保证 RabbitMQ 消息不丢失
  2. 百度面试题:求数组最大值
  3. [Hive_add_11] Hive 使用 UDTF 实现日志降维
  4. boost::type_erasure::add_assignable相关的测试程序
  5. P1801-黑匣子_NOI导刊2010提高【堆】
  6. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...
  7. 幸福在《精通移动App测试实战 技术、工具和案例》
  8. 地图分幅组件的实现(一) ——图号和经纬度转换组件
  9. 微信小程序 3 岁:日活超 3 亿,交易额超 8000 亿
  10. 我是如何在 10 分钟内搞砸 IT 面试的
  11. 在Android studio中出现 ‘opencv2/opencv.hpp‘ file not found
  12. wordpress邮件地址混淆 你没权限访问整个邮件地址造成的死链接
  13. 第六章金融衍生工具市场
  14. SwitchyOmega_Chromium插件的下载安装以及使用
  15. day03-文字效果标签及特殊符号
  16. vue组件中ctrl键和shift键操作多选
  17. Web(牛腩)概念知识总结
  18. reason: 'Multiplier is not finite! That's illegal. multiplier:nan' *** First throw call stack:
  19. 原型模式与深拷贝浅拷贝
  20. 利用nsca监控oracle的session数

热门文章

  1. 冒死曝光这个软件,希望不要被封杀!
  2. where 1=1 是什么鬼?SQL中有这玩意?
  3. python excel 教程推荐_Python学习教程:从Excel到Python最常用的32个P
  4. 广义平稳随机过程定义_广义平稳随机过程介绍.ppt
  5. php 中访问常量,php 中的常量
  6. gin--简单的登录界面的实现
  7. docker server 容器连接sql_借力 Docker ,三分钟搞定 MySQL 主从复制!
  8. c++ vector排序_儿童时间管理课6:便利贴时间排序法
  9. Python爬虫实践(一) -- 社交网站用户信息爬取
  10. Extjs4操作TreeStore处理proxyAjax获取的数据