(OSDs * 100)
Total PGs = ------------
pool size
ceph 客户端从ceph monitor获取cluster map,然后执行在pool中的pg执行IO操作。cursh ruleset和pg的数量是决定数据对象放在哪里的核心因素。获取到最新的cluster map,ceph客户端是不知道数据对象在哪里。
只有写操作需要客户端的object id和pool名称,ceph把数据存储在pool中。当客户端写入数据对象时候,会输入object的哈希、pg的数量、pool名称作为写入参数,然后使用crush计算对应哪个pg id和主的osd.客户端会经过如下几个步骤计算PG ID:
1.客户端使用pool id和object id作为参数,然后根据object id进行哈希计算
2.crush拿到object id和哈希值,哈希值针对当前pool中所有的pg数量总数取余,获得pg id
3.crush通过crush规则计算出pg id对应的主osd
4.客户端在PG ID前加上pool ID,例如4.58,然后客户端这对数据对象的读写删操作直接和主的osd进行操作
ceph集群的topology和state是相对稳定的。让一个Ceph客户端通过librados来计算对象位置比要求客户端查询存储集群要快得多对于每个读/写操作。cursh算法允许客户端计算object存储在哪个位置,同时允许ceph客户端直接和主osd进行读写数据。如果集群的状态改变,ceph客户端可以直接从ceph minotor请求并且更新集群状态信息。
ObjectStore提供了low-level的接口给osd的裸设备使用。当客户端read/write数据,直接和ObjectStore接口交互。ceph写操作具有ACID的事务的。ObjectStore写入一个事务要么成功要么失败,这是体现了原子性。数据对象存在ceph集群有一个唯一的编号、数据、元数据,因此ObjectStore根据这些信息来保证数据对象的一致性。ObjectStore通过顺序写操作来保证隔离性。osd提供副本或者EC pool的接口,这体现了持久性。ceph实现了如下方式存储引擎存储数据
1.FileStore:企业生产级别的使用文件系统存储数据对象
2.BlueStore:企业生产级别使用裸设备存储对象数据
3.MemeStore:开发级别用于在内存测试读写操作
4.K/V Store:ceph内部实现的key/value数据库