雷竞技下载官网MongoDB支持Percona Operator多集群或跨站点复制部署自版本1.10。如果您想要进行灾难恢复部署,或者从运行在Kubernetes中的MongoDB集群迁移到MongoDB集群,这个功能非常有用。简而言之,它允许您使用部署在不同Kubernetes集群中的操作员来管理和扩展副本集。
例如,您有两个Kubernetes集群:一个在区域A,另一个在区域B。
- 在区域A中,使用Percona Operator部署MongoDB集群。雷竞技下载官网
- 在区域B中,使用另一个Percona Operator安装部署非托管MongoDB节点。雷竞技下载官网
- 配置这两个操作符,使区域B中的节点添加到区域A中的副本集中。
当区域A出现故障时,可以将流量切换到区域B。
迁移MongoDB到Kubernetes描述了使用Operator的此功能的迁移过程。
这个功能是在技术预览中发布的,我们从用户那里收到了很多积极的反馈。但是我们的一个客户提出了一个内部问题,指出跨站点复制功能与多集群服务不兼容。这开始了调查和这张票的创建-k8spsmdb - 625。
这篇博客文章将深入探讨这个故事的根源,以及它是如何在MongoDB的Percona Operator的最新版本中解决的雷竞技下载官网版本1.12。
这个问题
多集群服务或MCS允许您扩展Kubernetes集群的网络边界,并跨这些边界共享服务对象。有人称之为Kubernetes Federation的另一个版本。这个功能已经在一些托管的Kubernetes产品上可用,谷歌云Kubernetes引擎(GKE)和AWS Elastic Kubernetes服务(的)。潜艇在底层使用相同的逻辑和原语。
MCS基础知识
要理解这个问题,我们需要了解多集群服务是如何工作的。让我们来看看下面的图片:

- 我们在不同的Kubernetes集群中有两个pod
- 我们将这两个集群添加到MCS域中
- 每个Pod都有一个服务和ip地址,这对Kubernetes集群是唯一的
- MCS引入了新的自定义资源-ServiceImport和ServiceExport。
- 一旦你创建了ServiceExport对象在一个集群中,ServiceImport对象出现在MCS域中的所有集群中。
- 这ServiceImport对象在svc.clusterset。local通过MCS引入的网络魔法,可以从MCS域中的任何集群访问
上面的意思是,如果我在A区域的Kubernetes集群中有一个应用程序,我可以通过域名连接到B区域的Kubernetes集群中的Pod我的-圆荚体。<名称空间>.svc.clusterset。local。它在另一个集群中也同样适用。
MCS和副本集
如果你使用负载均衡器,下面是Percona Operator跨站点复制的工作原理:雷竞技下载官网

所有复制集节点都有一个专用服务和一个负载均衡器。MongoDB集群中的副本集就是使用这些公网IP地址形成的。使用公网IP地址添加外部节点:
|
1
2
3.
4
5
|
replset
:
-
名字
:
rs0
大小
:
3.
externalNodes
:
-
宿主
:
123.45.67.89
|
所有节点都可以相互连接,这是形成健康副本集所必需的。
下面是通过多集群服务连接集群时的情况:
复制集节点通过集群ip公开,而不是负载均衡器。我们有ServiceExports和ServiceImports资源。在网络层面上,一切看起来都很好,它应该起作用,但事实并非如此。
问题在于操作员在区域a中构建MongoDB副本集的方式。要从区域B中注册一个外部节点到副本集,我们将在对应的部分中使用MCS域名:
|
1
2
3.
4
5
|
replset
:
-
名字
:
rs0
大小
:
3.
externalNodes
:
-
宿主
:
rs0-4. mongo.svc.clusterset.local
|
现在我们的rs.status ()会是这样的:
|
1
2
3.
4
5
6
7
8
9
10
11
|
“名称”
:
“我——集群rs0 - 0. - mongo.svc.cluster.local: 27017”
“角色”
:
“主”
。
。
。
“名称”
:
“我——集群rs0 - 1. - mongo.svc.cluster.local: 27017”
“角色”
:
“二级”
。
。
。
“名称”
:
“我——集群rs0 - 2. - mongo.svc.cluster.local: 27017”
“角色”
:
“二级”
。
。
。
“名称”
:
“rs0 - 4. mongo.svc.clusterset.local: 27017”
“角色”
:
“未知”
|
如您所见,Operator使用svc.cluster。local域,因为当您使用ClusterIP服务类型。在这种情况下,区域B中的节点无法连接到区域a中的任何节点,因为它试图连接到区域a中集群的本地域。
在下图中,你可以很容易地看到问题所在:

