我已从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),
我希望我有意义..因为,我很快就会在现场制作中使用它..谢谢!!
答案 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
答案 2 :(得分:0)
最后,kubernetes PetSet解决了这个问题。它像魔术一样工作