Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30820
  • 博文数量: 7
  • 博客积分: 225
  • 博客等级: 入伍新兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-21 18:02
文章分类
文章存档

2011年(7)

最近访客

分类: LINUX

2011-09-18 17:41:02

分布式复制块设备DRBD
Distrbuted Replicated Block Device

一).关于DRBD:

简介
开发公司:linbit
遵循GPL协定的开源软件
2.6.33以后被做进内核
在内核内工作
一个内核的子系统,补充了内核关于I/O方面的功能

工作原理:
node1,node2双方各提供一个共享分区
node1上的存储网页文件在底层自动复制给node2
复制过程为块级别,在内核中完成

配置工具:
drdbadm(两段式:内核/用户)
用以定义将哪些分区配置为DRBD的块设备,或者监控他们的工作状态
主配置文件:/etc/drbd.conf

drbdsetup
drbdmeta

DRBD特点:
software-based 基于软件
shared-nothing 无共享
between servers
服务器之间
replicated storage solution mirroring the content of block devices
镜像块设备(硬盘,分区,逻辑卷)内容的同步存储解决方案

DRBD mirrors data
实现数据镜像的特点:
In real time 实时
Transparently 透明
Synchronously or asynchronously 可同步也可异步或半同步

附:
复制过程分为同步和异步:需要对方确认为同步,不需要为异步。


二).一些基础概念:

一.资源:
对于DRBD资源不是流转的,它实际是一个DRBD完整的架构信息。

资源有好几种组件组成:

1.Resource name资源的名字:
DRBD节点识别DRBD设备用到的,每一个资源名用以标示一个独立的DRBD架构

必须使用纯粹的ascII码来标示,并且不能包含任何空白字符

DRBD设备必须建立在资源上,资源必须用资源名进行标示

2.DRBD device设备:
在DRBD中,资源被定义为DRBD的块设备,这个设备是虚拟的,所以他必须有对应的定义文件。

所有设备的主设备号是147

每一个块设备都被命名为/dev/drdbn,其中n为该设备的次设备号

3.Disk configuration 磁盘配置相关信息
指定为了创建这个DRBD设备需要用到的哪个节点的哪个分区,以及有关DRBD的源数据信息的位置

4.Network configuration 网络相关的配置信息
关于网络的传输过程中是否需要认证
用于指定两者之间的可用带宽

 

二.资源的角色
Primary 主节点
unrestrictedly 读写 可以裸I/O

Secondary 从节点
不能挂载,不能读写
只接受主节点的读写信息,不允许用户或其他本节点任何应用程序的读写信息

两者可以互换
类似于MYSQL为数据提供一种通路

三.DRBD的模型
单主节点(主从)
任何资源只能在主节点被读写操作
文件系统可以使任何常见的文件系统
主要为HA提供解决方案

双主节点(主主)
任何一个节点实现对DRBD的读写,但是双主模型必须要结合集群文件系统来实现,来解决加锁问题
只在DRBD8.0以后才支持
gfs ocfs2

四.同步和异步

Protocol(关键字,定义同步或异步)
A异步
只传输,不考虑从节点
不可靠,但性能好

B半同步(内存同步)
只要传输到内存中,就宣布成功
两个节点同时断电会造成数据丢失

C同步
只有数据存储在磁盘上,才宣布存储完成
最可靠,DRBD默认使用

附:关于断电丢失数据的解决方法:可以把DRBD数据存放到RAID上,RAID要带电池

DRBD只能提供99.5%的高可用性,可以满足一般企业的需要。

五.脑裂split brain与解决方法
双节点都无法探测到彼此,结果导致双方都认为自己成为主节点,各自进行读写,然后当双方恢复通讯时,双方数据无法吻合。

解决方法:
1.最近刚刚成为主节点的新人数据丢弃,早的覆盖晚的
2.晚的覆盖早的,越晚写的数据越新
3.谁改的少丢弃谁的
4.手动选择


三)安装并配置一个DRBD设备

前提:
1.两个节点通过主机名访问彼此,两个主机名必须通过uname -n访问彼此
2.双方节点各自准备一个大小一样的磁盘分区
3.各自安装软件

注意:
DRBD与kmod软件包版本必须一样

关于配置文件:
配置文件/etc/drbd.conf
两个字段:
grobal 全局属性
common 定义每一个资源用到的共享配置,非必须

定义resource文件
resource web(资源名) {
  on node1.a.org {
 device /dev/drbd0;(对应设备)
 disk /dev/sda4;
 address (监听在哪个端口上互相通信)
 meta-disk internel;(元数据)

一.分别创建分区
node1:
fdisk /dev/sda
4
n
w
partprode /dev/sda
node2:同上

二.两个节点分别下载安装软件
lftp 172.16.0.1(这里我在局域网中下载的软件包,用户可根据自己情况选择合适的网址进行下载)
cd /pub/Source/drbd
mget *
bye
yum --localinstall -y --nogpgcheck *.rpm

node2节点同上

三.配置文件
1.
cd /user/share/doc/drbd83-8.3.8/
cp /drbd.conf /etc

2.配置/etc/drbd.d/global-common.conf
global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}

common {
        protocol C;

        handlers {
                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }

        startup {
                wfc-timeout 120;
                degr-wfc-timeout 120;
        }

        disk {
                on-io-error detach;
        fencing resource-only;
        }

        net {
        cram-hmac-alg "sha1";
         shared-secret "mydrbdlab";
        }

        syncer {
                rate 100M;
        }
}

可以注释掉以下三行
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

3.定义一个资源
vim /etc/drbd.d/web.res
resource web {
  on node1.a.org {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.44.41:7789;
    meta-disk internal;
  }
  on node2.a.org {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.44.42:7789;
    meta-disk internal;
  }
}
scp -r /etc/drbd.conf /etc/drbd.d node2:/etc/drbd.conf

四.初始化与角色分配

1.初始化资源
drbdadm create-md web

2.启动服务
/etc/init.d/drbd start

3.查看启动状态:
cat /proc/drbd

4.在node2上完成同样配置,但注意,双方节点必须同时启动起来

5.将其中一个节点设置为主节点
drbdadm -- --overwrite-data-of-peer primary web

五.创建文件系统并挂载使用

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
mke2fs -j -L DRBDWEB /dev/drbd0
mkdir /web
mount /dev/drbd0 /web

cd /web

vim index.html

Web with share Storage.

6、切换Primary和Secondary节点

对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:

Node1:
cp -r /etc/drbd.* /Web
umount /Web
drbdadm secondary web

查看状态:
drbd-overview
  0:web  Connected Secondary/Secondary UpToDate/UpToDate C r----

Node2:
drbdadm primary web
drbd-overview
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r----
mkdir /mnt/drbd
mount /dev/drbd0 /Web

由于使用DRBD和pacemaker以及Mysql搭配构建集群一直未能实现,决定先将此博客前半段放出,在下一篇博客继续为大家讲解DRBD+pacemaker与mysql的组合使用。

 

阅读(1531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~