【星海出品】云存储 ceph

在这里插入图片描述
在这里插入图片描述

https://ceph.com/en/

ceph组件介绍

Monitor

一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。

OSD

OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。

MDS

MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。

Object

Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。

PG

PG全称Placement Grouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。

RADOS

RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。

Libradio

Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。

CRUSH

CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。

RBD

RBD全称RADOS block device,是Ceph对外提供的块设备服务。

RGW

RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。

CephFS

CephFS全称Ceph File System,是Ceph对外提供的文件系统服务。

建议运行带有两个网络的Ceph存储集群:公共(前端)网络和集群(后端)网络。为了支持两个网络,每个Ceph节点都需要有多个NIC。
在这里插入图片描述
为什么要做内外网分离
Ceph 的客户端,如RBD,会直接和 OSD 互联,以上传和下载数据,这部分是直接提供对外下载上传能力的;Ceph 一个基本功能是提供数据的冗余备份,OSD 负责数据的备份,跨主机间的数据备份当然要占用带宽,而且这部分带宽是无益于 Ceph 集群的吞吐量的。只有一个网络,尤其是有新的存储节点加入时,Ceph 集群的性能会因为大量的数据拷贝而变得很糟糕。建立内网是为了降低 OSD 节点间数据复制对 Ceph 整体的影响,那么只要在 OSD 节点上加内网就可以了,上图非常清晰的描述了内网和外网覆盖的范围。
做内外网分离,必不可少的前提条件是 OSD 服务器上必须有两张可用的网卡,并且网络互通,确保这点我们就可以开始了。所以对于性能有一定要求的用户,还是有必要配置内外网分离的。

在这里插入图片描述

步骤:

  1. 客户端创建一个pool,需要为这个pool指定pg的数量。
  2. 创建pool/image rbd设备进行挂载。
  3. 用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,名字就是object+序号。
  4. 将每个object通过pg进行副本位置的分配。
  5. pg根据cursh算法会寻找3个osd,把这个object分别保存在这三个osd上。
  6. osd上实际是把底层的disk进行了格式化操作,一般部署工具会将它格式化为xfs文件系统。
  7. object的存储就变成了存储一个文rbd0.object1.file。
  8. 在这里插入图片描述

在这里插入图片描述

用简单hash解决对象obj到虚拟节点pg的映射,但是为了解决pg到实际物理节点osd的映射问题,ceph提出了crush算法。
crush算法是一个伪随机的路由选择算法,输入pg的id,osdmap等元信息,通过crush根据这个pool配置的crush rule规则的伪随机计算,最终输出存储这个pg的副本的osd列表。由于是伪随机的,只要CRUSH Map、crush rule规则相同,在任意的机器上,针对某个pg id,计算的最终的osd列表都是相同的。

CRUSH算法的全称为:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可扩展的、分布式的副本数据放置算法。

pg到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。

CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。

Pg id由简单hash算法求出,计算公式如下:
Id = Int(Hash(object_name)%PG_num)

Ceph通信框架设计模式

订阅发布模式又名观察者模式,它意图是“定义对象间的一种一对多的依赖关系,
当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
在这里插入图片描述
步骤:
Accepter监听peer的请求, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求。

Pipe用于消息的读取和发送。该类主要有两个组件,Pipe::Reader,Pipe::Writer用来处理消息读取和发送。

Messenger作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者, Messenger 收到消息之后, 通过 Pipe 读取消息,然后转给 Dispatcher 处理。

Dispatcher是订阅者的基类,具体的订阅后端继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers. 收到消息后,通知该类处理。

DispatchQueue该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息。
在这里插入图片描述

令牌桶限流模型

用户发起请求异步IO到达Image中。
请求到达ImageRequestWQ队列中。
在ImageRequestWQ出队列的时候加入令牌桶算法TokenBucket。
通过令牌桶算法进行限速,然后发送给ImageRequest进行处理。
在这里插入图片描述

要使用Ceph-tools中的重新平衡功能,可以按照以下步骤进行操作:
准备环境:确保已经安装了Ceph-tools,并且Ceph集群处于正常运行状态。
选择存储池:选择要进行重新平衡的存储池(pool)。可以使用ceph osd pool ls命令查看可用的存储池。
获取存储池信息:使用ceph osd pool info <pool_name>命令获取存储池的详细信息,包括OSD列表和权重等。
调整OSD权重:根据需要调整OSD的权重。可以使用ceph osd pool reweight <pool_name> <new_weight>命令来调整单个OSD的权重。如果要批量调整多个OSD的权重,可以使用ceph osd pool reweight <pool_name> <osd_spec>命令,其中<osd_spec>可以是OSD的ID、名称或者范围。
等待重新平衡完成:调整权重后,Ceph会自动开始重新平衡存储池,将数据重新分配到各个OSD上。等待一段时间后,可以使用ceph osd pool stats命令查看存储池的状态和统计信息,确认数据是否已经重新平衡。
请注意,在执行重新平衡操作之前,建议做好数据备份,并确保对Ceph集群的配置和参数有深入的了解。此外,根据实际情况可能需要调整其他相关参数和配置。建议在测试环境中进行验证,以避免不必要的风险。

命令篇

ceph 常用命令

状态查看:

[查看ceph集群状态:]
ceph -s
[查看mon状态]
ceph mon stat
[查看osd状态]
ceph osd stat
[查看osd目录树]
ceph osd tree
[查看osd池]
ceph osd lspool

OSD 常用命令

