欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

PostgreSQLpg_rewind原理

一、背景
常見的高可用架構(gòu)中,如果master掛了且有數(shù)據(jù)沒有同步到備,高可用系統(tǒng)會提升備為主對外服務(wù)。對于老主有可能再以備的身份加入集群時,可能搭建流復(fù)制關(guān)系失敗。可以用pg_rewind工具使主備的數(shù)據(jù)一致。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了北侖免費建站歡迎大家使用!

二、pg_rewind原理
PostgreSQL pg_rewind原理
三、相關(guān)代碼

1、每個文件(目錄)的差異被記錄在結(jié)構(gòu)體 file_entry_t 中,其定義如下
typedef struct file_entry_t
{
    char       *path;
    file_type_t type;
    file_action_t action;

    /* for a regular file */
    size_t  oldsize;
    size_t  newsize;
    Bool    isrelfile;      
    /* is it a relation data file? */

    datapagemap_t pagemap;

    /* for a symlink */
    char       *link_target;

    struct file_entry_t *next;
} file_entry_t;
2、文件類型
typedef enum
{
    FILE_TYPE_REGULAR,//常規(guī)文件
    FILE_TYPE_DIRECTORY,//目錄
    FILE_TYPE_SYMLINK//軟連接
} file_type_t;
3、對應(yīng)文件的操作action
typedef enum
{
    FILE_ACTION_CREATE,         /* 創(chuàng)建目錄或者軟鏈接: create_target(entry)*/
    FILE_ACTION_COPY,           /* 復(fù)制整個文件或者重寫已存在的文件: fetch_file_range(entry->path, 0, entry->newsize);*/
    FILE_ACTION_COPY_TAIL,      /* 從source中拷貝從oldsize到newsize的部分 fetch_file_range(entry->path, entry->oldsize, entry->newsize)*/
    FILE_ACTION_NONE,           /* 無操作 */
    FILE_ACTION_TRUNCATE,       /* 裁剪target集群文件到'newsize'大小: truncate_target_file(entry->path, entry->newsize)*/
    FILE_ACTION_REMOVE          /* 刪除本地文件/目錄/軟鏈接: remove_target(entry)*/
} file_action_t;
4、其他變量解讀
isrefile 表示該文件是否是一個表數(shù)據(jù)文件,表數(shù)據(jù)文件的路徑要滿足以下幾個條件:
isRelDataFile(path):
    global/ 目錄下的文件,即數(shù)據(jù)庫共享的表文件目錄下的文件
    base/ 目錄下的文件,即默認tablespace的表文件目錄下的文件
    pg_tblspc/&rnode.spcNode/TABLESPACE_VERSION_DIRECTORY/目錄下的文件,即其他tablespace 的表文件目錄下的文件,其中PG_9.4_201403261 與版本相關(guān)
    文件名符合的格式
pagemap (怎么用?extractPageInfo)存儲了一個bitmap,每一位存儲了對應(yīng)的目的集群文件中的每個page 從兩個集群的分叉點之后是否發(fā)生了變化,1代表發(fā)生變化,0代表未變化。
oldsize 代表目的集群該文件的大小,newsize 代表源集群該文件的大小。pg_rewind 中通過源集群和目的集群的對應(yīng)文件大小比較或者文件(目錄)是否存在,指定文件的處理action,例如:
    oldsize > newsize: action=FILE_ACTION_TRUNCATE
    oldsize < newsize: action=FILE_ACTION_COPY_TAIL
    如果文件不存在,則action=FILE_ACTION_COPY,PG_VERSION文件除外
    如果目錄不存在,則action=FILE_ACTION_CREATE
    如果文件多余,則action=FILE_ACTION_REMOVE
    以上動作由函數(shù)process_target_file和process_source_file一起處理。只在process_target_file設(shè)置FILE_ACTION_REMOVE
5、提取wal日志獲取更改頁的步驟:
extractPageInfo:
    for (block_id = 0; block_id <= record->max_block_id; block_id++){
        if (!XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blkno))
            continue;
        /* We only care about the main fork; others are copied in toto */
        if (forknum != MAIN_FORKNUM)//MAIN_FORKNUM是什么意思?
            continue;
        process_block_change(forknum, rnode, blkno);
    }
6、pagemap中的bitmap
pg_rewind 工具執(zhí)行需要打開full_page_writes,而打開了full_page_writes 之后,checkpoint 后每個數(shù)據(jù)頁的第一次修改對應(yīng)的數(shù)據(jù)頁的全部內(nèi)容都會寫在WAL日志記錄中,所以pg_rewind 可以根據(jù)WAL 日志的組織結(jié)構(gòu)很容易的找到對應(yīng)已經(jīng)修改的數(shù)據(jù)頁信息,并把對應(yīng)的file_entry_t 的bitmap 置為1。
XLogRecGetBlockTag:XLogReaderState.blocks[XLR_MAX_BLOCK_ID + 1]

標(biāo)題名稱:PostgreSQLpg_rewind原理
轉(zhuǎn)載來源:http://www.chinadenli.net/article30/jdjspo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計企業(yè)網(wǎng)站制作微信小程序網(wǎng)站改版全網(wǎng)營銷推廣營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司