0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PolarDB物理復(fù)制刷臟約束問題和解決

數(shù)據(jù)庫和存儲(chǔ) ? 來源:數(shù)據(jù)庫和存儲(chǔ) ? 2023-10-11 17:02 ? 次閱讀

目前物理復(fù)制到了ro 開始刷120s apply_lsn 不推進(jìn)的信息以后, 即使壓力停下來也無法恢復(fù), 為什么?

如下圖所示:

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

這里最極端的場(chǎng)景是如果rw 上面最老的page1, 也就是在flush list 上根據(jù) oldest_modification_lsn 排在最老的位置page_lsn 已經(jīng)大于ro 上面的apply_lsn 了, 那么刷臟是無法進(jìn)行的, 因?yàn)槲锢韽?fù)制需要保證page 已經(jīng)被解析到ro parse buffer才可以進(jìn)行刷臟. 另外想Page2 這樣的Page 雖然newest_modification 和 oldest_modification 沒有差很多也無法進(jìn)行刷臟了. 因?yàn)镻arse buffer 已經(jīng)滿了.

但是這個(gè)時(shí)候ro 節(jié)點(diǎn)的apply_lsn 已經(jīng)不推進(jìn)了, 因?yàn)樯厦娴膒arse buffer 已經(jīng)滿了, parse buffer 推進(jìn)需要等rw 節(jié)點(diǎn)把老的page 刷下去, 老的parse buffer chunk 才可以釋放. 但是由于上面rw 節(jié)點(diǎn)已經(jīng)最老的page 都無法刷臟, 那么parse buffer chunk 肯定就沒機(jī)會(huì)釋放了.

那么此時(shí)就形成了死循環(huán)了. 即使寫入壓力停下來, ro 也是無法恢復(fù)的.

所以只要rw 上面最老page 超過了 parse buffer 的大小, 也就是最老page newest_modification_page lsn > ro apply_lsn 之時(shí), 那么死鎖就已經(jīng)形成, 后續(xù)都無法避免了

這里copy_page 為何沒有生效?

目前copy_page 的機(jī)制是刷臟的時(shí)候進(jìn)行的, 在下圖中copy page copy 出來的page newest_modification 也是大于ro apply_lsn 的, 所以也是無法刷臟的, 所以這個(gè)時(shí)候其實(shí)這個(gè)copy_page 機(jī)制是無效的機(jī)制.

正確的做法是: 在發(fā)現(xiàn)Page newest_modification 有可能超過一定的大小, 那么就應(yīng)該讓該page 進(jìn)行copy page強(qiáng)行刷臟, 否則到后面在進(jìn)行刷臟就來不及了.

開啟了多版本LogIndex 版本為什么可以規(guī)避這個(gè)問題?

在因?yàn)閜arse buffer 滿導(dǎo)致的刷臟約束中, 如上圖所示, Page1, Page2 無法進(jìn)行刷臟, 但是其他的Page 如果newest_modification < ro apply_lsn 是可以刷臟的, 因此rw 節(jié)點(diǎn)buffer pool 里面臟頁其實(shí)不多.

開啟了LogIndex 以后, ro 就可以隨意丟棄自己的parse buffer 了, 當(dāng)然也就不會(huì)crash.

但是依然有一個(gè)問題是如果Page1 一直修改, 這個(gè)Page1 的newest_modification lsn 一直在更新, 那么即使開啟LogIndex 也無法將該P(yáng)age 刷下去, 帶來的問題是rw checkpoint 是無法推進(jìn), 但是由于有了LogIndex, 其他page 可以隨意刷臟, 所以不會(huì)出現(xiàn)rw 臟頁數(shù)不夠的問題. 那Page1 刷臟如何解決呢?

通過copy page 解決.

如果rw 開啟了copy page 以后, 雖然上圖中的Page1 剛剛被copy 出來的時(shí)候無法flush, 但是因?yàn)殚_啟LogIndex, ro apply_lsn 可以隨意推進(jìn), 隨著ro apply_lsn 的推進(jìn), 過一段時(shí)間一定可以刷這個(gè)copy page, 也就避免了這個(gè)問題了.

所以目前版本答案是 LogIndex + copy page 解決了幾乎所有問題

另外驗(yàn)證了刷臟約束兩種場(chǎng)景

大量寫入場(chǎng)景

有熱點(diǎn)頁場(chǎng)景

其實(shí)大量寫入場(chǎng)景即使導(dǎo)致了刷臟約束, 后面還是可以恢復(fù)的, 只有熱點(diǎn)頁場(chǎng)景才無法恢復(fù). 很多時(shí)候熱點(diǎn)頁不一定是用戶修改的page, 而是Btree 上面的一些其他page, 比如root page 等等, 我們很難發(fā)現(xiàn)的.

