ceph存储原理
什么是ceph
Ceph 是一个开源的分布式存储系统,它的原理涉及数据存储、数据分布、数据冗余和故障恢复等多个方面,下面为你详细介绍:
数据存储模型
Ceph 采用对象存储作为基础存储模型。在 Ceph 中,所有数据都被抽象为对象(Object)。每个对象包含数据本身以及与之关联的元数据,元数据描述了对象的属性,如大小、创建时间、访问权限等。对象被存储在对象存储设备(OSD)上,OSD 是实际负责存储和管理数据的物理节点或逻辑单元。
数据分布机制
- 集群映射(Cluster Map):Ceph 通过集群映射来记录集群的状态信息,包括所有 OSD 的状态、监视器(Monitor)的位置、数据的分布规则等。集群映射会随着集群的变化(如节点加入、离开或故障)而动态更新,并在所有参与节点间同步。
- 一致性哈希与 CRUSH 算法:Ceph 使用基于一致性哈希改进的 CRUSH(Controlled Replication Under Scalable Hashing)算法来确定数据对象的存储位置。CRUSH 算法根据集群映射和用户指定的存储策略(如副本数量、存储位置限制等),计算出对象应该存储在哪些 OSD 上。这样做的好处是,当集群规模发生变化时,只需要对少量数据进行迁移,减少了数据的移动量,提高了系统的可扩展性和稳定性。
数据冗余与恢复
- 数据副本策略:为了保证数据的可靠性,Ceph 支持数据副本机制。用户可以根据需求指定数据的副本数量,默认情况下通常为 3 份。CRUSH 算法会将数据副本分散存储在不同的 OSD 上,甚至不同的物理节点或机架上,以避免单点故障。
- 自动故障检测与恢复:Ceph 的监视器(Monitor)会实时监控集群中各个 OSD 的状态。当检测到某个 OSD 出现故障时,Ceph 会自动启动数据恢复流程。它会根据集群映射和副本信息,从其他正常的 OSD 上复制数据到新的 OSD 上,以保证数据的副本数量达到用户指定的要求。同时,Ceph 会在后台对数据进行一致性检查和修复,确保数据的完整性。
元数据管理
- 文件系统元数据(MDS):在提供文件系统接口时,Ceph 使用元数据服务器(MDS)来管理文件系统的元数据,如文件目录结构、文件权限、文件与对象的映射关系等。MDS 将元数据与实际数据分离存储,使得文件系统的操作更加高效。客户端在访问文件时,首先与 MDS 进行交互,获取文件的元数据信息,然后再根据元数据与相应的 OSD 进行数据读写操作。
- 对象存储元数据:对于对象存储,元数据直接与对象关联并存储在 OSD 上。每个对象的元数据包含了对象的基本信息,如对象 ID、大小、创建时间等。这些元数据可以帮助 OSD 快速定位和管理对象。
客户端访问
Ceph 提供了多种客户端接口,包括对象存储接口(如 S3、Swift)、块存储接口(如 iSCSI)和文件系统接口(如 CephFS)。客户端通过这些接口与 Ceph 集群进行交互。当客户端发起读写请求时,它会先与 Ceph 的监视器或元数据服务器进行通信,获取数据的存储位置信息,然后直接与相应的 OSD 进行数据传输,避免了中间节点的性能瓶颈,提高了数据访问的效率。
ceph搭建方式和步骤
1. 环境准备
- 硬件要求:至少需要 3 台服务器,每台服务器都要有可用的硬盘用于存储数据。同时,服务器需要具备足够的内存和 CPU 资源,以保障 Ceph 服务的正常运行。
- 软件要求:所有服务器需安装相同版本的 Linux 操作系统,例如 Ubuntu 20.04 或者 CentOS 8。并且要确保服务器之间能够通过网络相互通信,防火墙已正确配置,允许 Ceph 服务所需的端口通过。
2. 安装必要的软件包
在每台服务器上,根据不同的操作系统,使用以下命令安装必要的软件包:
Ubuntu 系统
bash
sudo apt update
sudo apt install -y ceph-deploy
CentOS 系统
bash
sudo yum install -y ceph-deploy
3. 创建部署目录
在其中一台服务器上创建一个用于 Ceph 部署的目录,并进入该目录:
bash
mkdir ceph-cluster
cd ceph-cluster
4. 配置主机名和 SSH 免密登录
- 配置主机名:在每台服务器上,使用
hostnamectl
命令设置主机名,并将主机名和对应的 IP 地址添加到/etc/hosts
文件中,确保服务器之间可以通过主机名进行通信。 - SSH 免密登录:在部署节点上生成 SSH 密钥对,并将公钥分发到其他所有服务器上,实现 SSH 免密登录。
bash
ssh-keygen
ssh-copy-id username@server_ip
这里的username
是服务器的用户名,server_ip
是服务器的 IP 地址。
5. 初始化 Ceph 部署
在部署目录中,使用ceph-deploy
工具初始化 Ceph 部署:
bash
ceph-deploy new node1 node2 node3
这里的node1
、node2
、node3
是你的服务器主机名。
6. 编辑 Ceph 配置文件
打开生成的ceph.conf
文件,根据需求进行配置,例如设置集群的副本数、存储池的大小等。以下是一个简单的配置示例:
ini
[global]
fsid = <uuid>
mon_initial_members = node1, node2, node3
mon_host = <node1_ip>,<node2_ip>,<node3_ip>
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 3
需要将<uuid>
替换为一个唯一的 UUID,可以使用uuidgen
命令生成;<node1_ip>
、<node2_ip>
、<node3_ip>
替换为对应的服务器 IP 地址。
7. 安装 Ceph 软件
使用ceph-deploy
工具在所有服务器上安装 Ceph 软件:
bash
ceph-deploy install node1 node2 node3
8. 部署监视器(Monitor)
在指定的服务器上部署 Ceph 监视器:
bash
ceph-deploy mon create-initial
9. 准备 OSD(对象存储设备)
在每台服务器上,选择要用于 Ceph 存储的硬盘,并对其进行分区和格式化:
bash
ceph-deploy osd prepare node1:/dev/sdb node2:/dev/sdb node3:/dev/sdb
这里的/dev/sdb
是要使用的硬盘设备名,根据实际情况进行修改。
10. 激活 OSD
准备好 OSD 后,激活它们:
bash
ceph-deploy osd activate node1:/dev/sdb1 node2:/dev/sdb1 node3:/dev/sdb1
这里的/dev/sdb1
是之前分区后的设备名。
11. 验证 Ceph 集群
使用以下命令验证 Ceph 集群是否正常运行:
bash
ceph -s
如果集群正常运行,你将看到集群的状态信息,包括监视器状态、OSD 状态、存储池信息等。
12. 创建存储池和用户
创建一个存储池用于存储数据,并创建一个用户用于访问存储池:
bash
ceph osd pool create mypool 128 128
ceph auth get-or-create client.myuser mon 'allow r' osd 'allow rwx pool=mypool'
这里的mypool
是存储池的名称,myuser
是用户的名称。
通过以上步骤,你就可以成功搭建一个 Ceph 集群。在实际使用中,你可以根据具体需求对 Ceph 集群进行进一步的配置和优化。