简介:
什么是DRBD?
Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回) DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。 DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。
什么是Heartbeat?
Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。Heartbeat是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用。
系统环境:
两台全新安装的CentOS 6.7 x86_64虚拟机
准备工作:
- yum update
- #更新一下系统
-
- reboot
- #然后重启
升级后uname -r查看一下内核版本,返回2.6.32-573.8.1.el6.x86_64
- yum install heartbeat gcc gcc-c++ make kernel-devel kernel-headers flex wget
node1和node2都要执行,这里需要注意一下kernel-devel安装的内核版本是不是和uname -r一致,如果不一致,需要升级到一致。
node1和node2都执行以下操作:
- wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
-
- tar zxvf drbd-8.4.3.tar.gz
- cd drbd-8.4.3
- ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat
- make KDIR=/usr/src/kernels/2.6.32-573.8.1.el6.x86_64/
- make install
-
- mkdir -p /usr/local/drbd/var/run/drbd
- cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
- chkconfig --add drbd
安装drbd模块:
- cd drbd
- make clean
- make KDIR=/usr/src/kernels/2.6.32-573.8.1.el6.x86_64/
- cp drbd.ko /lib/modules/2.6.32-573.8.1.el6.x86_64/kernel/lib/
- depmod
-
- cp -R /usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d/
到这里drbd就算告一段落,为了实验,我在node1和node2上各自添加一块1G的硬盘sdb
对sdb这块硬盘分区
- [root@node1 drbd]# fdisk /dev/sdb
- Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
- Building a new DOS disklabel with disk identifier 0x894c2e0e.
- Changes will remain in memory only,until you decide to write them.
- After that, of course, the previous content won't be recoverable.
-
- Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
-
- WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
- switch off the mode (command 'c')and change display units to
- sectors (command 'u').
-
- Command(m for help): n
- Command action
- e extended
- p primary partition (1-4)
- p
- Partition number (1-4):1
- First cylinder (1-130,default1):
- Usingdefault value 1
- Last cylinder,+cylinders or+size{K,M,G}(1-130,default130):
- Usingdefault value 130
-
- Command(m for help): w
- The partition table has been altered!
-
- Calling ioctl() to re-read partition table.
- Syncing disks.
- partprobe
- #使刚才的设置生效,如果没有这个命令,yum install parted,虚拟机执行这个命令有时候会报错,直接reboot就行
现在node1和node2都有/dev/sdb1分区了,都不要去格式化,放着先,接下来:
- cd /usr/local/drbd/etc/drbd.d
-
- cp global_common.conf global_common.conf.default
-
- vi global_common.conf
- #这个文件里都是注释,删掉写我们自己的配置
-
- global{
- usage-count no;
- #是否参加什么使用者统计之类的,大概是这意思,默认是yes
- }
-
- #下面这个common大括号里的参数,在所有资源上都有效
-
- common {
-
- net {
- protocol C;
- #同步协议(有ABC三个,默认使用C),也就是一个写入请求,node1和node2都确认写入,才算是一个完整的数据写入
- }
-
- }
-
- vi /usr/local/drbd/etc/drbd.d/r0.res
- #创建资源r0
-
- resource r0 {
- on node1 {
- device /dev/drbd1;
- disk /dev/sdb1;
- address 172.16.3.31:7789;
- meta-disk internal;
- }
- on node2 {
- device /dev/drbd1;
- disk /dev/sdb1;
- address 172.16.3.32:7789;
- meta-disk internal;
- }
- startup {
- wfc-timeout 0;
- degr-wfc-timeout 120;
- }
- disk {
- on-io-error detach;
- }
- }
-
- scp r0.res global_common.conf node2:/usr/local/drbd/etc/drbd.d/
- #把配置文件传到node2
在node1和node2上操作:
- modprobe drbd
- #载入 drbd 模块
-
- dd if=/dev/zero of=/dev/sdb1 bs=1M count=100
- #把一些资料塞到 sdb 內 (否则 create-md 时有可能会出现错误)
-
- drbdadm create-md r0
- #建立 drbd resource
-
- drbdadm up r0
- #启动 resource r0
-
- 以下操作仅在node1执行:
-
- drbdadm primary --force r0
- #设置node1为primary节点
上面已经完成了/dev/drbd1的初始化,现在把/dev/drbd1格式化成ext4文件系统。
- mkfs.ext4 /dev/drbd1
-
- mkdir /data
-
- mount /dev/drbd1 /data
- #然后将/dev/drbd1挂载到创建的/data目录
heartbeat配置:
- vi /etc/ha.d/ha.cf
- #创建ha.cf,并写入以下内容
-
-
- debugfile /var/log/ha-debug
- #打开错误日志报告
-
-
- keepalive 2
- #两秒检测一次心跳线连接
-
-
- deadtime 10
- #10 秒测试不到主服务器心跳线为有问题出现
-
-
- warntime 6
- #警告时间(最好在 2 ~ 10 之间)
-
-
- initdead 120
- #初始化启动时 120 秒无连接视为正常,或指定heartbeat 在启动时,需要等待120秒才去启动任何资源
-
-
- udpport 694
- #用 udp 的 694 端口连接
-
-
- ucast eth1 172.16.2.32
- #在node1上写node2的IP,反之。也就是eth1的心跳线
-
-
- node node1
- #主节点主机名
-
-
- node node2
- #备节点主机名
-
-
- auto_failback off
- #主节点恢复后可自动切换回来,这个一般开启,除非服务器性能差很大
-
-
- respawn hacluster /usr/lib64/heartbeat/ipfail
- #如果是32位系统就把lib64改成lib
配置authkeys
- vi /etc/ha.d/authkeys
- auth 1
- 1 crc
-
- chmod 600/etc/ha.d/authkeys
配置haresources
- vi /etc/ha.d/haresources
- node1 IPaddr::192.168.1.33/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd1::/data::ext4
- #设置VIP
-
-
- scp authkeys ha.cf haresources node2:/etc/ha.d/
- #把配置文件传到node2
DRBD主从自动切换测试
首先启动node1的heartbeat,接着再启动node2的heartbeat。
然后启动node1上的drbd,接着启动node2上的drbd
稍等片刻,请看截图:
可以看到,现在VIP在node1上的eth0上,而且drbd状态是Primary状态,node2是Secondary状态,一切正常。
好,那现在来简单模拟一下node1宕机的场景,我直接把node1关机,现在再来node2上查看,请看截图:
可以看到,现在VIP已经成功飘逸到了node2,而node2上的drbd状态也变成了Primary,node1因为被我关机了,所有显示Unknown
那么我现在把node1开机,再来看node1是什么情况,请看截图:
可以看到,VIP依旧工作在node2上,没有飘回node1,这是我想要的,再看drbd,node1变成Secondary状态了,也没有变回Primary,不会和node2抢角色。
而之前因为node1关机,node2上的drbd现在也恢复正常
至此,整个CentOS 6.7 DRBD+Heartbeat 实时镜像和角色自动切换的实验到此结束,好了,谢谢阅读。
DRBD 的详细介绍:请点这里
DRBD 的下载地址:请点这里