一、drbd简介

分布式的块设备

基于软件的不共享任何东西的分布式复制存储解决方案,而这种解决方案是通过镜像两个块设备中的内容来实现的.而这两个块设备是位于不同的主机上

块设备可以是一个磁盘、分区、甚至可以是一个逻辑卷

drbd在实现数据镜像的时候,有以下三个特点

1.实时的

2.透明的

3.数据传输过程可以做到同步或者异步,也可以做成半同步

一般做成同步性能最差,但安全性最佳。默认情况是做主从模式。不能解决文件系统锁的问题

drbd是工作在内核当中的。类似于一种驱动模块

他工作的位置在文件系统的buffer cache和磁盘调度器之间

通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送给对方的drbd,再由对方的drbd存在本地对应磁盘上

因为drbd是工作在内核当中,所以我们要对内核进行打补丁。

不过在2.6.33内核之后已经被做进内核当中了

如果做成drbd当本地一个进程往磁盘写入数据的时候他在什么情况下会认为数据写入完成?

他要不要等待在另外一台主机写入完成才认为是完成呢?

这取决于数据传输模式 同步 异步 半同步

异步指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后 就认为写入完成

半同步指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入

同步指的是主节点已写入,从节点磁盘也写入


官方的drbd介绍

1.drbd是两段式的 用户空间和管理工具

内核空间有内核模块

用户空间的管理工具就是drbdadm还有drbdsetup和drbdmeta


对于drbd的resources来说resources就是谁跟谁的镜像关系,而且这个resources还有名字

关联某一个特定的drbd设备的相关所有属性的定义就是resources

1.资源名只能使用纯ascii码 而且不能使用空白字符 用于表示资源名称

2.所关联的两个设备是谁,至少要关联两个设备,这个设备是drbd管理的,主设备号是147,次设备号从0开始

因此在一组主机上,drbd的设备的设备名称就在/dev/drbdN,这个N通常给他的次设备号表示一致。

这个设备号是系统自动分配的

3.磁盘配置信息通常指的是两个磁盘之间在复制数据的时候最高速率是多大,是不是在数据传输的时候进行加密或者签名.

这些都叫磁盘配置信息或者传输属性.

最重要的是磁盘配置的源数据在什么地方

4.网络配置主要用于确保drbd双主机通讯的时候是否加密,是否签名,使用多大带宽.


在drbd配置当中用的最多的是数据源在哪.


resources roles

资源的角色

在主从架构中是不是就有角色了,在某一时刻只能有一个是主的,因为是主从架构

每一个资源在主从架构当中都有这样角色

在所有设为primary的资源将不受限制进行读写操作。可以创建文件系统,可以使用裸设备,甚至直接io

在所有设为secondary的设备中不能挂载,不能读写

drbd也有drbd mode 一种是单主模型(主从) 一种叫双主模型

drbd只有在8.0以后的版本才支持双主模型

在单主模型下drbd可以使用任意的文件系统

单在双主模型下只能使用集群文件系统

开源的集群文件系统

1.ocfs2

2.gfs2


复制模型就是传输模式 同步 异步 半同步

他的复制模型是靠protocol关键字来定义的

protocol A表示异步

protocol B表示半同步

protocol C表示同步

默认为protocol C

在同步模式下只有两块磁盘才会导致数据丢失

在半同步模式下只有主挂了,从服务器停电了 同时 才会导致数据丢失

drbd的主不会监控从的状态 所以有可能会造成数据重传

脑裂的问题

主从联系不上了 从也认为自己变成主的了

最后又恢复了 就可能会出现脑裂

drbd脑裂恢复策略

丢弃最近一次变为主的,以原来为主

丢弃设置为主的,以新的为准

以谁修改的最少,来保证数据。

二、安装

drbd安装和常见高可用集群安装一样

通常使用主机名来访问对方主机

而且主机名要和uname -n一直

如果纯粹使用drbd的话他本身并不依赖于高可用集群

只不过在高可用集群当中时候的时候它被定义为一种资源

如果纯粹使用的话 需要手动切换


关于drbd版本

在linux 2.6.33以后的版本中,drbd已经集成到内核中

目前在用的drbd主要8.0 8.2 8.3 三个版本,对应的rpm包是drbd,drbd82和drbd83,因此需要安装对应的内核模块,对应的名字为kmod-drbd,kmod-drbd82,kmod-drbd83.

个版本的功能和配置略有差异我们这里用的是centos 5.4和x86的系统

我们这里使用的是drbd83-8.3.13和kmod-drbd83-8.3.13

下载地址为http://mirror.centos.org/centos/5/extras/i386/RPMS/

注意版本一定要一致 同时drbd83-8.3.13可能需要升级内核到2.6.18-308.8.2.el5

测试环境

