使用 Docker 部署分布式存储系统——Ceph

最近工作中接触了一个 Python + Flask 的新项目,项目中使用了 Ceph 对象存储服务。遂在开发环境使用 Docker 搭建了一套 Ceph 集群。

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

拉取镜像

DockerHub 镜像地址

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

  1. 创建挂载目录,并赋予权限。
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
  1. 启动容器。
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
  1. 复制配置文件到另外两台服务器.
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
  1. 执行上面的容器启动命令,在另外两台服务器上启动 mon 容器。

  2. 查看部署状态。如下图,三个 mon 节点启动成功。

bash 复制代码
docker exec mon ceph -s

启动 osd 容器

  1. 执行如下命令,在 mon 节点生成 osd 密钥信息,否则启动 osd 容器会报错。
bash 复制代码
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
  1. 启动容器。
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
  1. 查看部署状态。如下图,三个 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 容器

  1. 执行如下命令,在 mon 节点生成 rgw密钥信息,否则启动 rgw容器会报错。
bash 复制代码
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
  1. 启动容器。
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 容器

  1. 启动容器。
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
  1. 查看部署状态。如下图,至此,Ceph 集群节点全部启动成功。

安装 Dashboard 管理后台

  1. 开启 Dashboard 功能。
bash 复制代码
docker exec mgr ceph mgr module enable dashboard
  1. 创建证书。
lua 复制代码
docker exec mgr ceph dashboard create-self-signed-cert
  1. 创建登陆用户名和密码。
python 复制代码
docker exec mgr ceph dashboard set-login-credentials cephAdmin cephPassword
  1. 配置外部访问端口。
bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/server_port 7800
  1. 配置外部访问 ip。
bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 10.0.28.10
  1. 关闭 HTTPS(如果没有证书或内网使用,可以关闭)。
bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
  1. 重启mgr服务。

    docker restart mgr

  2. 查看 Dashboard 服务信息。

bash 复制代码
docker exec mgr ceph mgr services
  1. 浏览器访问 Dashboard 管理页面。

问题

  • osd 容器启动失败。error connecting to the clusterdoes 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 的启动脚本解决。
  1. 将 mon 容器内的启动脚本复制到宿主机中。
bash 复制代码
docker cp mon:/opt/ceph-container/bin/start_mon.sh .
  1. 修改启动脚本。
ini 复制代码
# 找到如下代码,注释掉
v2v1=$(ceph-conf -c /etc/ceph/${CLUSTER}.conf 'mon host' | tr ',' '\n' | grep -c ${MON_IP})
# 替换为如下代码
v2v1=2
  1. 将修改后的启动脚本再复制到容器中。
bash 复制代码
docker cp start_mon.sh mon:/opt/ceph-container/bin/start_mon.sh 
  1. 重新启动 mon 容器。

    docker restart mon

  2. 容器正常启动,但出现如下错误日志,执行docker exec mon ceph -s命令无响应。因为部署了三个 mon 节点,只要再启动其他两个 mon 节点即可恢复正常响应。

末尾

如果本文对你有帮助的话,欢迎 点赞 + 收藏 ,非常感谢!

我是 Cleaner,我们下期再见~

相关推荐
sam-12339 分钟前
k8s上部署redis高可用集群
redis·docker·k8s
Fanstay9851 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
星染xr1 小时前
kafka 生产经验——数据积压(消费者如何提高吞吐量)
分布式·kafka
东方巴黎~Sunsiny2 小时前
如何监控Kafka消费者的性能指标?
分布式·kafka
飞升不如收破烂~2 小时前
kafka
分布式·kafka
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
背水2 小时前
初识Spring
java·后端·spring
晴天飛 雪3 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
weixin_537590453 小时前
《Spring boot从入门到实战》第七章习题答案
数据库·spring boot·后端