同步操作将从 alibaba/PolarDB-for-PostgreSQL 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
PolarDB PostgreSQL(下文简称为 PolarDB)是一款阿里云自主研发的云原生数据库产品,100% 兼容 PostgreSQL,采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 的能力。
PolarDB 还支持时空、GIS、图像、向量、搜索、图谱等多模创新特性,应对企业对数据处理日新月异的需求。
另外,除了上述 Shared-Storage 云原生的模式,PolarDB 还支持以 Shared-Nothing 模式部署,详见 distribute 分支的 README。
PolarDB 后续默认分支为 main 分支,支持存储计算分离的形态。分布式形态由 distribute 分支支持(对应之前的 master 分支)。
PolarDB 采用了基于 Shared-Storage 的存储计算分离架构。数据库由传统的 Share-Nothing 架构,转变成了 Shared-Storage 架构。由原来的 N 份计算 + N 份存储,转变成了 N 份计算 + 1 份存储。虽然共享存储上数据是一份,但是数据在各节点内存中的状态是不同的,需要通过内存状态的同步来维护数据的一致性;同时主节点在刷脏时也需要做协调,避免只读节点读取到超前的 “未来页面”,也要避免只读节点读取到过时的没有在内存中被正确回放的 “过去页面”。为了解决该问题,PolarDB 创造性地设计了 LogIndex 数据结构来维护页面的回放历史,该结构能够实现主节点与只读节点之间的同步。
在存储计算分离后,I/O 单路延迟变大的同时,I/O 的吞吐也变大了。在处理分析型查询时,仅使用单个只读节点无法发挥出存储侧的大 I/O 带宽优势,也无法利用其他只读节点的 CPU、内存和 I/O 资源。为了解决该问题,PolarDB 研发了基于 Shared-Storage 的并行执行引擎,能够在 SQL 级别上弹性利用任意数目的 CPU 来加速分析查询,支持 HTAP 的混合负载场景。
我们提供了5种方式来使用PolarDB数据库:阿里巴巴云服务、搭建本地存储的实例、搭建基于NBD共享存储的实例、搭建基于ceph共享存储的实例、搭建基于PolarDB Stack共享存储的实例。
阿里云云原生关系型数据库 PolarDB PostgreSQL 引擎:官网地址。
我们提供了一键部署脚本,助您快速编译 PolarDB 内核并搭建本地实例。本节介绍了如何通过提供的一键部署脚本,快速搭建存储为本地磁盘的 PolarDB 实例。
操作系统要求:CentOS 7.5 及以上。以下步骤在 CentOS 7.5 上通过测试。
说明:请使用同一个用户进行以下步骤。请勿使用 root 用户搭建实例。
从 这里 下载 PolarDB 源代码。
安装相关依赖:
sudo yum install readline-devel zlib-devel perl-CPAN bison flex
sudo cpan -fi Test::More IPC::Run
根据不同的搭建场景,可选择不同的脚本执行命令:
只编译数据库源码,不创建本地实例:
./polardb_build.sh --noinit
编译并创建本地单节点实例,节点为主节点(端口为 5432):
./polardb_build.sh
编译并创建本地多节点实例,节点包括:
./polardb_build.sh --withrep --repnum=1
编译并创建本地多节点实例,节点包括:
./polardb_build.sh --withrep --repnum=1 --withstandby
编译并创建本地多节点实例,节点包括:
./polardb_build.sh --withrep --repnum=2 --withstandby
部署完成后,需要进行实例检查和测试,确保部署正确。
实例检查:
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -p 5432 -c 'select version();'
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -p 5432 -c 'select * from pg_replication_slots;'
一键执行全量回归测试:
./polardb_build.sh --withrep --repnum=1 --withstandby -r-check-all -e -r-contrib -r-pl -r-external -r-installcheck-all
Network Block Device(NBD)是一种网络协议,可以在多个主机间共享块存储设备,它是Client-Server的架构,因此至少需要两台物理机来部署。
以两台物理机环境为例,本小节介绍基于NBD共享存储的实例构建方法大体如下:首先,两台主机通过NBD共享一个块设备;然后,两台主机上均部署PolarDB-FileSystem(PFS)来初始化并挂载到同一个块设备;最后,在两台主机上分别部署PolarDB-for-PostgreSQL内核,构建主节点、只读节点已形成简单的一写多读实例。
操作系统要求:CentOS 7.5 及以上。以下步骤在 CentOS 7.5 上通过测试。
说明:操作系统内核需要支持NBD内核模块,如果操作系统当前不支持该内核模块,则需要自己通过对应内核版本进行编译和加载NBD内核模块。
rpm -ihv kernel-3.10.0-862.el7.src.rpm
cd ~/rpmbuild/SOURCES
tar Jxvf linux-3.10.0-862.el7.tar.xz -C /usr/src/kernels/
cd /usr/src/kernels/linux-3.10.0-862.el7/
cp ../$(uname -r)/Module.symvers ./
make menuconfig # Device Driver -> Block devices -> Set 'M' On 'Network block device support'
make prepare && make modules_prepare && make scripts
make CONFIG_BLK_DEV_NBD=m M=drivers/block
modinfo drivers/block/nbd.ko
cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block
depmod -a
modprobe nbd # 或者 modprobe -f nbd 可以忽略模块版本检查
# 检查已安装内核模块
lsmod | grep nbd
# 如果NBD驱动已经安装,则会生成/dev/nbd*设备(例如:/dev/nbd0、/dev/nbd1等)
ls /dev/nbd*
yum install nbd
nbd-server -C /root/nbd.conf
[generic]
#user = nbd
#group = nbd
listenaddr = 0.0.0.0
port = 1921
[export1]
exportname = /dev/vdb
readonly = false
multifile = false
copyonwrite = false
flush = true
fua = true
sync = true
nbd-client x.x.x.x 1921 -N export1 /dev/nbd0
# x.x.x.x是NBD服务端主机的IP地址
sudo pfs -C disk mkfs nvme0n1
sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme0n1
说明:请使用同一个用户进行以下步骤。请勿使用 root 用户搭建实例。
./polardb_build.sh --noinit --with-pfsd
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D primary
# 共享存储初始化
sudo pfs -C disk mkdir /nvme0n1/shared_data
sudo /home/[$USER]/tmp_basedir_polardb_pg_1100_bld/bin/polar-initdb.sh /home/[$USER]/primary/ /nvme0n1/shared_data/
port=5432
polar_hostid=1
polar_enable_shared_storage_mode=on
polar_disk_name='nvme0n1'
polar_datadir='/nvme0n1/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'
host replication [$USER] 0.0.0.0/0 trust
$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();'
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql -p 5432 -d postgres -c "select pg_create_physical_replication_slot('replica1');"
./polardb_build.sh --noinit --with-pfsd
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/initdb -D replica1
port=5433
polar_hostid=2
polar_enable_shared_storage_mode=on
polar_disk_name='nvme0n1'
polar_datadir='/nvme0n1/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
polar_replica='on'
recovery_target_timeline='latest'
primary_slot_name='replica1'
primary_conninfo='host=[主节点所在容器的IP] port=5432 user=[$USER] dbname=postgres application_name=replica1'
$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();'
$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;"
ceph是一个统一的分布式存储系统,由于它可以提供较好的性能、可靠性和可扩展性,被广泛的应用在存储领域。 以下是在ceph分布式集群上部署PolarDB-FileSystem以及PolarDB-for-PostgreSQL的教程。
ceph搭建需要2台及以上的物理机/虚拟机实现存储共享与数据备份,本教程以3台虚拟机机环境为例,介绍基于ceph共享存储的实例构建方法。大体如下:
操作系统要求:CentOS 7.5 及以上。以下步骤在 CentOS 7.5 上通过测试。
环境准备
IP hostname
192.168.1.173 ceph001
192.168.1.174 ceph002
192.168.1.175 ceph003
安装docker
说明:本教程使用阿里云镜像站提供的docker包。
安装docker依赖包:
yum install -y yum-utils device-mapper-persistent-data lvm2
安装并启动docker:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
yum install -y docker-ce
systemctl start docker
systemctl enable docker
检查是否安装成功:
docker run hello-world
配置ssh免密登录
密钥的生成与拷贝:
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph001
ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph002
ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph003
检查是否配置成功
ssh root@ceph003
下载ceph daemon
docker pull ceph/daemon
mon部署
ceph001上mon进程启动
docker run -d \
--net=host \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=192.168.1.173 \
-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
--security-opt seccomp=unconfined \
--name=mon01 \
ceph/daemon mon
注意:根据实际网络环境修改IP、子网掩码位数。
查看容器状态
docker exec mon01 ceph -s
cluster:
id: 937ccded-3483-4245-9f61-e6ef0dbd85ca
health: HEALTH_OK
services:
mon: 1 daemons, quorum ceph001 (age 26m)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
注意:如果遇到mon is allowing insecure global_id reclaim的报错,使用以下命令解决。
docker exec mon01 ceph config set mon auth_allow_insecure_global_id_reclaim false
生成必须的keyring
docker exec mon01 ceph auth get client. bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ ceph.keyring
docker exec mon01 ceph auth get client. bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ ceph.keyring
配置文件同步
ssh root@ceph002 mkdir -p /var/lib/ceph
scp -r /etc/ceph root@ceph002:/etc
scp -r /var/lib/ceph/bootstrap* root@ceph002:/ var/lib/ceph
ssh root@ceph003 mkdir -p /var/lib/ceph
scp -r /etc/ceph root@ceph003:/etc
scp -r /var/lib/ceph/bootstrap* root@ceph003:/ var/lib/ceph
在ceph002与ceph003中启动mon
docker run -d \
--net=host \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=192.168.1.174 \
-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
--security-opt seccomp=unconfined \
--name=mon02 \
ceph/daemon mon
docker run -d \
--net=host \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-e MON_IP=1192.168.1.175 \
-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \
--security-opt seccomp=unconfined \
--name=mon03 \
ceph/daemon mon
查看当前集群状态
docker exec mon01 ceph -s
cluster:
id: 937ccded-3483-4245-9f61-e6ef0dbd85ca
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph001,ceph002, ceph003 (age 35s)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
注意:从mon节点信息查看是否有添加在另外两个节点创建的mon添加进来。
osd部署
osd准备阶段:
本环境的虚拟机只有一个/dev/vdb磁盘可用,因此为每个虚拟机只创建了一个osd节点。
docker run --rm --privileged=true --net=host - -ipc=host \
--security-opt seccomp=unconfined \
-v /run/lock/lvm:/run/lock/lvm:z \
-v /var/run/udev/:/var/run/udev/:z \
-v /dev:/dev -v /etc/ceph:/etc/ceph:z \
-v /run/lvm/:/run/lvm/ \
-v /var/lib/ceph/:/var/lib/ceph/:z \
-v /var/log/ceph/:/var/log/ceph/:z \
--entrypoint=ceph-volume \
docker.io/ceph/daemon \
--cluster ceph lvm prepare --bluestore --data /dev/vdb
注意:以上命令在三个节点都是一样的,只需要根据磁盘名称进行修改调整即可。
osd激活阶段:
docker run -d --privileged=true --net=host --pid=host --ipc=host \
--security-opt seccomp=unconfined \
-v /dev:/dev \
-v /etc/localtime:/etc/ localtime:ro \
-v /var/lib/ceph:/var/lib/ ceph:z \
-v /etc/ceph:/etc/ceph:z \
-v /var/run/ceph:/var/run/ ceph:z \
-v /var/run/udev/:/var/run/ udev/ \
-v /var/log/ceph:/var/log/ ceph:z \
-v /run/lvm/:/run/lvm/ \
-e CLUSTER=ceph \
-e CEPH_DAEMON=OSD_CEPH_VOLUME_ACT IVATE \
-e CONTAINER_IMAGE=docker.io/ ceph/daemon \
-e OSD_ID=0 \
--name=ceph-osd-0 \
docker.io/ceph/daemon
注意:各个节点需要修改OSD_ID与name属性,OSD_ID是从编号0递增的,其余节点为OSD_ID=1、OSD_ID=2。
查看集群状态
docker exec mon01 ceph -s
cluster:
id: e430d054-dda8-43f1-9cda-c0881b782e17
health: HEALTH_WARN
no active mgr
services:
mon: 3 daemons, quorum ceph001,ceph002, ceph003 (age 44m)
mgr: no daemons active
osd: 3 osds: 3 up (since 7m), 3 in (since 13m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
mgr、mds、rgw部署
以下命令均在ceph001进行:
docker run -d --net=host \
--privileged=true \
--security-opt seccomp=unconfined \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
--name=ceph-mgr-0 \
ceph/daemon mgr
docker run -d --net=host \
--privileged=true \
--security-opt seccomp=unconfined \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /etc/ceph:/etc/ceph \
-e CEPHFS_CREATE=1 \
--name=ceph-mds-0 \
ceph/daemon mds
docker run -d --net=host \
--privileged=true \
--security-opt seccomp=unconfined \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /etc/ceph:/etc/ceph \
--name=ceph-rgw-0 \
ceph/daemon rgw
查看集群状态
docker exec mon01 ceph -s
cluster:
id: e430d054-dda8-43f1-9cda-c0881b782e17
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph001,ceph002, ceph003 (age 92m)
mgr: ceph001(active, since 25m)
mds: 1/1 daemons up
osd: 3 osds: 3 up (since 54m), 3 in (since 60m)
rgw: 1 daemon active (1 hosts, 1 zones)
data:
volumes: 1/1 healthy
pools: 7 pools, 145 pgs
objects: 243 objects, 7.2 KiB
usage: 50 MiB used, 2.9 TiB / 2.9 TiB avail
pgs: 145 active+clean
rbd块设备创建
以下命令均在容器mon01中进行。
存储池的创建:
docker exec -it mon01 bash
ceph osd pool create rbd_polar
创建镜像文件并查看信息
rbd create --size 512000 rbd_polar/image02
rbd info rbd_polar/image02
rbd image 'image02':
size 500 GiB in 128000 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 13b97b252c5d
block_name_prefix: rbd_data.13b97b252c5d
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Thu Oct 28 06:18:07 2021
access_timestamp: Thu Oct 28 06:18:07 2021
modify_timestamp: Thu Oct 28 06:18:07 2021
映射镜像文件
rbd map rbd_polar/image02
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_polar/image02 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
注意:某些特性内核不支持,需要关闭才可以映射成功。如下进行:关闭rbd不支持特性,重新映射镜像,并查看映射列表。
rbd feature disable rbd_polar/image02 object-map fast-diff deep-flatten
rbd map rbd_polar/image02
rbd device list
id pool namespace image snap device
0 rbd_polar image01 - /dev/ rbd0
1 rbd_polar image02 - /dev/ rbd1
此处我已经先映射了一个image01,所以有两条信息。
查看块设备
回到容器外,进行操作。查看系统中的块设备:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 500G 0 disk
└─vda1 253:1 0 500G 0 part /
vdb 253:16 0 1000G 0 disk
└─ceph--7eefe77f--c618--4477--a1ed--b4f44520dfc 2-osd--block--bced3ff1--42b9--43e1--8f63--e853b ce41435
252:0 0 1000G 0 lvm
rbd0 251:0 0 100G 0 disk
rbd1 251:16 0 500G 0 disk
注意:块设备镜像需要在各个节点都进行映射才可以在本地环境中通过lsblk命令查看到,否则不显示。ceph002与ceph003上映射命令与上述一致。
PolarDB-FileSystem安装部署
请参考 方式3:搭建基于NBD共享存储 — PolarDB-FileSystem安装部署
PolarDB-for-PostgreSQL内核安装部署
请参考 方式3:搭建基于NBD共享存储 — PolarDB-for-PostgreSQL内核安装部署
PolarDB Stack是轻量级PolarDB PaaS软件。基于共享存储提供一写多读的PolarDB数据库服务,特别定制和深度优化了数据库生命周期管理。通过PolarDB Stack可以一键部署PolarDB-for-PostgreSQL内核和PolarDB-FileSystem。
PolarDB Stack架构如下图所示,进入PolarDB Stack的部署文档
PolarDB 的代码的发布基于 Apache 2.0 版本和 PostgreSQL 代码的软件许可。相关的许可说明可参见 LICENSE 和 NOTICE。
部分代码和设计思路参考了其他开源项目,例如:PG-XC/XL (pgxc_ctl)、TBase (部分基于时间戳的 vacuum 和 MVCC)、Greenplum 以及 Citus (pg_cron)。感谢以上开源项目的贡献。
PolarDB PostgreSQL Slack:https://app.slack.com/client/T023NM10KGE/C023VEMKS02
使用钉钉扫描如下二维码,加入PolarDB技术推广组钉钉群
Copyright © Alibaba Group, Inc.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。