概述

在共享存储一写多读的架构下,数据文件实际上只有一份。得益于多版本机制,不同节点的读写实际上并不会冲突。但是有一些数据操作不具有多版本机制,其中比较有代表性的就是文件操作。
多版本机制仅限于文件内的元组,但不包括文件本身。对文件进行创建、删除等操作实际上会对全集群立即可见,这会导致RO在读取文件时出现文件消失的情况,因此需要做一些同步操作,来防止此类情况。
对文件进行操作通常使用DDL,因此对于DDL操作,PolarDB提供了一种同步机制,来防止并发的文件操作的出现。除了同步机制外,DDL的其他逻辑和单机执行逻辑并无区别。

术语

  • LSN:Log Sequence Number,日志序列号。是WAL日志的唯一标识。LSN在全局是递增的。
  • 回放位点:Apply LSN,表示只读节点的回放位点。

同步DDL机制

DDL锁

同步DDL机制利用AccessExclusiveLock(后文简称DDL锁)来进行RW/RO的DDL操作同步。

图1 DDL锁和WAL日志的关系 DDL锁是数据库中最高级的表锁,对其他所有的锁级别都互斥,会伴随着WAL日志同步到RO节点上,并且可以获取到该锁在WAL日志的写入位点。当RO回放超过Lock LSN位点时,就可以认为在RO中已经获取了这把锁。DDL锁会伴随着事务的结束而释放。如图1所示,当回放到ApplyLSN1时,表示未获取到DDL锁;当回放到ApplyLSN2时,表示获取到了该锁;当回放到ApplyLSN3时,已经释放了DDL锁。 ![异步回放ddl锁.png](pic/46_DDL_2.png) 图2 DDL锁的获取条件 当所有RO都回放超过了Lock LSN这个位点时(如图2所示),可以认为RW的事务在集群级别获取到了这把锁。获取到这把锁就意味着RW/RO中没有其他的会话能够访问这张表,此时RW就可以对这张表做各种文件相关的操作。 > 说明:Standby有独立的文件存储,获取锁时不会出现上述情况。

图3 同步DDL流程图 图3所示流程说明如下:

  1. RO会话执行查询语句。
  2. RW会话执行DDL,在本地获取DDL锁并且写到WAL日志中,等待所有RO回放到该WAL日志。
  3. RO的回放进程尝试获取该锁,获取成功后将回放位点返回给RW。
  4. RW获知所有RO均获取到该锁。
  5. RO开始进行DDL操作。

如何保证数据正确性

DDL锁是PG数据库最高级别的锁,当对一个表进行DROP/ALTER/LOCK/VACUUM(FULL) table等操作时,需要先获取到DDL锁。RW是通过用户的主动操作来获取锁,获取锁成功时会写入到日志中,RO则通过回放日志获取锁。

  • 主备环境:热备存在只读查询,同时进行回放,回放到该锁时,如果该表正在被读取,回放就会被阻塞直到超时。
  • PolarDB环境:RW获取锁需要等待RO全部获取锁成功才算成功,因为需要确保主备都不再访问共享存储的数据才能进行DDL操作。

当以下操作的对象都是某张表,“<”表示时间先后顺序时,同步DDL的执行逻辑如下:

  1. 本地所有查询操作结束 < 本地获取DDL锁 < 本地释放DDL锁 < 本地新增查询操作
  2. RW本地获取DDL锁 < 各个RO获取本地DDL锁 < RW获取全局DDL锁
  3. RW获取全局DDL锁 < RW进行写数据操作 < RW释放全局DDL锁

结合以上执行逻辑可以得到以下操作的先后顺序:各个RW/RO查询操作结束 < RW获取全局DDL锁 < RW写数据 < RW释放全局DDL锁 < RW/RO新增查询操作。
可以看到在写共享存储的数据时,RW/RO上都不会存在查询,因此不会造成正确性问题。在整个操作的过程中,都是遵循2PL协议的,因此对于多个表,也可以保证正确性。

RO锁回放优化

上述机制中存在一个问题,就是锁同步发生在主备同步的主路径中,当RO的锁同步被阻塞时,会造成RO的数据同步阻塞(如图1所示,回放进程的3、4阶段在等待本地查询会话结束后才能获取锁)。PolarDB默认设置的同步超时时间为30s,如果RW压力过大,有可能造成较大的数据延迟。 RO中回放的DDL锁还会出现叠加效果,例如RW在1s内写下了10个DDL锁日志,在RO却需要300s才能回放完毕。数据延迟对于PolarDB是十分危险的,它会造成RW无法及时刷脏、及时做检查点,如果此时发生崩溃,恢复系统会需要更长的时间,这会导致极大的稳定性风险。

异步DDL锁回放

针对此问题,PolarDB进行了RO锁回放优化。