另外驗(yàn)證了如果page 以及 redo log 寫入延遲都升高, 是不會(huì)特別出現(xiàn)刷臟約束問題, 只有出現(xiàn)熱點(diǎn)頁的場(chǎng)景才會(huì)有問題.

上圖可以看到

ro parse buffer = ro appply_lsn - rw flush_lsn

apply_lsn 是ro 節(jié)點(diǎn)讀取redo 并應(yīng)用推進(jìn)的速度

flush_lsn 是rw 節(jié)點(diǎn)page 刷臟推進(jìn)的速度

由于IO 延遲同時(shí)影響了 redo 和 page, 從公式可以看到, 那么ro parse buffer 不會(huì)快速增長(zhǎng)的.

從公式里面可以看到, 如果redo 推進(jìn)速度加快, page 刷臟速度減慢, 那么是最容易出現(xiàn)刷臟約束的. 也就是redo IO 速度不變, Page IO 速度變慢, 就容易出現(xiàn)把RO parse buffer 打滿的情況, 但是一樣需要出現(xiàn)熱點(diǎn)頁才能出現(xiàn)parse buffer 被打滿的死鎖.

如果沒有熱點(diǎn)頁, 這個(gè)時(shí)候由于parse buffer 還是再推進(jìn), 所以不會(huì)自動(dòng)crash, 反而會(huì)出現(xiàn)rw 由于被限制了刷臟, buffer pool 里面大量的臟頁, 最后找不到空閑Page 的情況. rw crash 的情況.

多版本或者Aurora 如何解決這個(gè)問題?

剛才上面的分析有兩個(gè)鏈條互相依賴

約束1: rw 的刷臟依賴ro 節(jié)點(diǎn)apply_lsn 的推進(jìn)

約束2: ro 節(jié)點(diǎn)釋放old parse buffer 依賴rw 節(jié)點(diǎn)刷臟

多版本/Aurora 都把約束2 給去掉了, ro 節(jié)點(diǎn)可以隨意釋放old parse buffer. 那么就不會(huì)有parse buffer 滿的問題, 那么如果ro 節(jié)點(diǎn)訪問到rw 還未刷下去page, 但是ro 節(jié)點(diǎn)已經(jīng)把Parse buffer 釋放了, 那么會(huì)通過磁盤上的 logIndex + 磁盤上page 生成想要的版本.

但是這里依然還要去解決約束1 的問題, rw 的刷臟會(huì)被ro 給限制. rw 刷臟時(shí)候判斷 page newest_modification_lsn > ro apply_lsn, 那么在Aurora 里面這個(gè)Page 也是無法進(jìn)行Apply 的, 但是Aurora 和我們區(qū)別在于Aurora 可以把這個(gè)Page 丟出buffer pool, 但是我們是無法把這樣的page 丟出Buffer Pool, 依然會(huì)造成Buffer Pool 里面大量的臟頁, 最后找不到空閑Page 的情況. 在多版本引擎里面支持把Page newest_modification_lsn > ro apply_lsn 這樣的Page 在Buffer Pool 中釋放也很重要.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 節(jié)點(diǎn)
    +關(guān)注

    關(guān)注

    0

    文章

    216

    瀏覽量

    24331
  • PAGE
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    20154

原文標(biāo)題:PolarDB 物理復(fù)制刷臟約束問題和解決

