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

时间:2015-12-02 11:02:03

标签: mongodb kubernetes google-kubernetes-engine

我已从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),

我希望我有意义..因为,我很快就会在现场制作中使用它..谢谢!!

3 个答案:

答案 0 :(得分:1)

抱歉延误。这篇文章详细描述了如何启动mongodb: https://medium.com/google-cloud/mongodb-replica-sets-with-kubernetes-d96606bd9474#.x197hr2ps

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

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

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

答案 1 :(得分:1)

对于那些想要使用旧方法设置mongo(使用ReplicationControllers或Deployments而不是PetSet)的人来说,问题似乎是kubernetes Services的主机名分配延迟。解决方案是在容器入口点添加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

答案 2 :(得分:0)

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