暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB PostgreSQL版手动部署与共享存储配置介绍

内核开发者 2023-08-03
1133

关于 PolarDB PostgreSQL 版

PolarDB PostgreSQL 版是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法;采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 、Ganos全空间数据处理能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB PostgreSQL 版具有大规模并行计算能力,可以应对 OLTP 与 OLAP 混合负载。

手动部署

基于PolarDB for PostgreSQL部署指南,用户可以在本地盘上创建单节点、多节点、多节点带备库等不同形态的集群。但美中不足的是,指南中介绍的过程都是通过源码来进行部署的,那在只有二进制或者RPM包的情况下,如何手动部署PolarDB for PostgreSQL的共享存储形态呢?

  1. 首先,通过上述指南可以得到所需的二进制:

    1. 二进制路径为/home/postgres/tmp_basedir_polardb_pg_1100_bld,内容如下:

      1. bin路径:包含PolarDB for PostgreSQL运行所需要的服务端进程二进制postgres,以及数据库初始化、运行、配置等所需要的工具二进制,比如:initdb、polar-initdb.sh、polar_basebackup等。

      2. include路径:源码编译过程中所使用的头文件,也可在基于当前已有二进制编译第三方插件源码时使用;

      3. lib路径:插件二进制及其配置文件,CEATE EXTENSION时,服务端进程会到该路径下加载对应插件的二进制;

      4. share路径:数据库初始化所需要的配置文件模版、sql脚本等及其相关说明文档。

postgres@e52fcdf15e86:~/tmp_basedir_polardb_pg_1100_bld$ pwd
/home/postgres/tmp_basedir_polardb_pg_1100_bld
postgres@e52fcdf15e86:~/tmp_basedir_polardb_pg_1100_bld$ ls
bin  include  lib  share
postgres@e52fcdf15e86:~/tmp_basedir_polardb_pg_1100_bld$ ls bin/
clusterdb   dbatools.sql  ecpg      pg_archivecleanup  pg_controldata  pg_dumpall     pg_recvlogical  pg_rewind      pg_test_timing       pg_waldump       polar-replica-initdb.sh  postgres    reindexdb
createdb    dropdb        initdb    pg_basebackup      pg_ctl          pg_isready     pg_resetwal     pg_standby     pg_upgrade           pgbench          polar_basebackup         postmaster  vacuumdb
createuser  dropuser      oid2name  pg_config          pg_dump         pg_receivewal  pg_restore      pg_test_fsync  pg_verify_checksums  polar-initdb.sh  polar_tools              psql        vacuumlo
  1. 备注:如果后期PolarDB for PostgreSQL发布了RPM包,则可以直接使用RPM包中的二进制,路径和上述描述保持一致。

  2. 环境变量配置

  3. 在.bash_profile中,添加一些环境变量,有助于方便调用PolarDB for PostgreSQL的各种命令:

export POLARDB_HOME=/home/postgres/tmp_basedir_polardb_pg_1100_bld/
export PATH=$POLARDB_HOME/bin/:$PATH
export POLARDB_USER='postgres'
export POLARDB_DATABASE='postgres'

export RW_DATADIR=/home/postgres/rw_datadir/
export RW_SHARED_DATADIR=/home/postgres/shared_datadir/
export RW_HOST=127.0.0.1
export RW_PORT=5432

export RO_DATADIR=/home/postgres/ro_datadir/
export RO_SHARED_DATADIR=/home/postgres/shared_datadir/ #RW和RO的共享存储路径保持一致
export RO_HOST=127.0.0.1
export RO_PORT=5433

export STANDBY_DATADIR=/home/postgres/standby_datadir/
export STANDBY_SHARED_DATADIR=/home/postgres/standby_shared_datadir/ #standby有自己独立的一份共享存储
export STANDBY_HOST=127.0.0.1
export STANDBY_PORT=5434
  1. 创建RW节点

    1. 初始化RW

initdb -D $RW_DATADIR
# 创建并初始化共享存储路径
mkdir $RW_SHARED_DATADIR
polar-initdb.sh $RW_DATADIR $RW_SHARED_DATADIR localfs
  1. 修改RW的配置文件:打开postgresql.conf文件,增加如下配置

port=5432 #填写环境变量$RW_PORT的值
polar_hostid=1 #节点ID,不同节点的hostid保持不同
polar_enable_shared_storage_mode=on #打开共享存储模式
polar_datadir='file-dio:///home/postgres/shared_datadir/' #填写环境变量$RW_SHARED_DATADIR的值,其中file-dio://是协议头,表明本地盘DIO模式
polar_vfs.localfs_mode=on #开启本地盘模式
logging_collector=on #打开日志记录功能
log_line_prefix='%p\t%r\t%u\t%m\t' #日志记录的格式
log_directory='pg_log' #日志记录的存储路径
listen_addresses='*' #监听所有地址
synchronous_standby_names='replica1,standby1' #配置同步流复制slot,将RO和Standby节点的slot全部配置上
  1. 启动与检查

pg_ctl start -D $RW_DATADIR
psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c 'select version();'
psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c 'show polar_release_date;'
  1. 创建RO和Standby节点的物理流复制slot

psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select pg_create_physical_replication_slot('replica1');"
psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select pg_create_physical_replication_slot('standby1');"
  1. 创建RO节点

    1. 初始化RO节点

      1. 由于RO节点与RW节点共享一份存储(即$RO_SHARED_DATADIR和$RW_SHARED_DATADIR一致),因此,其本地路径$RO_DATADIR可以直接拷贝RW节点的本地路径$RW_DATADIR

