---
title: 对象映射到OSD
description: "每个存储池都有很多归置组，CRUSH动态的把它们映射到OSD。Ceph客户端要存对象时，CRUSH将把各对象映射到某个归置组。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengsdss/twp/kunpengsdss_19_0008.html
sourcePath: /source/zh/kunpengsdss/twp/kunpengsdss_19_0008.html
indexId: 0ec62f2ad217269c53e65119552c08e5045080787ac6da1f3e8ac52fc7762fd751
---
# 对象映射到OSD

每个存储池都有很多归置组，CRUSH动态的把它们映射到OSD。Ceph客户端要存对象时，CRUSH将把各对象映射到某个归置组。

把对象映射到归置组在OSD和客户端间创建了一个间接层。由于Ceph集群必须能增大或缩小，并动态地重均衡。如果让客户端“知道”哪个OSD有哪个对象，就会导致客户端和OSD紧耦合；相反，CRUSH算法把对象映射到归置组、然后再把各归置组映射到一或多个OSD，这一间接层可以让Ceph在OSD守护进程和底层设备上线时动态地重均衡。下图描述了CRUSH如何将对象映射到归置组、再把归置组映射到OSD。

图1 CRUSH将对象映射到归置组、再把归置组映射到OSD

有了集群运行图副本和CRUSH算法，客户端就能精确地计算出到哪个OSD读、写某特定对象。

Ceph客户端绑定到某监视器时，会索取最新的集群运行图副本，有了此图，客户端就能知道集群内的所有监视器、OSD和元数据服务器。然而它对对象的位置一无所知。

对象位置是计算出来的。

客户端只需输入对象名称和存储池，此事简单：Ceph把数据存在某存储池（如liverpool）中。当客户端想要存命名对象（如john、paul、george、ringo等）时，它用对象名、一个哈希值、存储池中的归置组数、存储池名计算归置组。Ceph按下列步骤计算PG ID。

1. 客户端输入存储池名称和对象名称（如pool="liverpool"和object-id="john"）。
2. CRUSH拿到对象名称并哈希它。
3. CRUSH用PG数（如58）对哈希值取模，这就是归置组ID。
4. CRUSH根据存储池名称取得存储池ID（如liverpool = 4 ）。
5. CRUSH把存储池ID加到PG ID（如 4.58 ）之前。

计算对象位置远快于查询定位，CRUSH算法允许客户端计算对象应该存到哪里，并允许客户端连接主OSD来存储或检索对象。
