(1)统一的日志系统。
在openGauss的存储引擎中,磁盘引擎和内存引擎共用同一套日志系统,以保证在数据库故障恢复场景下,各个引擎内和各个引擎间的数据持久性和一致性。基于上述统一的日志系统,openGauss支持主、备机(主、备数据库服务进程)之间的流式日志复制,并通过Quorum复制协议,在保证复制一致性的前提下,尽可能降低日志同步对主机业务的影响
openGauss Quorum一致性复制协议 - 墨天轮 (modb.pro)
为了保证数据库数据的可靠和高可用,当主机上执行的事务修改产生日志之后,在事务提交之前需要将本事务产生的日志同步到多个备机上。openGauss采用Quorum一致性复制协议,即当多数备机完成上述事务的日志同步之后主机事务方可提交。这个过程中作为事务提交参考的是同步备,其他备机是异步备,作为冗余备份。同步备和异步备的具体选择可以通过配置synchronus_standby_names参数实现。
SyncRepGetSyncRecPtr()
|
图4-39 事务提交和一致性复制协议
主机上事务提交和一致性复制协议的工作运行机制如图4-39所示。主要涉及的数据结构是WalSndCtlData数据结构体,其定义代码如下:
typedef struct WalSndCtlData {
SHM_QUEUE SyncRepQueue[NUM_SYNC_REP_WAIT_MODE];
XLogRecPtr lsn[NUM_SYNC_REP_WAIT_MODE];
bool sync_standbys_defined;
bool most_available_sync;
bool sync_master_standalone;
DemoteMode demotion;
slock_t mutex;
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER];
} WalSndCtlData;
其中SyncRepQueue是等待不同同步方式(备机日志写入磁盘、备机日志接收、备机日志回放等同步方式)的业务线程等待队列,用于当某一种同步方式满足条件之后,唤醒该类型的业务线程完成事务提交。lsn是上述几种队列队头后台线程等待的日志同步位置。sync_standbys_defined表示是否配置了同步备机。most_available_sync表示是否配置了最大可用模式;如果已配置,则在没有同步备机连接的情况下,后台业务线程可以直接提交,不用阻塞等待。sync_master_standalone表示当前是否有同步备机连接。demotion表示主机的降备方式。mutex表示保护walsnds结构体并发访问的互斥锁。walsnds表示保存wal sender的具体同步状态和进度信息。
我们设置的是on 也就是正常情况下,主备机落盘的xlog位置是一样的,否则事务根本无法提交,备机落后主机xlog落盘,只能是在备机宕了重启的时候,这个时候主机会等备机xlog落盘跟上才能执行事务。问题在于1.备机宕机重启,判断xlog差距的逻辑。2.正常情况下,备机xlog刷盘会落后于主机很多吗,落后了会怎么影响主机。
synchronous_commit=on
on跟单实例下含义不同,表示流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入WAL文件,之后才向客户端返回成功。
简单地说 on 表示本地和备库的WAL都已落盘,有两份持久化的WAL,但备库此时还没有完成apply,这个选项带来的事务响应时间较高 。
————————————————
版权声明:本文为CSDN博主「Hehuyi_In」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hehuyi_In/article/details/103449611