最近工作中接触了一个 Python + Flask 的新项目,项目中使用了 Ceph 对象存储服务。遂在开发环境使用 Docker 搭建了一套 Ceph 集群。
Ceph 介绍
Ceph 是一个开源的分布式存储系统,提供了对象存储、块存储和文件系统三种存储接口。Ceph 将数据存储在逻辑存储池中,使用 CRUSH 分布式算法决定如何将数据分散存储在集群的各个节点上,以实现高可用性和数据冗余。本文介绍如何使用 Ceph 的对象存储功能。
搭建 Ceph 集群至少要包括一个 MON(Monitor) 节点、一个MGR(Manager) 节点和多个 OSD(Object Storage Daemon)节点,OSD 节点数量由你要保存的数据副本数量决定,比如你要将数据集存储三份,就需要部署至少三个 OSD 节点。
-
OSD(Object Storage Daemon):负责管理磁盘上的数据块(数据存储、数据复制和数据恢复等),执行数据的读写操作。确保集群的高可用性,通常至少要部署三个节点。
-
MON(Monitor):负责维护 Ceph 集群的状态信息、配置信息和映射信息,确保集群元数据的一致性,协调集群节点间数据的分布和恢复。确保集群的高可用性,通常至少要部署三个节点。
-
MDS(Metadata Server):负责管理文件系统的目录结构、文件和目录的元数据信息,为 CephFS(Ceph的分布式文件系统)提供元数据服务。块存储和对象存储不需要部署 MDS。
-
MGR(Manager):负责收集 Ceph 集群的状态信息(OSD、MON、MDS 的性能指标、健康状况等),并提供了可视化的仪表板(Ceph Dashboard)方便用户查看。确保集群的高可用性,通常至少要部署两个节点。
-
RGW(Rados Gateway):提供了 RESTful API,允许用户发送 HTTP/HTTPS 请求访问和管理存储在 Ceph 集群中的数据,支持 Amazon S3 API 和 OpenStack Swift API。
Ceph 集群搭建
部署环境
三台网络互通的 CentOS 虚拟机。
主机名称 | 主机IP | 说明 |
---|---|---|
ceph-admin | 10.0.28.10 | osd、mon、mgr、rgw |
ceph-1 | 10.0.28.11 | osd、mon |
ceph-2 | 10.0.28.12 | osd、mon |
拉取镜像
bash
# 拉取镜像
docker pull ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
# 更改镜像tag
docker image tag ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64 ceph/daemon:latest
启动 mon 容器
登陆到第一台服务器(ceph-admin)。
- 创建挂载目录,并赋予权限。
arduino
sudo mkdir -p "/root/ceph/etc"
sudo mkdir -p "/root/ceph/lib"
sudo mkdir -p "/root/ceph/logs"
sudo mkdir -p "/root/ceph/data;
chmod -R 777 /root/ceph
- 启动容器。
ini
docker run -d \
--net=host \
--name=mon \
--restart=always \
--privileged=true \
-v /root/ceph/etc:/etc/ceph \
-v /root/ceph/lib:/var/lib/ceph/ \
-v /root/ceph/logs:/var/log/ceph \
-e MON_IP=10.0.28.10,10.0.28.11,10.0.28.12 \
-e CEPH_PUBLIC_NETWORK=10.0.28.0/24 \
ceph/daemon mon
- 复制配置文件到另外两台服务器.
ruby
# ceph-2 10.0.28.11
scp -r /root/ceph root@10.0.28.11:/root
# ceph-3 10.0.28.12
scp -r /root/ceph root@10.0.28.12:/root
-
执行上面的容器启动命令,在另外两台服务器上启动 mon 容器。
-
查看部署状态。如下图,三个 mon 节点启动成功。
bash
docker exec mon ceph -s
启动 osd 容器
- 执行如下命令,在 mon 节点生成 osd 密钥信息,否则启动 osd 容器会报错。
bash
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
- 启动容器。
ruby
docker run -d \
--net=host \
--name=osd \
--restart=always \
--privileged=true \
-v /root/ceph/etc:/etc/ceph \
-v /root/ceph/lib/:/var/lib/ceph/ \
-v /root/ceph/logs/:/var/log/ceph \
-v /root/ceph/data/osd:/var/lib/ceph/osd \
ceph/daemon osd_directory
- 查看部署状态。如下图,三个 osd节点启动成功。
启动 mds 容器
ini
docker run -d \
--net=host \
--name mds \
--restart=always \
--privileged=true \
-v /root/baseService/ceph/etc:/etc/ceph \
-v /root/baseService/ceph/lib:/var/lib/ceph/ \
-v /root/baseService/ceph/logs:/var/log/ceph \
-e CEPHFS_CREATE=0 \
-e CEPHFS_METADATA_POOL_PG=512 \
-e CEPHFS_DATA_POOL_PG=512 \
ceph/daemon mds
# CEPHFS_CREATE 是为METADATA服务生成文件系统, 0表示不自动创建文件系统(默认值), 1表示自动创建。
# CEPHFS_DATA_POOL_PG是数据池的数量,默认为8。
# CEPHFS_METADATA_POOL_PG是元数据池的数量,默认为8。
启动 rgw 容器
- 执行如下命令,在 mon 节点生成 rgw密钥信息,否则启动 rgw容器会报错。
bash
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
- 启动容器。
bash
docker run -d \
--net=host \
--name rgw \
--restart=always \
-p 7480:80 \
-v /root/ceph/etc:/etc/ceph \
-v /root/ceph/lib:/var/lib/ceph/ \
-v /root/ceph/logs:/var/log/ceph \
ceph/daemon rgw
启动 mgr 容器
- 启动容器。
bash
docker run -d --net=host \
--name=mgr \
--restart=always \
-v /root/ceph/etc:/etc/ceph \
-v /root/ceph/lib:/var/lib/ceph \
-v /root/ceph/logs:/var/log/ceph \
ceph/daemon mgr
- 查看部署状态。如下图,至此,Ceph 集群节点全部启动成功。
安装 Dashboard 管理后台
- 开启 Dashboard 功能。
bash
docker exec mgr ceph mgr module enable dashboard
- 创建证书。
lua
docker exec mgr ceph dashboard create-self-signed-cert
- 创建登陆用户名和密码。
python
docker exec mgr ceph dashboard set-login-credentials cephAdmin cephPassword
- 配置外部访问端口。
bash
docker exec mgr ceph config set mgr mgr/dashboard/server_port 7800
- 配置外部访问 ip。
bash
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 10.0.28.10
- 关闭 HTTPS(如果没有证书或内网使用,可以关闭)。
bash
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
-
重启
mgr
服务。docker restart mgr
-
查看 Dashboard 服务信息。
bash
docker exec mgr ceph mgr services
- 浏览器访问 Dashboard 管理页面。
问题
- osd 容器启动失败。
error connecting to the cluster
、does not generate config
。执行如下命令解决。
bash
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
- rgw 容器启动失败。
ERROR- /var/lib/ceph/bootstrap-rgw/ceph.keyring must exist
执行如下命令解决。
bash
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
- 服务器重启后,mon 节点重启失败。
Existing mon, trying to rejoin cluster
。修改 mon 的启动脚本解决。
- 将 mon 容器内的启动脚本复制到宿主机中。
bash
docker cp mon:/opt/ceph-container/bin/start_mon.sh .
- 修改启动脚本。
ini
# 找到如下代码,注释掉
v2v1=$(ceph-conf -c /etc/ceph/${CLUSTER}.conf 'mon host' | tr ',' '\n' | grep -c ${MON_IP})
# 替换为如下代码
v2v1=2
- 将修改后的启动脚本再复制到容器中。
bash
docker cp start_mon.sh mon:/opt/ceph-container/bin/start_mon.sh
-
重新启动 mon 容器。
docker restart mon
-
容器正常启动,但出现如下错误日志,执行
docker exec mon ceph -s
命令无响应。因为部署了三个 mon 节点,只要再启动其他两个 mon 节点即可恢复正常响应。
末尾
如果本文对你有帮助的话,欢迎 点赞 + 收藏 ,非常感谢!
我是 Cleaner,我们下期再见~