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

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 分享人:思才,阿里云智能数据库产品事业部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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
25天前
|
存储 关系型数据库 分布式数据库
揭秘PolarDB:中国云原生数据库的超级英雄,如何颠覆传统数据存储?
在数字化时代,数据成为企业的核心资产,而云原生数据库则是推动企业转型的关键。PolarDB凭借其先进的存储计算分离架构,在性能、可靠性和易用性方面脱颖而出,成为国内领先的选择。它支持多种数据库引擎,提供多副本存储机制,并采用按量付费模式,有效降低管理和成本压力,助力企业实现高效、可靠的数字化转型。
38 1
|
1月前
|
关系型数据库 分布式数据库 数据库
开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布
PolarDB进行了深度的内核优化,从而实现以更低的成本提供商业数据库的性能。
|
1月前
惊世骇俗!开源 PolarDB-X 部署安装大冒险,全程心跳与惊喜不断!
【9月更文挑战第8天】作为技术爱好者的我,近期成功完成了开源 PolarDB-X 的部署安装。尽管过程中遇到不少挑战,但通过精心准备环境、下载安装包、配置参数及启动服务等步骤,最终顺利实现部署。本文将详细介绍部署全过程及可能遇到的问题,为您的 PolarDB-X 探索之旅提供参考与启发,希望能让大家在技术海洋里畅游得更加顺利!
67 2
|
1月前
|
Kubernetes 关系型数据库 分布式数据库
PolarDB在混合云环境下的部署策略与挑战
【9月更文挑战第5天】随着云计算技术的发展,混合云成为众多企业首选,以满足数据管理和业务扩展需求。阿里巴巴自研的PolarDB是一款高性能云原生数据库,在混合云中可通过多种方式部署,如Kubernetes,实现资源弹性伸缩及自动化管理,并支持跨平台数据同步与金融级高可用性。然而,混合云环境下也带来了复杂性、成本优化及运维难度等挑战,企业需综合考虑平台兼容性、安全性和资源投入比例等问题。
68 5
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
云原生数据库2.0问题之PolarDB利用云计算技术红利如何解决
云原生数据库2.0问题之PolarDB利用云计算技术红利如何解决
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
云原生关系型数据库PolarDB问题之PolarDB相比传统商用数据库的优势如何解决
云原生关系型数据库PolarDB问题之PolarDB相比传统商用数据库的优势如何解决
32 1
|
2月前
|
存储 关系型数据库 MySQL
再探PolarDB —— PolarDB MySQL 四大场景下的全方位评测
本文全面评测了阿里云PolarDB MySQL在四大关键场景下的表现:Serverless极致弹性、列存索引(IMCI)、弹性并行查询(ePQ)以及无感秒切高可用。通过官方提供的免费体验资源,我们深入了解了PolarDB MySQL的核心能力和性能。Serverless极致弹性列存索引(IMCI弹性并行查询(ePQ)无感秒切高可用此外,文章还介绍了PolarDB MySQL在数据备份和HTAP(混合事务/分析处理)场景下的优势,包括灵活的备份策略、高效的全量和库表恢复方式,以及通过IMCI支持的HTAP能力。这些特性共同构成了PolarDB MySQL作为一款先进的云数据库服务的强大竞争力。
|
2月前
|
Kubernetes 关系型数据库 分布式数据库
PolarDB在混合云环境下的部署策略与挑战
随着云计算的发展,混合云成为企业优选架构。PolarDB作为阿里云原生数据库,具备高可用、水平扩展和HTAP能力,在混合云中通过多种部署方式(如Kubernetes)实现资源弹性管理与数据实时同步。面对复杂性、成本优化及运维挑战,PolarDB提供解决方案确保数据安全与业务连续性。
62 4
|
2月前
|
监控 Oracle 关系型数据库
PolarDB 在多云环境下的部署与管理
【8月更文第27天】随着云计算的普及和发展,越来越多的企业开始采用多云策略来分散风险、优化成本并提高业务灵活性。阿里云的 PolarDB 是一种兼容 MySQL、PostgreSQL 和 Oracle 的关系型数据库服务,它提供了高性能、高可用性和自动化的管理功能。本文将探讨如何在多云环境下部署和管理 PolarDB 实例,并提供一些实用的代码示例。
56 0
|
2月前
|
Kubernetes Cloud Native 关系型数据库
k8s 部署polardb-x集群
k8s 部署polardb-x集群
124 0