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

PolarDB PostgreSQL版的计算节点扩缩容(下)

PolarDB农夫山泉 2023-06-26
238

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

PolarDB for PostgreSQL 是一款存储与计算分离的数据库,所有计算节点共享存储,并可以按需要弹性增加或删减计算节点而无需做任何数据迁移,本文将协助您在共享存储集群上添加或删除计算节点,分两部分内容介绍,该篇介绍集群的扩缩容。

集群扩容

接下来,在已经有一个读写节点的计算集群中扩容一个新的计算节点。由于 PolarDB for PostgreSQL 是一写多读的架构,所以后续扩容的节点只可以对共享存储进行读取,但无法对共享存储进行写入。只读节点通过与读写节点进行物理复制来保持内存状态的同步。

类似地,在用于部署新计算节点的机器上,拉取镜像并启动带有可执行文件的容器:

docker pull polardb/polardb_pg_binary:pfs
docker run -it \
    --cap-add=SYS_PTRACE \
    --privileged=true \
    --name polardb_pg \
    --shm-size=512m \
    polardb/polardb_pg_binary:pfs \
    bash

确认存储可访问

确保部署只读节点的机器也可以访问到共享存储的块设备:

$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0   40G  0 disk
└─nvme0n1p1 259:1    0   40G  0 part /etc/hosts
nvme1n1     259:2    0  100G  0 disk

挂载 PFS 文件系统

由于此时共享存储已经被读写节点格式化为 PFS 格式了,因此这里无需再次进行格式化。只需要启动 PFS 守护进程完成挂载即可:

sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme1n1 -w 2

初始化数据目录

在只读节点本地磁盘的 ~/replica1 路径上创建一个空目录,然后通过 polar-replica-initdb.sh 脚本使用共享存储上的数据目录来初始化只读节点的本地目录。初始化后的本地目录中没有默认配置文件,所以还需要使用 initdb 创建一个临时的本地目录模板,然后将所有的默认配置文件拷贝到只读节点的本地目录下:

mkdir -m 0700 $HOME/replica1
sudo ~/tmp_basedir_polardb_pg_1100_bld/bin/polar-replica-initdb.sh \
    /nvme1n1/shared_data/ $HOME/replica1/

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D /tmp/replica1
cp /tmp/replica1/*.conf $HOME/replica1/

编辑只读节点配置

编辑只读节点的配置文件 ~/replica1/postgresql.conf,配置好只读节点的集群标识和监听端口,以及与读写节点相同的共享存储目录:

port=5432 polar_hostid=2 polar_enable_shared_storage_mode=on polar_disk_name='nvme1n1' polar_datadir='/nvme1n1/shared_data/' polar_vfs.localfs_mode=off shared_preload_libraries='$libdir/polar_vfs,$libdir/polar_worker' polar_storage_cluster_name='disk' logging_collector=on log_line_prefix='%p\t%r\t%u\t%m\t' log_directory='pg_log' listen_addresses='*' max_connections=1000

编辑只读节点的复制配置文件 ~/replica1/recovery.conf,配置好当前节点的角色(只读),以及从读写节点进行物理复制的连接串和复制槽:

polar_replica='on'
recovery_target_timeline='latest'
primary_conninfo='host=[读写节点所在IP] port=5432 user=postgres dbname=postgres application_name=replica1'
primary_slot_name='replica1'

由于读写节点上暂时还没有名为 replica1 的复制槽,所以需要连接到读写节点上,创建这个复制槽:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5432 \
    -d postgres \
    -c "SELECT pg_create_physical_replication_slot('replica1');"
 pg_create_physical_replication_slot
-------------------------------------
 (replica1,)
(1 row)

启动只读节点

完成上述步骤后,启动只读节点并验证:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl -D $HOME/replica1 start

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5432 \
    -d postgres \
    -c 'SELECT version();'
            version
--------------------------------
 PostgreSQL 11.9 (POLARDB 11.9)
(1 row)

集群功能检查

连接到读写节点上,创建一个表并插入数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5432 \
    -d postgres \
    -c "CREATE TABLE t(id INT); INSERT INTO t SELECT generate_series(1,10);"

在只读节点上可以立刻查询到从读写节点上插入的数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5432 \
    -d postgres \
    -c "SELECT * FROM t;"
 id
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

从读写节点上可以看到用于与只读节点进行物理复制的复制槽已经处于活跃状态:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5432 \
    -d postgres \
    -c "SELECT * FROM pg_replication_slots;"
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 replica1  |        | physical  |        |          | f         | t      |         45 |      |              | 0/4079E8E8  |
(1 rows)

依次类推,使用类似的方法还可以横向扩容更多的只读节点。

集群缩容

集群缩容的步骤较为简单:将只读节点停机即可。

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl -D $HOME/replica1 stop

在只读节点停机后,读写节点上的复制槽将变为非活跃状态。非活跃的复制槽将会阻止 WAL 日志的回收,所以需要及时清理。

在读写节点上执行如下命令,移除名为 replica1 的复制槽:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \
    -p 5432 \
    -d postgres \
    -c "SELECT pg_drop_replication_slot('replica1');"
 pg_drop_replication_slot
--------------------------

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

文章被以下合辑收录

评论