共计 4889 个字符,预计需要花费 13 分钟才能阅读完成。
简介:
什么是 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 原理及特性概述 http://www.linuxidc.com/Linux/2015-11/124759.htm
快速安装及部署 DRBD http://www.linuxidc.com/Linux/2015-11/124760.htm
Linux 高可用(HA)集群之 DRBD 详解 http://www.linuxidc.com/Linux/2013-08/89035.htm
DRBD 中文应用指南 PDF http://www.linuxidc.com/Linux/2013-08/89034.htm
CentOS 6.3 下 DRBD 安装配置笔记 http://www.linuxidc.com/Linux/2013-06/85600.htm
基于 DRBD+Corosync 实现高可用 MySQL http://www.linuxidc.com/Linux/2013-05/84471.htm
CentOS 6.4 下 DRBD 安装配置 http://www.linuxidc.com/Linux/2013-09/90536.htm
DRBD 的详细介绍:请点这里
DRBD 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132264.htm