文章出處:【微信號(hào):inf_storage,微信公眾號(hào):數(shù)據(jù)庫和存儲(chǔ)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Xilinx FPGA管腳物理約束介紹

    引言:本文我們簡(jiǎn)單介紹下Xilinx FPGA管腳物理約束,包括位置(管腳)約束和電氣約束。
    發(fā)表于 07-25 10:13 ?4805次閱讀

    物理約束實(shí)踐:I/O約束

    I/O約束(I/O Constraints)包括I/O標(biāo)準(zhǔn)(I/OStandard)約束和I/O位置(I/O location)約束
    的頭像 發(fā)表于 11-18 16:42 ?980次閱讀
    <b class='flag-5'>物理</b><b class='flag-5'>約束</b>實(shí)踐:I/O<b class='flag-5'>約束</b>

    FPGA物理約束之布局約束

    在進(jìn)行布局約束前,通常會(huì)對(duì)現(xiàn)有設(shè)計(jì)進(jìn)行設(shè)計(jì)實(shí)現(xiàn)(Implementation)編譯。在完成第一次設(shè)計(jì)實(shí)現(xiàn)編譯后,工程設(shè)計(jì)通常會(huì)不斷更新迭代,此時(shí)對(duì)于設(shè)計(jì)中一些固定不變的邏輯,設(shè)計(jì)者希望它們的編譯結(jié)果
    的頭像 發(fā)表于 01-02 14:13 ?1276次閱讀
    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
    發(fā)表于 09-26 15:32

    云棲干貨回顧 | 云原生數(shù)據(jù)庫POLARDB專場(chǎng)“硬核”解析

    ,POLARDB基于TCP的遠(yuǎn)程物理復(fù)制技術(shù)實(shí)現(xiàn)了跨AZ的容災(zāi)。在可用性方面,POLARDB借助Parallel Raft復(fù)制技術(shù)使得單節(jié)點(diǎn)
    發(fā)表于 10-15 15:38

    阿里云數(shù)據(jù)庫POLARDB核心功能物理復(fù)制技術(shù)解讀

    深入解讀阿里云數(shù)據(jù)庫POLARDB核心功能物理復(fù)制技術(shù)
    發(fā)表于 06-02 10:16

    【MiniStar FPGA開發(fā)板】配套視頻教程——Gowin進(jìn)行物理和時(shí)序約束

    本視頻是MiniStar FPGA開發(fā)板的配套視頻課程,主要通過工程實(shí)例介紹Gowin的物理約束和時(shí)序約束,課程內(nèi)容包括gowin的管腳約束及其他
    發(fā)表于 05-06 15:40

    請(qǐng)問物理約束文件ADC可做哪些約束?

    物理約束文件ADC可做哪些約束
    發(fā)表于 08-11 08:37

    Adam Taylor玩轉(zhuǎn)MicroZed系列74:物理約束

    研究了相關(guān)的時(shí)序約束后,在設(shè)計(jì)中我們也不能忽視所能運(yùn)用到的物理約束。一個(gè)工程師最常用的物理約束是I/O管腳的放置和與每個(gè)I/O腳相關(guān)的參數(shù)定
    發(fā)表于 02-08 02:20 ?273次閱讀
    Adam Taylor玩轉(zhuǎn)MicroZed系列74:<b class='flag-5'>物理</b><b class='flag-5'>約束</b>

    Polardb數(shù)據(jù)庫模擬控制智能家居測(cè)試案例

    Polardb 是阿里云研發(fā)的一種關(guān)系型數(shù)據(jù)庫,與mysql完全兼容,而性能又是其6倍,具有高吞吐,低延遲等特性; 本測(cè)試通過模擬控制智能家居開關(guān)的終端場(chǎng)景,來體驗(yàn)polardb的性能; 本測(cè)試通過
    的頭像 發(fā)表于 11-06 09:54 ?2103次閱讀
    <b class='flag-5'>Polardb</b>數(shù)據(jù)庫模擬控制智能家居測(cè)試案例

    XDC約束物理約束的介紹

    觀看視頻,了解和學(xué)習(xí)有關(guān)XDC約束,包括時(shí)序,以及物理約束相關(guān)知識(shí)。
    的頭像 發(fā)表于 01-07 07:10 ?6085次閱讀
    XDC<b class='flag-5'>約束</b>及<b class='flag-5'>物理</b><b class='flag-5'>約束</b>的介紹

    簡(jiǎn)述Xilinx FPGA管腳物理約束解析

    引言:本文我們簡(jiǎn)單介紹下Xilinx FPGA管腳物理約束,包括位置(管腳)約束和電氣約束。
    的頭像 發(fā)表于 04-27 10:36 ?4200次閱讀
    簡(jiǎn)述Xilinx FPGA管腳<b class='flag-5'>物理</b><b class='flag-5'>約束</b>解析

    PolarDB for PostgreSQL云原生數(shù)據(jù)庫

    ./oschina_soft/PolarDB-for-PostgreSQL.zip
    發(fā)表于 06-17 10:21 ?3次下載
    <b class='flag-5'>PolarDB</b> for PostgreSQL云原生數(shù)據(jù)庫

    Gowin設(shè)計(jì)物理約束用戶指南

    電子發(fā)燒友網(wǎng)站提供《Gowin設(shè)計(jì)物理約束用戶指南 .pdf》資料免費(fèi)下載
    發(fā)表于 09-15 16:07 ?0次下載
    Gowin設(shè)計(jì)<b class='flag-5'>物理</b><b class='flag-5'>約束</b>用戶指南

    物理約束實(shí)踐:網(wǎng)表約束DONT_TOUCH

    信號(hào),此時(shí)就可以使用DONT_TOUCH約束達(dá)到保留這些信號(hào)的目的。又如,有時(shí)在設(shè)計(jì)中會(huì)對(duì)一些高扇出的信號(hào)進(jìn)行手動(dòng)的邏輯復(fù)制,也可以使用DONT_TOUCH約束避免它們被優(yōu)化掉。 工程實(shí)踐 ? 下面有一個(gè)簡(jiǎn)單的例子,看看DONT
    的頭像 發(fā)表于 11-12 14:14 ?3005次閱讀