日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入解析Ceph分布式存儲的內(nèi)核客戶端

深入解析Ceph分布式存儲的內(nèi)核客戶端

作者:SunnyZhang的IT世界 2020-03-12 19:00:48

存儲

存儲軟件

分布式 隨著云計算的發(fā)展,Ceph已經(jīng)成為目前最為流行的分布式存儲系統(tǒng),儼然存儲界的Linux操作系統(tǒng)。Ceph集塊存儲、文件存儲和對象存儲于一身,適用場景廣泛,用戶眾多。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了西盟免費建站歡迎大家使用!

 隨著云計算的發(fā)展,Ceph已經(jīng)成為目前最為流行的分布式存儲系統(tǒng),儼然存儲界的Linux操作系統(tǒng)。Ceph集塊存儲、文件存儲和對象存儲于一身,適用場景廣泛,用戶眾多。本文是介紹Ceph客戶端在內(nèi)核部分的實現(xiàn)的文章,本號特以翻譯成中文。

[[318499]]

 

Ceph是一個開源,統(tǒng)一的分布式存儲系統(tǒng),我們在Salesforce中用作塊存儲服務。Ceph的塊存儲通過一個客戶端模塊實現(xiàn),這個客戶端可以直接從數(shù)據(jù)守護進程讀寫數(shù)據(jù)(不需要經(jīng)過一個網(wǎng)關(guān))。根據(jù)客戶端整合生態(tài)系統(tǒng)的差異(譯者注:也就是應用場景),客戶端有兩種實現(xiàn)方式:

  • librbd (用戶態(tài))
  • krbd (內(nèi)核態(tài))

Librbd是一個典型的應用就是在虛擬機環(huán)境中(例如KVM或者QEMu),而krbd則是用在容器和裸金屬環(huán)境。在Salesforce, 我們將Ceph作為Docker容器并且在應用容器運行主機上安裝krbd模塊。

本文將描述Ceph內(nèi)核客戶端的一些內(nèi)部實現(xiàn)。下面是本文涵蓋的內(nèi)容:

  • 初始化
  • Ceph的配置是如何被內(nèi)核模塊獲取的
  • 處理配置的代碼入口點
  • 連接處理
  • 安全
  • 連接狀態(tài)機

krbd 初始化

krbd是一個內(nèi)核模塊。其在內(nèi)核中以一個塊設(shè)備的方式加以實現(xiàn)。整個Ceph客戶端都是以內(nèi)核模塊的方式實現(xiàn)(沒有與之相關(guān)的用戶態(tài)進程或者守護進程)。

Ceph客戶端需要一個配置文件(ceph.conf)以知道如何連接集群,并且需要知道集群的屬性。該配置文件通常包括Monitor的IP地址、用戶證書和Ceph認證的安全屬性(Cephx)。在初始化的時候,所有這些配置都需要加載到內(nèi)核模塊當中。一旦完成這一步,剩下的諸如鏡像或者卷生命周期、連接管理、認證和狀態(tài)機等所有實現(xiàn)都可以在內(nèi)核模塊中完成。

將CEPH配置推送到內(nèi)核模塊

當你運行ceph-deploy去安裝客戶端的時候,它將安裝在Ceph客戶端(以rbd為前綴的命令)CLI命令調(diào)用的二進制文件。

rbd CLI

第一個客戶端命令是:

  
 
 
 
  1. rbd map  --pool  

默認情況下,rbd從配置文件/etc/ceph/ceph.conf中讀取配置信息。該文件包含諸如Monitor地址(客戶端通過該地址與Monitor聯(lián)系)、OSD閑時ttl、OSD超時時間、OSD請求超時和加密等內(nèi)容。關(guān)于配置項的全量列表可以從這個地址獲?。篽ttp://docs.ceph.com/docs/jewel/man/8/rbd/#kernel-rbd-krbd-options。

OSD

 

 

krbd 初始化

rbd map命令行命令實際上讀取ceph.conf文件的內(nèi)容,并且通過Linux的“總線”接口(/sys/bus/ - 我們的場景下是 /sys/bus/rbd/add)推送這些配置信息給krbd內(nèi)核模塊。