cp -frp $RW_DATADIR $RO_DATADIR
  1. 修改RW的配置文件:

    1. 删除polar_node_static.conf文件和postmaster.pid文件

      1. polar_node_static.conf文件是一个临时文件,为了防止重要参数被恶意修改的行为,新建RO节点时可以删除;

      2. postmaster.pid是初始化RO节点时从RW节点本地路径下拷贝过来的,可以删除。

rm $RO_DATADIR/polar_node_static.conf
rm $RO_DATADIR/postmaster.pid
  1. 打开postgresql.conf文件,增加如下配置

port=5433 #填写环境变量$RO_PORT的值
polar_hostid=2 #节点ID,不同节点的hostid保持不同
  1. 增加recovery.conf文件,增加如下配置

polar_replica='on' #设置流复制为RO模式
recovery_target_timeline='latest'
primary_slot_name='replica1' #设置流复制使用的slot
primary_conninfo='host=127.0.0.1 port=5432 user=postgres dbname=postgres application_name=replica1' #host对应$RW_HOST,port对应$RW_PORT,user对应$POLARDB_USER,dbname对应$POLARDB_DATABASE
  1. 启动

pg_ctl start -D $RO_DATADIR
  1. 检查:

    1. RW插入数据

psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "create table t(t1 int primary key, t2 int);"
psql -h $RW_HOST -p $RW_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "insert into t values (1, 1),(2, 3),(3, 3);"
  1. RO查询数据

psql -h $RO_HOST -p $RO_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select * from t;"
  1. 创建Standby

    1. 使用polar_basebackup工具生成standby节点

polar_basebackup --pgdata=$STANDBY_DATADIR --polardata=$STANDBY_SHARED_DATADIR --host=$RW_HOST --port=$RW_PORT --no-sync --write-recovery-conf --format=plain -X fetch
  1. 修改配置文件

    1. 打开postgresql.conf文件,增加如下配置

port=5434 #填写环境变量$RO_PORT的值
polar_hostid=3 #节点ID,不同节点的hostid保持不同
polar_datadir='/home/postgres/standby_shared_datadir' #设置为环境变量$STANDBY_SHARED_DATADIR
polar_enable_parallel_replay_standby_mode=on #开启并行回放
  1. 打开recovery.conf文件,增加如下配置

standby_mode=on #设置流复制为Standby模式
recovery_target_timeline='latest'
primary_slot_name='standby1' #设置流复制slot
primary_conninfo='host=127.0.0.1 port=5432 user=postgres dbname=postgres application_name=standby1' #host对应$RW_HOST,port对应$RW_PORT,user对应$POLARDB_USER,dbname对应$POLARDB_DATABASE
  1. 启动和检查

    1. 启动

pg_ctl start -D $STANDBY_DATADIR
  1. 检查

psql -h $STANDBY_HOST -p $STANDBY_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select * from t;"

共享存储配置介绍

  1. 参数polar_datadir

    1. PolarDB for PostgreSQL是基于 Shared-Storage 的存储计算分离架构,数据库内核为了支持共享存储,额外添加了参数polar_datadir用来配置共享存储的路径,数据库内核会将数据默认存放到polar_datadir路径下。

    2. 参数格式:polar_datadir=[protocol://]path

      1. "protocol://" 是可选字段,有三种可选项:file://、file-dio://、pfsd://,含义分别如下:(默认情况下,polar_datadir路径下文件读/写默认采用file://方式)

file://

polar_datadir路径下的文件读/写均采用Buffer I/O方式;

file-dio://

polar_datadir路径下的文件读/写均采用Direct I/O方式;

pfsd://

polar_datadir路径下的文件读/写均采用PolarDB File System的接口;

  1. 关于共享存储路径协议的实现,放到后期VFS模块的分享中进行讲解。

  2. 参数polar_hostid

  3. PolarDB for PostgreSQL集群的每一个节点均分配一个唯一的hostid,有两个用途:

    1. 在使用PolarDB File System的接口mount共享存储盘时需要传入该值;

    2. 在“共享存储多写问题主动发现与止损功能”中使用,用于标识共享存储当前的属主节点,该功能介绍在之后的共享存储的分享中将会讲到。

  4. 参数polar_enable_shared_storage_mode

    1. PolarDB for PostgreSQL内核添加该参数用于控制是否打开共享存储模式;

  5. 参数polar_vfs.localfs_mode

    1. PolarDB for PostgreSQL提供了polar_vfs插件来实现存储层I/O的抽象,其中polar_vfs.localfs_mode参数打开后,可以使用本地盘来模拟共享存储盘。

  6. 脚本polar-initdb.sh

    1. 该脚本用来初始化共享存储路径下的内容。具体操作是将本地路径的子路径(base、global、pg_wal、pg_logindex、pg_xact、pg_csnlog、pg_twophase等)的内容一一拷贝到共享存储路径下。

  7. 参数polar_replica

    1. recovery.conf中添加polar_replica参数,用来表明该备库是一个RO节点,流复制协议将采用RW-RO间的流复制协议,RW-RO间流复制协议将在后期流复制的分享中进行讲解。

  8. 参数polar_enable_parallel_replay_standby_mode

    1. 该参数在Standby节点上开启WAL日志并行回放机制,WAL日志并行回放机制的介绍文档可参见之前分享的文章

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论