自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Docker和Kubernetes上運(yùn)行MongoDB微服務(wù)

運(yùn)維 系統(tǒng)運(yùn)維 MongoDB
利用Docker和Kubernetes搭建一套具有冗余備份集合的MongoDB服務(wù),從容器對(duì)CI和CD引發(fā)的改變?nèi)胧?,討論了容器技術(shù)對(duì)MongoDB帶來(lái)的挑戰(zhàn)和機(jī)會(huì),然后實(shí)戰(zhàn)如何部署一套穩(wěn)定的MongoDB服務(wù)。

 [[169251]]

本文介紹了利用Docker和Kubernetes搭建一套具有冗余備份集合的MongoDB服務(wù),從容器對(duì)CI和CD引發(fā)的改變?nèi)胧郑懻摿巳萜骷夹g(shù)對(duì)MongoDB帶來(lái)的挑戰(zhàn)和機(jī)會(huì),然后實(shí)戰(zhàn)如何部署一套穩(wěn)定的MongoDB服務(wù),非常的干貨~

介紹

想嘗試在筆記本電腦上運(yùn)行MongoDB么?希望通過(guò)執(zhí)行一個(gè)簡(jiǎn)單的命令,然后就有一個(gè)輕量級(jí)、自組織的沙盒么?并可再通過(guò)一條命令就可以移除所有的痕跡么?

需要在多個(gè)環(huán)境中運(yùn)行相同的應(yīng)用程序棧?創(chuàng)建自己的容器鏡像,使得開(kāi)發(fā)、測(cè)試、操作和支持團(tuán)隊(duì)啟動(dòng)一份完全相同的環(huán)境。

容器正在改變整個(gè)軟件生命周期;它覆蓋了從最初的技術(shù)試驗(yàn)到通過(guò)開(kāi)發(fā)、測(cè)試、部署和支持的概念證明。

閱讀微服務(wù):容器和編排白皮書(shū)(https://www.mongodb.com/collateral/microservices-containers-and-orchestration-explained)。

編排工具管理著多個(gè)容器如何創(chuàng)建、升級(jí)和高可用。編排同樣管理著容器如何連接,并利用多個(gè)微服務(wù)容器創(chuàng)建穩(wěn)定的應(yīng)用服務(wù)。

豐富的功能、簡(jiǎn)單的工具、強(qiáng)大的API讓容器和編排得到DevOps團(tuán)隊(duì)的青睞。DevOps工程師將它們整合到持續(xù)集成(CI)和持續(xù)交付(CD)工作流中。

本篇文章將探索在嘗試運(yùn)行和編排MongoDB容器時(shí)遇到的問(wèn)題,并描述如何克服這些問(wèn)題。

對(duì)于MongoDB的思考

采用容器和編排運(yùn)行MongoDB帶來(lái)了一些新的思考:

MongoDB數(shù)據(jù)庫(kù)節(jié)點(diǎn)是有狀態(tài)的。若一個(gè)容器掛了,并且被重新編排,數(shù)據(jù)丟失是不能接受的(雖然它可以從其他節(jié)點(diǎn)中恢復(fù)數(shù)據(jù),但是很費(fèi)時(shí))。為解決這個(gè)問(wèn)題,Kubernetes中的卷抽象(Volume abstraction)特性將用于映射MongoDB數(shù)據(jù)文件夾到一個(gè)持久化地址,避免容器的失敗或重編排。

同一組MongoDB數(shù)據(jù)庫(kù)備份節(jié)點(diǎn)之間需要通信,即使是在重編排之后。同一冗余備份集合的節(jié)點(diǎn)必須知道全部其他節(jié)點(diǎn)的地址,但是當(dāng)某個(gè)容器重編排之后,它的IP地址會(huì)變化。例如,所有Kubernetes內(nèi)的容器共享一個(gè)IP地址,當(dāng)pod被重編排之后這個(gè)地址就會(huì)改變。在Kubernetes中,這個(gè)問(wèn)題可以通過(guò)聯(lián)系Kubernetes服務(wù)與MongoDB節(jié)點(diǎn)來(lái)解決,采用Kubernetes的DNS服務(wù)提供主機(jī)名給重編排之后的服務(wù)。

一旦每個(gè)獨(dú)立的MongoDB節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)在單獨(dú)容器中)啟動(dòng)起來(lái),備份集合必須初始化,并把每個(gè)節(jié)點(diǎn)加入進(jìn)來(lái)。這需要編排工具提供額外的邏輯。特別是備份集合中只有一個(gè)MongoDB節(jié)點(diǎn)時(shí),必須執(zhí)行rs.initiate和rs.add命令。