1.本次测试有两个节点,分别为web01和web02对于的ip为192.168.0.11和192.168.0.22

2.web01和web02两个节点各提供了一个大小相同的分区作为drbd设备;大小为20g

3.系统为CentOS 5.4 x86

注意请修改/etc/hosts里面对应的主机名称和ip

配置drbd

drbd的主配置文件为/etc/drbd.conf;默认安装完之后是空的,但是给了一个样例复制一下就可以了.为了管理的便捷性,目前通常会将这些配置文件分成多个部分,并且都保存在/etc/drbd.d/目录中,主配置文件仅使用

"include"指令将这些配置文件片段整合起来。通常/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件,其中global_common.conf

中主要定义global段和common段,而每一个.res的文件用于定义一个资源.


在配置文件中global段只能出现一次,如果所有的配置信息都保存至同一个配置中而不分开为多个文件的话,global段必须位于配置文件的最开始处.

目前global段可以定义的参数仅有 minor-count,dialog-refresh,disable-ip-verification和usage-count。


common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common中定义,实际应用中,common段并非必须,但建议将

多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。


resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以

由非空白的ascii字符组成。每个资源段的定义中至少要包含两个host字段,以定义此资源关联至的节点,其他参数均可以从common段或者drbd的默认中进行继承

而无需定义.

下面开始安装和配置

1.查看主机名
[root@web01 soft]# vim /etc/hosts
192.168.0.11 web01
192.168.0.22 web02
[root@web02 soft]# vim /etc/hosts
192.168.0.11 web01
192.168.0.22 web02
下面开始安装drbd
node1:
[root@web01 soft]# yum --nogpgcheck -y localinstall *.rpm
配置文件主配置文件为/etc/drbd.conf
复制样例文件
[root@web01 ~]# cp /usr/share/doc/drbd83-8.3.13/drbd.conf /etc/drbd.conf
[root@web01 ~]# cd /etc/drbd.d/
[root@web01 drbd.d]# vim global_common.conf
usage-count yes;是否记录drbd次数,如果没用就改为no
protocol C;同步模式 默认同步.A表示异步,B表示半同步
handlers处理方式
local-io-error 本地io有问题的时候怎么办
after-resync-target  重传之前怎么办
before-resync-target 什么时候做重传
out-of-sync  同步之前怎么办
fence-peer   可以fence
split-brain  脑裂的时候怎么办
allow-two-primaries 双主模型
cram-hmac-alg 数据传输中的算法是什么
shared-secret 共享密码是什么
rate 定义同步的时候速率有多大
下面给一个简单的配置
global_common.conf
    startup {
        wfc-timeout 120;
                degr-wfc-timeout 120;
    }
    disk {
        on-io-error detach;
                fencing resource-only;
    }
    net {
        cram-hmac-alg "sha1";
                shared-secret "testtest2";
    }
    syncer {
        rate 100M;
    }
定义资源
resource 资源名
on 对应的节点是谁
device /dev/drbd0;
disk 这个主机的磁盘分区是那个;
address 监听在那个地址的哪个端口;
meta-disk 用于定义磁盘磁盘的数据如何保存和存储; drbd有两种存储方式
定义资源的例子
[root@web01 drbd.d]# cat web.res
resource web {
       on web01 {
       device /dev/drbd0;
       disk /dev/sdb5;
       address 192.168.0.11:7789;
       meta-disk internal;
}
       on web02 {
       device /dev/drbd0;
       disk /dev/sdb5;
       address 192.168.0.22:7789;
       meta-disk internal;
}
}
注意两个主机都要有
开始初始化资源并启动服务
[root@web01 drbd.d]# drbdadm create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
[root@web01 drbd.d]# /etc/init.d/drbd start
双方都要启动 启动之后
[root@web01 drbd.d]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31
m:res  cs         ro                   ds                         p  mounted  fstype
0:web  Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
[root@web01 ~]# drbdadm -- --overwrite-data-of-peer primary web 设置哪个资源为主节点 这里设置在web01节点上web资源为主
对于主primary/Secondary模型的drbd服务来讲,在某一个时刻只有一个节点为primary,因此,要切换两个节点的角色,只能在将原有的primary节点设置为
Secondary后,才能将原来的Secondary设置为primary
我们使用drbdadm secondary web将此节点设置为secondary;然后再在另外一节点上使用drbdadm primary web将其提升为primary
注意使用的时候一定要先umount分区
[root@web01 ~]# drbd-overview  查看同步状态
[root@web01 drbd.d]# chkconfig drbd on
[root@web01 ~]# mkfs.ext3 /dev/drbd0 格式化分区
[root@web01 ~]# mkdir /web
[root@web01 ~]# mount /dev/drbd0 /web/

至此drbd实验到此结束