我正在考虑将 ceph 作为我自制的 MAID(大量空闲驱动器阵列)的分布式文件系统。
据我所知,Ceph 面向集群使用,将数据均匀分布在 OSD 上(相对于 CRUSH 图),并尝试利用不同节点上的读取操作并行性。
就我而言,我不需要最大化扩展和吞吐量,理想情况下它应该先填充 N 个 OSD(其中 N 是复制因子),然后再开始填充接下来的 N 个 OSD,以最小化相邻数据检索所需的活动驱动器数量。
我可以通过调整放置组数量和 CRUSH 图来实现这种行为吗?或者,如果不可能,我至少可以让 ceph 停止将文件拆分为多个块吗?
答案1
我认为 ceph 无法实现与你想要实现的目标类似的目标。据我所知,ceph 是一个分布式文件系统并且它通过使用复制来确保高容错能力。请阅读:
Ceph 的主要目标是实现完全分布式、无单点故障、可扩展至 EB 级别并且可免费使用。
ceph 的强大之处在于它的可扩展性和高可用性:
在传统架构中,客户端与集中式组件(例如网关、代理、API、外观等)通信,该组件充当复杂子系统的单一入口点。这限制了性能和可扩展性,同时引入了单点故障(即,如果集中式组件发生故障,整个系统也会发生故障)。
Ceph 消除了集中式网关,使客户端能够直接与 Ceph OSD 守护进程交互。Ceph OSD 守护进程在其他 Ceph 节点上创建对象副本,以确保数据安全和高可用性。Ceph 还使用监视器集群来确保高可用性。为了消除集中化,Ceph 使用了一种称为 CRUSH 的算法。
我想指出的是,ceph 旨在确保集群环境中物理磁盘的使用,以确保更高的弹性、高可用性和透明度。这并不是你想要的。
如果你担心性能或磁盘 I/O,可以使用这个选项主要亲和力,例如,可以用于优先考虑 SAAS 磁盘而不是 SATA。阅读更多这里和这里。
主要亲和力
当 Ceph 客户端读取或写入数据时,它始终会联系在职集中的主 OSD。对于集 [2, 3, 4],osd.2 是主 OSD。有时,与其他 OSD 相比,某个 OSD 并不适合充当主 OSD(例如,它的磁盘或控制器速度较慢)。为了防止出现性能瓶颈(尤其是在读取操作时),同时最大限度地利用硬件,您可以设置 Ceph OSD 的主亲和性,以便 CRUSH 不太可能将该 OSD 用作在职集中的主 OSD。
ceph osd primary-affinity <osd-id> <weight>
默认情况下,主关联性为 1(即,OSD 可以充当主 OSD)。您可以将 OSD 主关联性范围设置为 0-1,其中 0 表示 OSD 不能用作主 OSD,1 表示 OSD 可以用作主 OSD。当权重小于 1 时,CRUSH 选择 Ceph OSD 守护进程充当主 OSD 的可能性较小。
我知道这并不能完全回答您的所有问题,但可能会提供一些值得思考的内容。
详情请见此处:http://docs.ceph.com/docs/master/rados/operations/crush-map/#primary-affinity
和这里是一个很好的博客,解释 ceph 集群。