如果編排框架提供自動(dòng)化重編排容器功能(如Kubernetes的特性),那么這可以提高M(jìn)ongoDB的容災(zāi)性,節(jié)點(diǎn)會(huì)在掛掉之后自動(dòng)重新創(chuàng)建,恢復(fù)到完整冗余水平且不需要人工干預(yù)。

當(dāng)編排框架掌控所有容器的狀態(tài)時(shí),它并不管理容器內(nèi)的應(yīng)用或者備份數(shù)據(jù)。這就意味著采用一個(gè)有效的管理和備份方案很重要,如MongoDB Cloud Manager,包括MongoDB Enterprise Advanced和MongoDB Professional兩部分??紤]到需要?jiǎng)?chuàng)建鏡像,可采用你傾向的MongoDB版本和MongoDB Automation Agent。

利用Docker和Kubernetes實(shí)現(xiàn)MongoDB冗余備份

如前一節(jié)所述,MongoDB這類分布式數(shù)據(jù)庫(kù)在利用編排框架(如Kubernetes)進(jìn)行部署時(shí)需要額外考慮。本節(jié)將對(duì)這部分細(xì)節(jié)進(jìn)行分析,并介紹如何實(shí)現(xiàn)。

首先,我們?cè)谝粋€(gè)單獨(dú)的Kubernetes集群(同一個(gè)數(shù)據(jù)中心內(nèi),并不存在物理上的冗余備份)中創(chuàng)建整個(gè)MongoDB冗余集合。如果跨多個(gè)數(shù)據(jù)中心進(jìn)行創(chuàng)建,其步驟也差異不大,后續(xù)將會(huì)介紹。

備份中的每個(gè)成員都運(yùn)行在獨(dú)自的pod中,只暴露其IP地址和端口。固定的IP地址對(duì)于外部應(yīng)用和其他冗余備份節(jié)點(diǎn)非常重要,它決定了哪些pod將被重新部署。

下圖展示了其中一個(gè)pod與關(guān)聯(lián)的冗余控制器和服務(wù)的關(guān)系。

 

深入這些配置中描述的資源,內(nèi)容如下:

啟動(dòng)核心節(jié)點(diǎn)mongo-node1。該節(jié)點(diǎn)包括了一個(gè)叫做的mongo的鏡像,來(lái)源于Docker Hub(https://hub.docker.com/_/mongo/),其暴露27107端口。

Kubernetes的卷特性用于映射/data/db文件夾到持久化目錄mongo-persistent-storage1;該目錄為Google Cloud上創(chuàng)建的目錄映射mongodb-disk1,用于持久化MongoDB的數(shù)據(jù)。

容器由pod進(jìn)行管理,標(biāo)記為mongo-node,同時(shí)對(duì)rod提供一個(gè)隨機(jī)生成的名字。

冗余控制器命名為mongo-rc1,用于確保mongo-node1的實(shí)例一直處于運(yùn)行中。

負(fù)載均衡服務(wù)命名為mongo-svc-a用27017暴露端口。該服務(wù)通過(guò)pod的標(biāo)簽匹配正確的服務(wù)到對(duì)應(yīng)的pod上,對(duì)外暴露的ip和端口給應(yīng)用程序使用,同時(shí)用于冗余備份集合中各節(jié)點(diǎn)的通信。雖然每個(gè)容器擁有內(nèi)部ip,但是當(dāng)容器被重啟或者移動(dòng)之后它們會(huì)變更,因此不能用于冗余備份集合之間的通信。

下圖展示了冗余備份及中的另一個(gè)成員信息:

 

90%的配置是相同的,只有幾處不同:

硬盤(pán)和卷的名字必須是***的,于是采用mongodb-disk2和mongo-persisitent-storage2

Pod分配到j(luò)ane實(shí)例,同時(shí)節(jié)點(diǎn)命名為mongo-node2,用于區(qū)分新服務(wù)與圖1中的Pod

冗余控制命名為mongo-rc2

服務(wù)命名為mongo-svc-b,并獲取一個(gè)不同的外部IP地址(本例子中,Kubernets分配為104.1.4.5)

第三個(gè)冗余備份成員的配置仿照上述的模式進(jìn)行,下圖展示了完整的冗余配置集合:

 

注意,即使配置如圖3一樣,在一個(gè)三個(gè)或者多個(gè)節(jié)點(diǎn)的Kubernetes集群上,Kubernetes可能會(huì)調(diào)度兩個(gè)或者多個(gè)MongoDB冗余備份成員在同一個(gè)宿主機(jī)上。這是因?yàn)镵ubernetes將三個(gè)pod視為三個(gè)獨(dú)立的服務(wù)。

