程式在不同機器間的動態移轉
一個程式從一台機器移轉到另一台機器執行,需要轉移程式與程式的狀態。
一般來說,一個程式的狀態包含以下項目 (如果不考慮 I/O 的話):
1. 程式本身在記憶體中的變數
2. 使用的作業系統核心物件狀態
3. 程式儲存在檔案系統中的檔案
考慮 I/O 的話,還必須考慮如何取代或使用原先機器使用的 I/O 狀態。包含:
1. 網路連線的路徑重建問題
2. I/O 反應的即時性問題
資料的同步
資料的同步指的是在不同的機器,在同一時間點,能夠讀到相同的資料。
如果所有的資料是唯讀的,這個問題最容易,只要將資料分享給所有機器便可辦到。
如果資料有被寫入的情況,問題就變得困難。
多部機器進行時間同步,這是已知的困難問題。
多部機器間缺乏共同的時間基準,資料讀取與寫入的順序就無法判斷。
此外,多部機器同時寫入同一筆資料,哪一筆資料是有效的也難以判斷。
解決的方法有兩種:
1. 中央控制: 基準時間由一部機器決定,所有的資料操作必須取得這部機器的時間標籤。這個方法比較容易,但擴充性較差。
2. 分散式控制: 機器間沒有共同的基準時間,資料同步是依賴與 "時間標籤" 無關的 "非同步" 方法。
同步資料的方法,要考慮三個因素 [CAP 理論]
1. 資料一致性 (consistency): 多部機器在任何時間存取同一筆資料的一致性
2. 資料可用性 (availability): 隨時可以存取資料
3. 資料復原性 (partition tolerance): 發生網路斷線後,機器間能夠復原資料
資料可用性 與 資料一致性 已經被證明 "找不到任何一種方法 可以保證 資料可用性 與 資料一致性 同時存在"。
(即 CA 不存在,因為 CA 不存在,CAP 的方法論 顯然也不存在)
使用反證法證明:
假設 "有一種方法" 可以保證 資料可用性 與 資料一致性 同時存在。
當 機器A 要寫入 資料C,機器B 要讀取資料 C,且機器A 與 機器B 之間的通訊永遠是失敗的。
因為 資料可用性 存在,所以 機器A 的寫入會成功,機器B 的讀取也會成功。
但因為 機器A 與 機器B 的通訊永遠是失敗的,所以 機器B 不會得到 機器A 對於資料C 的更新。
所以 機器B 得到的 資料C 與 機器 A 的資料 C 是不一致的,違背假設,所以假設不成立。
所以 "找不到任何一種方法" 可以保證 資料可用性 與 資料一致性 同時存在。
有了這個證明,我們對於 資料可用性 與 資料一致性 就必須做出取捨。
隨時可以取得資料,該資料不見得是最新的。
要取得最新的資料,取得資料的時間可能不是即時的。
這兩個限制,對於我們的原始題目: 即時移轉最新的資料 以供 程式移轉到不同機器執行 是不吻合的。
要改變證明的結果,機器A 與 機器B 之間的通訊必須永遠是即時也成功的,這在現實中是不可能保證的。
換句話說,根據不同的應用,折衷資料可用性 與 資料一致性,才有實現的可能。
另一方面,其他性質的組合就沒有問題。要證明它們,可以透過列舉一個可行方案證明其可行性。
資料可用性 與 資料復原性 同時存在 (AP): 在不要求資料一致性的情況下,多部機器可以同時存取同一筆資料,各自保存不同的結果,即使網路斷線也沒關係。
資料一致性 與 資料復原性 同時存在 (CP): 在不要求資料隨時可以存取的情況下,當資料存取發生衝突時,各機器可以拒絕對存取該資料。當網路斷線時,機器停止存取共用資料項。
回到主題,AP 與 CP 的方法論可以 即時移轉最新的資料 以供 程式移轉到不同機器執行 嗎?
對於 資料一致 要求比較低的應用程式可以使用 AP 的方法論
對於 即時反應 要求比較低的應用程式可以使用 CP 的方法論
前面所提的方法,都是指百分之百的資料可用性、百分之百的資料一致性、百分之百的資料復原性。
如果條件放鬆一點,CAP 問題會不會變得更簡單一點,CA 會不會從不可行變成可行?
根據以下的例子,答案似乎是 yes!
以下列舉放鬆條件的例子:
eventually consistent: (時間換取空間)
根據前面 CA 的證明,如果 機器A 與 機器B 有百分之九十九的機會通訊是成功的,
機器A 跟 機器B 對資料C 的操作最終是會一致的。
在現實中,如果資料量夠小,網路速度夠快,為了資料一致所造成的延遲時間就可以落在可以接受的範圍內。
(百分之九十九的資料可用性、百分之百資料一致性、百分之百資料復原性)
read-your-write: (空間的分割)
對於關心的特定資料項提供百分之百的一致性,對於其他的資料項提供百分之百的可用性。
換句話說,也就是不提供百分之百的一致性與百分之百的可用性,自然不受 CA 的限制。
(百分之九十九的資料可用性、百分之九十九資料一致性、百分之百資料復原性)
time slot: (時間的分割)
以時槽的觀念同步資料,不同時槽的讀取到的資料可能不一致,同步期間拒絕服務。
(百分之九十九的資料可用性、百分之九十九資料一致性、百分之百資料復原性)
(空間換取時間的例子呢?):
用倍量的空間進行平行計算? 量子電腦的時代比較可行。但那已經超過有限步驟完成運算的方法論。
(我暫時是這麼想的)
從以上的例子也可以看出,可用性、一致性 與 復原性 等性質是用來評量一個資料同步方法論的量測工具,
如何設計一個資料同步的方法論,要從其它的個面向出發,比方說時間、空間、資料結構、演算法等。
已知的方法,通常思考的方向是處理海量的資料 (petabytes),多使用者多寫入多讀取。
如果我們的資料量比較小,操作資料的機器數量有限,問題會不會變得比較簡單?
參考資料
CAP 理論 http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
放鬆條件的 CAP 理論 http://devblog.streamy.com/2009/08/24/cap-theorem/
Bigtable: A Distributed Storage System for Structured Data, highly CA 的案例, http://labs.google.com/papers/bigtable.html
Dynamo: Amazon’s Highly Available Key-value Store, highly AP and eventually consistent 案例, http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf