0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PolarDB物理复制刷脏约束问题和解决

数据库和存储 来源:数据库和存储 2023-10-11 17:02 次阅读

目前物理复制到了ro 开始刷120s apply_lsn 不推进的信息以后, 即使压力停下来也无法恢复, 为什么?

如下图所示:

89df3442-680e-11ee-939d-92fbcf53809c.png

这里最极端的场景是如果rw 上面最老的page1, 也就是在flush list 上根据 oldest_modification_lsn 排在最老的位置page_lsn 已经大于ro 上面的apply_lsn 了, 那么刷脏是无法进行的, 因为物理复制需要保证page 已经被解析到ro parse buffer才可以进行刷脏. 另外想Page2 这样的Page 虽然newest_modification 和 oldest_modification 没有差很多也无法进行刷脏了. 因为Parse buffer 已经满了.

但是这个时候ro 节点的apply_lsn 已经不推进了, 因为上面的parse buffer 已经满了, parse buffer 推进需要等rw 节点把老的page 刷下去, 老的parse buffer chunk 才可以释放. 但是由于上面rw 节点已经最老的page 都无法刷脏, 那么parse buffer chunk 肯定就没机会释放了.

那么此时就形成了死循环了. 即使写入压力停下来, ro 也是无法恢复的.

所以只要rw 上面最老page 超过了 parse buffer 的大小, 也就是最老page newest_modification_page lsn > ro apply_lsn 之时, 那么死锁就已经形成, 后续都无法避免了

这里copy_page 为何没有生效?

目前copy_page 的机制是刷脏的时候进行的, 在下图中copy page copy 出来的page newest_modification 也是大于ro apply_lsn 的, 所以也是无法刷脏的, 所以这个时候其实这个copy_page 机制是无效的机制.

正确的做法是: 在发现Page newest_modification 有可能超过一定的大小, 那么就应该让该page 进行copy page强行刷脏, 否则到后面在进行刷脏就来不及了.

开启了多版本LogIndex 版本为什么可以规避这个问题?

在因为parse buffer 满导致的刷脏约束中, 如上图所示, Page1, Page2 无法进行刷脏, 但是其他的Page 如果newest_modification < ro apply_lsn 是可以刷脏的, 因此rw 节点buffer pool 里面脏页其实不多.

开启了LogIndex 以后, ro 就可以随意丢弃自己的parse buffer 了, 当然也就不会crash.

但是依然有一个问题是如果Page1 一直修改, 这个Page1 的newest_modification lsn 一直在更新, 那么即使开启LogIndex 也无法将该Page 刷下去, 带来的问题是rw checkpoint 是无法推进, 但是由于有了LogIndex, 其他page 可以随意刷脏, 所以不会出现rw 脏页数不够的问题. 那Page1 刷脏如何解决呢?

通过copy page 解决.

如果rw 开启了copy page 以后, 虽然上图中的Page1 刚刚被copy 出来的时候无法flush, 但是因为开启LogIndex, ro apply_lsn 可以随意推进, 随着ro apply_lsn 的推进, 过一段时间一定可以刷这个copy page, 也就避免了这个问题了.

所以目前版本答案是 LogIndex + copy page 解决了几乎所有问题

另外验证了刷脏约束两种场景

大量写入场景

有热点页场景

其实大量写入场景即使导致了刷脏约束, 后面还是可以恢复的, 只有热点页场景才无法恢复. 很多时候热点页不一定是用户修改的page, 而是Btree 上面的一些其他page, 比如root page 等等, 我们很难发现的.

另外验证了如果page 以及 redo log 写入延迟都升高, 是不会特别出现刷脏约束问题, 只有出现热点页的场景才会有问题.

上图可以看到

ro parse buffer = ro appply_lsn - rw flush_lsn

apply_lsn 是ro 节点读取redo 并应用推进的速度

flush_lsn 是rw 节点page 刷脏推进的速度

由于IO 延迟同时影响了 redo 和 page, 从公式可以看到, 那么ro parse buffer 不会快速增长的.

从公式里面可以看到, 如果redo 推进速度加快, page 刷脏速度减慢, 那么是最容易出现刷脏约束的. 也就是redo IO 速度不变, Page IO 速度变慢, 就容易出现把RO parse buffer 打满的情况, 但是一样需要出现热点页才能出现parse buffer 被打满的死锁.

如果没有热点页, 这个时候由于parse buffer 还是再推进, 所以不会自动crash, 反而会出现rw 由于被限制了刷脏, buffer pool 里面大量的脏页, 最后找不到空闲Page 的情况. rw crash 的情况.

多版本或者Aurora 如何解决这个问题?

刚才上面的分析有两个链条互相依赖

约束1: rw 的刷脏依赖ro 节点apply_lsn 的推进

约束2: ro 节点释放old parse buffer 依赖rw 节点刷脏

多版本/Aurora 都把约束2 给去掉了, ro 节点可以随意释放old parse buffer. 那么就不会有parse buffer 满的问题, 那么如果ro 节点访问到rw 还未刷下去page, 但是ro 节点已经把Parse buffer 释放了, 那么会通过磁盘上的 logIndex + 磁盘上page 生成想要的版本.

