私はこの問題を ここ から投稿しました
シャードされたmongodbをkubernetes環境で実行しており、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),
_
私が理にかなっていることを願っています。なぜなら、私はこれをすぐにライブプロダクションで使用するからです。ありがとう!
最後に、kubernetes PetSet はこの問題を解決します。それは魔法のように機能します
Mongoを設定する古い方法(PetSetの代わりにReplicationControllersまたはDeploymentsを使用)を使用したい場合、問題はkubernetesサービスのホスト名割り当ての遅延にあるようです。解決策は、コンテナのエントリポイントに(実際のmongoを開始する前に)10秒の遅延を追加することです。
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
遅れて申し訳ありません。これは、mongodbを起動する方法を詳細に説明する投稿です: https://medium.com/google-cloud/mongodb-replica-sets-with-kubernetes-d96606bd9474#.x197hr2ps
インスタンスごとに1つのサービスと1つの単一レプリカReplicationControllerは、各インスタンスが安定した予測可能なIDを必要とするステートフルアプリケーションの現在のアプローチです。このアプローチでは、ポッドごとにPersistentVolumeを割り当てることも簡単です。
その例に示されているサイドカーアプローチやCassandra例)のカスタムシードプロバイダーなど、他のソリューションも可能ですが、もう少し複雑です。
Kubernetes 1.2は、各ポッドのホスト名(コンテナーから見た場合)を設定する手段を提供します。 Kubernetes 1.3は、インスタンスを作成するための新しいコントローラーを追加します。