牛虻与专家

导航

 

CEPH RADOS IO(读写) 处理流程图:

 

以下流程版本ceph version 14.2.5 nautilus

 

 

 

CPEH读写顺序保证: 

  •  不同对象的并发控制

不同的对象有可能落到同一个pg里,ceph实现里,在OSD的处理线程中就会给PG加锁,一直到queue_transactions里把事务放到bluestore的队列里才释放PG的锁。从这里可以看出,对于同一个PG里的不同对象,是通过PG锁来进行并发的控制,好在这个过程中没有涉及到对象的I/O,不会太影响效率;对于不同PG的对象,就可以直接进行并发访问。

 

  • 同一个对象的并发顺序控制

从上面的介绍可以得知,同一个对象的访问也会受到PG锁的限制,但这是在OSD的处理逻辑里。对于同一个对象的访问,要考虑的情况比较复杂。从用户使用场景上来说,有两种使用方式。比如:

1)一个client情况,客户端对同一个对象的更新处理逻辑是串行的,要等前一次写请求完成,再进行后一次的读取或者写更新;

2)多个client对同一个对象的并发访问,目前的分布式系统里很少能做到,涉及到多个client同时更新带来的数据一致性问题,一般都需要集群文件系统的支持;

 

对于多client的场景,cephrbd也是不能保证的,因此这里主要以单client访问ceph rbd块设备的场景进行阐述,看一个极端的例子:同一个client先后发送了2次对同一个对象的异步写请求。以这个例子展开进行说明。

  • pg层顺序保证及对象锁机制

从消息队列里取消息进行处理时,osd端处理op是划分为多个shard,然后每个shard里可以配置多个线程,pg按照取模的方式映射到不同的shard里。另外osd在处理pg时,从消息队列里取出的时候就对pg加了写锁的,而且是在请求下发到store后端才释放的锁,所以消息队列里过来的消息有序后,在osdpg这一层处理时也是有序的

posted on 2020-06-16 18:01  牛虻&专家  阅读(2313)  评论(0编辑  收藏  举报