1. 程式人生 > >openstack基於CEPH的共享盤實現方案

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

地址為192.168.1.5)和雲主機B(主機名為share-2,IP地址為192.168.1.6)共享一個共享盤,這個共享盤在雲主機AB中的裝置路徑為/dev/vdb,掛載點為/ocr


在雲主機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塊,之後在雲主機的配置可參考上述配置即可