[下线OSD]
#让编号为0的osd down掉,此时该osd不接受读写请求,但仍然活着
ceph osd down 0
[拉起osd]
ceph osd up 0
[将osd逐出集群]
ceph osd out 0
[将osd加入集群]
ceph osd in 0
[删除osd]
#在集群中删除一个 osd,可能需要先 stop 该 osd,即 stop osd.0
ceph osd rm 0
[删除host节点]
#在集群中删除一个host节点
ceph osd crush rm node1
[查看最大osd个数]
#查看最大osd的个数,默认最大是4个osd节点
ceph osd getmaxosd
[暂停OSD]
#暂停后整个集群不再接受数据
ceph osd pause
[开启osd]
#开启后再次接收数据
ceph osd unpause
[创建pool池]
ceph osd pool create vms

ceph 服务常用命令

[重启mon]
systemctl restart ceph-mon.target
[重启osd]
systemctl restart ceph-osd.target
[重启mgr]
systemctl restart ceph-mgr.target
查询实战篇。
[查询osd的树状结构,其中每个OSD都有一个唯一的ID标识。]
ceph osd tree
[获取特定主机上的所有OSD列表]
#注:ceph tree 可以显示每个 osd 所在的主机。
ceph osd crush get osd_host {hostname}

查看osd对应的物理硬盘:

ceph-bluestore-tool  show-label --path /var/lib/ceph/osd/ceph-2|grep osd_uuid|awk -F '\"' '{print $4}' 
lvs|grep XXXX-XXX-XXXX-XXX |awk '{print $2}' 

pvs|grep ceph-XXXX-XXXX-XXXX-XXXX
问题篇

systemctl status ceph-osd@id
active,but ceph osd tree 内显示是挂掉的.
FIRST YOU NEED
systemctl stop ceph-osd@<ID> 先停止该osd服务
AND TO
再运行ceph-volume lvm activate --all命令

【使用mkfs尝试修复】

ceph-osd -i $ID --mkfs
#删除osd 
ceph osd out 1 
ceph osd crush remove osd.1 
ceph auth del osd.1 
systemctl stop ceph-osd@1 
ceph osd destroy 1 --yes-i-really-mean-it 
umount /var/lib/ceph/osd/ceph-1 
ceph osd rm 1 
#执行完上述命令后,可以看到ceph -s里的osd已经变成只有1个 
#清理新硬盘 
ceph-volume lvm zap /dev/sdd --destroy 
#使用新硬盘 
ceph-volume lvm create --data /dev/sdd 

#启动服务 
systemctl enable --runtime ceph-osd@1
systemctl start ceph-osd@1 

【日志目录】
/var/log/ceph/

【当Ceph集群中的一个OSD损坏时】

Ceph池会通过以下方式发现并做出相应的调整:

OSD状态检测:Ceph集群中的其他OSD会定期检查集群中所有OSD的状态。如果某个OSD出现故障或离线,其他OSD会检测到该问题,并向监视器(Monitor)报告。
监视器处理:监视器节点接收到OSD状态信息后,会根据集群的CRUSH算法和规则,确定如何重新平衡数据分布。监视器会生成新的OSD映射(osdmap),指示数据应该被放置在哪些OSD上。
OSD映射更新:监视器将新的OSD映射广播到整个Ceph集群,确保所有节点都了解最新的数据分布情况。
数据恢复和再平衡:监视器会触发数据恢复机制,将数据从损坏的OSD迁移到其他健康的OSD上,以重新平衡数据分布。同时,Ceph客户端可能会收到通知,告知它们数据位置的变更。
客户端适应:客户端接收到通知后,会更新它们的数据位置信息,并使用新的OSD映射来访问存储池中的数据。
通过这种方式,当Ceph集群中的一个OSD损坏时,Ceph池能够自动检测、处理和调整数据分布,以确保数据的可靠性和可用性。同时,管理员可以采取适当的措施来修复或替换损坏的OSD,以恢复集群的正常运行。

ceph 池篇

ceph 池篇

Ceph池主要依靠CRUSH(Controlled Replication Under Scalable Hashing)算法来实现数据的存储和检索。CRUSH算法将数据映射到存储节点上,并根据可扩展哈希函数计算出数据应该被放置的位置。通过这种方式,Ceph池可以在集群中动态地增长或收缩,并重新平衡数据分布。

Ceph池还提供了快照功能,可以使用ceph osd pool mksnap命令来创建池的快照。快照功能可以帮助备份和恢复数据,同时还可以用于数据版本控制和回滚等操作。

此外,Ceph池还支持设置访问权限和所有权,以确保数据的隐私和安全性。通过使用CephX认证机制,可以控制对Ceph池的访问权限,并对数据进行加密和完整性验证。

ceph osd pool create 用于创建新的存储池。
ceph osd pool delete 用于删除指定的存储池。
ceph osd pool get 用于查看指定存储池的参数和属性。
ceph osd pool set 用于设置指定存储池的参数和属性。
ceph osd pool stats 用于查看存储池的统计信息,包括存储使用情况、IO 统计等。
ceph osd pool list 用于列出所有的存储池。
ceph osd pool mksnap 用于创建存储池的快照。
ceph osd pool rmsnap 用于删除存储池的快照。
ceph osd pool clone 用于克隆存储池中的对象。
ceph osd pool trim 用于修剪存储池中的对象。

资料来源

https://docs.ceph.com/en/latest/rados/configuration/mon-osd-interaction/
https://www.cnblogs.com/djoker/p/15955734.html
https://blog.csdn.net/uxiAD7442KMy1X86DtM3/article/details/81059215
http://www.51niux.com/?id=164
https://blog.csdn.net/easonwx/article/details/124306477
https://zhuanlan.zhihu.com/p/647566166

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值