PolarDB 开源基础教程系列 3 安装部署

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PolarDB 安装部署指南涵盖了从单机版到集群版的详细步骤。内容包括:1. **单机版安装**:通过Docker镜像`polardb_pg_local_instance`,提供快速搭建PolarDB学习或开发环境的方法,支持多种操作系统。2. **集群版安装(ECS + ESSD)**:在阿里云ECS上部署两台计算节点,并使用ESSD作为共享存储,通过PFS(PolarDB File System)实现存算分离和读写分离的集群架构。

PolarDB 安装部署

本节阅读导航

0、人肉部署PolarDB数据库实例单机版

1、安装部署 PolarDB 单机版

2、安装部署 PolarDB 集群版(on ECS + ESSD)

3、更多部署环境

0、人肉部署PolarDB数据库实例单机版

手工初始化PolarDB数据库实例单机版(其实非严格意义的单机版, 还是把共享数据和计算节点数据拆成了2个目录.)

如果你想使用单机版, 尽量使用polardb_pg_local_instance镜像. 下面为了帮助大家理解初始化过程, 使用polardb_pg_binary分解演示初始化实例的过程.

拉取镜像

# 公开课系列采用PolarDB 11版本, 因为目前PolarDB 15版本还有一些功能还没有开源(例如mpp)无法进行学习  
docker pull registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_binary:11  
  
# 方便后续使用 polardb/polardb_pg_binary, 打个标记  
docker tag registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_binary:11 polardb/polardb_pg_binary

启动容器, 将数据放在宿主机中

mkdir ~/pb_local_single  
cd ~/pb_local_single  
POLAR_DATA_DIR=/var/polardb  
  
docker run -it -P -d \
    --cap-add=SYS_PTRACE \
    --cap-add SYS_ADMIN \
    --privileged=true \
    --name pb_local_single \
    --shm-size=1g \
    -v ${PWD}:${POLAR_DATA_DIR} \
    polardb/polardb_pg_binary

前面提到: 部署单机版, 建议尽量使用polardb_pg_local_instance镜像, 因为接下来的初始化过程还是参考了polardb_pg_local_instance镜像里的docker-entrypoint.sh

进入容器

docker exec -ti pb_local_single bash

初始化实例

POLAR_DATA_DIR=/var/polardb  
echo "POLAR_DATA_DIR=/var/polardb" >> ~/.bashrc  
echo "export PGDATA=\${POLAR_DATA_DIR}/primary" >> ~/.bashrc  
. ~/.bashrc  
  
initdb -k -U postgres -D ${POLAR_DATA_DIR}/primary

配置参数

echo "  
max_connections = 100  
polar_wal_pipeline_enable = true  
polar_create_table_with_full_replica_identity = off  
logging_collector = on  
log_directory = 'pg_log'  
shared_buffers = '1GB'  
synchronous_commit = on  
full_page_writes = off  
autovacuum_naptime = 10min  
max_worker_processes = 32  
polar_use_statistical_relpages = off  
polar_enable_persisted_buffer_pool = off  
polar_nblocks_cache_mode = 'all'  
polar_enable_replica_use_smgr_cache = on  
polar_enable_standby_use_smgr_cache = on  
polar_enable_flashback_log = on  
polar_enable_fast_recovery_area = on  
polar_vfs.localfs_mode = true  
polar_enable_localfs_test_mode = on  
polar_enable_shared_storage_mode = on  
listen_addresses = '0.0.0.0'  
polar_disk_name = 'var'  
polar_datadir = 'file-dio://${POLAR_DATA_DIR}/shared_datadir'  
shared_preload_libraries = 'polar_px,polar_vfs,polar_worker,pg_stat_statements,auth_delay,auto_explain,polar_monitor_preload,polar_stat_sql,timescaledb'  
port = 5432  
polar_hostid = 1  
polar_enable_px=0  
polar_px_enable_check_workers=0  
polar_px_enable_replay_wait=1  
polar_px_dop_per_node=3  
polar_px_max_workers_number=0  
polar_px_enable_cte_shared_scan=1  
polar_px_enable_partition=1  
polar_px_enable_left_index_nestloop_join=1  
polar_px_wait_lock_timeout=1800000  
polar_px_enable_partitionwise_join=1  
polar_px_optimizer_multilevel_partitioning=1  
polar_px_max_slices=1000000  
polar_px_enable_adps=1  
polar_px_enable_adps_explain_analyze=1  
polar_trace_heap_scan_flow=1  
polar_px_enable_spi_read_all_namespaces=1  
" >> ${POLAR_DATA_DIR}/primary/postgresql.conf  
  
