今天來談談資料複製吧
資料複製是維持可用性的方法,因為資料複製好幾份到不同機器,所以只要有一台機器還在,資料就拿的到。
但只要有資料複製,就一定會有延遲的狀況,也就是在資料複製完成前,多台機器的資料是不一致的。
有的系統對於資料一致性讀很要求,就會採同步複製,要複製完成後資料寫入才會完成。但這樣會很慢,尤其是副本越來越多的時候。
所以比較有效率的作法是非同步複製,但一定會有一段時間不一致。
那有沒有折衷作法呢。有的,Quorum就是一個折衷的作法,R+W>N,你可以控制要write-efficient還是read-efficient,然後犧牲另一個operation的效率來換資料的一致性。
另外呢,每更新一筆資料就發一次複本更新是很沒有效率的,通常要累積一些更新或隔一段時間才會batch update。
常見的複製是有三個副本,除了原本的資料之外,同一個rack或data center一個副本,另一個rack或data center再一個。
那副本允不允許寫入呢?多數資料系統是不允許的,也就是說,副本純粹只是增加read concurrency/efficiency/availabilty。同樣是副本,同時只有一個master副本負責寫入,其他的slave副本只負責read request。
也有允許副本寫入的系統,像是cassandra。多個互相衝突的寫入會以寫入的timestamp訂輸贏 (所以NTP是必須的,但NTP也不能保證多台機器的時間完全一樣),Last write win。當然在還沒協調前會存在有資料不一致的時間,那這就是應用必須要忍受的。