Jul
7
在高可用解决方案(HA)中,为了实现集群中数据的共享,常见两种架构:1、利用SAN等架构的盘柜存放共享数据;2、在每台集群中的机器本地磁盘中划分一个空间出来,并利用网络等方式,往集群中其他机器同步,以保证每台机器上的数据是一致的。当然,为了令第二种架构也能用于数据库等应用,同步应以数据块方式,而非文件拷贝的方式进行,而DRBD就是可用于实现第二种架构的软件。本文就模拟一个简单的架构来说明DRBD的配置方法。
一、DRBD介绍
DRBD实际上是一种块设备的实现,它由内核模块和相关程序两部分而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说,当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证数据的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据可以继续使用,以达到高可用的目的。
因为DRBD是用网络以块的方式进行数据同步的,所以,其不依赖于文件系统、LVM、软RAID等上层设备,可用于数据库文件的同步(区别于rsync 的文件同步方式)。
官方网站:http://www.drbd.org/
二、获取介质
从2.6.33核心开始,DRBD模块就可以从核心中直接编译得到,见这里。若使用其他核心版本,需手动编译驱动模块及工具包。
以这次使用的平台Asianux 3.0 SP2为例,下面提供一个安装包:
(包括i686和x86_64平台,对应核心为:2.6.18-128.7AXS3)
※ 注意,因为DRBD需把模块加载到核心中,故核心版本必须一致。若我提供的版本与您的不一样,可用源码make install,或用附件中的src.rpm 编译后安装。
三、运行环境
操作系统:Asianux 3.0 SP2 for i686
主机名称:
hatest1:192.168.228.131
hatest2:192.168.228.132
四、初始设置
1、设置主机名
确认两服务器的主机名:
2、/etc/hosts文件
把两台服务器上的hosts文件都设置为相同的内容:
3、安装软件
在两台服务器上都安装drbd软件和核心驱动模块:
4、确认模块加载是否正常
drbd的同步依赖于加载到核心中的drbd.ko驱动模块,因此,在配置前,务必确认驱动模块与当前核心匹配:
5、分区
这里将使用本地硬盘sdb作为保存数据的磁盘,为了方便管理,在两台服务器上都为其创建一个单独的分区:
※注意:DRBD是以数据块方式同步的,因此,在创建镜像磁盘前,不要创建文件系统。
五、配置
1、创建配置文件
DRBD的主配置文件在/etc/drbd.conf,及/etc/drbd.d目录下。下面的操作现在一台机器上进行。
首先,可把参考文件拷贝到/etc下:
查看drbd.conf,可看到两行:
其中,global_common.conf 里面可设置全局配置项(global)、公共配置项(common),一般保留默认配置即可。
内容是:
※注意:
a、首次启动DRBD时,会自动参加DRBD使用者统计(需要联互联网),若不想参加,可在上面的配置中关闭;
b、DRBD支持三种同步协议,详细请见:这里。
而资源配置项(resource)是DRBD所管理的资源,包括节点、meta data信息等,一般存放在drbd.d/*.res目录下,需要手动创建。
内容如下:
在一台机器上配置完成后,拷贝到集群中其他机器上:
2、初始化分区
在两台机器上初始化分区(创建meta data信息),这里的oradata即为配置文件中的资源组名称:
3、启动服务
在两服务器上启动drbd服务。
因hatest1上已经加载过drbd.ko模块,故只需restart一下drbd服务(不执行也可以)。
用cat /proc/drbd 或 service drbd status 查看当前状态:
※ 注意,现在两机器都是处于Secondary,即备机状态,还进行数据同步。
4、设置primary主机
在确认作为主数据服务器的机器上执行:
这样,将把hatest1作为主机,把sdb1中的数据以块的方式同步到hatest2中。可再次查看状态:
从蓝色比较的地方,可区分主机在DRBD集群中的位置。使用下面的命令也可确认:
为仍系统启动时自动加载drbd.ko模块,可把drbd服务设置为自启动方式:
至此,镜像分区已创建完成。
最终同步完成后,两机器drbd的状态会变为:
六、简单使用
1、格式化分区
与软RAID、LVM等类似,要使用DRBD创建的镜像分区,不是直接使用/dev/sdb1设备,而是在配置文件中指定的/dev/drbd0等。同样的,不必等待初始化完成后才使用drbd0设备。
2、注意事项
需要注意,drbd0设备只能在Primary一端使用,下面的操作都是会报错的:
另外,为避免误操作,当机器重启后,默认都处于Secondary状态,如要使用drbd设备,需手动把其设置为Primary。
3、挂载
先把drbd0设备挂载到/oradata目录中:
4、测试
当前的primary是hatest1,我们在上面创建一个文件:
正如前面提到的,只能在Primary上使用drbd设备。所以,首先,我们需要在hatest1上把卸载该设备:
然后,把hatest1设置为Secondary:
现在两台服务器都是Secondary:
这样,我们就可以把hatest2设置为Primary:
可见,hatest2上的数据时同步的。
DRBD的在日常的使用中还有不少需要注意的问题,例如其中一台机器突然down机,数据同步如何恢复?新加入一块硬盘,如何进行同步?设置第三台同步主机等。这再后面再详细描述。
七、附件
1、DRBD 8.3.8 src.rpm 源码
可使用类似下面的命令进行编译:
其他版本,可从这里获得。
2、DRBD配置说明
下面是网上的一篇关于DRBD配置及原理的说明,很值得参考,特别是关于节点Crash部分:
3、DRBD的状态
通过cat /proc/drbd,或service drbd status可查看当前节点DRBD的状态,下面是其中一些简写的说明:
4、split brain的处理
split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都已Primary状态来运行。这通常发生在主节点断开,而备节点手动修改数据后,因meta data数据不一致的情况。当drbd某primary节点连接对方节点准 备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。
DRBD可在配置文件中设定发生split brain时的处理机制,但这可能与实际情况不一致,不建议使用。若没有配置split brain自动解决方案,我们可以手动来处理。
首先我们必须要确定哪一边应该作为解决问题后的primary(也就是拥有最新数据的一边),一旦确定好这一点,那么我们同时也就确定接受 丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:
(1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
(2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始(重新同步)。详细请见:Manual split brain recovery。
八、参考文档
The DRBD User's Guide(官方文档,很详细)
A Journey On DRBD For MySQL
DRBD软件的配置(drbd.conf)
参考文档:DRBD(磁盘镜像技术)
DRBD 8.3 Third Node Replication With Debian Etch
用DRBD自動同步備份NFS Server內容
一、DRBD介绍
DRBD实际上是一种块设备的实现,它由内核模块和相关程序两部分而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说,当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证数据的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据可以继续使用,以达到高可用的目的。
因为DRBD是用网络以块的方式进行数据同步的,所以,其不依赖于文件系统、LVM、软RAID等上层设备,可用于数据库文件的同步(区别于rsync 的文件同步方式)。
官方网站:http://www.drbd.org/
二、获取介质
从2.6.33核心开始,DRBD模块就可以从核心中直接编译得到,见这里。若使用其他核心版本,需手动编译驱动模块及工具包。
以这次使用的平台Asianux 3.0 SP2为例,下面提供一个安装包:
下载文件
(包括i686和x86_64平台,对应核心为:2.6.18-128.7AXS3)
※ 注意,因为DRBD需把模块加载到核心中,故核心版本必须一致。若我提供的版本与您的不一样,可用源码make install,或用附件中的src.rpm 编译后安装。
三、运行环境
操作系统:Asianux 3.0 SP2 for i686
主机名称:
hatest1:192.168.228.131
hatest2:192.168.228.132
四、初始设置
1、设置主机名
确认两服务器的主机名:
引用
[root@hatest1 ~]# hostname
hatest1
[root@hatest2 ~]# hostname
hatest2
hatest1
[root@hatest2 ~]# hostname
hatest2
2、/etc/hosts文件
把两台服务器上的hosts文件都设置为相同的内容:
引用
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.228.131 hatest1.linuxfly.org hatest1
192.168.228.132 hatest2.linuxfly.org hatest2
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.228.131 hatest1.linuxfly.org hatest1
192.168.228.132 hatest2.linuxfly.org hatest2
3、安装软件
在两台服务器上都安装drbd软件和核心驱动模块:
# rpm -ivh kmod-drbd83-8.3.8-1AXS3.i686.rpm drbd83-8.3.8-1AXS3.i686.rpm
4、确认模块加载是否正常
drbd的同步依赖于加载到核心中的drbd.ko驱动模块,因此,在配置前,务必确认驱动模块与当前核心匹配:
引用
# modprobe drbd
# lsmod|grep drbd
drbd 228528 0
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
# lsmod|grep drbd
drbd 228528 0
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
5、分区
这里将使用本地硬盘sdb作为保存数据的磁盘,为了方便管理,在两台服务器上都为其创建一个单独的分区:
引用
# fdisk -l /dev/sdb
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 261 2096451 83 Linux
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 261 2096451 83 Linux
※注意:DRBD是以数据块方式同步的,因此,在创建镜像磁盘前,不要创建文件系统。
五、配置
1、创建配置文件
DRBD的主配置文件在/etc/drbd.conf,及/etc/drbd.d目录下。下面的操作现在一台机器上进行。
首先,可把参考文件拷贝到/etc下:
引用
[root@hatest1 ~]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/
查看drbd.conf,可看到两行:
引用
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
include "drbd.d/*.res";
其中,global_common.conf 里面可设置全局配置项(global)、公共配置项(common),一般保留默认配置即可。
内容是:
引用
global {
usage-count yes; # 是否参加DRBD使用者统计,默认是yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; # DRBD支持三种协议,默认是C 协议
}
usage-count yes; # 是否参加DRBD使用者统计,默认是yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; # DRBD支持三种协议,默认是C 协议
}
※注意:
a、首次启动DRBD时,会自动参加DRBD使用者统计(需要联互联网),若不想参加,可在上面的配置中关闭;
b、DRBD支持三种同步协议,详细请见:这里。
而资源配置项(resource)是DRBD所管理的资源,包括节点、meta data信息等,一般存放在drbd.d/*.res目录下,需要手动创建。
内容如下:
引用
[root@hatest1 ~]# cat /etc/drbd.d/oradata.res
resource oradata { # 资源组的名称
protocol C;
startup {
degr-wfc-timeout 120; # 2 minutes. 启动时连接其他节点的超时时间
}
disk {
on-io-error detach; # 当磁盘有错误时,不连接
}
net {
}
syncer {
rate 10M; # 设置主备节点同步时的网络速率最大值
al-extents 257;
}
on hatest1 { # 节点主机名
device /dev/drbd0; # 今后使用的设备
disk /dev/sdb1; # 该节点上的用于存放数据的分区号
address 192.168.228.131:7789; # 该节点的IP地址
meta-disk internal; # meta data信息存放的方式
}
on hatest2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.228.132:7789;
meta-disk internal;
}
}
resource oradata { # 资源组的名称
protocol C;
startup {
degr-wfc-timeout 120; # 2 minutes. 启动时连接其他节点的超时时间
}
disk {
on-io-error detach; # 当磁盘有错误时,不连接
}
net {
}
syncer {
rate 10M; # 设置主备节点同步时的网络速率最大值
al-extents 257;
}
on hatest1 { # 节点主机名
device /dev/drbd0; # 今后使用的设备
disk /dev/sdb1; # 该节点上的用于存放数据的分区号
address 192.168.228.131:7789; # 该节点的IP地址
meta-disk internal; # meta data信息存放的方式
}
on hatest2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.228.132:7789;
meta-disk internal;
}
}
在一台机器上配置完成后,拷贝到集群中其他机器上:
引用
[root@hatest1 ~]# scp /etc/drbd.conf hatest2:/etc
[root@hatest1 ~]# scp /etc/drbd.d/oradata.res hatest2:/etc/drbd.d/
[root@hatest1 ~]# scp /etc/drbd.d/oradata.res hatest2:/etc/drbd.d/
2、初始化分区
在两台机器上初始化分区(创建meta data信息),这里的oradata即为配置文件中的资源组名称:
引用
[root@hatest1 ~]# drbdadm create-md oradata
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
[root@hatest2 ~]# drbdadm create-md oradata
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
[root@hatest2 ~]# drbdadm create-md oradata
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
3、启动服务
在两服务器上启动drbd服务。
引用
[root@hatest1 ~]# service drbd restart
[root@hatest2 ~]# service drbd start
[root@hatest2 ~]# service drbd start
因hatest1上已经加载过drbd.ko模块,故只需restart一下drbd服务(不执行也可以)。
用cat /proc/drbd 或 service drbd status 查看当前状态:
引用
[root@hatest1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: 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:2096348
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: 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:2096348
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: 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:2096348
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: 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:2096348
※ 注意,现在两机器都是处于Secondary,即备机状态,还进行数据同步。
4、设置primary主机
在确认作为主数据服务器的机器上执行:
引用
[root@hatest1 ~]# drbdadm adjust oradata
[root@hatest1 ~]# drbdsetup /dev/drbd0 primary -o
[root@hatest1 ~]# drbdsetup /dev/drbd0 primary -o
这样,将把hatest1作为主机,把sdb1中的数据以块的方式同步到hatest2中。可再次查看状态:
引用
[root@hatest1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:719756 nr:0 dw:0 dr:720896 al:0 bm:43 lo:0 pe:62 ua:36 ap:0 ep:1 wo:b oos:1378556
[=====>..............] sync'ed: 34.4% (1378556/2096348)K delay_probe: 149
finish: 0:04:59 speed: 4,580 (7,248) K/sec
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
ns:0 nr:752096 dw:751584 dr:0 al:0 bm:45 lo:17 pe:49 ua:16 ap:0 ep:1 wo:b oos:1344764
[======>.............] sync'ed: 36.0% (1344764/2096348)K queue_delay: 2.9 ms
finish: 0:02:11 speed: 10,224 (10,020) want: 10,240 K/sec
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:719756 nr:0 dw:0 dr:720896 al:0 bm:43 lo:0 pe:62 ua:36 ap:0 ep:1 wo:b oos:1378556
[=====>..............] sync'ed: 34.4% (1378556/2096348)K delay_probe: 149
finish: 0:04:59 speed: 4,580 (7,248) K/sec
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
ns:0 nr:752096 dw:751584 dr:0 al:0 bm:45 lo:17 pe:49 ua:16 ap:0 ep:1 wo:b oos:1344764
[======>.............] sync'ed: 36.0% (1344764/2096348)K queue_delay: 2.9 ms
finish: 0:02:11 speed: 10,224 (10,020) want: 10,240 K/sec
从蓝色比较的地方,可区分主机在DRBD集群中的位置。使用下面的命令也可确认:
引用
[root@hatest1 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
Primary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
为仍系统启动时自动加载drbd.ko模块,可把drbd服务设置为自启动方式:
引用
[root@hatest1 ~]# chkconfig --level 235 drbd on
[root@hatest2 ~]# chkconfig --level 235 drbd on
[root@hatest2 ~]# chkconfig --level 235 drbd on
至此,镜像分区已创建完成。
最终同步完成后,两机器drbd的状态会变为:
引用
[root@hatest1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:2096348 nr:0 dw:0 dr:2096348 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
ns:0 nr:2096348 dw:2096348 dr:0 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:2096348 nr:0 dw:0 dr:2096348 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
ns:0 nr:2096348 dw:2096348 dr:0 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
六、简单使用
1、格式化分区
与软RAID、LVM等类似,要使用DRBD创建的镜像分区,不是直接使用/dev/sdb1设备,而是在配置文件中指定的/dev/drbd0等。同样的,不必等待初始化完成后才使用drbd0设备。
引用
[root@hatest1 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest1 ~]# mkfs.ext3 /dev/drbd0
[root@hatest1 ~]# tune2fs -c 0 -i 0 /dev/drbd0
Primary/Secondary
[root@hatest1 ~]# mkfs.ext3 /dev/drbd0
[root@hatest1 ~]# tune2fs -c 0 -i 0 /dev/drbd0
2、注意事项
需要注意,drbd0设备只能在Primary一端使用,下面的操作都是会报错的:
引用
[root@hatest2 ~]# mount /dev/sdb1 /oradata
mount: /dev/sdb1 already mounted or /oradata busy
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
[root@hatest2 ~]# mount /dev/drbd0 /oradata/
mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: 错误的介质类型
mount: /dev/sdb1 already mounted or /oradata busy
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
[root@hatest2 ~]# mount /dev/drbd0 /oradata/
mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: 错误的介质类型
另外,为避免误操作,当机器重启后,默认都处于Secondary状态,如要使用drbd设备,需手动把其设置为Primary。
3、挂载
先把drbd0设备挂载到/oradata目录中:
引用
[root@hatest1 ~]# mount /dev/drbd0 /oradata
[root@hatest1 ~]# df -h /oradata
文件系统 容量 已用 可用 已用% 挂载点
/dev/drbd0 2.0G 36M 1.9G 2% /oradata
[root@hatest1 ~]# df -h /oradata
文件系统 容量 已用 可用 已用% 挂载点
/dev/drbd0 2.0G 36M 1.9G 2% /oradata
4、测试
当前的primary是hatest1,我们在上面创建一个文件:
引用
[root@hatest1 ~]# echo `date +%s` > /oradata/test.txt
[root@hatest1 ~]# cat /oradata/test.txt
1278471155
[root@hatest1 ~]# cat /oradata/test.txt
1278471155
正如前面提到的,只能在Primary上使用drbd设备。所以,首先,我们需要在hatest1上把卸载该设备:
引用
[root@hatest1 ~]# umount /oradata
然后,把hatest1设置为Secondary:
引用
[root@hatest1 ~]# drbdadm secondary oradata
现在两台服务器都是Secondary:
引用
[root@hatest1 ~]# drbdadm role oradata
Secondary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Secondary
Secondary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Secondary
这样,我们就可以把hatest2设置为Primary:
引用
[root@hatest2 ~]# drbdadm primary oradata
[root@hatest2 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest2 ~]# mount /dev/drbd0 /oradata
[root@hatest2 ~]# cat /oradata/test.txt
1278471155
[root@hatest2 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest2 ~]# mount /dev/drbd0 /oradata
[root@hatest2 ~]# cat /oradata/test.txt
1278471155
可见,hatest2上的数据时同步的。
DRBD的在日常的使用中还有不少需要注意的问题,例如其中一台机器突然down机,数据同步如何恢复?新加入一块硬盘,如何进行同步?设置第三台同步主机等。这再后面再详细描述。
七、附件
1、DRBD 8.3.8 src.rpm 源码
下载文件
可使用类似下面的命令进行编译:
rpmbuild --rebuild --define "kversion 2.6.18-128.7AXS3" --define "kvariants '' " --target i686 drbd83-kmod-8.3.8-1AXS3.src.rpm
其他版本,可从这里获得。
2、DRBD配置说明
下面是网上的一篇关于DRBD配置及原理的说明,很值得参考,特别是关于节点Crash部分:
下载文件
3、DRBD的状态
通过cat /proc/drbd,或service drbd status可查看当前节点DRBD的状态,下面是其中一些简写的说明:
引用
Field 说明 值:
cs 连接状态 出现的值:
o Unconfigured:设备在等待配置。
o Unconnected:连接模块时的过渡状态。
o WFConnection:设备等待另一测的配置。
o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。.
o SyncingAll:正将主节点的所有模块复制到次级节点上。.
o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected:一切正常。
o Timeout:过渡状态。
st 状态(设备的作用) 可能的值为:
o 本地/远程一级状态
o 二级状态
o 未知(这不是一种作用)
ns 网络发送 模块号码
nr 网络接收 模块号码
dw 磁盘写入 模块号码
DR 磁盘读取 模块号码
of 运行中(过时的)模块号码
pe 待解决的 模块号码
ua 未答复的 模块号码(最好为0)
cs 连接状态 出现的值:
o Unconfigured:设备在等待配置。
o Unconnected:连接模块时的过渡状态。
o WFConnection:设备等待另一测的配置。
o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。.
o SyncingAll:正将主节点的所有模块复制到次级节点上。.
o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected:一切正常。
o Timeout:过渡状态。
st 状态(设备的作用) 可能的值为:
o 本地/远程一级状态
o 二级状态
o 未知(这不是一种作用)
ns 网络发送 模块号码
nr 网络接收 模块号码
dw 磁盘写入 模块号码
DR 磁盘读取 模块号码
of 运行中(过时的)模块号码
pe 待解决的 模块号码
ua 未答复的 模块号码(最好为0)
4、split brain的处理
split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都已Primary状态来运行。这通常发生在主节点断开,而备节点手动修改数据后,因meta data数据不一致的情况。当drbd某primary节点连接对方节点准 备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。
DRBD可在配置文件中设定发生split brain时的处理机制,但这可能与实际情况不一致,不建议使用。若没有配置split brain自动解决方案,我们可以手动来处理。
首先我们必须要确定哪一边应该作为解决问题后的primary(也就是拥有最新数据的一边),一旦确定好这一点,那么我们同时也就确定接受 丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:
(1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
drbdadm disconnect resource_name
drbdadm secondary resource_name
drbdadm -- --discard-my-data connect resource_name
drbdadm secondary resource_name
drbdadm -- --discard-my-data connect resource_name
(2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
drbdadm connect resource_name
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始(重新同步)。详细请见:Manual split brain recovery。
八、参考文档
The DRBD User's Guide(官方文档,很详细)
A Journey On DRBD For MySQL
DRBD软件的配置(drbd.conf)
参考文档:DRBD(磁盘镜像技术)
DRBD 8.3 Third Node Replication With Debian Etch
用DRBD自動同步備份NFS Server內容
专门来点赞
2015/12/06 15:55
难得一见的好文,作者真的太用心了。一万个赞!
分页: 1/1 1