2016-12-14 103 views
12

我有一個MongoDB實例,set up using a config file and a key file。我想initiate a replica set using pymongo。當我嘗試啓動replcia集,通過執行對服務器的Python腳本,這將成爲副本集小學,因爲這樣的:MongoDB:無法啓動副本集; '已有數據,無法啓動設置'

from pymongo import MongoClient 

uri = "mongodb://correctWorkingUsername:[email protected]:27017" 
c = MongoClient(uri) 

config = {'_id': 'RelicaSetName', 'members': [ 
{'_id': 0, 'host': 'FirstServer:27017'}, 
{'_id': 1, 'host': 'SecondServer:27017'}, 
{'_id': 2, 'host': 'ThirdServer:27017'}]} 

c.admin.command("replSetInitiate", config) 

我得到一個錯誤信息,如下:

'SecondSErver:27017' has data already, cannot initiate set 

但是,如果我驗證使用

mongo admin -u correctWorkingUsername -p password 

我可以啓動複製的數據庫,併成功添加成員:

rs.initiate() 
rs.add('SecondServer:27017') 

我不確定這是與密鑰文件身份驗證有關,還是用戶已經通過腳本在其他服務器上創建的事實。每個服務器也已經啓動了一個配置文件mongod.conf,其中包含一個副本集名稱。

這是爲什麼會失敗? rs.initiate()和rs.add()完美地工作,但python腳本不起作用,儘管它可以連接到數據庫。

+1

鑑於我無法找到這個特定問題的'解決方案',我決定使用shell腳本直接執行mongodb副本啓動。基本上我使用一個shell腳本來完成他們遍歷的步驟。 https://api.mongodb.com/python/current/examples/high_availability.html –

+1

你是否對副本集的所有成員運行這個相同的python腳本?如果是這種情況,那就是你的問題。 – helmy

+0

@helmy不,我只對RS的主要版本運行腳本。爲了清晰起見編輯了這個問題。 –

回答

4

當您一次初始化完整副本集時,每個節點都不應該有數據。

將現有的單個節點轉換爲副本集時,其數據將成爲副本集數據,然後添加其他節點會將數據複製到擦除其現有數據。

你應該做的是啓動節點,初始化副本集和,然後創建用戶(僅在主節點上)。這本來是一個副本集的未初始化的成員是,如果上完成的唯一途徑 -

用戶是通過一個腳本

這是在覈問題上的其他服務器上已經創建它首先作爲非複製設置節點提出,添加了用戶,然後用replSet選項重新啓動。這不是正確的順序。有關步驟的正確列表check the docs

+0

有趣的是,在亞馬遜Linux上正式回購mongo 3.4之後,我得到了同樣的行爲。我想他們可能會添加一個默認用戶或其他東西。我通過刪除'/ var/lib/mongo /'中的所有內容來解決這個問題,但似乎不應該這樣。 –

+0

我剛剛用python試過,它的工作方式和我的預期一樣,但我從乾淨的實例開始。我猜你正在使用一些試圖有幫助的安裝/部署腳本。如果你仍想用Python做這件事,你可以啓動第一個節點,然後通過Python命令添加其他節點,就像通過mongo shell一樣。 –

+0

@AsyaKamsky有關爲什麼這個操作順序(在啓動副本集之前在主節點上創建用戶)爲什麼每次使用mongo shell都適用,但使用此腳本失敗?只有在使用python腳本時,我們纔會從shell中啓動RS。 –