2011-09-08 34 views
3

我們有一個基於Restlet框架構建的基於REST的應用程序,它支持CRUD操作。它使用本地文件來存儲數據。分佈式系統中的數據同步

現在需要在多個VM上部署此應用程序,並且一個VM中的任何更新操作都需要傳播其他VM上運行的其他應用程序實例。

我們想要解決這個問題的想法是在給定虛擬機中發生更新操作時發送多個POST消息(對所有其他應用程序)。 這裏的假設是每個應用程序都有一個所有其他應用程序的列表/ URL。

有沒有更好的方法來解決這個問題?

回答

5

Consistency是一個很深的話題,和一個hard thing to get right。當兩個幾乎同時發生的變化發生在同一個數據上時,問題就來了:衝突的更新可以在一個服務器上以一個順序到達,而在另一個服務器上以另一順序到達。這是一個問題,因爲兩臺服務器不再同意數據是什麼,並且不清楚誰是「正確的」。

小故事:獲得您最喜愛的RDBMS(例如,mysql很受歡迎),並讓您的應用程序服務器連接到所謂的three-tier model。請務必在transactions中執行復雜的更新,這將提供可接受的一致性模型。

長篇小說:三層模式適用於中小型網站/服務。您最終會發現單個數據庫成爲瓶頸。對於讀取流量遠大於寫入流量的服務,通常的優化是創建一個單主控,多從屬數據庫複製安排,其中所有寫入都轉到單個主控(爲了與非分佈式事務保持一致所需),但是更常見的讀取可以發送給任何讀取的從機。

對於具有均勻混合讀寫流量的服務,可以通過刪除一些正式SQL提供的便利(以及附帶的限制)來更好地服務,而不是使用各種「nosql」數據存儲之一最近出現了。他們相對的優點和對各種問題的適應性本身就是一個深刻的話題。

1

我現在可以看到7個主要選項。你應該瞭解更多的細節,並決定設施/權衡是否適合你的目的

  1. 在一個共同的RDBMS執行CRUD操作。最簡單和最一致的
  2. 在運行內存快速RDBMS的公共RDBMS上執行CRUD操作。例如TimesTen的甲骨文等
  3. 在分佈式緩存執行CRUD或自己家裏煮分佈式哈希表,它可以保證同步例如Hazelcast /的Ehcache和其他
  4. 使用較快的共同狀態服務器像Redis的/ Memcached和執行您的更新 ,並根據需要以懶惰的方式將成功的操作寫出到DB中。
  5. 分配您的REST服務器,使得單個實體上的CRUD操作僅由單個主服務器執行。完成此操作後,可以使用可靠的消息總線或分佈式數據庫(例如postgres)將更改的詳細信息傳送給所有其他人,這些數據庫運行在下面並快速同步所有更新。
  6. 目標最終一致性和使用分佈式數據存儲像Cassandra的,它可以讓你target the consistency you require
  7. 使用分佈式共識算法像的Paxos或RAFT或項目的相同(推薦),如飼養員或分別ETCD並取得所有權的實現你想要在執行CRUD操作之前從每個REST服務器進行更改 - 可能會有點慢,儘管Cassandra可能會給您提供相同的內容。