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服务