1.塊存儲是什么?
塊存儲簡稱(RADOS Block Device),是一種有序的字節序塊,也是Ceph三大存儲類型中最為常用的存儲方式,Ceph的塊存儲時基於RADOS的,因此它也借助RADOS的快照,復制和一致性等特性提供了快照,克隆和備份等操作。Ceph的塊設備值一種精簡置備模式,可以拓展塊存儲的大小且存儲的數據以條帶化的方式存儲到Ceph集群中的多個OSD中。
2.訪問塊存儲的方式
訪問塊存儲的方式有兩種,分別是KRBD的方式和librbd的方式。
2.1KRBD方式
KRBD是Kernel RADOS Block Device的簡稱,它是通過Kernel模塊中的RBD模塊來實現訪問后端存儲的,在使用前需要先使用modprobe命令將內核中RBD模塊進行加載,同時對內核版本也是有要求的,需要內核的版本不低於3.10,因為比這個版本低的內核還沒將RBD模塊集成到內核中,因此如果是CentOS6.x的一般需要先升下內核版本。
KRBD訪問后端存儲的方式一般適用於為物理主機提供的塊設備,這種方式是基於內核模塊驅動的,可以使用Linux自帶的頁緩存來提高性能。
以下是通過KRBD模塊訪問Ceph后端塊設備的一些命令操作。
modprobe rbd # 加載RBD內核模塊
modinfo rbd # 查看rbd模塊信息
rbd create image_name --size 10240 # 創建一個10G大小的名為image_name的塊設備
rbd list # 列出存儲池中的所有塊設備,沒有指定存儲池,默認使用rbd存儲池,可以使用-p選項來指定存儲池
rbd info image_name # 顯示出image_name塊設備的信息
rbd map image_name # 將image_name塊設備映射到系統中
rbd showmapped # 查看系統中已經映射的塊設備
rbd unmap /dev/xxx # 取消掉塊設備的映射
2.2 librbd方式
librbd是一個訪問rbd塊存儲的庫,它是基於librados庫進行的更高一層的封裝,所以librbd是通過librados庫來與塊存儲的數據進行交互的。
使用librbd訪問塊存儲的方式適用於為虛擬機提供塊設備的方式,可以使用RBD緩存來提高性能,比如在qemu+kvm虛擬框架中提供的虛擬機,qemu可以通過librbd來訪問后端存儲,以下是訪問的模型圖:
要通過qemu來將塊設備提供給客戶機,也就是我們說的虛擬機,需要指定存儲池名和映像名
命令格式類似如下:
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
舉例:
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
舉例:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
3. RBD的一些常用操作和命令
有關存儲池的操作:
部署好Ceph集群后,默認都會生成一個名為rbd的存儲池
ceph osd lspools # 來查看當前存儲的存儲池
ceph osd pool create {pool-name} {pg-num} {pgp-num} # 創建存儲池
ceph df # 查看存儲池統計信息
ceph osd pool set {pool-name} {key} {value} # 調整存儲池的選項值
有關image創建和查看的操作:
rbd create pool/image1 --size 1024 --image-format 2 # 在pool存儲池中創建1GB大小的image
rbd ls pool-name # 查看pool-name存儲池中的image
rbd info pool-name/image1 # 查看image1的詳細信息
rbd rm pool-name/image1 # 刪除image1
有關快照的操作:
rbd snap create pool-name/image1@image1_snap # 創建image1的快照
rbd snap list pool-name/image1 # 列出image1的所有快照
rbd info pool-name/image1@image1_snap # 查看快照的詳細信息
有關克隆的操作:
在克隆前,快照必須處於被保護的狀態才能夠被克隆。
rbd snap protect pool-name/image1@image1_snap # 將快照置於保護狀態
rbd clone pool-name/image1@image1_snap pool-name/image2 # 將快照克隆成一個image2
image2是依賴於image1的快照的,可以稱image2是image1_snap的children
rbd children pool-name/image1@image1_snap # 查看該快照的children
要是想要讓image2不再依賴於image1_snap,則需要使用如下命令將分層的image2變為扁平的沒有層級的image
rbd flatten pool-name/image2
有關備份和恢復的操作:
rbd export pool-name/image1 image1_export # 導出image1
rbd import image1_export pool-name/image3 --image-format 2 # 導入備份的文件保存為image3
4. qemu-kvm如何訪問塊存儲
這里介紹的是通過LIBRBD的方式訪問RBD塊存儲。
(1)檢測操作系統的KVM虛擬化是否支持RBD塊存儲
使用命令:
qemu-img --help |grep rbd
如果輸出的內容中出現了rbd關鍵詞,則說明當前qemu-kvm或者qemu-system-x86_64支持RBD塊存儲。
(2)使用塊存儲
把/etc/ceph/ceph.conf文件拷貝到目的節點相同的路徑位置,這樣該節點的qemu-img工具就會使用該文件作為默認配置文件。
如果ceph集群開啟了cephx認證,則需要創建客戶端訪問權限,在我的ceph配置為openstack的后端存儲中有說明如何創建這個權限,還有生成秘鑰並導入libvirt也有說明:配置Ceph集群為OpenStack后端存儲
最后會生成一個xml格式的文件,里面定義了需要訪問塊存儲的各種信息,由libvirt來將其轉換為對應的命令行以使得qemu-kvm進程可以訪問塊存儲,從而虛擬機可以訪問塊存儲。