為了增加冗余,需要?jiǎng)?chuàng)建一個(gè)額外的headless服務(wù)。該服務(wù)不具備提供外部服務(wù)的能力,甚至沒(méi)有外部IP地址,但是它用于通知Kubernetes這三個(gè)MongoDB Pod是屬于同一個(gè)服務(wù),于是Kubernetes會(huì)將它們調(diào)度在不同的節(jié)點(diǎn)上。

 具體的配置文件和相關(guān)操作命令可以從《啟動(dòng)微服務(wù):容器&調(diào)度說(shuō)明白皮書(shū)》中找到。其中包含了三個(gè)特殊的步驟確保合并三個(gè)MongoDB到一個(gè)功能中,即本文中描述的冗余備份。

多個(gè)可用區(qū)域MongoDB冗余集合

所有冗余部件均運(yùn)行在同一個(gè)GCE集群上時(shí)具有很高的風(fēng)險(xiǎn),在同一個(gè)zone的集群也一樣。如果發(fā)生一個(gè)重大事件導(dǎo)致可用zone離線,那么MongoDB冗余集合也就不可用。如果需要地理上的冗余備份,那么三個(gè)pod需要運(yùn)行在不同的zone內(nèi)。

只需要很少的改動(dòng)就可以創(chuàng)建這樣一個(gè)冗余備份集合。每一個(gè)集群需要獨(dú)自的Kubernetes YAML文件來(lái)定義pod、冗余控制器和服務(wù)。然后,就可以完成一個(gè)zone的集群創(chuàng)建、持久化存儲(chǔ)和MongoDB節(jié)點(diǎn)。

下圖展示了運(yùn)行在不同zone上的冗余結(jié)合:

責(zé)任編輯:龐桂玉 來(lái)源: 運(yùn)維派
相關(guān)推薦

2019-07-12 14:41:31

微服務(wù)Kubernetes容器

2022-10-19 13:11:35

2019-04-23 09:48:21

KubernetesPostgreSQL

2019-06-03 09:15:15

KubernetesKafka數(shù)據(jù)庫(kù)

2023-01-26 11:56:31

Kubernete虛擬機(jī)k3s

2015-06-16 16:29:43

Docker云計(jì)算七牛

2020-07-20 18:30:44

Fedora 32DockerLinux

2017-03-07 11:02:03

Kubernetes微服務(wù)DevOps

2011-08-12 09:14:16

OpenShiftMongoDB

2014-12-17 15:18:27

LinuxMonoWindows

2021-03-02 06:00:05

Docker.NET 5 Dockerfile

2019-12-11 14:27:39

數(shù)據(jù)庫(kù)集群Kubernetes

2017-05-18 10:44:49

MACDockerOracle

2018-02-26 08:14:20

LinuxDocker容器

2022-10-10 08:00:00

微服務(wù)Spring Boo容器

2021-08-09 09:00:00

Kubernetes云計(jì)算架構(gòu)

2022-12-29 14:25:22

2021-12-14 06:59:39

微服務(wù)Kubernetes架構(gòu)

2024-03-26 08:00:00

LLMVLMRaspberry

2022-02-28 18:26:13

KubernetePostgreSQL負(fù)載均衡
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)