图4 RO异步DDL锁回放 优化思路:设计一个异步进程来回放这些锁,从而不阻塞主回放进程的工作。 整体流程如图4所示,和图3不同的是,回放进程会将锁获取的操作卸载到锁回放进程中进行,并且立刻回到主回放流程中,从而不受锁回放阻塞的影响。 锁回放冲突并不是一个常见的情况,因此主回放进程并非将所有的锁都卸载到锁回放进程中进行,它会尝试获取锁,如果获取成功了,就不需要卸载到锁回放进程中进行,这样可以有效减少进程间的同步开销。 该功能在PolarDB中默认启用,能够有效的减少回放冲突造成的回放延迟,以及衍生出来的稳定性问题。在AWS Aurora中不具备该特性,当发生冲突时会严重增加延迟。

如何保证数据正确性

在异步回放的模式下,仅仅是获取锁的操作者变了,但是执行逻辑并未发生变化,依旧能够保证RW获取到全局DDL锁、写数据、释放全局DDL锁这期间不会存在任何查询,因此不会存在正确性问题。

企业级分布式开源数据库 PolarDB for PostgreSQL-阿里云开发者社区

PolarDB PostgreSQL DDL同步原理的更多相关文章

  1. PolarDB PostgreSQL Buffer Management 原理

    背景介绍 传统数据库的主备架构,主备有各自的存储,备节点回放WAL日志并读写自己的存储,主备节点在存储层没有耦合.PolarDB的实现是基于共享存储的一写多读架构,主备使用共享存储中的一份数据.读写节 ...

  2. PolarDB PostgreSQL 架构原理解读

    背景 PolarDB PostgreSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容PostgreSQL与Oracle.PolarDB 的存储与计算能 ...

  3. PolarDB PostgreSQL 快速入门

    什么是PolarDB PostgreSQL PolarDB PostgreSQL(下文简称为PolarDB)是一款阿里云自主研发的云原生数据库产品,100%兼容PostgreSQL,采用基于Share ...

  4. Mysql 主从同步原理简析

    在开始讲述原理的情况下,我们先来做个知识汇总,究竟什么是主从,为什么要搞主从,可以怎么实现主从,mysql主从同步的原理1.什么是主从其实主从这个概念非常简单主机就是我们平常主要用来读写的服务,我们称 ...

  5. rsync 文件校验及同步原理

    rsync 文件校验及同步原理 参考:http://rsync.samba.org/how-rsync-works.html 我们关注的是其发送与接收校验文件的算法,这里附上原文和我老婆(^_^)的翻 ...

  6. 10-openldap同步原理

    openldap同步原理 阅读视图 openldap同步原理 syncrepl.slurpd同步机制优缺点 OpenLDAP同步条件 OpenLDAP同步参数 1. openldap同步原理 Open ...

  7. OGG_GoldenGate数据库配置DDL同步(案例)

    2014-03-08 Created By BaoXinjian

  8. AlwaysOn的数据同步原理

    摘抄自<SQL Server 2012实施与管理实战指南> 镜像的工作原理: 那么主体数据库和镜像数据库是如何同步数据的呢?SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正 ...

  9. 架构师必备:MySQL主从同步原理和应用

    日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...

随机推荐

  1. Angular Module 共享模块使用 父模块使用多个子模块

      Component.module.ts import {BrowserModule} from '@angular/platform-browser'; import {LocationStrat ...

  2. Vmware15的安装以及Ubunt的在虚拟机上的安装

    一.vmware15安装 1.百度网盘地址 链接:https://pan.baidu.com/s/1Lgez57n50QEW97HNdYZCfQ 提取码:9wvy 2.下载到本地后 3.双击安装程序 ...

  3. 终于讲清楚了:深入理解Java 应用程序中 final 关键字的各种使用场景

    在 Java 语言众多的关键字中,final 关键字无疑是被提到最多的,也是在面试过程中经常被问到的知识点.今天,老王查找了很多材料,最后终于收集了关于 final 关键字比较全的知识点.首先,fin ...

  4. Vue2.0 axios 读取本地json文件

    参考:https://www.cnblogs.com/wdxue/p/8868982.html 1.下载插件 npm install axios --save 2.在main.js下引用axios i ...

  5. .NET 元数据概述

    元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码转换为 Mi ...

  6. 01.SpringMVC之概述

    springMVC架构 SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需通过中间整合层进行整合.SpringMVC是基于MVC架构的WEB框架.SpringMVC框 ...

  7. Contos7 克隆实例 以及 配置网络-服务-等相关信息

    以下为我自己整理的克隆虚拟机和设置固定IP的方法,记录一下,以防忘记: 桥接模式网络配置 1.配置ip地址等信息在文件里做如下配置: /etc/sysconfig/network-scripts/if ...

  8. OVN架构

    原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...

  9. Go并发控制--WaitGroup篇

    目录 1. 前言 2. 使用WaitGroup控制 2.1 使用场景 2.2 信号量 1.3 WaitGroup 数据结构 2.3.1 Add () 方法 2.3.2 Wait() 2.3.3 Don ...

  10. WIN10 64bit + QT5.10.0(MinGW3.5.0) + OpenCV3.4.1 无痛安装、配置

    安装QT和配置MinGW 官方下载qt-opensource-windows-x86-5.10.0.exe 正常步骤安装QT5.10.0,安装过程选择自带的MinGW3.5.0编译器即可. 打开QtC ...