2015-12-02 27 views
7

我從here副本集配置無效或者我們是不是它的成員,在kubernetes

張貼了這個問題,我在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() 
      { 
       "host" : "mongodb-shard2-master-ofgrb", 
       "version" : "3.0.7", 
       "process" : "mongod", 
       "pid" : NumberLong(8), 

我希望我正在感db.serverStatus()樣本..因爲,我會用這在現場製作很快..謝謝!

回答

-1

最後,kubernetes PetSet解決了這個問題。它的工作原理像魔術一樣

1

對不起。下面是詳細介紹瞭如何打開MongoDB的一個帖子: https://medium.com/google-cloud/mongodb-replica-sets-with-kubernetes-d96606bd9474#.x197hr2ps

一個服務,併爲每個實例一個單副本ReplicationController爲每個實例都需要一個穩定的,可預見的身份有狀態的應用目前的做法。通過這種方法,爲每個吊艙分配一個PersistentVolume也很簡單。

其他解決方案也是可能的,例如該示例中顯示的邊車方法和Cassandra示例中的自定義種子提供程序,但稍微複雜一些。

Kubernetes 1.2將提供設置每個吊艙的主機名(如容器所示)的方法。 Kubernetes 1.3將添加一個新的控制器來創建實例。

+0

感謝您的評論。不幸的是,我放棄了在生產中使用k8s來處理這件事。部署mongodb的使用泊塢窗工具。直到k8s修復主機名稱,在這種情況下不可能部署mongodb和其他數據庫,如neo4j和likes。嘗試了所有可能的解決方案,但k8s中的mongodbs的維護和管理令人頭疼。 – Hokutosei

+0

順便說一句,在GKE中部署了mongodb的/ neo4j用於較小和開發項目。 – Hokutosei

1

對於那些想要使用舊的mongo設置方法(使用ReplicationControllers或Deployments而不是PetSet),問題似乎出現在kubernetes Services的主機名分配延遲中。解決的方法是(在開始實際蒙戈之前)添加在容器入口點有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

+0

我們甚至在一些Docker Swarm節點上間歇性地看到mongodb服務VIP在發佈時不可用。在入口處增加3秒的睡眠幫助。 –

相關問題