大神教你轻松玩转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与关联的冗余控制器和服务的关系。

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

  • 启动核心节点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,但是当容器被重启或者移动之后它们会变更,因此不能用于冗余备份集合之间的通信。

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

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上的冗余结合:

推荐一个交流学习群:685167672 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多:

原文地址:https://www.cnblogs.com/jdx6/p/8645208.html

时间: 2024-08-28 06:11:45

大神教你轻松玩转Docker和Kubernetes中如何运行MongoDB微服务的相关文章

CAD初学者要如何学好CAD?CAD大神教你技巧

CAD初学者如何学好CAD?CAD大神教你技巧.就问你想不想学,现在有一些新的小伙伴们开始加入到CAD行业中的这个大家庭中来,但是他们有一些烦恼,那就是CAD初学者要如何学好CAD呢?那下面想要学好CAD的小伙伴们可要注意了,CAD大神教你如何学好CAD,首先第一步就是要学会对CAD图纸的查看,那下面就和小编一起来看看吧,以下就是具体操作. 第一步:首先,电脑中没有下载CAD看图软件的,在电脑桌面中任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CAD看图,然后进入官网,根据系统提示的步骤下载安

docker和kubernetes中hostname的使用和常见问题

原文:docker和kubernetes中hostname的使用和常见问题 hostname在docker中是使用UTS namespace进行隔离的.docker中主要有两种ns的用法, 一种是docker run --uts="" busybox.这种会新创建一个新的uts ns. 一种是docekr run --uts="host" busybox.这种创建的容器将会使用物理机的uts ns. 在k8s中,是这样处理的uts的ns的: func modifyH

PS常用快捷键分享,教你轻松玩转PS

PS看似简单,实际操作起来却没有我们想象的那么容易,要想轻松玩转PS,首先快捷键的灵活运用是很重要的,掌握了一些常用快捷键,不仅能够帮助我们快速制作出精美的图片,在办公中还能够提高工作效率,下面让我们一起来看看是哪些快捷键吧! 关于PS快捷键今天的分享到这里就结束了,如果你经常需要使用这个工具不妨试试这些快捷键吧,希望上述的分享可以帮助到有需求的伙伴: 注:大家在操作的过程中有更好的方法可以分享出来我们一起学习哦! 原文地址:https://blog.51cto.com/14455371/242

在KCloud上轻松“玩转”Docker

继CoreOS和Atomic镜像上线之后,刻通云紧跟Docker技术发展脚步,近期又推出了Ubuntu Core镜像,成为国内首家支持Ubuntu Core镜像的基础云服务商,同时也是国内唯一一家同时支持CoreOS.Atomic和Ubuntu Core镜像的云服务商,全面支持用户在刻通云平台上轻松部署Docker应用. 下面体验下在KCloud上快速部署Docker应用,这里选择Ubuntu Core镜像为例(其它同理): 一.创建Ubuntu Core云主机 1.打开KeyTone Clou

大神教你如何自助手机贴膜

一.工具: 1.相机清洁套装(含清洁喷剂.清洁布.小毛刷) 2.银行卡(IP卡.密保卡.饭卡等均可) 3.手机贴膜,价格在6-20元之间.太便宜的肯定效果很差,太贵的没必要.(建议用BENKS贴膜,含贴膜.静电除尘贴.手机贴膜.清洁布:第二选择为MOMAX贴膜,无静电除尘贴) 4.如无静电除尘贴,要准备静电除尘胶带. 二.准备工作: 注意:清洁手机最关键,其次是贴膜的位置不能偏,再次才是有无气泡. 1.洗手,洗脸,清洁桌面. 2.手机关机. 3.在不破坏手机贴膜的前提下,仔细对比手机贴膜和屏幕之

大神教你如果学习Python爬虫 如何才能高效地爬取海量数据

Python如何才能高效地爬取海量数据 我们都知道在互联网时代,数据才是最重要的,而且如果把数据用用得好的话,会创造很大的价值空间.但是没有大量的数据,怎么来创建价值呢?如果是自己的业务每天都能产生大量的数据,那么数据量的来源问题就解决啦,但是没有数据怎么办??哈哈哈,靠爬虫来获取呀!!! 通过利用爬虫技术获取规模庞大的互联网数据,然后做市场分析.竞品调研.用户分析.商业决策等. 也许对于小白来说,爬虫是一件非常难且技术门槛高的是,但是如果掌握了正确的方法,在短时间内可以让你应运自如.下面就分享

大神教你一招,如何使用Shell

Shell是用来解决用户如何与操作系统通信的问题. 其实大家都对Shell这个概念有误解,好像一定要是命令行的Shell才叫Shell. 其实Shell,就是壳. 顾名思义就是机器外面的一层壳,用于人机交互,只要是人与电脑交互的接口,就可以称为Shell. 所以我们熟悉的GNOME.KDE等图形界面也都是Shell,只不过是GUI Shell.所以像Bash 等 Shell 当初发明的原因当然也就很容易理解了,就是为了人与机器之间交互的问题,只不过当时的技术还不能做出 GUI,所以就做成了命令行

本大神教你用PHP把文本内容转换成16进制数字,进行加密

<?php $a="杨波"; $b = bin2hex($a); echo $a."<br />"; $c = pack("H*",$b); echo $c."<br />"; ?> 字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字符限制字

AI新时代-大神教你使用python+Opencv完成人脸解锁(附源码)

好吧,伙计们,我回来了.说我拖更不写文章的可以过来用你的小拳拳狠命地捶我胸口.... 那么今天我们来讲关于使用python+opencv+face++来实现人脸验证及人脸解锁.代码量同样不多,你可以将这些代码运用在其它一些智能领域,如智能家居,进门的时候判断你是谁,也可以加入机器学习判断来的人是客人还是熟人.在讲之前我们会先适当的拓扑一下关于人脸识别的知识点.OK废话少说下面开始正是话题. 解锁原理: 原理呢,其实很简单,没有那么复杂难懂(当然除了官方语言之外).我们先来通俗的说一下利用Face