但是这里依然还要去解决约束1 的问题, rw 的刷脏会被ro 给限制. rw 刷脏时候判断 page newest_modification_lsn > ro apply_lsn, 那么在Aurora 里面这个Page 也是无法进行Apply 的, 但是Aurora 和我们区别在于Aurora 可以把这个Page 丢出buffer pool, 但是我们是无法把这样的page 丢出Buffer Pool, 依然会造成Buffer Pool 里面大量的脏页, 最后找不到空闲Page 的情况. 在多版本引擎里面支持把Page newest_modification_lsn > ro apply_lsn 这样的Page 在Buffer Pool 中释放也很重要.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 节点
    +关注

    关注

    0

    文章

    217

    浏览量

    24371
  • PAGE
    +关注

    关注

    0

    文章

    11

    浏览量

    20167

原文标题:PolarDB 物理复制刷脏约束问题和解决

文章出处:【微信号:inf_storage,微信公众号:数据库和存储】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Xilinx FPGA管脚物理约束介绍

    引言:本文我们简单介绍下Xilinx FPGA管脚物理约束,包括位置(管脚)约束和电气约束
    发表于 07-25 10:13 4870次阅读

    物理约束实践:I/O约束

    I/O约束(I/O Constraints)包括I/O标准(I/OStandard)约束和I/O位置(I/O location)约束
    的头像 发表于 11-18 16:42 1029次阅读
    <b class='flag-5'>物理</b><b class='flag-5'>约束</b>实践:I/O<b class='flag-5'>约束</b>

    FPGA物理约束之布局约束

    在进行布局约束前,通常会对现有设计进行设计实现(Implementation)编译。在完成第一次设计实现编译后,工程设计通常会不断更新迭代,此时对于设计中一些固定不变的逻辑,设计者希望它们的编译结果
    的头像 发表于 01-02 14:13 1374次阅读
    FPGA<b class='flag-5'>物理</b><b class='flag-5'>约束</b>之布局<b class='flag-5'>约束</b>

    物理约束之布局约束

    1. 单元布局约束set_property BELGTHE2_CHANNEL[get_cellsswitch_v2_i/srio_0/srio_gen2_0_inst
    发表于 09-26 15:32

    云栖干货回顾 | 云原生数据库POLARDB专场“硬核”解析

    POLARDB基于TCP的远程物理复制技术实现了跨AZ的容灾。在可用性方面,POLARDB借助Parallel Raft复制技术使得单节点
    发表于 10-15 15:38

    阿里云数据库POLARDB核心功能物理复制技术解读

    深入解读阿里云数据库POLARDB核心功能物理复制技术
    发表于 06-02 10:16

    【MiniStar FPGA开发板】配套视频教程——Gowin进行物理和时序约束

    本视频是MiniStar FPGA开发板的配套视频课程,主要通过工程实例介绍Gowin的物理约束和时序约束,课程内容包括gowin的管脚约束及其他
    发表于 05-06 15:40

    请问物理约束文件ADC可做哪些约束

    物理约束文件ADC可做哪些约束
    发表于 08-11 08:37

    Adam Taylor玩转MicroZed系列74:物理约束

    研究了相关的时序约束后,在设计中我们也不能忽视所能运用到的物理约束。一个工程师最常用的物理约束是I/O管脚的放置和与每个I/O脚相关的参数定
    发表于 02-08 02:20 279次阅读
    Adam Taylor玩转MicroZed系列74:<b class='flag-5'>物理</b><b class='flag-5'>约束</b>

    Polardb数据库模拟控制智能家居测试案例

    Polardb 是阿里云研发的一种关系型数据库,与mysql完全兼容,而性能又是其6倍,具有高吞吐,低延迟等特性; 本测试通过模拟控制智能家居开关的终端场景,来体验polardb的性能; 本测试通过
    的头像 发表于 11-06 09:54 2115次阅读
    <b class='flag-5'>Polardb</b>数据库模拟控制智能家居测试案例

    XDC约束物理约束的介绍

    观看视频,了解和学习有关XDC约束,包括时序,以及物理约束相关知识。
    的头像 发表于 01-07 07:10 6143次阅读
    XDC<b class='flag-5'>约束</b>及<b class='flag-5'>物理</b><b class='flag-5'>约束</b>的介绍

    简述Xilinx FPGA管脚物理约束解析

    引言:本文我们简单介绍下Xilinx FPGA管脚物理约束,包括位置(管脚)约束和电气约束
    的头像 发表于 04-27 10:36 4314次阅读
    简述Xilinx FPGA管脚<b class='flag-5'>物理</b><b class='flag-5'>约束</b>解析

    PolarDB for PostgreSQL云原生数据库

    ./oschina_soft/PolarDB-for-PostgreSQL.zip
    发表于 06-17 10:21 3次下载
    <b class='flag-5'>PolarDB</b> for PostgreSQL云原生数据库

    Gowin设计物理约束用户指南

    电子发烧友网站提供《Gowin设计物理约束用户指南 .pdf》资料免费下载
    发表于 09-15 16:07 0次下载
    Gowin设计<b class='flag-5'>物理</b><b class='flag-5'>约束</b>用户指南

    物理约束实践:网表约束DONT_TOUCH

    信号,此时就可以使用DONT_TOUCH约束达到保留这些信号的目的。又如,有时在设计中会对一些高扇出的信号进行手动的逻辑复制,也可以使用DONT_TOUCH约束避免它们被优化掉。 工程实践   下面有一个简单的例子,看看DONT
    的头像 发表于 11-12 14:14 3143次阅读