echo "  
host  all all 0.0.0.0/0 md5  
" >> ${POLAR_DATA_DIR}/primary/pg_hba.conf  
  
echo "  
primary_conninfo = 'host=127.0.0.1 port=5432 user=postgres dbname=postgres application_name=replica1'  
primary_slot_name = 'replica1'  
polar_replica = on  
recovery_target_timeline = 'latest'  
" > ${POLAR_DATA_DIR}/primary/recovery.done

将共享数据从计算节点数据目录中剥离出去

mkdir ${POLAR_DATA_DIR}/shared_datadir/  
polar-initdb.sh ${POLAR_DATA_DIR}/primary/ ${POLAR_DATA_DIR}/shared_datadir/ localfs

启动PolarDB

pg_ctl start

此时只有一个RW节点, 存储如下:

  • 计算节点数据文件目录 ${POLAR_DATA_DIR}/primary/
  • 共享数据目录 ${POLAR_DATA_DIR}/shared_datadir/
$ psql  
psql (11.9)  
Type "help" for help.  
  
postgres=# select version();  
            version               
--------------------------------  
 PostgreSQL 11.9 (POLARDB 11.9)  
(1 row)  
postgres=# create table test (id int);  
CREATE TABLE  
postgres=# insert into test select generate_series(1,100);  
INSERT 0 100

1、安装部署 PolarDB 单机版

提示, 本文安装PolarDB都使用了阿里云预制docker镜像, 如果你想在物理机或ecs层面安装PolarDB, 有很多依赖包要安装, 不过不用担心, 可以参考PolarDB docker image制作文件Dockerfile, 支持大多数操作系统:

  • ubuntu24.04: use ubuntu:24.04 as base OS
  • ubuntu22.04: use ubuntu:22.04 as base OS
  • ubuntu20.04: use ubuntu:20.04 as base OS
  • debian12: use debian:12 as base OS
  • debian11: use debian:11 as base OS
  • rocky9: use rockylinux:9 as base OS
  • rocky8: use rockylinux:8 as base OS
  • anolis8: use openanolis/anolisos:8.6 as base OS
  • centos7 (DEPRECATED): use centos:centos7 as base OS

PS:

  • 前置条件, 请在本机先安装docker desktop.
  • 注意将文中命令内出现的${your_data_dir}替换为你实际的目录全路径.

在单机文件系统(如 ext4)上部署 PolarDB-PG,适用于所有PolarDB计算节点都可以访问相同本地磁盘存储的场景。

单机版通常用于快速搭建PolarDB学习或开发环境.

1.1、拉取镜像

我们在 DockerHub 上提供了 PolarDB-PG 的 本地实例镜像,里面已包含启动 PolarDB-PG 本地存储实例的入口脚本。镜像目前支持 linux/amd64linux/arm64 两种 CPU 架构。

# 公开课系列采用PolarDB 11版本, 因为目前PolarDB 15版本还有一些功能还没有开源(例如mpp)无法进行学习
docker pull registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_local_instance:11
# 方便后续使用polardb/polardb_pg_local_instance, 打个标记
docker tag registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_local_instance:11 polardb/polardb_pg_local_instance

1.2、初始化数据库

