副本集配置无效或者我们不是它的成员,运行 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
我已经从 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