DevOps开发运维
成长之路

DM8-数据守护LSN、Redo日志

LSN

LSN(Log Sequence Number)是由系统自动维护的Bigint类型数值,具有自动递增、全局唯一特性,每一个LSN值代表着DM系统内部产生的一个物理事务。物理事务(Physical Transacation,简称ptx)是数据库内部一系列修改物理数据页操作的结合,与数据库管理系统中事务(Transaction)概念想对应,具有原子性、有序行、无法撤销等特性。

DM 数据库中与 LSN 相关的信息,可以通过查询 V$RLOG 表来获取。DM 主要包括以下 几种类型的 LSN:

CUR_LSN:是系统已经分配的最大LSN值,物理事务提交时,系统会为其分配一个唯一的LSN值,大小等于CUR_LSN + 1,然后在修改CUR_LSN=CUR_LSN + 1。
FILE_LSN:是已经写入联机redo日志文件的最大LSN值,每次将redo日志包RLOG_PKG写入联机redo日志文件后,都要修改FILE_LSN值。
FLUSH_LSN:是已经发起日志刷盘请求,但还没真正写入联机redo日志文件的最大LSN值
CKPT_LSN:是检查点LSN,所有LSN<=CKPT_LSN的物理事务修改的数据页,都已经从buffer缓冲区写入磁盘,CKPT_LSN有检查点线程负责调整。
APPLY_LSN:是备库重演LSN,表示备库已经重演完成的最大LSN,如果主库是DMDSC集群,备库分别为主库每一个节点维护一个APPLY_LSN。

与上述LSN对应,DM数据守护也定义了一批LSN:
CLSN: 与 CUR_LSN 保持一致,数据库已经分配的最大 LSN 值。
FLSN: 与 FILE_LSN 保持一致,已写入联机日志文件的 LSN 值。
ALSN: 与 APPLY_LSN 保持一致,备库已经重演完成的最大 LSN 值。
SLSN: 是 Standby LSN 的缩写,表示备库明确可重演的最大 LSN 值。
KLSN: 是 Keep LSN 的缩写,表示备库已经收到、但未明确是否可以重演 的 RLOG_PKG 的最大 LSN 值。在读写分离集群中 KLSN == SLSN。

Redo日志

Redo日志包括了所有物理数据页的修改内容,DML\DDL操作,最终都会转化为对物理数据页的修改,这些修改都会反映到redo日志中,一般说来一条修改数据的sql,在系统内部会转化为多个相互独立的物理事务来完成,物理事务提交时会将产生的redo日志写入日志报RLOG_PKG。

一个物理事务包含一个或多个redo记录(redo record),每条记录(rrec)都对应一个修改物理数据页的动作,RREC可以分为两类,物理RREC和逻辑RREC。

物理RREC记录的是数据页的变化情况,包括:操作类型,修改数据页地址,页内偏移,数据页上的修改内容,如果是变长类型,在RREC记录头之后还有一个两字节的长度信息。
逻辑RREC记录的是一些数据库逻辑操作步骤,包括:事务启动,事务提交,事务回滚,字典封锁,事务封锁,B树封锁,字典淘汰等。

逻辑RREC记录是专门为数据守护增加的记录类型,用来解决备库重演redo日志与用户访问备库之间的并发冲突,以及主库执行DDL后导致的主备数据库字典缓存不一致问题。备库解析到逻辑RREC记录时,根据记录内容,生成响应的事务,封锁对应的数据库对象,并从字典缓冲中淘汰过期的字典对象。

Redo日志包(LOG_PKG)

redo日志包是DM数据库批量保存物理事务产生的redo日志的数据单元,以物理事务PTX为单元保存日志,一个日志包内可连续保存一个或多个PTX,日志包具有字描述的特性,大小不固定,采用固定包头和可变包头结合的方式,包头记录日志的控制信息,包括类型,长度,包序号,LSN信息,产生日志的节点号,加密压缩信息,日志并行数等内容。

日志包生成时按照序号连续递增,相邻日志包的 LSN 顺序是总体递增的,但是在多节 点集群的 DSC 环境下不一定连续。如果未开启并行日志,RLOG_PKG 包内日志的 LSN 是递 增的。如果开启并行日志,一个 RLOG_PKG 包内包含多路并行产生的日志,每一路并行日 志的 LSN 是递增的,但是各路之间并不能保证 LSN 有序,因此并行日志包内 LSN 具有局部 有序,整体无序的特点。

物理事务提交时将 Redo 日志写入到日志包中,在数据库事务提交或日志包被写满时触 发日志刷盘动作。日志刷盘线程负责将日志包中的 Redo 日志写入联机日志文件,如果配置 了 Redo 日志归档,日志刷盘线程还将负责触发归档动作。DM 数据守护系统中,主库以 RLOG_PKG 为最小单位发送 Redo 日志到备库。