定義依賴這里: https://github.com/torvalds/linux/blob/master/include/linux/device.h

總線(bus)是處理器和一個或者多個設(shè)備間的通道。其目的是實現(xiàn)設(shè)備模型,所有設(shè)備由總線連接,甚至可以是一個內(nèi)部的、虛擬的平臺(platform)總線??偩€之間可以彼此連接,比如一個USB控制器通常是一個PCI設(shè)備。設(shè)備模型代表總線和它們所控制設(shè)備的實際連接。

在Linux設(shè)備模型中,bus_type結(jié)構(gòu)體代表一個總線,在linux/device.h中定義。該結(jié)構(gòu)體如下:

 

 

本實現(xiàn)的源代碼在ceph/ceph git庫,具體如下:https://github.com/ceph/ceph/blob/master/src/krbd.cc

 

 

KRBD 配置解析

在內(nèi)核模塊中,處理配置文件的入口點定義在drivers/block/rbd.c 中(https://github.com/ceph/ceph-client/blob/for-linus/drivers/block/rbd.c):

static ssize_t rbd_add(struct bus_type *bus, const char *buf, size_t count)

連接設(shè)置

內(nèi)核模塊全權(quán)負責建立與Monitor和OSD的TCP連接,檢測這些連接,并且進行在出現(xiàn)問題的時候重建連接,以及認證工作。這些工作都是在內(nèi)核中進行的。

 

 

Mon 客戶端初始化

入口函數(shù): ceph_monc_init()

該函數(shù)首先通過掛載時提供的IP地址構(gòu)建一個臨時的monmap(build_initial_monmap()) ,這個操作發(fā)生在客戶端與Monitor建立新連接的時候。之后,其初始化認證數(shù)據(jù)結(jié)構(gòu),進一步準備如下消息以完成連接后的初步握手:

  • CEPH_MSG_MON_SUBSCRIBE (msg Id: 15)
  • CEPH_MSG_MON_SUBSCRIBE_ACK (msg Id: 16)
  • CEPH_MSG_AUTH (msg Id: 17)
  • CEPH_MSG_AUTH_REPLY (msg Id: 18)

連接初始化

入口函數(shù): ceph_con_init()

這時,調(diào)用ceph_con_init() (在net/ceph/messenger.c中) 函數(shù)完成與Monitor連接的初始化,并且通過一個狀態(tài)機轉(zhuǎn)換連接。ceph_con_init() 初始化套接字,發(fā)起一個工作隊列函數(shù),該函數(shù)通過異步的方式實現(xiàn)連接的設(shè)置。

 

 

ceph_con_workfn() 函數(shù)通過如下套接字狀態(tài)(ceph_connection -> sock_state)遍歷連接,并將其轉(zhuǎn)換為ESTABLISHED狀態(tài)。

  
 
 
 
  1. /* 
  2.  * Socket state - transitions (connection state is different from socket state) 
  3.  * -------- 
  4.  * | NEW* | transient initial state 
  5.  * -------- 
  6.  * | con_sock_state_init() 
  7.  * v 
  8.  * ---------- 
  9.  * | CLOSED | initialized, but no socket (and no 
  10.  * ---------- TCP connection) 
  11.  * ^ \ 
  12.  * | \ con_sock_state_connecting() 
  13.  * | ---------------------- 
  14.  * | \ 
  15.  * + con_sock_state_closed() \ 
  16.  * |+--------------------------- \ 
  17.  * | \ \ \ 
  18.  * | ----------- \ \ 
  19.  * | | CLOSING | socket event; \ \ 
  20.  * | ----------- await close \ \ 
  21.  * | ^ \ | 
  22.  * | | \ | 
  23.  * | + con_sock_state_closing() \ | 
  24.  * | / \ | | 
  25.  * | / --------------- | | 
  26.  * | / \ v v 
  27.  * | / -------------- 
  28.  * | / -----------------| CONNECTING | socket created,  
  29.  * | | / -------------- TCP connect  
  30.  * | | | initiated 
  31.  * | | | con_sock_state_connected() 
  32.  * | | v 
  33.  * ------------- 
  34.  * | CONNECTED | TCP connection established 
  35.  * ------------- 
  36.  * 
  37.  * State values for ceph_connection->sock_state; NEW is assumed to be 0. 
  38.  */ 
  39. /* 
  40.  * Connection state - transitions  
  41.  * -------- 
  42.  * | CLOSED |<----<-----------------<-----------<-  
  43.  * -------- | | | 
  44.  * | | On failures | | 
  45.  * v | | | 
  46.  * -------- | | | 
  47.  * ---->| PREOPEN |---- | | 
  48.  * | -------- ^ ^ 
  49.  * | | ceph_tcp_connect() | | 
  50.  * | v | | 
  51.  * ^ ------------- | | 
  52.  * | | CONNECTING |----------------------- | 
  53.  * | ------------- | 
  54.  * | | Read and process banner ("ceph v027"), |  
  55.  * | | prepare capabilities to send to peer | 
  56.  * | | | 
  57.  * | v | 
  58.  * | -------------- | 
  59.  * | | NEGOTIATING |----------------------------------  
  60.  * | --------------  
  61.  * ------- | Read connect_reply, auth capabilites 
  62.  * |STANDBY| | from peer 
  63.  * ------- | 
  64.  * | v 
  65.  * | -----  
  66.  * <----- |OPEN |--------------------------------------->  
  67.  * ----- (Complete final handshake ack)  
  68.  * 

Connection Callback Registrations

下面是在include/linux/ceph/messenger.h中定義的數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)定義了在Monitor連接中處理連接事件的回調(diào)函數(shù)(包括連接到OSD的連接):

 

 

 

 

 

 

一旦客戶端完成連接,它將收到如下內(nèi)容:

Mon map (ceph_monc_handle_map() 在 net/ceph/mon_client.c)

Osd map (ceph_osdc_handle_map() 在 net/ceph/osd_client.c)

如果Ceph客戶端的配置文件中包含集群中所有Monitor的信息,客戶端將與所有的Monitor建立連接。但是,如果在你的集群中有5個Monitor,但是配置文件中只有一個Monitor。這時,客戶端與配置文件中的這個Monitor建立連接。如果與Monitor的連接中斷,客戶端將隨機選取一個Monitor建立連接(客戶端通過其接收的monmap獲得所有Monitor的列表)。

當Monitor連接觸發(fā)創(chuàng)建OSD客戶端數(shù)據(jù)結(jié)構(gòu)和連接的時候,客戶端會收到OSD map的信息。

krbd在內(nèi)核的源碼目錄

源文件:

  • drivers/block/rbd.c
  • drivers/block/rbd_types.h
  • net/ceph/

頭文件:

include/linux/ceph

包裝

本文深入介紹了Ceph客戶端krbd,并且介紹了其在內(nèi)核中的實現(xiàn)。同時,還介紹了在內(nèi)核中實現(xiàn)的客戶端的各種功能的入口函數(shù)。

總結(jié)(譯者注)

本文介紹了Ceph客戶端塊存儲部分的初始化和實現(xiàn)的部分細節(jié)。Ceph在內(nèi)核中還有另外一部分,這部分就是大名鼎鼎的Ceph文件系統(tǒng)。這部分內(nèi)容比較復雜,后面譯者將另外寫一篇文章進行介紹。

另外,這里需要補充的是,在Linux內(nèi)核中Ceph的內(nèi)容主要涉及3個方面,一個是krbd的實現(xiàn)(在 drivers/block/rbd.c中),也就是塊設(shè)備的實現(xiàn);第二個是Ceph文件系統(tǒng)(在 fs/ceph目錄中)的實現(xiàn),這里類似與NFS,它通過網(wǎng)絡(luò)的方式實現(xiàn)對Ceph集群分布式文件系統(tǒng)的訪問;第三個是網(wǎng)絡(luò)部分(在 net/ceph目錄中),這部分是公用的,塊設(shè)備和文件系統(tǒng)都用到了該部分的內(nèi)容。


網(wǎng)頁名稱:深入解析Ceph分布式存儲的內(nèi)核客戶端
文章路徑:http://m.5511xx.com/article/dpjpehc.html