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的場景,ceph的rbd也是不能保證的,因此這里主要以單client訪問ceph rbd塊設備的場景進行闡述,看一個極端的例子:同一個client先后發送了2次對同一個對象的異步寫請求。以這個例子展開進行說明。
- pg層順序保證及對象鎖機制
從消息隊列里取消息進行處理時,osd端處理op是划分為多個shard,然后每個shard里可以配置多個線程,pg按照取模的方式映射到不同的shard里。另外osd在處理pg時,從消息隊列里取出的時候就對pg加了寫鎖的,而且是在請求下發到store后端才釋放的鎖,所以消息隊列里過來的消息有序后,在osd端pg這一層處理時也是有序的