pg_basebackup原理解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
简介: pg_basebackup原理解析

pg_basebackup

介绍


pg_basebackup提供一个全量备份。常用来搭建流复制环境。属于物理备份。逻辑备份工具时pg_dump。参数说明:

-D:--pgdata=DIRECTORRY,接收备份的目录

-F:--format=p | t,指定输出格式,支持p(原样输出)或者t(tar格式输出)

-r:--max-rate=RATE,最大传输率(kB/s,或用前缀 k,M)

-R,--write-recovery-conf,备份后写recovery.conf文件

-s,--slot=SLOTNAME,使用的复制槽

-T:--tablespace-mapping=OLDDIR=NEWDIR,使用NEWDIR替代OLDDIR

-x:--xlog,备份开始后,启动另一个流复制连接从主库接收WAL

-X:--xlog-method=fetch| stream

  --xlogdir=XLOGDIR

-z:--gzip

-Z:--compress=0-9

--target-gp-dbid:根据给定的dbid创建表空间子目录

 

-C,--checkpoint=fast| spread

-l,--label=LABLE:设置backup label

-E,--exclude

--exclude-from=FILE

 

 

选项:

static struct optionlong_options[] = {

       {"help", no_argument, NULL,'?'},

       {"version", no_argument, NULL,'V'},

       {"pgdata", required_argument,NULL, 'D'},

       {"format", required_argument,NULL, 'F'},

       {"checkpoint",required_argument, NULL, 'c'},

       {"create-slot", no_argument,NULL, 'C'},

       {"max-rate",required_argument, NULL, 'r'},

       {"write-recovery-conf",no_argument, NULL, 'R'},

       {"slot", required_argument,NULL, 'S'},

       {"tablespace-mapping",required_argument, NULL, 'T'},

       {"wal-method",required_argument, NULL, 'X'},

       {"gzip", no_argument, NULL,'z'},

       {"compress",required_argument, NULL, 'Z'},

       {"label", required_argument,NULL, 'l'},

       {"no-clean", no_argument,NULL, 'n'},

       {"no-sync", no_argument, NULL,'N'},

       {"dbname", required_argument,NULL, 'd'},

       {"host", required_argument,NULL, 'h'},

       {"port", required_argument,NULL, 'p'},

       {"username", required_argument,NULL, 'U'},

       {"no-password", no_argument,NULL, 'w'},

       {"password", no_argument,NULL, 'W'},

       {"status-interval",required_argument, NULL, 's'},

       {"verbose", no_argument, NULL,'v'},

       {"progress", no_argument,NULL, 'P'},

       {"waldir", required_argument,NULL, 1},

       {"no-slot", no_argument, NULL,2},

       {"no-verify-checksums",no_argument, NULL, 3},

       {NULL, 0, NULL, 0}

   };

 

流程

1、上层流程


1)先对传入的参数进行互斥检测,必须指定备份路径-D,format指定t模式时才可以使用压缩级别compresslevel。仅includewal为流复制模式时才可以使用复制槽。no_slot下不使用复制槽和temp_replication_slot。create_slot即指定-C时必须使用复制槽。xlog_dir下必须使用format为p即plain模式,且必须使用绝对路径。

2)通过GetConnection函数连接主,返回连接conn

3)format为p模式下,如果-D指定的目录不存在则创建该目录,若存在,则这个目录必须为空

