副本集配置无效或者我们不是它的成员,运行 in kubernetes

replica set config is invalid or we are not a member of it, running in kubernetes

我已经从 here

发布了这个问题

我在 kubernetes 环境中 运行 分片 mongodb,有 3 个分片,每个分片上有 3 个实例。由于某些原因,我的 mongodb 实例已被重新安排到另一台机器上。

问题是当一个 mongodb 实例被重新安排到另一个实例时,它的 replica config 将失效。导致以下错误。

            > rs.status()
            {
                "state" : 10,
                "stateStr" : "REMOVED",
                "uptime" : 2110,
                "optime" : Timestamp(1448462710, 6),
                "optimeDate" : ISODate("2015-11-25T14:45:10Z"),
                "ok" : 0,
                "errmsg" : "Our replica set config is invalid or we are not a member of it",
                "code" : 93
            }
            >

这是配置

            > rs.config().members
            [
                {
                    "_id" : 0,
                    "host" : "mongodb-shard2-service:27038",
                    "arbiterOnly" : false,
                    "buildIndexes" : true,
                    "hidden" : false,
                    "priority" : 1,
                    "tags" : {

                    },
                    "slaveDelay" : 0,
                    "votes" : 1
                },
                {
                    "_id" : 1,
                    "host" : "shard2-slave2-service:27039",
                    "arbiterOnly" : false,
                    "buildIndexes" : true,
                    "hidden" : false,
                    "priority" : 1,
                    "tags" : {

                    },
                    "slaveDelay" : 0,
                    "votes" : 1
                },
                {
                    "_id" : 2,
                    "host" : "shard2-slave1-service:27033",
                    "arbiterOnly" : false,
                    "buildIndexes" : true,
                    "hidden" : false,
                    "priority" : 1,
                    "tags" : {

                    },
                    "slaveDelay" : 0,
                    "votes" : 1
                }
            ]

和重新安排的 mongodb 实例 db.serverStatus() 的样本

            > db.serverStatus()
            {
                "host" : "mongodb-shard2-master-ofgrb",
                "version" : "3.0.7",
                "process" : "mongod",
                "pid" : NumberLong(8),

我希望我说得有道理..因为,我很快就会在现场制作中使用它..谢谢!!

抱歉耽搁了。这里有一篇post详细介绍了如何调出mongodb: https://medium.com/google-cloud/mongodb-replica-sets-with-kubernetes-d96606bd9474#.x197hr2ps

每个实例一个服务和一个单副本 ReplicationController 是有状态应用程序的当前方法,其中每个实例都需要一个稳定的、可预测的标识。使用这种方法,也可以直接为每个 pod 分配一个 PersistentVolume。

其他解决方案也是可能的,例如该示例中显示的边车方法和 Cassandra 示例中的自定义种子提供程序,但稍微复杂一些。

Kubernetes 1.2 将提供一种为每个 pod 设置主机名(如容器所见)的方法。 Kubernetes 1.3 将添加一个新的控制器来创建实例。

最后,kubernetesPetSet解决了这个问题。它像魔术一样工作

对于那些想使用旧方法设置 mongo(使用 ReplicationControllers 或 Deployments 而不是 PetSet)的人来说,问题似乎出在 kubernetes 服务的主机名分配延迟上。解决方案是在容器入口点添加 10 秒延迟(在开始实际 mongo 之前):

spec:
  containers:
    - name: mongo-node1
      image: mongo
      command: ["/bin/sh", "-c"]
      args: ["sleep 10 && mongod --replSet rs1"]
      ports:
        - containerPort: 27017
      volumeMounts:
        - name: mongo-persistent-storage1
          mountPath: /data/db

相关讨论:https://jira.mongodb.org/browse/SERVER-24778