openstack基於CEPH的共享盤實現方案
首先,讓我們先了解下librbd I/O的協議棧
其中VM根據libvirt通過配置檔案來呼叫QEMU的。而塊儲存RBD,其實是CEPH叢集的一個client而已。所以,可以控制OSD中的/etc/ceph/ceph.conf中的[client]欄位的rbd_cache來決定是否開啟RBD的快取。對應圖上的關係則是QEMU對應服務nova-compute,Ceph Cluster對應OSD(真實的資料讀寫都是為OSD)。因此配置後要先重啟OSD,然後再重啟nova-compute。QEMU中的qemu driver ‘writeback’(即/etc/nova/nova.conf中的disk_cachemodes)和CEPH配置檔案中的rbd_cache會相互影響,因此需要設定一致的模式,防止產生不必要的麻煩。
在CEPH官網(http://docs.ceph.org.cn/rbd/libvirt/)中,也有這麼一段解釋
libvirt 庫是管理程式和軟體應用間的一個虛擬機器抽象層。通過libvirt ,開發者和系統管理員只需要關注這些管理器的一個通用管理框架、通用 API 、和通用 shell 介面(即virsh )即可,包括:
-
QEMU/KVM
-
XEN
-
LXC
-
VirtualBox
-
等等
Ceph 塊裝置支援 QEMU/KVM ,所以你可以通過能與libvirt 互動的軟體來使用 Ceph 塊裝置。下面的堆疊圖解釋了libvirt
和 QEMU 如何通過librbd 使用 Ceph 塊裝置。
libvirt 常見於為雲解決方案提供 Ceph 塊裝置,像 OpenStack 、 ClouldStack 。它們用libvirt 和 QEMU/KVM 互動、 QEMU/KVM 再通過librbd 與 Ceph 塊裝置互動。
瞭解以上基礎知識之後,我們還需要了解到CEPH到兩種快取機制,Tier和RBD cache兩種機制。首先它們兩者都有快取、預讀的功能,但是它們快取的位置卻不相同。tier是rados層在osd端進行資料快取,也就是說不論是塊儲存、物件儲存還是檔案儲存都可以使用tier來提高讀寫速度;rbd
cache是rbd層在客戶端的快取,也就是隻支援塊儲存。Rbd cache是客戶端的快取,當多個客戶端使用同個塊裝置時(例如ocfs2),存在客戶端資料不一致的問題。舉個例子,使用者A向塊裝置寫入資料後,資料停留在客戶自己的快取中,沒有立即重新整理到磁碟,所以其它使用者讀取不到A寫入的資料。但是tier不存在這個問題,因為所有使用者的資料都直接寫入到ssd,使用者讀取資料也是在ssd中讀取的,所以不存在客戶端資料不一致問題。由此可見,實現快取盤有兩種形式,一種的關閉RBD cache,另一種就是使用Tier來實現,此兩者都能解決客戶端資料不一致的問題。
關閉RBD cache
因此,要OSD所在的伺服器上,分別在/etc/ceph/ceph.conf中,將[client]中的兩個欄位修改成false
然後重啟這個節點上的所有OSD
restart ceph-osd-all
然後在計算節點上,開啟/etc/nova/nova.conf中,找到欄位disk_cachemodes,將內容改成
disk_cachemodes="network=none,block=none"
重啟nova-compute
service nova-compute restart
假設雲主機為ubuntu14.04,雲主機A(主機名為share-1,IP
在雲主機A中,執行以下shell指令碼
#!/bin/bash
echo "nameserver 114.114.114.114" > /etc/resolv.conf
echo "****************************begin**************************************"
echo "make a copy..."
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "remove old sources.list..."
rm /etc/apt/sources.list
echo "creating new sources.list..."
touch /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo " create sources.list success"
echo "update package..."
apt-get update
echo "*****************************done************************************"
apt-get install ocfs2-tools ocfs2-tools-dev ocfs2console
touch /etc/ocfs2/cluster.conf
echo "node:
ip_port = 7777
ip_address = 192.168.1.6
number = 0
name = share-2
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.1.5
number = 1
name = share-1
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
" > /etc/ocfs2/cluster.conf
sed -i 's/false/true/g' /etc/default/o2cb
mkdir -p /ocr
/etc/init.d/o2cb start
mkfs.ocfs2 -b 4K -C 32K -N 3 -L /ocr /dev/vdb
mount -t ocfs2 /dev/vdb /ocr
雲主機B同樣執行上述指令碼,但是需將倒二行的橙色字註釋掉(只需格式化一次即可)
mkfs.ocfs2 -b 4K -C 32K -N 3 -L /ocr /dev/vdb
之後,還有很重要的一步,即需要開啟這兩臺雲主機的埠7777
成功後入下圖所示
使用Tier
以下為配置快取層示例,其中假設ruleset 0為容量盤,ruleset 1為效能盤
ceph osd pool create storage_pool 256 256
ceph osd pool create cache_pool 64 64
ceph osd pool set cache_pool crush_ruleset 1
ceph osd tier add storage_pool cache_pool
ceph osd tier cache-mode cache_pool writeback
ceph osd tier set-overlay storage_pool cache_pool
ceph osd pool set cache_pool hit_set_type bloom
ceph osd pool set cache_pool hit_set_count 1
ceph osd pool set cache_pool hit_set_period 3600
ceph osd pool set cache_pool target_max_bytes 107374182400
ceph osd pool set cache_pool target_max_objects 25600
ceph osd pool set cache_pool cache_min_flush_age 3600
ceph osd pool set cache_pool cache_min_evict_age 3600
ceph osd pool set cache_pool cache_target_dirty_ratio .6
ceph osd pool set cache_pool cache_target_full_ratio .6
配置完成後,在cinder服務中將底層的pool配置成cache_pool,然後重啟cinder-volume使其生效,之後建立的雲硬碟即是使用了Tier的RBD塊,之後在雲主機的配置可參考上述配置即可