解决方案
幸运的是我们有特殊兴趣小组(SIG),一个Kubernetes增强方案(KEP)以及启用多集群服务的多个实现。拥有KEP非常棒,因为我们可以确保来自不同提供商(即GCP, AWS)的实现将或多或少地遵循相同的标准。
在自定义资源中有两个字段控制操作符中的MCS:
|
1
2
3.
4
|
规范
:
multiCluster
:
启用
:
真正的
DNSSuffix
:
svc
.clusterset
。local
|
让我们看看设置这些标志后在后台发生了什么。
ServiceImport和ServiceExport对象
一旦你启用MCS通过修补CR规范.multiCluster.enabled:真正的,操作符创建一个ServiceExport对象。这些serviceexport将由集群中的MCS控制器检测到,并最终将ServiceImport为每一个ServiceExport将在每个启用了MCS的集群的相同命名空间中创建。
如你所见,我们做了一个决定并授权操作者去创造ServiceExport对象。这么做主要有两个原因:
- 如果使用任何基础设施即代码工具,则需要额外的逻辑和复杂性来自动创建所需的MCS对象。如果Operator处理它,就不需要额外的工作。
- 我们的操作符负责数据库的基础设施,包括服务对象。将这一功能扩展到MCS是合乎逻辑的。
复制集和传输加密
我们在这里试图解决的问题的根本原因在于网络领域,其中外部复制集节点试图连接到错误的域名。现在,当您启用多集群和设置DNSSuffix(默认为svc.clusterset。local),操作员会做以下工作:
- 复制集是使用MCS域集形成的DNSSuffix
- 操作员像往常一样生成TLS证书,但添加了DNSSuffix域到图中
使用这种方法,节点之间的流量按预期流动,并在默认情况下进行加密。

需要考虑的事项
MCS api
请注意,运营商不会在你的Kubernetes集群上安装MCS api和控制器。在为PSMDB集群启用MCS之前,您需要按照提供商的说明安装它们。看到我们的文档链接到不同的提供者。
操作员通过API资源检测集群中是否安装了MCS。检测发生在控制器在操作符中启动之前。如果在运行操作符时安装了MCS api,需要重启操作符。否则,你会看到这样的错误:
|
1
2
3.
4
5
6
7
8
9
10
11
|
{
“水平”
:
“错误”
,
“t”
:
1652083068.5910048
,
“日志”
:
“controller.psmdb-controller”
,
“味精”
:
“调解人错误”
,
“名称”
:
“cluster1”
,
“名称”
:
“psmdb”
,
“错误”
:
"错误的psmdb选项:MCS在此集群上不可用"
,
“errorVerbose”
:
“…”
,
“加”
:
“…”
}
|
ServiceImport发放时间
可能要花点时间ServiceImport需要在Kubernetes集群中创建的对象。在创建过程中,您可以在日志中看到以下消息:
|
1
2
3.
4
5
6
7
8
|
{
“水平”
:
“信息”
,
“t”
:
1652083323.483056
,
“日志”
:
“controller_psmdb”
,
“味精”
:
“等待服务导入”
,
“replset”
:
“rs0”
,
“serviceExport”
:
“cluster1-rs0”
}
|
在测试期间,我们发现等待时间长达10-15分钟。如果您发现您的集群由于等待服务导入而停留在初始化状态,那么检查您的环境的使用情况和配额是个好主意。
DNSSuffix
我们还决定为MongoDB集群的Percona服务器自动生成TLS证书雷竞技下载官网*.clusterset。local域,即使MCS未启用。这种方法简化了为运行中的MongoDB集群启用MCS的过程。它没有太大的意义去改变DNSSuffix字段,除非您的服务提供商有硬性要求,但我们仍然允许这样的更改。
如果您希望在部署了低于1.12的操作员版本的集群中启用MCS,则需要更新TLS证书以包含*.clusterset。local无。看到的文档的指令。
结论
如今,业务比以往任何时候都更依赖于为他们服务的应用程序和基础设施。灾难恢复协议和各种故障安全机制是可靠性工程师的日常工作,而不是积压中令人讨厌的任务。
通过Percona Operator for MongoDB中的多集群部署功能,我们希望让用户雷竞技下载官网能够用最少的努力构建高可用性和安全的数据库集群。
雷竞技下载官网Percona Operator for MongoDB是真正开源的,为用户提供了一种在Kubernetes上部署和管理企业级MongoDB集群的方法。我们鼓励您尝试这个新的多集群服务集成,并让我们知道您的结果社区论坛。您可以找到一些脚本,这些脚本将帮助您在GKE或EKS上配置第一个MCS集群在这里。
总有改进的空间,总有找到更好方法的时间。如果您在为Percona产品贡献您的想法时遇到任何问题,请告诉我们。雷竞技下载官网你可以在社区论坛或JIRA。阅读更多关于Percona Operator for MongoDB的贡献指南雷竞技下载官网CONTRIBUTING.md。





