本文為TimesTen數據庫復制系列的第1篇。
復制就是在多個數據庫中存在多份數據拷貝,對性能影響最小的同時保證數據高可用,除數據恢復外,還可以均衡工作負載,以最大化性能和實現轉動升級和保護
TT復制的實現是在master和subscriber數據庫都有復制代理,1個負責讀,1個負責加載,數據在rep agent間傳遞
TT推薦的方法是ASP(active standby pair),TT支持復制整庫,部份表,cache group, sequence等。ASP是唯1支持復制cache group的方案
TT也支持復制DDL
必須同平臺,同字節順序。
雖然可以復制同1主機上兩個庫,但最好建議是不同主機上的兩個庫
復制的庫必須具有相同字符集(DatabaseCharacterSet)和數據類型模式(TypeMode,缺省為Oracle)
通過主機名和文件系統路徑名可以唯1肯定1個庫,rep agent之間通過TCP/IP socket通訊
The replication agent on the master database reads the records from the transaction log and forwards any detected changes to replicated elements to the replication agent on the subscriber database. The replication agent on the subscriber database then applies the updates to its database. If the subscriber agent is not running when the updates are forwarded by the master, the master retains the updates in the transaction log until they can be transmitted.
支持3種模式,按性能影響和數據1致性由小到大為:
1. NO RETURN (缺省,異步模式)
2. RETURN RECEIPT (對方接到即返回)
3. RETURN TWOSAFE (對方接到,并提交后返回)
缺省模式提供最好性能,但存在數據丟失的風險。利用更新主庫后,無需等待更新傳遞和加載到定閱庫。主庫和定閱庫之間有內部機制肯定更新被成功傳遞和加載,和利用完全獨立。
幾點說明:
* 利用在交易提交,然后寫入log buffer后才可以返回,也就是完成步驟2后。
* replication agent負責將log buffer的數據flush到磁盤和傳遞到subscriber
* 在subscriber返回接受成功后,replication agent就能夠刪除沒必要要的日志了
* 更新的傳遞采取批量模式,以提高效力。
利用阻塞,直到對方接遭到更新后便可返回
幾點說明:
* 對方接收到是指在內存中接遭到便可,而后續寫入log buffer和持久化不計在內
* 如果10秒內未返回receipt,利用可繼續,此超時時間可配置。
* 超時的緣由多是網絡,復制代理失效等
利用阻塞,直到交易在對方提交后方可繼續。
幾點說明:
* 交易先在備點提交再在主點提交
* 主點的復制代理在傳遞變化到備點前,其實不需要將log buffer中的內容flush到磁盤。這點是和異步和return receipt是不同的。這也是為什么return twosafe的性能實際上是比return receipt要快的緣由。
> Transmission of return twosafe transactions is nondurable, so the master replication agent does not flush the log records to disk before sending them to the subscriber, as it does by default when replication is configured for asynchronous or return receipt replication.
* 超時可配置,缺省為10秒。超時后可以設置為重新提交或無條件提交(不顧備點未接遭到數據)
這里的replication scheme稱為replication pattern更好理解。
Active Standby Pair(以下簡稱ASP)是TimesTen最經常使用的的復制模式。
ASP中包括3個成員,分別是兩個master和1組只讀的subscriber(最多127個)。
其中active和standby都是master,只不過active為可讀寫,standby為只讀。
幾點說明:
* 既然ASP是Pair,說明active和standby是成對出現的,1個active對應多個standby是不支持的。
* 如果standby失效,active可以直接向subscriber復制;如果standby恢復,會先和active同步,然后重新承當起向subscriber復制的責任。
在Classic復制中,master和subscriber都是可讀寫的(待后續實驗確認)
以下為整庫復制:
以下為選擇性復制,可以復制同1個對象到多個目標,也可分別復制不同的對象到目標,以下圖:
單向復制是1個master對應多個subscriber,而雙向復制是指1個數據庫既是master也是subscriber。
雙向復制也有兩種用法,1個是用于負載分擔,即兩個庫散布承當不同的服務,以下圖:
另外一種是復制均衡,即兩個庫承當相同的服務,以下圖:
這類模式斟酌的更多的是網絡帶寬的影響和復制負載的分擔。
下圖為直接復制:
下圖為中轉復制,propagator和subscribers在1個網絡內:
下圖為復制負載分擔的中轉復制:
緩存組的復制只支持Active Standby Pair1種復制模式。支持復制的緩存組包括AWT和只讀緩存組。
上圖我們先關注左側active和standby兩個庫,更新是通過standby傳遞到Oracle數據庫的。目的是為了減輕active master的負擔。
如果master失效,standby會承當業務讀寫,并仍保持與Oracle數據庫的同步。
如果standby失效,或standby還未建立,這時候active可以同時承當接受業務讀寫和與Oracle同步數據的職責。
standby變成新的active時, TimesTen會重寫配置緩存組,使得新的standby承當起與Oracle同步的任務。
再來看看右側從standby到只讀subscriber的復制,在只讀subscriber上的復制目標不是cache group中的表,而只是普通的non-cache表。
如果說上1種方式是針對HA,由于active和master是同享Oracle數據庫的。那末此處的方式則面向D/R,由于主點和備點分別有不同的Oracle數據庫。
在這類復制模式中,active 數據庫自動同步來做Oracle的數據。其實standby也配置了autorefresh,只不過處于pause狀態。
如果master失效,standby會接收,同時autorefresh狀態改成ON。
由于TimesTen不但會跟蹤active與Oracle的同步狀態,同時也會跟蹤active和standby的同步狀態,因此,當standby接收失效的master時,其實不需要從頭開始與Oracle同步。
不過對只讀緩存組的復制,如果master失效后,再配置新的master應當不是很容易。
TimesTen支持Sequence的復制,通常Sequence用來作為主鍵,唯1肯定1行。在這類場景中,Sequence比TimeStamp更經常使用。
You may choose to replicate all or a subset of tables that have foreign key relationships with one another. However, the method for how to replicate the tables involved in the relationship differ according to the type of replication scheme.
如果復制表定義了Aging策略,不管是基于時間戳還是LRU,那末:
* 源和目標的Aging策略必須1致
* 對ASP,只有主點應用Aging策略,引發的數據刪除通過復制傳播到目標
* 如果不是ASP,則主點和備點分別應用自己的Aging策略
* 如果是AWT緩存組,Aging引發的數據刪除其實不傳遞到Oracle,這點其實與復制沒關系,對Aging來講,這是公道的行動。