你了解Ceph嗎?
Ceph是一種分布式存儲系統,它可以將多台服務器組成一個超大集群,把這些機器中的磁盤資源整合到一塊兒,形成一個大的資源池(PB級別),然后按需分配給應用使用。
那么你知道Ceph的架構嗎?
Ceph的底層實現是RADOS,RADOS是由C++寫的,但是它向外界暴露了調用接口,即LibRADOS,應用程序只需要調用LibRADOS的接口,就可以操縱Ceph了。這其中,RADOS GW用於對象存儲,RBD用於塊存儲,它們都屬於LibRADOS;CephFS是內核態程序,向外界提供了POSIX接口,用戶可以通過客戶端直接掛載使用。
你知道RADOS內部架構和工作原理嗎?
每台服務器都有好幾塊磁盤(sda,sdb,sdc等),磁盤又可以進一步分區(sda1,sda2等)。CEPH中最基本的進程就是OSD(對象存儲設備),每個磁盤對應一個OSD。
如果用戶通過客戶端想要存儲一個文件,那么在RADOS中,該文件實際上會分為一個個4M塊大小的對象。每個文件都一個文件ID(例如A),那么這些對象的ID就是(A0,A1,A2等)。然而在分布式儲存系統中,有成千上萬個對象,光遍歷就要花很長的時間,所以對象會先通過hash-取模運算,存放到一個PG(Place Group)中,PG相當於數據庫中的索引(PG的數量是固定的,不會隨着OSD的增加或者刪除而改變),這樣一來,只需要首先定位到PG的位置,然后在PG中查詢對象即可,大大提高了查詢的效率。之后,PG中的對象又會根據設置的副本數量進行復制,並根據Crush算法存儲到OSD節點上。
你知道CEPH的進程還有哪些嗎?
CEPH中的Monitor(至少有3個)用於維護和監控整個集群的狀態,每個Monitor都有一個Cluster Map,只要有這個Map,就能夠清楚知道每個對象存儲在什么位置了。客戶端會先tcp連接到Monitor,從中獲取Cluster Map,並在客戶端進行計算,當知道對象的位置后,再直接與OSD通信(去中心化的思想)。OSD節點平常會向Monitor節點發送簡單心跳,只有當添加、刪除或者出現異常狀況時,才會自動上報信息給Monitor。
MDS是可選的,只有需要使用CEPH FS的時候才需要配置MDS節點。在ceph中,元數據也是存放在OSD中的,MDS只相當於元數據的緩存服務器。
在Ceph中,如果要寫數據,只能向主OSD寫,然后再由主OSD向從OSD同步地寫,只有當從OSD返回結果給主OSD后,主OSD才會向客戶端報告寫入完成的消息。如果要讀數據,不會使用讀寫分離,而是也需要先向主OSD發請求,以保證數據的強一致性。