Oracle,MySQL 和PostgreSQL都包括用于給備用的復(fù)制數(shù)據(jù)庫(kù)傳輸日志的日志傳輸協(xié)議。Oracle還把日志產(chǎn)品化為一個(gè)通用的數(shù)據(jù)訂閱機(jī)制,這樣非Oracle數(shù)據(jù)訂閱用戶(hù)就可以使用XStreams和GoldenGate訂閱數(shù)據(jù)了,MySQL和PostgreSQL上的類(lèi)似的實(shí)現(xiàn)則成為許多數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵組件。
正是由于這樣的起源,機(jī)器可識(shí)別的日志的概念大部分都被局限在數(shù)據(jù)庫(kù)內(nèi)部。日志用做數(shù)據(jù)訂閱的機(jī)制似乎是偶然出現(xiàn)的,不過(guò)要把這種 抽象用于支持所有類(lèi)型的消息傳輸、數(shù)據(jù)流和實(shí)時(shí)數(shù)據(jù)處理是不切實(shí)際的。
分布式系統(tǒng)日志
日志解決了兩個(gè)問(wèn)題:更改動(dòng)作的排序和數(shù)據(jù)的分發(fā),這兩個(gè)問(wèn)題在分布式數(shù)據(jù)系統(tǒng)里顯得尤為重要。協(xié)商出一致的更改動(dòng)作的順序(或者說(shuō)保持各個(gè)子系統(tǒng)本身的做法,但可以進(jìn)行存在副作用的數(shù)據(jù)拷貝)是分布式系統(tǒng)設(shè)計(jì)的核心問(wèn)題之一。
以日志為中心實(shí)現(xiàn)分布式系統(tǒng)是受到了一個(gè)簡(jiǎn)單的經(jīng)驗(yàn)常識(shí)的啟發(fā),我把這個(gè)經(jīng)驗(yàn)常識(shí)稱(chēng)為狀態(tài)機(jī)復(fù)制原理:如果兩個(gè)相同的、確定性的進(jìn)程從同一狀態(tài)開(kāi)始,并且以相同的順序獲得相同的輸入,那么這兩個(gè)進(jìn)程將會(huì)生成相同的輸出,并且結(jié)束在相同的狀態(tài)。
這也許有點(diǎn)難以理解,讓我們更加深入的探討,弄懂它的真正含義。
確定性意味著處理過(guò)程是與時(shí)間無(wú)關(guān)的,而且任何其他“外部的“輸入不會(huì)影響到處理結(jié)果。例如,如果一個(gè)程序的輸出會(huì)受到線(xiàn)程執(zhí)行的具體順序影響,或者受到gettimeofday調(diào)用、或者其他一些非重復(fù)性事件的影響,那么這樣的程序一般最有可能被認(rèn)為是非確定性的。
進(jìn)程狀態(tài)是進(jìn)程保存在機(jī)器上的任何數(shù)據(jù),在進(jìn)程處理結(jié)束的時(shí)候,這些數(shù)據(jù)要么保存在內(nèi)存里,要么保存在磁盤(pán)上。