7天突破PolarDB for PostgreSQL— 第二讲 PolarDB-CEPH部署

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 分享人:思才,阿里云智能数据库产品事业部PolarDB产品部

7天突破PolarDB for PostgreSQL

第二讲 PolarDB-CEPH部署

分享人:思才,阿里云智能数据库产品事业部PolarDB产品部


视频地址

https://developer.aliyun.com/learning/course/992/detail/14969


目录:

一、PolarDB:CEPH共享存储结构

二、如何搭建PolarDB-CEPH共享存储


正文:

一、PolarDB:CEPH共享存储结构


PolarDB结合CEPH共享存储结构有以下特点:


  1. PolarDB支持一写多读的数据库结构,一写指一个读写节点,多读指多个只读节点;


  1. CEPH是一个分布式的共享存储结构,可以将多个OSD节点所附属的DISK组成一个RBD POOL(块设备存储池),在这个存储池中可以创建私有的RBD DISK使用;


  1. PolarFS可以将CEPH提供的RBD DISK作为数据目录存放,实现在多个不同的服务器中用同一个CEPH RBD DISK提供数据服务的目标。

image.png

二、如何搭建PolarDB-CEPH共享存储


CEPH是一个统一的分布式存储系统,具有较好的性能、可靠性和可扩展性,被广泛应用在存储领域。以下是在CEPH分布式集群上部署PolarDB-FileSystem以及PolarDB-for-PostqreSQL的教程。


【实践演示】

目标:将ceph001配置成读写节点,将ceph002和ceph003配置成只读节点,在ceph001中写入数据,然后在ceph002和ceph003中查询。


文档参考:

https://apsaradb.github.io/PolarDB-for-PostgreSQL/zh/guide/deploy.html


步骤一:准备块储存设备


  1. 环境准备


a.使用虚拟机环境:


IP                  hostname

192.168.1.173       ceph001

192.168.1.174       ceph002

192.168.1.175       ceph003


b.安装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

   出现Hello from Docker则证明安装成功;


c.配置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


2.mon部署


a. ceph001上mon进程启动;


docker run -d \

   --net=host \

   --privileged=true \

   -v /etc/ceph:/etc/ceph \

   -v /var/lib/ceph/:/var/lib/ceph/ \

   -e MON_IP=172.17.0.125 \

   -e CEPH_PUBLIC_NETWORK=172.17.0.0/24 \

   --security-opt seccomp=unconfined \

   --name=mon01 \

   ceph/daemon mon


  • 查看容器状态

$ docker exec mon01 ceph -s

image.png

如遇到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 getclient.bootstrap-rgw-o/var/lib/ceph/bootstrap-osd/ceph.keyring

docker exec mon01 ceph auth get client.bootstrap-osd-o/var/ib/ceph/bootstrap-rgw/ceph.keyring


b.配置同步文件;


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


c.在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=172.17.0.126 \

   -e CEPH_PUBLIC_NETWORK=172.17.0.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=172.17.0.124 \

   -e CEPH_PUBLIC_NETWORK=172.17.0.0/24 \

   --security-opt seccomp=unconfined \

   --name=mon03 \

   ceph/daemon mon


d.查看当前集群状态;


$ docker exec mon01 ceph –s

image.png


3.osd部署


提示:本环境的虚拟机只有一个/dev/vdb磁盘可用,因此为每个虚拟机只创建了一个osd节点。


a. 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


注:以上命令在三个节点都是一样的,只需要根据磁盘名称进行修改调整即可。当看到ceph-volum lvm prepare successful for: dev/vdb,则证明已经准备好。


b. 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_ACTIVATE \

   -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。


c. 查看集群状态;


$ docker exec mon01 ceph –s

image.png

  1. mgr、mds、rgw 部署


a.以下命令均在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


b.查看集群状态


$ docker exec mon01 ceph –s

image.png


5.RBD块设备创建


以下命令均在容器mon001中进行。


a.储存池的创建;


docker exec -it mon01 bash

ceph osd pool create rbd_polar


b.创建镜像文件并查看信息;


  • 创建镜像文件

rbd create --size 512000 rbd_polar/image02

注:命令中的size和文件名image02都可以自行修改。


  • 查看文件信息

rbd info rbd_polar/image02

image.png


