本文为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来讲,这是公道的行动。