关于 PolarDB PostgreSQL 版
PolarDB PostgreSQL 版是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法;采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 、Ganos全空间数据处理能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB PostgreSQL 版具有大规模并行计算能力,可以应对 OLTP 与 OLAP 混合负载。
手动部署
基于PolarDB for PostgreSQL部署指南,用户可以在本地盘上创建单节点、多节点、多节点带备库等不同形态的集群。但美中不足的是,指南中介绍的过程都是通过源码来进行部署的,那在只有二进制或者RPM包的情况下,如何手动部署PolarDB for PostgreSQL的共享存储形态呢?
首先,通过上述指南可以得到所需的二进制:
二进制路径为/home/postgres/tmp_basedir_polardb_pg_1100_bld,内容如下:
bin路径:包含PolarDB for PostgreSQL运行所需要的服务端进程二进制postgres,以及数据库初始化、运行、配置等所需要的工具二进制,比如:initdb、polar-initdb.sh、polar_basebackup等。
include路径:源码编译过程中所使用的头文件,也可在基于当前已有二进制编译第三方插件源码时使用;
lib路径:插件二进制及其配置文件,CEATE EXTENSION时,服务端进程会到该路径下加载对应插件的二进制;
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备注:如果后期PolarDB for PostgreSQL发布了RPM包,则可以直接使用RPM包中的二进制,路径和上述描述保持一致。
环境变量配置
在.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创建RW节点
初始化RW
initdb -D $RW_DATADIR
# 创建并初始化共享存储路径
mkdir $RW_SHARED_DATADIR
polar-initdb.sh $RW_DATADIR $RW_SHARED_DATADIR localfs修改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全部配置上启动与检查
pg_ctl start -D $RW_DATADIRpsql -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;'创建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');"创建RO节点
初始化RO节点
由于RO节点与RW节点共享一份存储(即$RO_SHARED_DATADIR和$RW_SHARED_DATADIR一致),因此,其本地路径$RO_DATADIR可以直接拷贝RW节点的本地路径$RW_DATADIR
cp -frp $RW_DATADIR $RO_DATADIR修改RW的配置文件:
删除polar_node_static.conf文件和postmaster.pid文件
polar_node_static.conf文件是一个临时文件,为了防止重要参数被恶意修改的行为,新建RO节点时可以删除;
postmaster.pid是初始化RO节点时从RW节点本地路径下拷贝过来的,可以删除。
rm $RO_DATADIR/polar_node_static.conf
rm $RO_DATADIR/postmaster.pid打开postgresql.conf文件,增加如下配置
port=5433 #填写环境变量$RO_PORT的值
polar_hostid=2 #节点ID,不同节点的hostid保持不同增加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启动
pg_ctl start -D $RO_DATADIR检查:
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);"RO查询数据
psql -h $RO_HOST -p $RO_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select * from t;"创建Standby
使用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修改配置文件
打开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 #开启并行回放打开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启动和检查
启动
pg_ctl start -D $STANDBY_DATADIR检查
psql -h $STANDBY_HOST -p $STANDBY_PORT -U $POLARDB_USER -d $POLARDB_DATABASE -c "select * from t;"共享存储配置介绍
参数polar_datadir
PolarDB for PostgreSQL是基于 Shared-Storage 的存储计算分离架构,数据库内核为了支持共享存储,额外添加了参数polar_datadir用来配置共享存储的路径,数据库内核会将数据默认存放到polar_datadir路径下。
参数格式:polar_datadir=[protocol://]path
"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的接口; |
关于共享存储路径协议的实现,放到后期VFS模块的分享中进行讲解。
参数polar_hostid
PolarDB for PostgreSQL集群的每一个节点均分配一个唯一的hostid,有两个用途:
在使用PolarDB File System的接口mount共享存储盘时需要传入该值;
在“共享存储多写问题主动发现与止损功能”中使用,用于标识共享存储当前的属主节点,该功能介绍在之后的共享存储的分享中将会讲到。
参数polar_enable_shared_storage_mode
PolarDB for PostgreSQL内核添加该参数用于控制是否打开共享存储模式;
参数polar_vfs.localfs_mode
PolarDB for PostgreSQL提供了polar_vfs插件来实现存储层I/O的抽象,其中polar_vfs.localfs_mode参数打开后,可以使用本地盘来模拟共享存储盘。
脚本polar-initdb.sh
该脚本用来初始化共享存储路径下的内容。具体操作是将本地路径的子路径(base、global、pg_wal、pg_logindex、pg_xact、pg_csnlog、pg_twophase等)的内容一一拷贝到共享存储路径下。
参数polar_replica
recovery.conf中添加polar_replica参数,用来表明该备库是一个RO节点,流复制协议将采用RW-RO间的流复制协议,RW-RO间流复制协议将在后期流复制的分享中进行讲解。
参数polar_enable_parallel_replay_standby_mode