c.映射镜像文件;


modprobe rbd # 加载内核模块,在主机上执行

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


image.png

由于是共享存储,在ceph002和ceph003中只需进行映射操作,最后查看映射列表;


modprobe rbd

docker exec -it mon02 bash

rbd map rbd_polar/image01

rbd device list


映射完成后,退出CEPH容器,查看系统中的块设备;


exit

lsblk

image.png


步骤二:定制开发环境


1.创建用户组postgres和用户postgres


a.以root用户身份,分别在三个节点执行以下命令:


# install sudo

yum install -y sudo

# create user and group

groupadd -r postgres

useradd -m -g postgres postgres -p ''

usermod -aG wheel postgres

# make postgres as sudoer

chmod u+w /etc/sudoers

echo 'postgres ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

chmod u-w /etc/sudoers

# grant access to home directory

chown -R postgres:postgres /home/postgres/

echo 'source /etc/bashrc' >> /home/postgres/.bashrc

# for su postgres

sed -i 's/4096/unlimited/g' /etc/security/limits.d/20-nproc.conf


b.切换到postgres用户进行后续步骤:


su postgres

source /etc/bashrc

cd ~


2.下载PolarDB源代码


PolarDB for PostgreSQL 的代码托管于GitHub上,稳定分支为 POLARDB_11_STABLE。


用以下命令在三个节点下载PolarDB源代码:


sudo yum install -y git

git clone -b POLARDB_11_STABLE https://github.com/ApsaraDB/PolarDB-for-PostgreSQL.git


3.依赖安装


使用 sudo 执行源代码根目录下的依赖安装脚本install_dependencies.sh,自动完成所有的依赖安装。


用以下命令在三个节点安装依赖:


d PolarDB-for-PostgreSQL

sudo ./install_dependencies.sh


注:依赖安装直接影响到后续主节点的部署,如出现问题提示需要尽快排查,否则主节点部署也会失败。


步骤三:PolarDB File System(PFS)安装部署


PolarDB File System,简称PFS或PolarFS,是由阿里云自主研发的高性能类POSIX的用户态分布式文件系统,服务于阿里云数据库PolarDB产品。使用 PFS 对共享存储进行格式化并挂载后,能够保证一个计算节点对共享存储的写入能够立刻对另一个计算节点可见。


  1. PFS编译安装

PFS手动编译参考Readme文件:

https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/Readme-CN.md


安装zlog和rpm到三个节点:


zlog安装:


rpm安装:

image.png


  1. 块设备重命名

PFS仅支持特定字符开头的块设备进行访问,建议所有块设备访问节点都通过软链接使用相同名字访问共享块设备。


在 NBD 服务端主机上,使用新的块设备名 /dev/nvme1n1 软链到共享存储块设备的原有名称 /dev/rbd0 上:

ln -s /dev/rbd0/dev/nvme1n1


  1. 块设备初始化

使用任意一台主机在共享存储块设备上格式化PFS:

sudo pfs -C disk mkfs nvme1n1

  1. PFS文件系统挂载

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


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


步骤三:编译部署PolarDB内核


1.主节点部署


a.在主节点上,使用 --with-pfsd 选项编译 PolarDB 内核:

./polardb_build.sh --with-pfsd

注:编译内核时会先检查依赖,如果编译失败则说明执行安装依赖脚本的过程存在问题,需要进行排查。


b.在节点本地初始化数据目录 $HOME/primary/:

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


c.在共享存储的 /nvme1n1/shared_data/ 目录上初始化共享数据目录;

# 使用 pfs 创建共享数据目录

sudo pfs -C disk mkdir /nvme1n1/shared_data

# 初始化db的本地和共享数据目录

sudo/$HOME/postgres/tmp_basedir_polardb_pg_1100_bld/bin/polar-initdb.sh\$HOME/postgres/primary/ /nvme1n1/shared_data/

注:以上命令中的postgres是[User],用户可根据实际创建用户名更改。


d.配置节点,打开 $HOME/primary/postgresql.conf,在最后一行增加配置项:

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'


e.打开 $HOME/primary/pg_hba.conf,在最后一行增加以下配置项,与上面内容对齐:

host    replication    postgres        0.0.0.0/0        trust


f.启动主节点:

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


g.检查主节点能否正常运行:

