因爲最新公司業務使用的NFS系統偶爾發生故障,恢復起來須要不少時間,因而學習了下文件系統,以前一直在作mfs的測試,可是因爲mfs有單點故障的存在,也就放下了,但願之後mfs能夠解決單點的問題,那就造福於大衆了.
Glusterfs的簡介:
GlusterFS是一個高層次的分佈式文件系統解決方案.經過增長一個邏輯層,對上層使用者掩蓋了下面的實現,使用者不用瞭解也不需知道,文件的存儲形式、分佈.內部實現是整合了許多存儲塊(server)經過Infiniband RDMA 或者Tcp/Ip方式互聯的一個並行的網絡文件系統,這樣的許多存儲塊能夠經過許多廉價的x86 主機,經過網絡搭建起來.
採用這種方式的理由:
因爲glusterfs文件系統能夠採用多種模式,以前作了cluster/Replicate,可是通過讀寫性能測試,發現寫操做不是很理想,雖然能夠確保數據的完整性和防止單點故障.因而有了標題這個方式,既能夠確保讀寫速度又能夠確保數據完整性和防止單點故障.利用heartbeat來檢測2個主機的存活,glusterfs磁盤掛載的切換.
網絡拓撲:
說明:因爲drbd同步機制只容許在一個服務器上進行磁盤的掛載,另一個服務器不容許再進行掛載,不然致使同步失敗.爲了不master節點down機以後 ,還須要手動去slave節點上進行手動掛載,在此時間內客戶端沒法正常的讀寫數據,這裏利用heartbeat來自動進行磁盤掛載切換工做,當master節點down機,它會把磁盤資源釋放到slave文件服務器,切換工做僅僅須要10秒左右的時間,大大的提升了故障恢復相應時間.因爲heartbeat不能對服務項進行檢測,因而又寫了moniter腳原本彌補這個缺陷.
測試環境
OS平臺:
REDHAT AS 5.1
Ip地址規劃:
192.168.0.59 glusterfs-1 drbd-1
192.168.0.60 glusterfs-2 drbd-2
磁盤規劃:
Sda:安裝相關的安裝包
Sdb:用來作drbd的同步
Sofrware:
fuse-2.8.3.tar.gz
glusterfs-3.0.3.tar.gz
drbd-8.3.5.tar.gz
libnet-1.1.2.1.tar.gz
heartbeat-2.0.7.tar.gz
安裝相關的包
//在2個server節點都安裝glusterfs和drbd,因爲glusterfs使用到了fuse模塊,因此須要先安裝FUSE.
#tar zxvf fuse-2.8.3.tar.gz
#cd fuse-2.8.3
#./configure -enable-dependency-tracking -enable-lib -enable-util
#make && make install
#tar zxvf glusterfs-3.0.3.tar.gz
#cd glusterfs-3.0.3
#./configure
#make && make install
#tar zxvf drbd-8.3.5.tar.gz
#cd drbd-8.3.5
#make && make install
#tar zxvf libnet-1.1.2.1.tar.gz
#cd libnet
#./configure
#make && make install
#tar zxvf heartbeat-2.0.7.tar.gz
#cd heartbeat-2.0.7
# ./ConfigureMe configure --disable-swig --disable-snmp-subagent
#make && make install
相關文件的配置
//在2個節點上添加以下的hosts.
# vi hosts
192.168.0.59 drbd-1
192.168.0.60 drbd-2
//配置master節點的glusterfs配置文件
#cd /usr/local/etc/glusterfs
#cp glusterfsd.vol.sample glusterfsd.vol
#vi glusterfsd.vol //配置以下
### Export volume "brick" with the contents of "/home/export" directory.
volume brick
type storage/posix # POSIX FS translator
option directory /home/gluster # Export this directory
end-volume
volume locker
type features/locks
subvolumes brick
end-volume
volume bricks
type performance/io-threads
option thread-count 50 //開啓50個線程
subvolumes locker
end-volume
### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option listen-port 6996 # Default is 6996
subvolumes locker
option auth.addr.bricks.allow *
option auth.addr.locker.allow *
end-volume
//配置slave節點的glusterfs配置文件
### Export volume "brick" with the contents of "/home/export" directory.
volume brick
type storage/posix # POSIX FS translator
option directory /home/gluster # Export this directory
end-volume
volume locker
type features/posix-locks
subvolumes brick
end-volume
volume bricks
type performance/io-threads
option thread-count 50 //開啓50個線程
subvolumes locker
end-volume
### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option listen-port 6996
subvolumes locker
option auth.addr.bricks.allow *
option auth.addr.locker.allow *
end-volume
//在2個節點上執行下面的命令,啓動server端的服務
#gluster –f /usr/loca/etc/gluster/glusterfd.vol
//配置drbd的配置文件,2個節點的配置相同
common {
syncer { rate 100M; } //限制流量
}
resource db {
protocol C; //使用C協議
disk {
on-io-error detach;
}
on drbd-1 { //drbd-1爲第一臺機器的機器名
device /dev/drbd0; //建立的虛擬資源
disk /dev/sdb1; //實際的物理分區
address 192.168.0.59:7788; //第一臺機器的ip地址,及通信端口
meta-disk internal; //類型,局域網
}
on drbd-2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.60:7788;
meta-disk internal;
}
}
//在2個節點上執行以下命令, 建立相應的元數據保存的數據塊
#modprobe /lib/modules/2.6.18-53.el5/kernel/drivers/block/drbd.ko
#lsmod |grep drbd //drbd模塊是否加載成功
//因爲我這裏是有數據的,先要保存下數據.
drbd-1 # dd if=/dev/sdb1 of=/root/backup bs=500M count=1 //這裏要根據本身的數據
大小進行修改.
#drbdadm create-md db //在2個主機上的 /dev/sdb1 分區上建立相應的元數據保存的數據塊
#/etc/init.d/drbd start
#chkconfig drbd on
# ps aux | grep drbd
avahi 2239 0.0 1.1 2552 1384 ? Ss 19:38 0:00 avahi-daemon: running [drbd-1.local]
root 2702 0.0 0.0 0 0 ? S 20:32 0:00 [drbd1_worker]
root 2715 0.0 0.0 0 0 ? S 20:32 0:00 [drbd1_receiver]
root 2726 0.0 0.0 0 0 ? S 20:32 0:00 [drbd1_asender]
//若是看到這4個進程就說明drbd啓動正常. drbd0_worker是drbd0的主要進程drbd0_asender是primary上drbd0的數據發送進程,drbd0_receiver是secondary上drbd0的數據接收進程.