heartbeat drbd nfs高可用
drbd:網絡raid-1,用於通過網絡鏡像磁盤數據,屬於磁盤塊的鏡像,和文件無關。
數據要寫入磁盤,先要把文件轉換爲磁盤上對應的扇區,塊然後磁盤開始
轉圈圈(機械式的),把數據寫到了磁盤,永久保存了數據。drbd就是工作在
轉換爲扇區,塊後,把對應的扇區,塊記錄下來。然後通過tcp報文傳到遠端
存儲。具體一點通常爲了提升磁盤效率在內核會有一個buffer cache用於緩衝
寫的數據,在緩衝過後爲了更好的提升磁盤性能,會把相鄰的寫操作放到一起
把儘可能的降低隨機io,讓磁盤轉一圈多寫點數據,不用來回尋道。當然ssd
就不存在這樣的問題,因爲它是電子的。比機械式的各方面都要優秀。就是有點貴。
根據drbd在兩個節點同步數據時的同步方式可分爲同步,半同步,異步
其中同步最安全,異步最高效,爲什麼這麼說呢。
在同步的時候,主節點要等待備節點把數據寫入磁盤
在異步的時候,主節點只要把數據封裝成報文發送出去就完了,至於你寫沒寫完我不關心
heartbeat:實現高可用的,通過各節點的心跳信息,進行服務的轉移以實現高可用
本身帶了集羣的整個套件,包括心跳檢測和資源管理。後來獨立出來了
一個pacemaker集羣資源管理器,可結合openais獨立出來的corosync心跳信息檢測使用
nfs:network file system
192.168.100.25 主
192.168.100.26 備
192.168.100.200 vip
準備
# vim /etc/hosts
192.168.100.25 node1.xy.com node1
192.168.100.26 node2.xy.com node2
# ssh-keygen
# ssh-copy-id [email protected]
# scp /etc/hosts node2:/etc/
# ssh node2 "hostname node2.xy.com";hostname node1.xy.com
# ssh node2 "ntpdate 192.168.100.254";ntpdate 192.168.100.254
安裝drbd
先查看內核版本號,因爲drbd要和內核嚴格匹配。kernal 2.6.33 自帶drbd,只需安裝用戶空間工具
[root@node1 ~]# ssh node2 'uname -r';uname -r
2.6.32-431.el6.x86_64
2.6.32-431.el6.x86_64
下載包安裝
[root@node1 ~]# scp ./drbd* node2:~/
drbd-8.4.3-33.el6.x86_64.rpm 100% 283KB 283.3KB/s 00:00
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm 100% 145KB 145.2KB/s 00:00
[root@node1 ~]# ssh node2 'yum -y install ~/drbd*';yum -y install drbd*
配置drbd
# vim global_common.conf
global { usage-count no; } common { handlers { pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; } startup { wfc-timeout 0; degr-wfc-timeout 120; } disk { on-io-error detach; } net { protocol C; cram-hmac-alg "sha1"; shared-secret "redhat"; } syncer { rate 200M; } }
添加一個資源
先分一個磁盤分區,或者用lvm或者用一塊磁盤
# vim drbd0.res
resource r0 { device /dev/drbd0; disk /dev/sda4; meta-disk internal; on node1.xy.com { address 192.168.100.25:7789; } on node2.xy.com { address 192.168.100.26:7789; } }
拷貝到node2一份
[root@node1 drbd.d]# scp ./* node2:/etc/drbd.d/
創建drbd
# mkdir /var/lib/drbd
# drbdadm create-md r0
# service drbd start
提升一個爲主的
# drbdadm primary r0 --force
[root@node1 drbd.d]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
ns:596864 nr:0 dw:0 dr:603800 al:0 bm:36 lo:0 pe:2 ua:7 ap:0 ep:1 wo:f oos:457824
[==========>.........] sync'ed: 57.0% (457824/1052768)K
finish: 0:00:09 speed: 49,576 (49,576) K/sec
在主的上創建文件系統
# mke2fs -t ext4 /dev/drbd0
[root@node1 drbd.d]# mkdir /mnt/drbd
[root@node1 drbd.d]# mount /dev/drbd0 /mnt/drbd
[root@node1 drbd.d]# cd /mnt/drbd
[root@node1 drbd]# ls
lost+found
[root@node1 drbd]# mkdir data/shared -p
[root@node1 drbd]# ls
data lost+found
在另一個節點查看,因爲從節點不能掛載,所以要先把主節點降級然後把從節點提升爲主的才能查看
[root@node1 mnt]# umount /mnt/drbd
[root@node1 mnt]# drbdadm secondary r0
[root@node2 drbd]# drbdadm primary r0
[root@node2 drbd]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4 nr:1102564 dw:1102568 dr:1017 al:1 bm:65 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@node2 drbd]# mkdir /mnt/drbd
[root@node2 drbd]# mount /dev/drbd0 /mnt/drbd
[root@node2 drbd]# cd /mnt/drbd
[root@node2 drbd]# ls
data lost+found
數據都有
安裝nfs
# ssh node2 "yum -y install nfs-utils";yum -y install nfs-utils
配置nfs
# vim /etc/exports
/mnt/drbd/data/shared192.168.100.0/24(rw)
# scp /etc/exports node2:/etc/
啓動nfs
service nfs start
在另一個節點使用
[root@node1 mnt]# showmount -e 192.168.100.26
Export list for 192.168.100.26:
/mnt/drbd/data/shared 192.168.100.0/24
[root@node1 mnt]# mount -t nfs 192.168.100.26:/mnt/drbd/data/shared /mnt
[root@node1 mnt]# cd /mnt
[root@node1 mnt]# ls
[root@node1 mnt]# mkdir mysql
[root@node1 mnt]# ls
mysql
要根據需要修改權限後才能寫的,我改成了777
# umount /mnt
最後就是安裝heartbeat了
# yum install perl-TimeDate net-snmp-libs libnet PyXML gettext
[root@node2 ~]# yum -y remove cluster-glue
# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
# cd /etc/ha.d/
# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./
# cp /usr/share/doc/heartbeat-2.1.4/haresources ./
# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./
# chmod 600 authkeys
配置節點間認證
auth 2
#1 crc
2 sha1 Hello!word
#3 md5 Hello!
# vim ha.cf
logfile /var/log/ha-log
logfacility local0
定義日誌的
keepalive 2
定義多久檢查一次心跳
deadtime 10
多久沒收到心跳就認爲別人掛了
mcast eth0 225.90.0.1 694 1 0
使用多播的方式發心跳信息
auto_failback off
節點從新上線後資源不會轉移回去,on表示轉回
node node1.xy.com node2.xy.com
定義節點
配置文件有說明英文版的
# vim haresources
node1.xy.com IPaddr::192.168.100.200/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext4 nfs
[root@node1 ha.d]# scp ha.cf authkeys haresources node2:/etc/ha.d
[root@node1 ha.d]# ssh node2 'service heartbeat start && chkconfig keartbeat on';service heartbeat start && chkconfig heartbeat on
測試
[root@node1 ha.d]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1102576 nr:128 dw:49936 dr:1055574 al:11 bm:65 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
已經提升爲主的
[root@node2 ha.d]# showmount -e node1
Export list for node1:
/mnt/drbd/data/shared 192.168.100.0/24
已經啓動了nfs
[root@node1 ha.d]# ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:F8:B5:7A
inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
當節點1下線時
[root@node1 mnt]# service heartbeat stop
Stopping High-Availability services:
Done.
[root@node2 ha.d]# ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:8A:B2:3B
inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
[root@node2 ha.d]# showmount -e
Export list for node2.xy.com:
/mnt/drbd/data/shared 192.168.100.0/24
[root@node2 ha.d]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:140 nr:1102580 dw:1102720 dr:2766 al:2 bm:65 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
所有資源都轉移了
比corosync+pacemaker用容易配置,一行配置頂pacemaker一頁
但是pacemaker做的更精細,可配置的多,這也是優勢也是劣勢。如果用的熟練當然選
corosync+pacemaker
在配置的時候nfs不能啓動,後來發現先啓動rpcbind後就正常了,這應該是nfs的標準步驟。
爲了避免資源爭用通常應該配置stonith設備
如果drbd發生錯誤
1,在從的上
drbdadm secondary r0
drbdadm disconnect all
drbdadm --discard-my-data connect r0
2,在主的上
drbdadm disconnect all
drbdadm connect r0
----------------------------
編譯安裝drbd
yum -y install gcc kernel-devel flex
./configure --with-km --with-heartbeat --prefix=/usr/local/drbd
make && make install
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d
chmod +x /etc/init.d/drbd
chkconfig --add drbd
lvm+drbd
[root@node4 drbd.d]# cat drbd0.res
resource r0 {
device /dev/drbd0;
disk /dev/mysql_vg/mysql_lv;
meta-disk internal;
on node4.xy.com {
address 192.168.100.104:7789;
}
on node3.xy.com {
address 192.168.100.103:7789;
}
}
在線擴容
在主節點上
lvextend -L 2G /dev/mysq_vg/mysql_lv
在從節點上
lvextend -L 2G /dev/mysql_vg/mysql_lv
在主節點上
drbdadm resize r0
在從節點上
[root@node4 /]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by [email protected], 2014-08-08 10:20:02
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:8 nr:453144 dw:453152 dr:1017 al:1 bm:24 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:661796
[======>.............] sync'ed: 37.2% (661796/1048544)K
finish: 0:00:23 speed: 27,624 (27,624) want: 8,240 K/sec
drbdadm resize r0
在主節點上
resize2fs /dev/drbd0
簡單時間服務器配置
# vim /etc/ntp.conf
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.100.0 mask 255.255.255.0 nomodify
server 220.130.158.71 perfer
server 59.124.196.83
server
server
server 127.127.1.0
server 133.100.11.8
說明:
server <ip or hostname> 配置你的上游時間服務器,可以有多個 perfer表示默認
restrict [ip] mask [netmask] [parameter] 配置訪問控制
[parameter]可用的參數
ignore:拒絕ntp連接
nomodify:客戶端不能使用ntpc,ntpq來修改服務器時間參數,但可以進行網絡校時
noquery:也是不提供ntp服務