3.4.6. MongoDB 复制
作为示例提供了为数据库镜像启用集群的配置,它们不适用于生产环境。
红帽使用 StatefulSet 为 MongoDB 复制(集群)提供了概念验证 模板。您可以 从 GitHub 获取示例模板。
例如,将示例模板上传到当前项目的模板库中:
$ oc create -f \ https://raw.githubusercontent.com/sclorg/mongodb-container/master/examples/petset/mongodb-petset-persistent.yaml
示例模板使用持久性存储。集群中必须有持久性卷才能使用此模板。
因为 OpenShift Container Platform 会自动重启不健康的 Pod(容器),如果一个或多个成员崩溃或失败,它将重启副本设置成员。
虽然副本设置的成员被缩减或正在重启,但可能是以下情况之一:
主要成员为下:
在这种情况下,其他两个成员选择一个新的 PRIMARY。直到那个时候,读取不会受到影响,但写入操作会失败。成功选举后,通常会写入并读取过程。
SECONDARY 的一个成员会停止:
读取和写入不会受到影响。根据
oplogSize
配置和写入率,第三方可能无法加入副本集,需要手动干预来重新同步其数据库的副本。任何两个成员都处于停止状态:
当一个由三个成员组成的副本集的成员无法访问其他成员时,如果它是 PRIMARY,则会从这个角色下移。在这种情况下,SECONDARY 成员可能会提供 read 功能,写入操作会失败。一旦有多个成员可用,会选举一个新的 PRIMARY 成员,读写操作可正常进行。
所有成员都停机:
在这种极端情况下,读取和写入都失败。在两个或者两个以上成员被备份后,选举会重新建立副本集,使其具有 PRIMARY 和 SECONDARY 成员,之后读取和写入将可以正常工作。
这是推荐的 MongoDB 复制策略。
对于生产环境,您必须尽可能在成员间保持分离。建议您使用一个或多个节点选择功能将 StatefulSet pod 调度到不同的节点上,并提供由独立卷支持的存储。
3.4.6.1. 限制:
- 只支持 MongoDB 3.2。
- 在进行缩减时,您必须手动更新副本设置的配置。
更改用户和管理员密码是一个手动过程。它要求:
- 更新 StatefulSet 配置中的环境变量值,
- 更改数据库中的密码,并
- 重启所有 pod。