在本机新建一个空白目录 ${your_data_dir} 作为 PolarDB-PG 实例的数据目录。启动容器时,将该目录作为 VOLUME 挂载到容器内,对数据目录进行初始化。在初始化的过程中,可以传入环境变量覆盖默认值:

  • POLARDB_PORT:PolarDB-PG 运行所需要使用的端口号,默认值为 5432;镜像将会使用三个连续的端口号(默认 5432-5434
  • POLARDB_USER:初始化数据库时创建默认的 superuser(默认 postgres
  • POLARDB_PASSWORD:默认 superuser 的密码

还可以传入其他变量(POLARDB_USER,POLARDB_PASSWORD,POLARDB_PORT,POLARDB_DATA_DIR,PGHOST), 有一些变量在docker-entrypoint.sh中会被用到. 可参考该镜像的Dockerfile: https://github.com/ApsaraDB/polardb-pg-docker-images/blob/main/Dockerfile-local-instance

ARG binary_image_tag=
FROM polardb/polardb_pg_binary:${binary_image_tag}
LABEL maintainer="mrdrivingduck@gmail.com"
ENV POLARDB_USER=
ENV POLARDB_PASSWORD=
ENV POLARDB_PORT=
ENV POLARDB_DATA_DIR=/var/polardb
ENV PGHOST=127.0.0.1
VOLUME ${POLARDB_DATA_DIR}
CMD [ "postgres" ]
WORKDIR /home/postgres/
COPY ./docker-entrypoint.sh ./docker-entrypoint.sh
ENTRYPOINT [ "./docker-entrypoint.sh" ]

使用如下命令初始化数据库(--rm表示执行后自动删除容器, 但是VOLUME目录由于在宿主机中, 所以其数据会被保留, 把VOLUME映射到POLARDB_DATA_DIR即可实现初始化数据库实例目的.):

docker run -it --rm \
    --env POLARDB_PORT=5432 \
    --env POLARDB_USER=u1 \
    --env POLARDB_PASSWORD=your_password \
    -v ${your_data_dir}:/var/polardb \
    polardb/polardb_pg_local_instance \
    echo 'done'

例如:

mkdir /Users/digoal/polardb_data
cd /Users/digoal/polardb_data
docker run -it --rm \
    --env POLARDB_PORT=5432 \
    --env POLARDB_USER=postgres \
    --env POLARDB_PASSWORD=hellopwd123 \
    -v ${PWD}:/var/polardb \
    polardb/polardb_pg_local_instance \
    echo 'done'

1.3、启动 PolarDB-PG 服务

数据库初始化完毕后,使用 -d 参数以后台模式创建容器,启动 PolarDB-PG 服务。通常 PolarDB-PG 的端口需要暴露给外界使用,使用 -p 参数将容器内的端口范围暴露到容器外。比如,初始化数据库时使用的是 5432-5434 端口,如下命令将会把这三个端口映射到容器外的 54320-54322 端口:

docker run -it -d \
    --cap-add=SYS_PTRACE \
    --cap-add SYS_ADMIN \
    --privileged=true \
    --name polardb_pg \
    --shm-size=1g \
    -p 54320-54322:5432-5434 \
    -v ${your_data_dir}:/var/polardb \
    polardb/polardb_pg_local_instance

或者也可以直接让容器与宿主机共享网络(注意network=host会和宿主机共享网络, 如果你想在同一个宿主机运行多个容器, 监听端口请错开, 否则会端口冲突.):

docker run -it -P -d \
    --cap-add=SYS_PTRACE \
    --cap-add SYS_ADMIN \
    --privileged=true \
    --name polardb_pg \
    --shm-size=1g \
    --network=host \
    -v ${your_data_dir}:/var/polardb \
    polardb/polardb_pg_local_instance

例如:

mkdir /Users/digoal/polardb_data
cd /Users/digoal/polardb_data
docker run -it -P -d \
    --cap-add=SYS_PTRACE \
    --cap-add SYS_ADMIN \
    --env POLARDB_PORT=5432 \
    --env POLARDB_USER=postgres \
    --env POLARDB_PASSWORD=hellopwd123 \
    --privileged=true \
    --name polardb_pg \
    --shm-size=1g \
    --network=host \
    -v ${PWD}:/var/polardb \
    polardb/polardb_pg_local_instance

进入该容器, 从docker-entrypoint.sh脚本可以了解到polardb/polardb_pg_local_instance会创建2个replica.

$ docker exec -ti polardb_pg bash
$ psql
psql (11.9)
Type "help" for help.
postgres=# select * from pg_stat_replication ;
 pid | usesysid | usename  | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn | 
write_lag | flush_lag | replay_lag | sync_priority | sync_state 
-----+----------+----------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-
----------+-----------+------------+---------------+------------
 171 |       10 | postgres | replica1         | 127.0.0.1   |                 |       61490 | 2025-01-17 09:34:54.643504+08 |              | streaming | 0/174E210 | 0/174E210 | 0/174E210 | 0/174E210  | 
          |           |            |             0 | async
 189 |       10 | postgres | replica2         | 127.0.0.1   |                 |       61502 | 2025-01-17 09:34:56.008966+08 |              | streaming | 0/174E210 | 0/174E210 | 0/174E210 | 0/174E210  | 
          |           |            |             0 | async
(2 rows)
postgres=# select version();
            version             
--------------------------------
 PostgreSQL 11.9 (POLARDB 11.9)
(1 row)

2、安装部署 PolarDB 集群版(on ECS + ESSD)

PS: 前置条件

阿里云 ESSD(Enhanced SSD)云盘 结合 25 GE 网络和 RDMA 技术,能够提供单盘高达 100 万的随机读写能力和单路低时延性能。阿里云 ESSD 云盘支持 NVMe 协议,且可以同时挂载到多台支持 NVMe 协议的 ECS(Elastic Compute Service)实例上,从而实现多个 ECS 实例并发读写访问,具备高可靠、高并发、高性能等特点。更新信息请参考阿里云 ECS 文档:

接下来指导您完成以下过程:

  • 1、部署两台阿里云 ECS 作为计算节点
  • 2、将一块 ESSD 云盘多重挂载到两台 ECS 上,作为共享存储
  • 3、在任意一台ECS上将 ESSD 共享存储格式化为分布式文件系统 PFS
  • 4、基于 PFS,在两台 ECS 上共同搭建一个存算分离、读写分离的 PolarDB 集群

image.png

2.1、部署阿里云 ECS

首先需要准备两台或以上的 阿里云 ECS。目前,ECS 对支持 ESSD 多重挂载的规格有较多限制,详情请参考 使用限制。仅 部分可用区、部分规格(ecs.g7se、ecs.c7se、ecs.r7se, 现在可能更多型号了, 具体参考阿里云文档.)的 ECS 实例可以支持 ESSD 的多重挂载。如图,请务必选择支持多重挂载的 ECS 规格:

image.png

对 ECS 存储配置的选择,系统盘可以选用任意的存储类型,数据盘和共享盘暂不选择。后续再单独创建一个 ESSD 云盘作为共享盘:

image.png

如图所示,在 同一可用区 中建好两台 ECS:

image.png

2.2、准备 ESSD 云盘

在阿里云 ECS 的管理控制台中,选择 存储与快照 下的 云盘,点击 创建云盘。在与已经建好的 ECS 所在的相同可用区内,选择建立一个 ESSD 云盘,并勾选 多实例挂载。如果您的 ECS 不符合多实例挂载的限制条件,则该选框不会出现。

image.png

ESSD 云盘创建完毕后,控制台显示云盘支持多重挂载,状态为 待挂载:

image.png

接下来,把这个云盘分别挂载到两台 ECS 上:

image.png

挂载完毕后,查看该云盘,将会显示该云盘已经挂载的两台 ECS 实例:

2.3、检查云盘

通过 ssh 分别连接到两台 ECS 上,运行 lsblk 命令可以看到:

  • nvme0n1 是 40GB 的 ECS 系统盘,为 ECS 私有
  • nvme1n1 是 100GB 的 ESSD 云盘,两台 ECS 同时可见
$ 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

2.4、准备分布式文件系统(PFS)

2.4.1、PFS 编译安装

接下来,将在两台 ECS 上分别部署 PolarDB 的主节点和只读节点。作为前提,需要在 ECS 共享的 ESSD 块设备上 格式化并挂载 PFS。

请先在ECS主机上安装Docker desktop/server. 具体步骤请参考docker官网文档( https://www.docker.com/ ), 书中略过.

拉取polardb_pg_binary镜像, 将在所有PolarDB计算节点(ECS)使用这个镜像的容器来运行pfs和数据库.

docker pull registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_binary:11
# 打个tag, 方便使用
docker tag registry.cn-hangzhou.aliyuncs.com/polardb_pg/polardb_pg_binary:11 polardb/polardb_pg_binary

在所有PolarDB计算节点(ECS) 启动容器

docker run -d -it --network=host \
    --cap-add=SYS_PTRACE --cap-add SYS_ADMIN \
    --privileged=true \
    --name polardb_pg \
    --shm-size=1g \
    polardb/polardb_pg_binary \
    /bin/bash

在PolarDB计算节点(ECS) 进入容器的方法:

docker exec -ti polardb_pg bash

2.4.2、块设备重命名(如果命名已符合pfs需求, 可略过. 例如 本节on ECS+ESSD 可略过该步骤.)

PFS 仅支持访问 以特定字符开头的块设备(详情可见 PolarDB File System 源代码的 src/pfs_core/pfs_api.h 文件):

#define PFS_PATH_ISVALID(path)                                  \
    (path != NULL &&                                            \
     ((path[0] == '/' && isdigit((path)[1])) || path[0] == '.'  \
      || strncmp(path, "/pangu-", 7) == 0                       \
      || strncmp(path, "/sd", 3) == 0                           \
      || strncmp(path, "/sf", 3) == 0                           \
      || strncmp(path, "/vd", 3) == 0                           \
      || strncmp(path, "/nvme", 5) == 0                         \
      || strncmp(path, "/loop", 5) == 0                         \
      || strncmp(path, "/mapper_", 8) ==0))

因此,为了保证能够顺畅完成后续流程,建议在所有访问块设备的节点上使用相同的软链接访问共享块设备。例如,在 NBD 服务端主机上,使用新的块设备名 /dev/nvme1n1 软链接到共享存储块设备的原有名称 /dev/vdb 上:

sudo ln -s /dev/vdb /dev/nvme1n1

在 NBD 客户端主机(PolarDB计算节点)上,使用同样的块设备名 /dev/nvme1n1 软链到共享存储块设备的原有名称 /dev/nbd0 上:

sudo ln -s /dev/nbd0 /dev/nvme1n1

这样便可以在服务端和客户端两台主机上使用相同的块设备名 /dev/nvme1n1 访问同一个块设备。

2.4.3、块设备格式化

使用 任意一台主机的容器,在共享存储块设备上格式化 PFS 分布式文件系统:

sudo pfs -C disk mkfs nvme1n1
OR
sudo pfs -C disk mkfs -f nvme1n1  # 强制格式化, 一般不建议. 如果以前这个盘已经被格式化过并且是其他实例的块设备, 可能被误格式化掉.

PS: 格式化 PFS 分布式文件系统仅需在集群中任意一个计算节点执行一次即可.

2.4.4、PFS 文件系统挂载

在能够访问共享存储的 所有主机节点的容器中 上分别启动 PFS 守护进程,挂载 PFS 文件系统:

sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme1n1 -w 2
# -w 2 表示pfsd的工作线程数, 越大可以获得越好的IO能力, 但是也会消耗更多的CPU资源.
# 建议根据服务器规格、共享存储的硬件配置、存储网络带宽等情况来进行配置.

2.5、PolarDB 读写节点部署

在作为PolarDB RW节点的主机的容器中进行部署.

初始化读写节点的本地数据目录 ~/primary/

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D $HOME/primary

在共享存储的 /nvme1n1/shared_data/ 路径上创建共享数据目录,然后使用 polar-initdb.sh 脚本初始化共享数据目录:

# 使用 pfs 创建共享数据目录  
sudo pfs -C disk mkdir /nvme1n1/shared_data  
# 初始化 db 的本地和共享数据目录  
sudo $HOME/tmp_basedir_polardb_pg_1100_bld/bin/polar-initdb.sh \
    $HOME/primary/ /nvme1n1/shared_data/

编辑读写节点的配置。打开 ~/primary/postgresql.conf,增加配置项:

echo "
port=5432  
polar_hostid=1  
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  
# synchronous_standby_names='replica1' 
" >> ~/primary/postgresql.conf

编辑读写节点的客户端认证文件 ~/primary/pg_hba.conf,增加以下配置项,允许只读节点进行物理复制:

echo "
host  replication postgres  0.0.0.0/0 trust
" >> ~/primary/pg_hba.conf
# 注意, 如果你知道ECS主机的网段, 建议把 0.0.0.0/0 配置为ECS主机的网段网段. 例如 192.168.1.0/24

插入知识点开始.

在不同主机上的容器之间的通信问题请参考:

要使 Docker 容器在不同主机上彼此之间通过 IP 网络互相访问,你需要设置一个跨主机的网络。Docker 的内置解决方案是使用 overlay 网络。Overlay 网络允许容器分布在多个 Docker 守护进程主机上,并且这些容器能够安全地相互通信。

以下是设置容器跨主机通信的步骤:

2.5.1、安装 Docker Engine

确保所有的主机上都安装了 Docker Engine,并且版本都是 1.12 或更高。

2.5.2、设置 Docker Swarm

Overlay 网络需要 Docker Swarm,所以你要初始化 Swarm 模式。

在你选定的第一个主机(Manager Node)上运行:

docker swarm init --advertise-addr <MANAGER-IP>

其中 <MANAGER-IP> 是该主机的 IP 地址。

初始化 Swarm 之后,将其他主机加入为 Worker Nodes:

docker swarm join --token <SWARM-TOKEN> <MANAGER-IP>:2377  

<SWARM-TOKEN> 通过在 Manager Node 上运行 docker swarm join-token worker 获得。

2.5.3、创建 Overlay 网络

在任何一个 Swarm Manager 上创建一个 overlay 网络:

docker network create --driver overlay --attachable my-overlay-network  

这里 my-overlay-network 是你为 overlay 网络自定义的名称,使用 --attachable 参数允许非 Swarm 服务的容器连接到这个网络。

2.5.4、运行容器并加入网络

在任何 Swarm 节点上启动你的容器,并将其连接到先前创建的 overlay 网络:

docker run -d --name my-container --network my-overlay-network my-image  

这里 my-container 是为你的容器指定的名字,my-image 是你容器的镜像。

2.5.5、容器间通信

容器现在可以使用容器名称作为主机名来互相通信。例如,如果你在 my-overlay-network 网络上启动了两个名为 container1container2 的容器,那么 container1 可以通过 container2 的名称来解析 container2 的 IP 地址。

请注意,这些步骤假设所有的主机都能够相互访问。如果你的主机在不同的网络中,例如它们之间受到防火墙或者 NAT 的限制,你可能需要进行一些额外的网络配置,比如设置适当的防火墙规则或者使用 VPN 等。

另外,如果你使用的是 Docker Desktop(如在 Windows 或 Mac 上),Swarm 和 Overlay 网络的设置可能会有一些不同,因为 Docker Desktop 附带了一个内置的虚拟化环境。

插入知识点结束.


最后,启动读写节点:

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

检查读写节点能否正常运行:

$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 \
    -p 5432 \
    -d postgres \
    -c "SELECT pg_create_physical_replication_slot('replica1');"  
 pg_create_physical_replication_slot  
-------------------------------------  
 (replica1,)  
(1 row)

2.6、PolarDB 只读节点部署

在作为PolarDB RO节点的主机的容器中进行部署.

在只读节点本地磁盘的 ~/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/
rm -rf /tmp/replica1

编辑只读节点的配置。打开 ~/replica1/postgresql.conf,增加配置项:

echo "
port=5433  
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/postgresql.conf

创建只读节点的复制配置文件 ~/replica1/recovery.conf,增加读写节点的连接信息,以及复制槽名称:

RW_HOST=[读写节点所在IP]
echo "
polar_replica='on'  
recovery_target_timeline='latest'  
primary_slot_name='replica1'  
primary_conninfo='host=${RW_HOST} port=5432 user=postgres dbname=postgres application_name=replica1'
" >> ~/replica1/recovery.conf

最后,启动只读节点:

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

检查只读节点能否正常运行:

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

2.7、PolarDB 集群检查和测试

部署完成后,需要进行实例检查和测试,确保读写节点可正常写入数据、只读节点可以正常读取。

登录 读写节点,创建测试表并插入样例数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5432 \
    -d postgres \
    -c "CREATE TABLE t (t1 INT PRIMARY KEY, t2 INT); INSERT INTO t VALUES (1, 1),(2, 3),(3, 3);"

登录 只读节点,查询刚刚插入的样例数据:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -q \
    -p 5433 \
    -d postgres \
    -c "SELECT * FROM t;"  
 t1 | t2  
----+----  
  1 |  1  
  2 |  3  
  3 |  3  
(3 rows)

在读写节点上插入的数据对只读节点可见,这意味着基于共享存储的 PolarDB 计算节点集群搭建成功。

3、更多部署环境

编译安装PolarDB软件, 以debian 11.x为例, 这两个镜像中已经包含了编译安装的PolarDB软件.

阿里云开源了dockerfile, 你可以根据操作系统的版本选择dockerfile查看它需要安装哪些依赖, 方便你在自己的OS中部署PolarDB:

  • ubuntu24.04: use ubuntu:24.04 as base OS
  • ubuntu22.04: use ubuntu:22.04 as base OS
  • ubuntu20.04: use ubuntu:20.04 as base OS
  • debian12: use debian:12 as base OS
  • debian11: use debian:11 as base OS
  • rocky9: use rockylinux:9 as base OS
  • rocky8: use rockylinux:8 as base OS
  • anolis8: use openanolis/anolisos:8.6 as base OS
  • centos7 (DEPRECATED): use centos:centos7 as base OS

详见: 《PolarDB 100 问 | 如何构建PolarDB Docker镜像 OR 本地编译PolarDB?》

X86_64 安装方法例子如下:

useradd -b /home/polardb -m -d /home/polardb -s /bin/bash polardb
apt-get install -y libldap2-dev libxerces-c-dev gettext tcl tcl-dev libperl-dev 
rm -f /usr/bin/python 
ln -s /usr/bin/python3 /usr/bin/python 
cd /tmp
git clone -b POLARDB_11_STABLE --depth 1 https://github.com/ApsaraDB/PolarDB-for-PostgreSQL
cd PolarDB-for-PostgreSQL
LLVM_CONFIG=/usr/bin/llvm-config-13 ./polardb_build.sh --withpx --noinit --basedir=/home/polardb/polardb_11_home
echo "#  add by digoal " >> /home/polardb/.bashrc
echo "alias rm='rm -i' " >> /home/polardb/.bashrc
echo "alias cp='cp -i' " >> /home/polardb/.bashrc
echo "alias ll='ls -larth' " >> /home/polardb/.bashrc
echo "alias mv='mv -i' " >> /home/polardb/.bashrc
echo "export PGHOME=/home/polardb/polardb_11_home " >> /home/polardb/.bashrc
echo "export PATH=\$PGHOME/bin:\$PATH " >> /home/polardb/.bashrc
# X86 
echo "export LD_LIBRARY_PATH=\$PGHOME/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu:\$LD_LIBRARY_PATH " >> /home/polardb/.bashrc
# ARM64
# echo "export LD_LIBRARY_PATH=\$PGHOME/lib:/usr/local/lib:/usr/lib/aarch64-linux-gnu:\$LD_LIBRARY_PATH " >> /home/polardb/.bashrc
echo "export PGDATA=/home/polardb/primary " >> /home/polardb/.bashrc
echo "export PGUSER=polardb " >> /home/polardb/.bashrc
echo "export PGHOST=\$PGDATA " >> /home/polardb/.bashrc
echo "export PGPORT=5432 " >> /home/polardb/.bashrc
echo "export PGDATABASE=postgres " >> /home/polardb/.bashrc
echo "export LC_ALL=en_US.UTF-8 " >> /home/polardb/.bashrc
# 初始化数据库实例
su - polardb -c " /home/polardb/polardb_11_home/bin/initdb -D /home/polardb/primary "
# 启动数据库
# su - polardb
# /home/polardb/polardb_11_home/bin/pg_ctl -D /home/polardb/primary -l logfile start
# 进入数据库SQL Shell
# su - polardb
# /home/polardb/polardb_11_home/bin/psql -h 127.0.0.1 -p 5432 -U polardb postgres

更多环境请参考 PolarDB for PostgreSQL 开源官方手册

  • curve 分布式存储
  • ceph 分布式存储
  • nbd
  • 传统存储
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
1天前
|
存储 安全 数据处理
Pandas高级数据处理:数据加密与解密
本文介绍如何使用Pandas结合加密库(如`cryptography`)实现数据加密与解密,确保敏感信息的安全。涵盖对称和非对称加密算法、常见问题及解决方案,包括密钥管理、性能优化、字符编码和数据完整性验证。通过示例代码展示具体操作,并提供常见报错的解决方法。
41 24
|
1天前
|
人工智能 自然语言处理 算法
DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
DeepSeek VS ChatGPT:DeepSeek以开源黑马姿态崛起,凭借低成本、高性能的「DeepSeek-V3」和专为深度推理设计的「DeepSeek-R1」,成为中小开发者的首选。而ChatGPT则较贵。 然而,AI依赖也带来隐忧,长期使用可能导致记忆衰退和“脑雾”现象。为此,推荐Neuriva解决方案,专注力提升30%,记忆留存率提升2.1倍,助力人类在AI时代保持脑力巅峰。 DeepSeek赢在技术普惠,ChatGPT胜于生态构建,人类的关键在于平衡AI与脑力健康,实现“双核驱动”突破极限!
69 7
|
23小时前
|
人工智能 JSON 自然语言处理
阿里云百炼产品月刊【2025年1月】
本月重点包括新增批量推理功能,支持非高峰时段大规模数据处理,享有5折折扣;工作流应用新增循环节点,增强了流程定义的灵活性;数据管理新增解析设置功能,支持自动识别与转换多种数据格式。此外,还推出了多个新模型,如DeepSeek系列、Wanx2.1系列等,涵盖文本生成、图像生成、视频生成等多个领域。特别是DeepSeek-V3,具有671B参数,擅长长文本、代码、数学等领域;Wanx2.1系列则在视频和图像生成方面表现出色。通义千问系列模型也在性能和功能上进行了显著提升,特别是在语义理解和多语言支持方面。此外,本月还举办了多项AI实训营活动,包括智能体创意开发赛、新春主题创作等。
|
1月前
|
机器学习/深度学习 编解码 人工智能
SeedVR:高效视频修复模型,支持任意长度和分辨率,生成真实感细节
SeedVR 是南洋理工大学和字节跳动联合推出的扩散变换器模型,能够高效修复低质量视频,支持任意长度和分辨率,生成真实感细节。
92 16
SeedVR:高效视频修复模型,支持任意长度和分辨率,生成真实感细节
|
20天前
|
XML Java 应用服务中间件
SpringBoot项目打war包流程
本文介绍了将Spring Boot项目改造为WAR包并部署到外部Tomcat服务器的步骤。主要内容包括:1) 修改pom.xml中的打包方式为WAR;2) 排除Spring Boot内置的Tomcat依赖;3) 添加Servlet API依赖;4) 改造启动类以支持WAR部署;5) 打包和部署。通过这些步骤,可以轻松地将Spring Boot应用转换为适合外部Tomcat服务器的WAR包。
112 64
SpringBoot项目打war包流程
|
10天前
|
前端开发 安全 中间件
Thinkphp5跨域问题常见的处理方法
通过这些步骤,可以有效解决ThinkPHP5中的跨域问题,确保前后端分离架构下的正常通信。
119 84
|
1天前
|
移动开发 前端开发 UED
React 音频播放器组件 Audio Player
本文介绍如何使用React创建功能丰富的音频播放器组件。基于HTML5 `&lt;audio&gt;` 标签,结合React的状态管理和事件处理,实现播放、暂停、进度和音量控制等功能。通过代码示例展示基本实现,并探讨常见问题如自动播放限制、进度条不更新、文件加载失败及多实例冲突的解决方案。同时,避免易错点如忽略生命周期管理、错误处理和性能优化,确保高效开发与良好用户体验。
38 23
|
1天前
|
机器学习/深度学习 人工智能 边缘计算
联邦
随着人工智能的发展,联邦学习在打破“数据孤岛”和保护隐私方面展现出巨大潜力,但也面临诸多安全挑战。本文总结了五个关键研究方向:1. 提高防御方法的鲁棒性,以应对多种攻击;2. 研究更多样化的攻击手段,促进防御进步;3. 提升通信效率,平衡安全与性能;4. 探索异构联邦学习,拓展应用场景;5. 增强模型可解释性,确保应用安全。未来需深入研究这些方向,推动联邦学习成为数据安全领域的关键技术。
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
很火的DeepSeek到底是什么
DeepSeek,全称杭州深度求索人工智能基础技术研究有限公司,成立于2023年。因推出开源 AI 模型 DeepSeek-R1 而引起了广泛关注。与ChatGPT相比,大幅降低了推理模型的成本。
963 35
|
5天前
|
存储 人工智能 安全
如何调用 DeepSeek-R1 API ?图文教程
首先登录 DeepSeek 开放平台,创建并保存 API Key。接着,在 Apifox 中设置环境变量,导入 DeepSeek 提供的 cURL 并配置 Authorization 为 `Bearer {{API_KEY}}`。通过切换至正式环境发送请求,可实现对话功能,支持流式或整体输出。