4)通过RetrieveWalSegSize函数得到远程WAL文件大小WalSegSz,通过执行SHOWwal_segment_size得到:

    postgres=# show wal_segment_size;
    -------------------------------
    16MB
    (1 row)

    5)调用函数BaseBackup进行全量备份。


    2、BaseBackup


    1)如果指定-R创建recovery.conf文件,那么先在内存中产生内容:

      standby_mode=’on’

     primary_conninfo=’replication= dbname=  fallback_application_name=’

     primary_slot_name=’’

      在备份完成后,写入recovery.conf文件WriteRecoveryConf();

    2)调用RunIdentifySystem向主发送IDENTIFY_SYSTEM命令,获取系统标识及时间线,例如:

      psql “dbname=postgres replication=database”-c “IDENTIFY_SYSTEM;”
      systemid    timeline   xlogpos  dbname
      ------------------+--------+----------+--------
      69516718657589179 |       1| 0/80000D8| postgres
      (1 row)

        主接收到命令后由函数exec_replication_command进行处理:IdentifySystem();时间线为主机的ThisTimeLineID。(这个值主上怎么更新?)

      3)生成BASE BACKUP命令,并向主发送。得到wal起始位置xlogstart和起始时间线starttli,表空间个数tablespacecount和循环计算得到文件总数totalsize?

      4)如果时流复制拉取,那么调用函数StartLogStreamer初始化后台进程用于接收WAL,会启动一个进程。

      这里请求的开始时间线9.3及之后版本为BASE_BACKUP获取的时间线值,否则为IDENTIFY_SYSTEM获取主上当前时间线值。

      StartLogStreamer(xlogstart, starttli, sysidentifier),注册流复制结构:


      typedef struct
      {
          PGconn    *bgconn;
          XLogRecPtr  startptr;
          char       xlog[MAXPGPATH];/* directory or tarfiledepending on mode */
          char      *sysidentifier;
          int        timeline;
      } logstreamer_param

       

        param->timeline = timeline;
        param->sysidentifier = sysidentifier;
        param->startptr = ((uint64) hi) << 32 | lo;//xlogstart转换
        //对齐文件头
        param->startptr -=XLogSegmentOffset(param->startptr, WalSegSz);
        param->bgconn = GetConnection();//另连接master server
        replication_slot//创建复制槽
        format为p模式创建archive_status目录
        bgchild = fork();
        if (bgchild == 0){//子进程
                /* in childprocess */
                exit(LogStreamerMain(param));
        }
        atexit(kill_bgchild_atexit);//父进程

        5)对于每个表空间:分别根据format指定的格式拉取数据,若是t则调用ReceiveTarFile接收tar文件,否则调用ReceiveAndUnpackTarFile接收tar文件并解压。这里接收的是数据文件。

        接收日志和接收数据不在同一个进程中,为流复制单独创建一个接收日志子进程,子进程接收日志开始的命令是START_REPLICATION,然后开启COPY流。

        数据的话应该是BASE_BACKUP,然后开启COPY流。

        6)接着根据指定的参数决定是否打印进度

        7)获取wal结束位置xlogend

        8)根据指定的参数决定是否打印wal end point点

        9)调用waitpid等待子进程退出

        10)最后将数据全部sync

         

        3、LogStreamerMain


        这个是一个子进程处理的内容,根据日志起始时间线及位置初始化流复制结构StreamCtl,然后调用函数ReceiveXlogStream进行流复制接收日志文件。

         

        4、ReceiveXlogStream


        1)首先判断时间线对应的history文件,不存在的话通过向主发送TIMELINE_HISTORY命令获取主对于history文件内容,然后写到本地。

        2)向主发送START_REPLICATION命令,开始复制,调用函数HandleCopyStream处理COPY流

        3)如果当前时间线的日志接收完,那么从下一个时间线开始重新接收。下一个时间线及其起始位置会由HandleCopyStream返回res中记录。下个时间线流复制开始位置会对齐到文件头位置。(也就是说总是从文件头开始复制)

        4)如果返回的结果状态时PGRES_COMMAND_OK表示复制结束

         

        目录
        相关文章
        |
        19天前
        |
        存储 缓存 算法
        HashMap深度解析:从原理到实战
        HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
        67 13
        |
        2月前
        |
        运维 持续交付 云计算
        深入解析云计算中的微服务架构:原理、优势与实践
        深入解析云计算中的微服务架构:原理、优势与实践
        76 1
        |
        3月前
        |
        存储 算法 Java
        解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
        在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
        64 3
        |
        5天前
        |
        存储 物联网 大数据
        探索阿里云 Flink 物化表:原理、优势与应用场景全解析
        阿里云Flink的物化表是流批一体化平台中的关键特性,支持低延迟实时更新、灵活查询性能、无缝流批处理和高容错性。它广泛应用于电商、物联网和金融等领域,助力企业高效处理实时数据,提升业务决策能力。实践案例表明,物化表显著提高了交易欺诈损失率的控制和信贷审批效率,推动企业在数字化转型中取得竞争优势。
        42 14
        |
        14天前
        |
        网络协议 安全 网络安全
        探索网络模型与协议:从OSI到HTTPs的原理解析
        OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
        62 1
        |
        2月前
        |
        运维 持续交付 虚拟化
        深入解析Docker容器化技术的核心原理
        深入解析Docker容器化技术的核心原理
        56 1
        |
        2月前
        |
        存储 供应链 算法
        深入解析区块链技术的核心原理与应用前景
        深入解析区块链技术的核心原理与应用前景
        61 0
        |
        2月前
        |
        算法 Java 数据库连接
        Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
        本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
        63 1
        |
        2月前
        |
        JavaScript 前端开发 API
        Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
        Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
        67 0
        |
        3月前
        |
        数据采集 存储 编解码
        一份简明的 Base64 原理解析
        Base64 编码器的原理,其实很简单,花一点点时间学会它,你就又消除了一个知识盲点。
        95 3