2.2.3 归档管理
1. 归档类型
归档是实现数据守护系统的重要技术手段,根据功能与实现方式的不同,达梦数据库的归档可以分为5类:本地归档、远程归档、实时归档、即时归档和异步归档。
1)本地归档
REDO日志本地归档(LOCAL),就是将REDO日志写入本地归档日志文件的过程。在配置为本地归档的情况下,REDO日志刷盘线程将REDO日志写入联机REDO日志文件后,对应的RLOG_BUF由专门的归档线程负责写入本地归档日志文件中。
与联机REDO日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中的REDO日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会自动删除最早生成的归档REDO日志文件,腾出空间。
达梦数据库提供了按指定的时间或指定的LSN删除归档日志的系统函数,但用户需要谨慎使用。例如,在数据守护系统中,如果备库发生了故障,主库继续服务,主库的日志在继续增加,此时如果删除尚未同步到备库的主库归档日志,那么在备库重启之后,会由于备库收到的日志缺失导致主备库无法正常同步数据。
本地归档文件在配置的归档目录下生成并保存,文件命名规则为“日志归档名_年月日时分秒毫秒.log”,如ARCHIVE_LOCAL1_20151014153933458.log。如果磁盘空间不足,并且没有配置归档日志空间上限(或者配置的上限超过实际空间),则系统将自动挂起,直到用户主动释放足够的空间后才继续运行。
【注意】为了最大限度地保护数据,当磁盘空间不足导致归档写入失败时,系统会挂起等待,直到用户释放出足够的磁盘空间。当磁盘损坏导致归档日志写入失败时,系统会强制Halt。
2)远程归档
DMDSC库节点除将自身的归档日志保存在本地节点外,还发送到DMDSC库内的其他节点上,同时接收其他节点的远程归档日志进行备份,这样每个节点的本地存储都保存了其他DMDSC库节点的归档日志,随时可进行本地访问。这种将归档日志发送到远程节点上保存的归档方式,被称为远程归档。
远程归档主要有以下两种使用场景。
(1)场景1:在执行数据库恢复时,恢复工具(如DMRMAN)所在节点需要访问其他节点归档日志。
(2)场景2:DMDSC守护系统中主备库异步归档日志的同步,备库恢复。DMDSC主节点为发送端,需要访问其他从节点的归档日志。
远程归档方便各节点保存数据库的完整归档日志,避免增加其他额外的开支(如共享存储等),是一种非常经济、便捷的日志存储手段。
3)实时归档
与本地归档写入本地磁盘不同,实时归档(REALTIME)对主库产生的REDO日志和Huge表数据进行修改,通过MAL系统传递到备库。实时归档是实时主备和MPP主备的实现基础。实时归档只有在主库配置为Primary模式下才能生效,一个主库可以配置1~8个实时备库。
实时归档的执行流程:主库在REDO日志(RLOG_BUF)写入联机REDO日志文件前,将REDO日志发送到配置为Standby模式的备库;备库收到REDO日志(RLOG_BUF)后放入KEEP_BUF,并在原有KEEP_BUF的内容中加入日志重演任务系统后,马上响应主库,而不是等待REDO日志重演结束再响应主库;主库收到响应消息,确认备库已经收到REDO日志,再将REDO日志写入联机REDO日志文件中。
4)即时归档
即时归档是读写分离集群的实现基础,其与实时归档的主要区别是发送REDO日志的时机不同。即时归档(TIMELY)在主库将REDO日志写入联机REDO日志文件后,再通过MAL系统将REDO日志发送到备库。一个主库可以配置1~8个即时备库。
根据备库重演REDO日志和响应主库时机的不同,即时归档分为两种模式:事务一致模式和高性能模式。达梦数据库根据配置文件dmarch.ini中的ARCH_WAIT_APPLY配置项来确定即时归档的模式,配置为1就是事务一致模式,配置为0就是高性能模式,ARCH_WAIT_APPLY默认为1。
(1)事务一致模式。主库事务Commit触发REDO日志刷盘和即时归档,备库收到主库发送的REDO日志要在重演完成后再响应主库,主库才能响应用户Commit成功。在事务一致模式下,同一个事务的SELECT语句不管是在主库执行,还是在备库执行,查询结果都满足Read Commit隔离级要求。
(2)高性能模式。与实时归档一样,备库收到主库发送的REDO日志后,马上响应主库后,再启动日志重演。在高性能模式下,备库与主库的数据同步存在一定延迟(一般情况下延迟时间非常短暂,用户几乎感觉不到),无法严格保证事务一致性。
事务一致模式的主备库之间严格维护事务一致性,但主库要等备库重演REDO日志完成后,再响应用户的Commit请求,事务Commit时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务的一致性来获得更高的性能及提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。
5)异步归档
异步归档(ASYNC),由主备库上配置的定时器触发,根据异步备库的CUR_LSN信息,扫描本地归档目录获取REDO日志,并通过MAL系统将REDO日志发送到异步备库。异步备库的REDO日志重演过程与实时归档等其他类型的归档完全一致。
每个Primary模式或Standby模式的数据库,最多可以配置8个异步备库,在Normal模式下配置的异步备库会自动失效。
异步备库可以级联配置,异步备库本身也可以作为源库配置异步备库。理论上来说,数据守护系统中可配置的异步备库的总数只受MAL系统最大节点数(2048个)限制。
2. 归档类型比较
对除远程归档外的归档类型进行比较,如表2-13所示。
表2-13 达梦数据库归档类型比较
(续表)
【注意】当任意一个备库的实时归档/即时归档失败时(即使其他备库归档成功了),主库都会切换为Suspend状态。
3. 归档状态及转换
本地归档、实时归档和即时归档均包含两种状态:Valid和Invalid;异步归档只有一种归档状态:Valid。实时归档、即时归档只对Primary模式的主库有效,备库上配置的实时归档、即时归档状态没有实际意义,始终保持Valid状态。
(1)Valid:归档有效状态,正常执行各种数据库归档操作。
(2)Invalid:归档无效状态,主库不发送联机REDO日志到备库。
在不同的归档类型中,归档状态转换时机不同,具体转换时机如下。
(1)主备库启动后,主库到所有备库的归档状态默认是Valid;守护进程Open主库前,将主库到所有备库的归档状态修改为Invalid。
(2)备库故障恢复,同步主库数据完成后,守护进程先将主库修改为Suspend状态,并将主库到备库的归档状态从Invalid修改为Valid。在守护进程再次Open主库后,主备库数据重新恢复为一致状态。
(3)主库发送日志到实时备库失败挂起,守护进程处理Failover过程中,将主库到备库的归档状态修改为Invalid。
(4)主库发送即时归档日志失败后,直接将主库到备库的归档状态修改为Invalid。
(5)异步归档始终保持Valid状态,一旦归档失败马上返回,等待下一次触发再继续发送。
4. 归档流程
实时主备库数据同步的基础是实时归档,主库生成联机REDO日志。在触发日志写文件操作后,日志线程先将RLOG_BUF发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否Open等),不合法则返回错误信息,合法则作为KEEP_BUF保留在内存中,原有KEEP_BUF的REDO日志加入APPLY任务队列进行REDO日志重演,并响应主库日志接收成功。实时归档流程如图2-9所示。
图2-9 达梦数据库实时归档流程