包序号介绍:

每个RLOG_PKG都有对应的序号属性,称之为包序号(PKG SEQNO),日志包生成时按照序号连续递增。包序号包括本地包序号(LSEQ)和全局包序号(GSEQ),本地包序号是节点内唯一、连续递增的值,用于校验联机日志连续性;全区包序号由数据守护进群的主备库共同维护,具有全局唯一、连续、递增的特性,用于校验归档日志的连续性。

DM数据库中与全局包序号相关的信息可以通过查询V$RLOG表来获取,主要包括以下:
CUR_SEQ:是系统已经分配的最大全局包序号。RLOG_PKG 写入联机日志文件前,系统会为其分配一个唯一的全局包序号。
FILE_SEQ:是已经写入联机 Redo 日志文件的最大全局包序号。每次将 Redo 日 志包 RLOG_PKG 写入联机 Redo 日志文件后,都要修改 FILE_SEQ 值。
APPLY_SEQ:是备库重演全局包序号,表示备库已经重演完成的最大全局包序号。 如果主库是 DSC 集群,备库分别为主库每一个节点维护一个 APPLY_SEQ。

DM 数据守护中也相应地定义了一批全局包序号:
CSEQ 全局已分配包序号,标识系统已经分配的最大 GSEQ 值。
FSEQ 全局文件包序号,标识已写入联机日志文件的最大 GSEQ 值。
ASEQ 全局重演包序号,标识备库已经重演的最大 GSEQ 值。
SSEQ 全局备库包序号,标识备库明确可重演的最大 GSEQ 值。
KSEQ 全局保留包序号,表示备库已经收到、未明确是否可以重演的最大 GSEQ 值。在读写分离集群中 SSEQ == KSEQ。

KEEP_PKG

主库的RLOG_PKG日志通过实时归档机制发送到备库后,备库将最新收到的RLOG_PKG保存在内存中,不马上启动重演,这个RLOG_PKG我们称之为KEEP_PKG。引入KEEP_PKG的主要目的是,避免下属场景中,主库故障重启后不必要的主备切换,减少用户干预。

1.用户登录主库 A 执行
CREATE TABLE TX(C1 INT);
INSERT INTO TX VALUES(1);
COMMIT;
其中commit操作将触发实时归档,发送RLOG_PKG到备库B。
2.备库B收到RLOG_PKG,响应主库A,并启动日志重演。
3.主库A在RLOG_PKG写入联机日志文件之前故障。
4.主库A在重启后,由于RLOG_PKG没有写入联机日志文件,之前插入TX表的数据丢失,但此时备库B已经重演日志成功,已经插入一行数据。
上述场景中,主备库数据不再保持一致,必须将备库B切为主库,并重新从B同步数据到A,如果配置的是手动切换模式,则必须要有用户干预,进行备库接管后,才能恢复数据库服务。

引入KEEP_PKG后,备库B收到主库A发送的RLOG_PKG,并不会马上启动重演,主库A启动后,守护进程A检测到备库B存在KEEP_PKG,通知备库B丢弃KEEP_PKG后,直接open主库A,就可以继续提供数据库服务,并且,这些操作是由守护进程自动完成,不需用户手动干预。

如果备库自动接管、或者用户发起备库接管命令,备库的KEEP_PKG将会启动重演,不管主库是否已经将KEEP_PKG对应的Redo日志写入联机日志文件中,备库接管时的APPLY_LSN一定是大于等于主库的FILE_LSN,当故障主库重启后,仍然可以作为备库,自动重新加入数据守护系统。

备库KEEP_PKG日志重演时机:
1、备库收到新的RLOG_PKG
2、收到主库的重演命令
主库会定时将 FILE_LSN 等信息发送到备库,当主库 FILE_LSN 等于备库 SLSN 时, 表明主库已经将 KEEP_PKG 对应的 Redo 日志写入联机日志文件中,此时备库会启动 KEEP_PKG 的日志重演。
3、备库切换为新主库
在监视器执行 SWITCHOVER 或 TAKEOVER 命令,或者确认监视器通知备库自动接管时, 备库会在切换为 PRIMARY 模式之前,启动 KEEP_PKG 的日志重演。

即时归档在 RLOG_PKG 写入主库联机 Redo 日志文件后,再发送 RLOG_PKG 到备库,因此即时备库没有 KEEP_PKG。

内容来自官方文档!

赞(0)

评论 抢沙发

评论前必须登录!

 

LNMP社群 不仅仅是技术

关于我们网站地图