7天突破PolarDB for PostgreSQL
第二讲 PolarDB-CEPH部署
分享人:思才,阿里云智能数据库产品事业部PolarDB产品部
视频地址:
https://developer.aliyun.com/learning/course/992/detail/14969
目录:
一、PolarDB:CEPH共享存储结构
二、如何搭建PolarDB-CEPH共享存储
正文:
一、PolarDB:CEPH共享存储结构
PolarDB结合CEPH共享存储结构有以下特点:
- PolarDB支持一写多读的数据库结构,一写指一个读写节点,多读指多个只读节点;
- CEPH是一个分布式的共享存储结构,可以将多个OSD节点所附属的DISK组成一个RBD POOL(块设备存储池),在这个存储池中可以创建私有的RBD DISK使用;
- PolarFS可以将CEPH提供的RBD DISK作为数据目录存放,实现在多个不同的服务器中用同一个CEPH RBD DISK提供数据服务的目标。
二、如何搭建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
步骤一:准备块储存设备
- 环境准备
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
如遇到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
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
- 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
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
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
由于是共享存储,在ceph002和ceph003中只需进行映射操作,最后查看映射列表;
modprobe rbd
docker exec -it mon02 bash
rbd map rbd_polar/image01
rbd device list
映射完成后,退出CEPH容器,查看系统中的块设备;
exit
lsblk
步骤二:定制开发环境
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 对共享存储进行格式化并挂载后,能够保证一个计算节点对共享存储的写入能够立刻对另一个计算节点可见。
- PFS编译安装
PFS手动编译参考Readme文件:
https://github.com/ApsaraDB/PolarDB-FileSystem/blob/master/Readme-CN.md
安装zlog和rpm到三个节点:
zlog安装:
- 在https://github.com/HardySimpson/zlog/releases,找到Source code ,点击右键复制链接地址;
- wget https://github.com/HardySimpson/zlog/archive/refs/tags/1.2.15.tar.gz
rpm安装:
- 在https://github.com/ApsaraDB/PolarDB-FileSystem/releases找到安装包,点击右键复制链接地址;
- 块设备重命名
PFS仅支持特定字符开头的块设备进行访问,建议所有块设备访问节点都通过软链接使用相同名字访问共享块设备。
在 NBD 服务端主机上,使用新的块设备名 /dev/nvme1n1 软链到共享存储块设备的原有名称 /dev/rbd0 上:
ln -s /dev/rbd0/dev/nvme1n1
- 块设备初始化
使用任意一台主机在共享存储块设备上格式化PFS:
sudo pfs -C disk mkfs nvme1n1
- 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)
至此,主节点部署完成。
- 只读节点部署
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)
- 集群检查和测试
部署完成后,需要进行实例检查和测试,确保主节点可正常写入数据、只读节点可以正常读取。
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 的部署。