$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)

至此,主节点部署完成。


  1. 只读节点部署


a.在主节点上,为对应的只读节点创建相应的 replication slot,可以是一个也可以多个,用于只读节点的物理流复制:

$HOME/tmp_basedir_polardb_pg_1100_bld/bin/psql \

   -p 5432 \

   -d postgres \

-c "select pg_create_physical_replication_slot('replica1');"


b.在只读节点上,使用 --with-pfsd 选项编译 PolarDB 内核:

./polardb_build.sh --with-pfsd


c.在节点本地初始化数据目录 $HOME/replica1/:

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


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

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


e.创建 $HOME/replica1/recovery.conf,增加以下配置项:

polar_replica='on'

recovery_target_timeline='latest'

primary_slot_name='replica1'

primary_conninfo='host=[主节点所在IP] port=5432 user=postgres dbname=postgres application_name=replica1'

注:请替换主节点(容器)所在的 IP 地址。


f.启动只读点:

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


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

$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)


  1. 集群检查和测试


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


a.登录主节点,创建测试表并插入样例数据:

$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);"


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

$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)

在主节点上插入的数据对只读节点可见。


【课程总结】


CEPH搭建需要2台及以上的物理机/虚拟机实现存储共享与数据备份,本教程以3台虚拟机机环境为例,介绍基于CEPH共享存储的实例构建方法。


  • 获取在同一网段的虚拟机三台,互相之间配置 ssh 免密登录,用作 ceph 密钥与配置信息的同步;
  • 在主节点启动 mon 进程,查看状态,并复制配置文件至其余各个节点,完成 mon 启动;
  • 在三个环境中启动 osd 进程配置存储盘,并在主节点环境启动 mgr 进程、rgw 进程;
  • 创建存储池与 rbd 块设备镜像,并对创建好的镜像在各个节点进行映射即可实现块设备的共享;
  • 对块设备进行 PolarFS 的格式化与 PolarDB 的部署。
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
关系型数据库 Serverless 分布式数据库
【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
|
2月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
|
1月前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
2月前
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless功能上线公测啦,公测期间免费使用!
Serverless数据库能够使得数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。PolarDB PostgreSQL版 Serverless提供了CPU、内存、存储、网络资源的实时弹性能力,构建计算与存储分离架构下的 PolarDB PostgreSQL版产品新形态。
|
4天前
|
关系型数据库 MySQL 分布式数据库
快速体验开源PolarDB -X 部署安装
在CentOS上部署PolarDB-X标准版集群的体验包括三步:安装python3和docker(如果未预装),然后使用venv创建环境,安装pxd并验证。接着,通过`pxd tryout -t standard`部署集群,该过程需拉取大量镜像,可能耗时且占用数GB空间,建议事先清理空间并了解资源需求。部署后,可查询集群状态和健康信息。最终,使用`pxd cleanup`清理。过程中因磁盘空间不足遇到问题,建议体验前提供系统配置需求,并允许用户自定义MySQL参数。
|
5天前
|
关系型数据库 Linux 分布式数据库
源码编译实现PolarDB-X部署安装的体验报告
本文档记录了编译安装PolarDB-X的步骤,包括设置CentOS开发环境、从GitHub获取源码、编译(耗时较长)、解决依赖和权限问题、安装部署及测试验证。作者建议优化文档细节、减少编译时间、改进错误提示,并提议提供一键安装依赖脚本、新手视频教程及加强社区支持。整个过程虽有挑战,但具有成就感。
16 0
|
6天前
|
关系型数据库 Java 数据库
docker部署postgresql数据库和整合springboot连接数据源
docker部署postgresql数据库和整合springboot连接数据源
16 0
|
14天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用合集之关于在Docker环境中部署和维护PolarDB-X,有相关文章可以参考吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
26天前
|
关系型数据库 MySQL 分布式数据库
【PolarDB-X从入门到精通】 第五讲:PolarDB集中式版安装部署(源码编译部署)
4月18日本周四晚19:00,一站式学习源码编译PolarDB-X标准版(集中式),各位敬请期待,我们不见不散!
【PolarDB-X从入门到精通】 第五讲:PolarDB集中式版安装部署(源码编译部署)
|
2月前
|
SQL 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB-X部署三台失败如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。