全部产品
云市场

如何建立基于RDS PostgreSQL的备库

更新时间:2019-10-08 17:53:38

如何建立基于RDS PostgreSQL的备库

如果用户需要构建一个和RDS for PostgreSQL一模一样的备库,则可以通过流复制或者归档来完成。同时用户可以通过这种方法搭建自己的备库,在RDS没有提供异地容灾服务前,进行异地容灾。

步骤如下

  1. 准备备库环境
  2. 准备一个拥有replication角色的用户
  3. 配置外网地址(可选)
  4. 配置白名单,测试连通性正常
  5. 下载全量备份集,测试归档的下载接口是否正常
  6. 配置postgresql.conf, recovery.conf
  7. 启动备库,检查是否同步

详细步骤

1. 准备备库环境

  • 安装CentOS 6.x x64,步骤略。

    线上RDS PostgreSQL版本为9.4.x,所以备库环境也需要安装9.4的大版本,我们可以安装9.4.6,关注一下release notes,确保兼容性。

    PS:目前阿里RDS PostgreSQL软件还没有下载或开源,如果将来开放下载或开源的话,建议安装阿里云提供的PostgreSQL版本,可以保证兼容性,以及出问题可以找到阿里云的PostgreSQL内核团队修复。

  • 确保与线上版本编译参数一致,包括插件版本。只需要关注如下

    1. select name,setting from pg_settings;
    2. block_size | 8192
    3. wal_block_size | 8192
    4. rds_available_extensions | plpgsql,pg_stat_statements,btree_gin,btree_gist,chkpass,citext,cube,dblink,dict_int,earthdistance,hstore,intagg,intarray,isn,ltree,pgcrypto,pgrowlocks,pg_prewarm,pg_trgm,postgres_fdw,sslinfo,tablefunc,tsearch2,unaccent,postgis,postgis_topology,fuzzystrmatch,postgis_tiger_geocoder,plperl,pltcl,plv8,plls,plcoffee,“uuid-ossp”,zhparser,pgrouting,rdkit,pg_hint_plan,pgstattuple
  • 安装软件

    1. wget https://ftp.postgresql.org/pub/source/v9.4.6/postgresql-9.4.6.tar.bz2
    2. tar -jxvf postgresql-9.4.6.tar.bz2
    3. cd postgresql-9.4.6
    4. ./configure prefix=/home/postgres/pgsql9.4.6 with-blocksize=8 with-wal-blocksize=8
    5. gmake -j 32 world
    6. gmake install-world
  • 配置环境变量

    1. # vi ~/env_pg.sh
    2. export PS1=“$USER@`/bin/hostname -s`-> “
    3. export PGPORT=1921
    4. export PGDATA=/data01/pgdata
    5. export LANG=en_US.utf8
    6. export PGHOME=/home/postgres/pgsql9.4.6
    7. export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
    8. export DATE=`date +“%Y%m%d%H%M”`
    9. export PATH=$PGHOME/bin:$PATH:.
    10. export MANPATH=$PGHOME/share/man:$MANPATH
    11. export PGHOST=$PGDATA
    12. export PGDATABASE=postgres
    13. export PGUSER=postgres
    14. alias rm=‘rm -i’
    15. alias ll=‘ls -lh’
    16. unalias vi
    17. postgres@digoal-> . ./env_pg.sh
    18. -bash: unalias: vi: not found
    19. postgres@digoal-> psql -V
    20. psql (PostgreSQL) 9.4.6
  • 以下插件如果没有用到可以不安装,否则需要手动安装,安装方法见相应的插件官网:

    1. postgis
    2. plv8
    3. plls
    4. plcoffee
    5. zhparser
    6. pgrouting
    7. rdkit
    8. pg_hint_plan
  • 规划空间

    目录空间至少要大于你所购买的RDS的容量规格,例如我买的是5G的实例,那么我本地的单个目录的空间要大于5GB。

    PS:目前RDS PostgreSQL不支持自定义表空间,所以所有的数据都是放在默认表空间的,也即是需要单个目录的空间大于购买规格的空间的原因。将来如果RDS开放了创建表空间的权限,可以重新规划本地的目录。

    1. [root@digoal ~]# df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/sda2 39G 22G 15G 61% /
    4. tmpfs 3.9G 0 3.9G 0% /dev/shm
    5. /dev/sdb 20G 44M 19G 1% /data01

