关于
我的项目
相关阅读
热度排行
- [转] 宫崎骏用动漫教给我们的人生哲理,每一句都能说到心里! - (日期:[八月 24, 2013] 点击:[53,145])
- Google 网页爬虫报告无法连接站点解决办法 - (日期:[七月 20, 2014] 点击:[38,630])
- 架设Tiny Tiny RSS(TTRSS)阅读器,找回Google Reader! - (日期:[九月 27, 2013] 点击:[27,762])
- SkyDrive、DropBox和Google Drive三大公有云存储服务对比 - (日期:[六月 25, 2013] 点击:[25,562])
- 升级到至强E5440后,与i5 CPU笔记本性能对比 - (日期:[二月 18, 2014] 点击:[23,694])
- 公钥私钥加密解密数字证书数字签名详解 - (日期:[四月 19, 2014] 点击:[22,955])
- 本站建站技术合集 - (日期:[九月 20, 2013] 点击:[22,478])
- 使用OpenerDNS解决无法访问Google的问题 - (日期:[七月 5, 2014] 点击:[21,773])
- WordPress博客添加“返回顶部”按钮 - (日期:[七月 14, 2013] 点击:[21,188])
- Linux文件系统基础之inode和dentry - (日期:[三月 13, 2015] 点击:[20,161])
- 云存储中的HTTP鉴权算法分析 - (日期:[二月 7, 2014] 点击:[18,636])
- 存储基础知识之——磁盘阵列原理及操作实战 - (日期:[二月 9, 2014] 点击:[17,478])
- 精选37条强大的常用linux shell命令组合 - (日期:[九月 4, 2013] 点击:[17,425])
- DNS原理、架构和配置详解 - (日期:[九月 6, 2013] 点击:[16,797])
- Netty和Jetty的Java NIO 网络框架模型分析 - (日期:[七月 13, 2013] 点击:[16,329])
- CoreOS 初识之安装 - (日期:[十一月 16, 2014] 点击:[16,161])
- Windows与Linux文件系统互访的几种方法 - (日期:[八月 21, 2014] 点击:[15,725])
- Dijkstra算法求解最短路径分析 - (日期:[七月 12, 2014] 点击:[14,921])
- NAS解决方案实现多媒体文件共享播放 - (日期:[十二月 21, 2014] 点击:[13,897])
- 简介 - (日期:[九月 1, 2012] 点击:[13,745])
- 如何编程实现 2 + 2 = 5? - (日期:[六月 2, 2014] 点击:[13,266])
- 搭建了一个iNews程序 - (日期:[十月 15, 2013] 点击:[13,233])
- 2014年9月曝出的Bash ShellShock漏洞简析 - (日期:[九月 26, 2014] 点击:[13,134])
- 彻底解决WordPress博客垃圾评论的问题 - (日期:[八月 5, 2013] 点击:[13,079])
- 如何使用1M的内存排序100万个8位数 - (日期:[三月 27, 2014] 点击:[12,551])
- 全部日志列表 - (日期:[十一月 11, 2012] 点击:[12,312])
- 关于回调函数和this指针探讨 - (日期:[八月 24, 2014] 点击:[12,204])
- 给定一个long型常量,其值为x,给定long型变量a,要求a & x 的取值集合 - (日期:[九月 8, 2012] 点击:[11,695])
- WordPress建站必备实用插件 - (日期:[八月 7, 2014] 点击:[11,356])
- Amazon 云计算业务全面介绍 - (日期:[三月 9, 2014] 点击:[11,262])
分类目录
文章归档
- 2024年四月 (1)
- 2024年二月 (1)
- 2023年九月 (1)
- 2023年一月 (1)
- 2022年十月 (1)
- 2022年八月 (2)
- 2022年四月 (1)
- 2022年三月 (1)
- 2021年十二月 (2)
- 2021年十月 (2)
- 2021年九月 (1)
- 2021年八月 (1)
- 2021年五月 (1)
- 2021年三月 (2)
- 2021年一月 (2)
- 2020年十二月 (5)
- 2020年十一月 (2)
- 2020年十月 (2)
- 2020年九月 (1)
- 2020年八月 (5)
- 2020年七月 (2)
- 2019年九月 (1)
- 2018年八月 (1)
- 2018年七月 (1)
- 2018年六月 (1)
- 2018年五月 (1)
- 2018年三月 (1)
- 2018年二月 (1)
- 2018年一月 (2)
- 2017年十二月 (3)
- 2017年十月 (4)
- 2017年九月 (1)
- 2017年七月 (1)
- 2017年六月 (1)
- 2016年十二月 (1)
- 2016年十月 (1)
- 2016年九月 (1)
- 2016年七月 (2)
- 2016年六月 (1)
- 2016年二月 (3)
- 2015年十二月 (3)
- 2015年十一月 (2)
- 2015年十月 (1)
- 2015年八月 (2)
- 2015年七月 (4)
- 2015年六月 (1)
- 2015年三月 (2)
- 2015年二月 (1)
- 2015年一月 (4)
- 2014年十二月 (2)
- 2014年十一月 (2)
- 2014年十月 (5)
- 2014年九月 (8)
- 2014年八月 (11)
- 2014年七月 (17)
- 2014年六月 (7)
- 2014年五月 (15)
- 2014年四月 (16)
- 2014年三月 (14)
- 2014年二月 (5)
- 2013年十二月 (5)
- 2013年十一月 (3)
- 2013年十月 (13)
- 2013年九月 (13)
- 2013年八月 (13)
- 2013年七月 (9)
- 2013年六月 (8)
- 2013年五月 (1)
- 2013年三月 (3)
- 2013年一月 (1)
- 2012年十一月 (1)
- 2012年九月 (12)
- 2012年八月 (3)
- 2011年二月 (1)
- 2009年三月 (1)
- 2009年二月 (1)
- 2008年十一月 (1)
- 2008年六月 (1)
- 2008年四月 (1)
- 2008年三月 (1)
DRBD远程实时双机热备系统配置完全手册
今天本来想按照之前的计划,分析一下drbd的源码,看到/proc/drbd文件的实现方式时,就想打开drbd服务切实看一下,结果发现几年前配置过的drbd已经不能再使用了,还是先把配置过程完整再尝试一下,以便记录在这里分享出来。
首先需要准备两台虚拟机,可以使用vmware或者virtualos。本文主要针对drbd的配置和使用过程,虚拟机安装部分不作详述。
步骤:
(一)安装虚拟机
安装配置Linux OS,目前桌面版的Linux系统都是免费的,可以很容易获取到安装镜像源。常用的有:Ubutun、Fedora和OpenSuse,可以自行选用。
(二)给虚拟机配置网络
最好都能上外网,以便下载安装常用软件包。
(三)安装drbd软件
上述的Linux桌面发行版自带的安装源中都能找到drbd的安装包。如果没有,那么需要自行下载源码编译安装,这样安装过程中一般会出现不少问题,Google或者百度能解决。
这里以我的两个虚拟机为例:
在做drbd实验之前,需要对虚拟机做快照备份,防止中途OS崩溃无法启动后可以回退。
系统配置:
虚拟机1
[root@t ~]# hostname
t
[root@t ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:07:3D:A8
inet addr:192.168.1.104 Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe07:3da8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:280652 errors:0 dropped:0 overruns:0 frame:0
TX packets:2326851 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:26215565 (25.0 MiB) TX bytes:3493042943 (3.2 GiB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@t ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.1.104 localhost.localdomain localhost localhost t
::1 localhost6.localdomain6 localhost6
192.168.1.106 Shentar
192.168.1.104 ME
[root@t ~]#
虚拟机2
[root@Shentar /]# hostname
Shentar
[root@Shentar /]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:39:C4:28
inet addr:192.168.1.106 Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe39:c428/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2327200 errors:0 dropped:0 overruns:0 frame:0
TX packets:280717 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3492827412 (3.2 GiB) TX bytes:26300053 (25.0 MiB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@Shentar /]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.1.106 localhost.localdomain localhost localhost Shentar
::1 localhost6.localdomain6 localhost6
192.168.1.104 t
192.168.1.106 ME
(四)在配置好了虚拟机之后,给每个虚拟机增加一块硬盘,用作drbd的镜像源。
准备供drbd管理的磁盘,对于虚拟机很方便,直接添加硬盘即可。添加步骤:
- 打开虚拟机的设置对话框:
- 点击add按钮
- 一路next即可。
- 添加完成后的虚拟机配置如下:
启动虚拟机使用fdisk -l命令会发现系统中多了一块硬盘设备:
[root@Shentar ~]# fdisk -l
Disk /dev/sdc: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/sdc doesn't contain a valid partition table注:这里的显示内容中已经将其他无关的磁盘信息删除。 - 对新加的硬盘创建分区,按照如下步骤执行即可:
[root@Shentar ~]# fdisk /dev/sdc
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-391, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-391, default 391):
Using default value 391
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@Shentar ~]# fdisk -l
Disk /dev/sdc: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x2a28d263
Device Boot Start End Blocks Id System
/dev/sdc1 1 391 3140676 83 Linux
(五)配置drbd.conf文件
两台虚拟机都配置完毕后,可以配置drbd.conf文件了。我的两台虚拟机的配置文件如下
[root@Shentar ~]# cat /etc/drbd.conf
#
# please have a a look at the example configuration file in
# /usr/share/doc/packages/drbd.conf
#
resource r0 {
protocol C;
startup {
wfc-timeout 2000;
degr-wfc-timeout 6000;
}
syncer {
rate 50M;
}
disk {
on-io-error pass_on;
}
on Shentar {
device /dev/drbd2;
disk /dev/sdc1;
address 192.168.1.106:7789;
meta-disk internal;
}
on t {
device /dev/drbd2;
disk /dev/sdc1;
address 192.168.1.104:7789;
meta-disk internal;
}
}
两台虚拟机的配置完全一样即可。
(六)创建drbd资源
执行如下两条命令创建drbd资源:
[root@Shentar ~]# drbdadm create-md r0
[root@t ~]# drbdadm create-md r0
其中r0是配置文件中指定的资源名。
(七)初次启动drbd
- 启动两台虚拟机上面的drbd服务。
/etc/init.d/drbd start
先启动的一台虚拟机会等待另外一台,一直停留在如下等待画面:
[root@t ~]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 6000 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 2000 seconds. [wfc-timeout]
(These values are for resource 'r0'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 30]:
等待另一台启动后,会自动完成启动。
- 查看系统进程,会发现多了3个drbd相关的进程:
[root@t ~]# proc
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S< 0 0:00 [kthreadd]
2 2966 0 0 ? -1 S 0 0:00 \_ [drbd2_worker]
2 2975 0 0 ? -1 S 0 0:00 \_ [drbd2_receiver]
2 3014 0 0 ? -1 S 0 0:00 \_ [drbd2_asender]
我的理解,drbd2_worker为本地磁盘管理内核线程,drbd2_receiver为接受对端同步数据的线程,drbd2_asender为本地发送数据到对端内核线程。
此时,使用drbd内核线程的状态,会发现二者已经建立联系:
[root@t ~]# cat /proc/drbd
version: 8.3.5 (api:88/proto:86-91)
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@t, 2010-05-22 10:36:02
2: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:3140544
检查drbd是否创建了设备drbd2:
[root@t ~]# l /dev/drbd2
brw-r----- 1 root disk 147, 2 2013-07-14 16:04 /dev/drbd2
[root@t ~]#
说明drbd的磁盘设备已经创建成功了。
/proc/drbd 文件是内核线程写的,当用户态打开该文件时,内核线程会将此时本端监控到的连接状态反馈给用户。PS:从这里可以看出,我的drbd是在2010年编译安装的,这个时间也够久远了。
到这里已经可以确认drbd安装、配置成功了。
但是还需要强制指定一端为主,并在新的drbd设备上面创建文件系统,方能挂载到系统使用。
- 在其中一个节点执行如下命令,强制置主:
[root@t ~]# drbdsetup /dev/drbd2 primary -o
此时再查看drbd的工作状态,会发现两台主机的drbd之间已经在同步数据了,同步速度为50M/s,这个速度是配置文件中指定的。
[root@t~]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:SyncSourcero:Primary/Secondaryds:UpToDate/InconsistentCr----
ns:372792nr:0dw:0dr:380960al:0bm:22lo:1pe:13ua:256ap:0ep:1wo:boos:2768160
[=>..................]sync'ed:12.0%(2768160/3140544)K
finish:0:01:06speed:41,376(41,376)K/sec
不必等待同步完成,已经可以在主端创建文件和使用了,但是在数据同步完成之前不能倒换或者强制重启的动作,否则会出现主备数据不一致的问题,导致“脑裂”出现。
数据同步完成后,状态显示为:
[root@t~]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:Connectedro:Primary/Secondaryds:UpToDate/UpToDateCr----
ns:3140544nr:0dw:0dr:3140544al:0bm:192lo:0pe:0ua:0ap:0ep:1wo:boos:0
- 对drbd虚拟设备做文件系统:
[root@t~]#mkfs.ext3/dev/drbd2
mke2fs1.40.8(13-Mar-2008)
Warning:256-byteinodesnotusableonoldersystems
Filesystemlabel=
OStype:Linux
Blocksize=4096(log=2)
Fragmentsize=4096(log=2)
196608inodes,785136blocks
39256blocks(5.00%)reservedforthesuperuser
Firstdatablock=0
Maximumfilesystemblocks=805306368
24blockgroups
32768blockspergroup,32768fragmentspergroup
8192inodespergroup
Superblockbackupsstoredonblocks:
32768,98304,163840,229376,294912
Writinginodetables:done
Creatingjournal(16384blocks):done
Writingsuperblocksandfilesystemaccountinginformation:done
Thisfilesystemwillbeautomaticallycheckedevery38mountsor
180days,whichevercomesfirst.Usetune2fs-cor-itooverride.
注意,文件系统只在一端做即可,另一端会在数据同步完成后就自动有文件系统了。同样创建的文件的权限也会同步到对端。因此两边操作系统的同名用户的用户id和组id也要完全一样,否则会出现同名用户创建的文件到了对端后出现该用户无法访问的问题。该问题在不指定用户id创建系统用户时比较容易出现,也比较隐藏。
- 现在就可以挂载使用drbd的虚拟磁盘设备/dev/drbd2 了。
[root@t/]#mkdirdrbd2/
[root@t/]#mount/dev/drbd2/drbd2
无出错提示,则挂载成功。
下面就可以在用户态下使用drbd的分区了。
- 做一个最简单的试验,在主节点创建一个文件,然后倒换到备,在备上面查看该文件:
[root@t/drbd2]#echo'hellodrbd!'>./justatest.txt
[root@t/drbd2]#catjustatest.txt
hellodrbd!
- 然后倒换drbd。
在主端执行如下命令:
cd/
umount/drbd2
drbdadmsecondaryall
[root@t/drbd2]#cd/
[root@t/]#umount/drbd2
[root@t/]#drbdadmsecondaryall
[root@t/]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:Connectedro:Secondary/Secondaryds:UpToDate/UpToDateCr----
ns:3256620nr:0dw:116076dr:3140673al:41bm:221lo:0pe:0ua:0ap:0ep:1wo:boos:0
[root@t/]#
在备端执行如下命令:
[root@Shentar/drbd2]#drbdadmprimaryall
[root@Shentar/]#mkdir/drbd2
[root@Shentar/]#mount/dev/drbd2/drbd2
然后再查看备端的文件是否同步成功:
[root@Shentar/drbd2]#cd/
[root@Shentar/]#cd/drbd2/
[root@Shentar/drbd2]#catjustatest.txt
hellodrbd!
[root@Shentar/drbd2]#
可以看到备端没有作文件系统,但是可以直接挂载磁盘,并打开主端同步过来的文件。
(八)后面就可以在drbd上面架数据库或者其他对文件持久化要求比较高的应用了。
Drbd在文件系统下层,直接管理块设备的块,因此如果是上层应用自身将数据结构破坏,那么坏的数据也会被同步到对端。如果是一端磁盘损坏,那么倒换后,也许数据还是好的,可以继续起上层应用,起到容灾的作用。Drbd不会自动倒换,需要在双机控制应用程序中写监控和倒换脚本来控制。