一. 系統架構 node
Sheepdog的架構是徹底對稱的,沒有中心控制節點,不存在單點問題,具備如下幾點特性: git
Ÿ 性能和容量的現行擴展:當須要更大的容量時,sheepdog能夠以線性增加方式簡單的將新節點加入到集羣中。 算法
Ÿ 無單點故障:當有機器出問題時,數據仍是能夠經過其餘機器傳輸。 網絡
Ÿ 容易管理:集羣中的節點沒有配置文件,當有新機器加入時,sheepdog進程會自動檢測並將新機器加入到集羣中。 架構
系統架構圖: tcp
Sheepdog是一個分佈式存儲系統,並具備對象存儲功能(哈希算法),其主要模塊有: 分佈式
Object storage:Sheepdog不是一個普通的文件系統,它能夠爲QEMU組建一個分佈式的對象存儲系統,並將對象存儲在這個系統中。一個對象是指大小靈活可變,並具備全局的惟一標識符。能夠經過指定標識符對該對象進行讀/寫/建立/刪除等操做,該對象存儲系統由gateway和object manager組成。 性能
Gateway:Gateway從QEMU的塊設備驅動上接收I/O請求(對象ID,偏移量,長度,操做類型等),經過哈希算法計算出目標節點,而且將該I/O請求發到目標節點上。 優化
Object manager:對象管理器接收網關發來的I/O請求,並根據該請求對本地磁盤執行讀寫操做。 spa
Cluster manager:集羣管理器管理集羣中節點之間的關係,檢測集羣中節點的變動並進行通知,同步節點之間的信息,如VDI,快照等。目前使用corosync做爲集羣管理器。
QEMU設備驅動程序:該程序將VM鏡像分割成一個固定大小的對象(默認爲4M),並經過網關將其存儲到對象存儲系統中。這些對象存儲在/var/lib/sheepdog/objs/下面。
二.安裝
1. 環境:
2. 依賴包:
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文件。