一. 系統架構
Sheepdog的架構是完全對稱的,沒有中心控制節點,不存在單點問題,具有以下幾點特性:
Ÿ 性能和容量的現行擴展:當需要更大的容量時,sheepdog可以以線性增長方式簡單的將新節點加入到集羣中。
Ÿ 無單點故障:當有機器出問題時,數據還是可以通過其他機器傳輸。
Ÿ 容易管理:集羣中的節點沒有配置文件,當有新機器加入時,sheepdog進程會自動檢測並將新機器加入到集羣中。
系統架構圖:
Sheepdog是一個分佈式存儲系統,並具有對象存儲功能(哈希算法),其主要模塊有:
Object storage:Sheepdog不是一個普通的文件系統,它可以爲QEMU組建一個分佈式的對象存儲系統,並將對象存儲在這個系統中。一個對象是指大小靈活可變,並具有全局的唯一標識符。可以通過指定標識符對該對象進行讀/寫/創建/刪除等操作,該對象存儲系統由gateway和object manager組成。
Gateway:Gateway從QEMU的塊設備驅動上接收I/O請求(對象ID,偏移量,長度,操作類型等),通過哈希算法計算出目標節點,並且將該I/O請求發到目標節點上。
Object manager:對象管理器接收網關發來的I/O請求,並根據該請求對本地磁盤執行讀寫操作。
Cluster manager:集羣管理器管理集羣中節點之間的關係,檢測集羣中節點的變更並進行通知,同步節點之間的信息,如VDI,快照等。目前使用corosync作爲集羣管理器。
QEMU設備驅動程序:該程序將VM鏡像分割成一個固定大小的對象(默認爲4M),並通過網關將其存儲到對象存儲系統中。這些對象存儲在/var/lib/sheepdog/objs/下面。
二.安裝
1. 環境:
- One or more x86-64 machines.
- Linux kernel 2.6.27 or later
- glibc 2.9 or later
- The corosync and corosync lib package.
- QEMU 0.13 or later
2. 依賴包:
- GNU Autotools
- pkg-config
- corosync devel package
- git (when compiling from source repo)
- liburcu
- optional:fuse-devel (for sheepfs)
3. 安裝集羣管理器-corosync
yum install corosync corosynclib corosynclib-devel
配置/etc/corosync/corosync.conf:
# Please read the corosync.conf.5 manual pagecompatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 1.1.1.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
主要需要修改bindnetaddr,該參數是指節點所在的網絡。
corosync是一個簡單的集羣管理器,其基本原理是通過組播的方式來進行通信,達到信息管理的目的。根據淘寶的調研,corosync最多隻支持50個節點的集羣,推薦使用zookeeper進行集羣管理。
下載userspace-rcu-0.7.4.tar.bz2
tar -xvf userspace-rcu-0.7.4.tar.bz2
cd userspace-rcu-0.7.4
./configure
make && make install
下載collie-sheepdog-v0.4.0-309-ga313bd0.zip
unzip collie-sheepdog-v0.4.0-309-ga313bd0.zip
cd collie-sheepdog-a313bd0
./autogen.sh
./configure
make && make install
配置iptables規則
iptables -A INPUT -p igmp -j ACCEPT
iptables -A INPUT -m addrtype --dst-type MULTICAST -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW -m multiport --dport 5404,5405 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 7000 -j ACCEPT
啓動服務
/etc/init.d/corosync restart
service iptables restart
/etc/init.d/sheepdog restart
日誌:
/var/log/cluster/corosync.log
/var/lib/sheepdog/sheep.log
三.使用
格式化集羣,並設置farm模式(提供高級特性:如集羣快照,快速修復,數據壓縮存儲(未實現)),冗餘設置爲3:
collie cluster format -b farm --copies=3
查看集羣節點:
collie node list
查看已經創建的img鏡像文件:
collie vdi list
如果報錯:Failed to read object 800316b400000000 IO has halted as there are too few living nodes
Failed to read inode header
解決:則停掉其他集羣node:
對該單一節點執行recover操作:
collie cluster recover force
但是這個操作會刪除所有已有鏡像
以網關形式啓動服務:
sheep -g /var/lib/sheepdog
創建一個空的vdi:
qemu-img create sheepdog:Alice 256G
把一個已有鏡像轉換到sheepdog中去:
qemu-img convert -t writethrough ~/amd64.raw sheepdog:Bob
通過sheepdog啓動一個虛擬機
qemu-system-x86_64 -curses sheepdog:192.168.10.2:7000:Alice
在sheepdog中安裝一個虛擬機
通過iso安裝:
qemu-kvm -m 1024 -cdrom CentOS-6.2-x86_64-minimal.iso -drive file=sheepdog:Alice,index=0 -boot d -net nic -net user -nographic -vnc :2
通過硬盤啓動
qemu-kvm -m 1024 -drive file=sheepdog:Bob,index=0,boot=on -boot c -net nic -net user -nographic -vnc :3
掛載硬盤到虛擬機中:
修改virsh中虛擬機的xml文件:
<disk type="network" device="disk">
<driver name="qemu" type="raw" />
<source protocol='sheepdog' name="Alice">
<host name="1.1.1.93" port="7000"/>
<host name="1.1.1.89" port="7000"/>
</source>
<target dev="vdb" bus="virtio" />
</disk>
進入到虛擬機中格式化磁盤:
mkfs.ext4 /dev/vdb
掛載:
mount /dev/vdb /mnt
這樣虛擬機中的vdb就使用了遠程sheepdog集羣中的vdi文件。
四.結論
sheepdog基本沒有配置文件,使用起來很簡單方便,使用zookeeper作爲集羣管理器能擴展更多的sheepdog節點。sheepdog的vdi在使用時會被分割成4M的obj,在試驗過程中,這個分割過程導致寫數據時非常慢,需要優化及進一步調研。與淘寶sheepdog項目成員子團溝通該問題,得到的答覆是最好用作慢存儲。因此,sheepdog就目前情況來說不適合用來做openstack的base目錄及磁盤的網絡存儲系統。