2. 准备一个拥有replication角色的用户

用户创建的初始账号拥有replication角色。用户可以根据快速入门-创建数据库和账号的介绍来创建初始账号。

3. 配置公网连接(可选)

如果你需要将RDS复制到阿里云以外的主机,或者RDS和ECS在不同的可用区,则需要通过公网来连接。在管理控制台的RDS实例管理中可以申请公网地址。

4. 配置白名单

在阿里云管理控制台的RDS->实例管理 -> 数据安全下配置白名单,如果备库的出口IP是固定的,则将这个IP添加到白名单,如果不是固定的IP,则需要添加0.0.0.0。然后测试连通性是否正常。

5. 下载全量备份集

在控制台下载最近的一次全量备份集。

6. 测试归档的下载接口是否正常

归档文件的下载需要通过调用API DescribeBinlogFiles完成。

什么情况下需要用到API呢?当备库需要的XLOG文件已经被主库删除时。这种情况通常发生在自建的备库和主库网络异常,或者自建的备库由于某些原因停库后,长时间没有接收来自RDS PostgreSQL的XLOG,这些XLOG在RDS归档后就会从线上数据库的WAL日志中清除。

如果发现自建的备库报需要获取的XLOG不存在的错误,这个时候就需要从OSS下载归档了。

如果连OSS中都无法找到需要的归档,说明归档也清除了,那么就需要重建备库,回到第五步骤。

7. 测试数据库的流复制连通性

请替换成您自己的RDS实例连接信息进行测试

  1. postgres@digoal-> psql “replication=true” -h xxxx.pg.rds.aliyuncs.com -p 3433 -U digoal
  2. Password for user digoal:
  3. psql (9.4.6, server 9.4.1)
  4. Type “help” for help.
  5. postgres=> IDENTIFY_SYSTEM;
  6. systemid | timeline | xlogpos | dbname
  7. ——————————-+—————+——————+————
  8. 6165616856935119759 | 3 | 0/6B3A0180 |
  9. (1 row)

8. 配置postgresql.conf, recovery.conf

解压全量备份集到规划好的目录/data01/pgdata。

配置 postgresql.conf在文件末尾追加如下:

  1. # add by digoal
  2. port=1921
  3. unix_socket_directories=‘.’
  4. tcp_keepalives_idle = 70
  5. tcp_keepalives_interval = 10
  6. tcp_keepalives_count = 10
  7. log_destination=‘csvlog’
  8. logging_collector=on
  9. log_truncate_on_rotation=on
  10. log_line_prefix = ‘’
  11. log_checkpoints = on
  12. log_connections = on
  13. log_disconnections = on
  14. log_error_verbosity = verbose
  15. hot_standby = on
  16. max_standby_archive_delay = 300s
  17. max_standby_streaming_delay = 300s
  18. wal_receiver_status_interval = 1s
  19. hot_standby_feedback = on
  20. log_statement=‘none’
  21. archive_mode=on
  22. archive_command = ‘/bin/date’
  23. track_io_timing=off
  24. listen_addresses=‘0.0.0.0’

配置recovery.conf,请替换成您自己的RDS实例连接信息:

  1. standby_mode = ‘on’
  2. primary_conninfo = ‘host=xxxxxx.pg.rds.aliyuncs.com user=digoal password=xxxx port=3433’
  3. recovery_target_timeline = ‘latest’

9. 启动备库,检查是否同步

  1. pg_ctl start

RDS中操作

  1. postgres@digoal-> psql -h xxxx.pg.rds.aliyuncs.com -p 3433 -U digoal postgres
  2. Type “help” for help.
  3. postgres=> create table test(id timestamp);
  4. postgres=> insert into test values (now());
  5. postgres=> update test set id=now() returning ;
  6. postgres=> \watch 1

备库中操作

  1. postgres@digoal-> psql -h 127.0.0.1 -p 1921 -U digoal postgres
  2. Type “help” for help.
  3. postgres=> select from test;
  4. postgres=> \watch 1

查看是否能同步

风险点评估

建议不要使用replication slot, 因为slot会导致主节点不删除XLOG, 从而可能因为网络堵塞、备库异常等无法实时接收XLOG,这种情况会导致主节点因为保留pg_xlog而把空间用满