CEPH RADOS IO(读写) 处理流程图:
以下流程版本ceph version 14.2.5 nautilus
CPEH读写顺序保证:
- 不同对象的并发控制
不同的对象有可能落到同一个pg里,ceph实现里,在OSD的处理线程中就会给PG加锁,一直到queue_transactions里把事务放到journal的队列里(以filestore为例)才释放PG的锁。从这里可以看出,对于同一个PG里的不同对象,是通过PG锁来进行并发的控制,好在这个过程中没有涉及到对象的I/O,不会太影响效率;对于不同PG的对象,就可以直接进行并发访问。
- 同一个对象的并发顺序控制
从上面的介绍可以得知,同一个对象的访问也会受到PG锁的限制,但这是在OSD的处理逻辑里。对于同一个对象的访问,要考虑的情况比较复杂。从用户使用场景上来说,有两种使用方式。比如:
1)一个client情况,客户端对同一个对象的更新处理逻辑是串行的,要等前一次写请求完成,再进行后一次的读取或者写更新;
2)多个client对同一个对象的并发访问,目前的分布式系统里很少能做到,涉及到多个client同时更新带来的数据一致性问题,一般都需要集群文件系统的支持;
对于多client的场景,ceph的rbd也是不能保证的,因此这里主要以单client访问ceph rbd块设备的场景进行阐述,看一个极端的例子:同一个client先后发送了2次对同一个对象的异步写请求。以这个例子展开进行说明。
- pg层顺序保证及对象锁机制
从消息队列里取消息进行处理时,osd端处理op是划分为多个shard,然后每个shard里可以配置多个线程,pg按照取模的方式映射到不同的shard里。另外osd在处理pg时,从消息队列里取出的时候就对pg加了写锁的,而且是在请求下发到store后端才释放的锁,所以消息队列里过来的消息有序后,在osd端pg这一层处理时也是有序的