2012-02-26 67 views
1

我有幾臺服務器都通過WAN鏈路連接(中等帶寬,更高延遲),所有服務器都需要能夠共享有關連接客戶端的信息。每個客戶端都可以連接到'mesh'中的任何服務器。我正在尋找某種分佈式數據庫,每個服務器都可以託管和更新。如果每個服務器在任何時間都處於脫機狀態,那麼每個服務器都可以使用當前狀態進行更新,這一點很重要。分佈式狀態

如果找不到任何東西,可以選擇一個服務器來託管所有服務器可以插入的MySQL數據庫;但如果可能的話,我真的很想將其作爲單點故障刪除。 (以及與提升從服務器到主服務器相關的宕機時間)

是否有您之前使用過的任何非單主分佈式數據存儲,並且會推薦?

如果任何解決方案具有Python接口,它將非常有用。

+0

因此,爲了澄清,您需要一個數據存儲區,允許您存儲大量數據集(每個客戶端一個)以及每個要複製到每個其他客戶端的數據集? – 2012-02-26 20:47:45

+0

@dan_waterworth只有服務器需要共享數據。當客戶端連接到服務器時,該服務器需要更新共享狀態,以便所有其他服務器可以查詢並確定哪個客戶端已連接;無論客戶端連接到哪個服務器。 – tMC 2012-02-26 20:51:36

+0

對不起,當我說客戶時,我的意思是數據存儲的客戶端。是否有每種情況下一臺服務器的數據可以覆蓋或更改另一臺服務器的數據? – 2012-02-27 12:34:06

回答

2

你有沒有看Python的multiprocessing.Manager對象?

你將不得不添加邏輯來維持一個分佈式數據庫(例如,選擇新主人,冗餘和任何屬性,您希望),它可以很容易地通過擴展Manager對象和實現自己的Proxy對象來完成,而模塊我提到會照顧所有的同步和數據發送給你。

這種方式,而不是有一個分佈式數據庫,您將共享一個Python dict或者您已指示Manager對象分享到連接代理的複雜數據類型。

0

您描述的內容讓我想起Apache Cassandra集羣,這樣每臺計算機都可以託管整個數據集的副本,並且在到達單個節點時讀寫成功(我從來沒有這樣做過,但我認爲這是可能的)。當WAN鏈路斷開時,節點應該能夠保持正常工作狀態,並在它們恢復聯機時立即收到掛起的更新。儘管如此,如果在不同的服務器上發佈衝突的更新,或者使用過時的副本來生成新數據,那麼在選擇的任何架構上都會出現一致性問題。

第二個問題是,對於每個本地寫入,您將獲得n-1個遠程寫入,並且您的服務器可能花費大量時間和帶寬辯論誰擁有最新記錄。

我強烈建議您啓動一對EC2實例並使用它們的連接來檢查一切是否按照您期望的方式工作。這似乎是在「創造性濫用」領域,如果你有任何問題,你的里程可能會大不相同。

0

如果每個服務器在任何時間段都處於脫機狀態,那麼每個服務器都能夠更新當前狀態將是非常重要的。

ZooKeeper的短暫節點允許您維護所有服務器節點的狀態信息。