Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1663768
  • 博文数量: 631
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3920
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(631)

文章存档

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2017-05-09 20:50:40

一、环境准备:
1、两个节点
hostname node1
hostname node2


2、各个节点hosts文件添加
192.168.23.148 node2
192.168.23.147 node1


[root@node2 drbd.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2
#
[root@node1 drbd.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1

[root@node1 drbd.d]# uname -n
node1
[root@node2 drbd.d]# uname -n
node2


3、配置双机互信
ssh-keygen -t rsa -P ''
ssh-copy-id root@node2


4、配置时间同步并添加到计划任务之中
*/5 * * * * /usr/sbin/ntpdate time.windows.com


5、为各个节点预留一块裸盘
Disk /dev/sdb: 5368 MB, 5368709120 bytes


2、安装软件包


drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。


目前适用CentOS 5的drbd版本主要有8.0、8.2、8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。

而适用于CentOS 6的版本为8.4,其对应的rpm包为drbd和drbd-kmdl,但在实际选用时,要切记两点:drbd和drbd-kmdl的版本要对应

另一个是drbd-kmdl的版本要与当前系统的内容版本相对应。各版本的功能和配置等略有差异;我们实验所用的平台为x86_64且系统为CentOS 6.5,因此需要同时安装内核模块和管理工具。

我们这里选用最新的8.4的版本(drbd-8.4.3-33.el6.x86_64.rpm和drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm),下载地址为ftp://rpmfind.net/linux/atrpms/,请按照需要下载。


实际使用中,您需要根据自己的系统平台等下载符合您需要的软件包版本,这里不提供各版本的下载地址。


下载完成后直接安装即可:

# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


3、配置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的默认中进行继承而无须定义。



下面的操作在node1.magedu.com上完成。


1 配置/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 1000M;
        }
}




2、定义一个资源/etc/drbd.d/web.res,内容如下:

resource web {
  on node1.magedu.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.100.7:7789;
    meta-disk internal;
  }
  on node2.magedu.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.100.8:7789;
    meta-disk internal;
  }
}
or
resource web {
device    /dev/drbd0;
    disk      /dev/sda5;
    meta-disk internal;

  on node1.magedu.com {
    address   172.16.100.7:7789;
  }
  on node2.magedu.com {
    address   172.16.100.8:7789;
  }
}


以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。

# scp  /etc/drbd.d/*  node2:/etc/drbd.d/


3、在两个节点上初始化已定义的资源并启动服务:


1)初始化资源,在Node1和Node2上分别执行

# drbdadm create-md web


2)启动服务,在Node1和Node2上分别执行

/etc/init.d/drbd start


3)查看启动状态

# cat /proc/drbd

version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 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:505964


也可以使用drbd-overview命令来查看

# drbd-overview 

  0:web  Connected Secondary/Secondary Inconsistent/Inconsistent C r---- 


从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令

# drbdadm primary --force resource


  注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点

     # drbdadm -- --overwrite-data-of-peer primary web


而后再次查看状态,可以发现数据同步过程已经开始:

# drbd-overview 

  0:web  SyncSource Primary/Secondary UpToDate/Inconsistent C r---- 
    [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
    
等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:

# drbd-overview 

  0:web  Connected Primary/Secondary UpToDate/UpToDate C r---- 

4、创建文件系统

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:

# mke2fs -j -L DRBD /dev/drbd0

# mkdir /mnt/drbd 

# mount /dev/drbd0 /mnt/drbd


5、切换Primary和Secondary节点


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

Secondary节点设置为Primary:



Node1:

# cp -r /etc/drbd.* /mnt/drbd  

# umount /mnt/drbd

# 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 /mnt/drbd


使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在:

# ls /mnt/drbd

补充:drbd 8.4中第一次设置某节点成为主节点的命令

# drbdadm primary --force resource

配置资源双主模型的示例:
resource mydrbd {

        net {
                protocol C;
                allow-two-primaries yes;
        }


        startup {
                become-primary-on both;
        }


        disk {
                fencing resource-and-stonith;
        }


        handlers {
                # Make sure the other node is confirmed
                # dead after this!
                outdate-peer "/sbin/kill-other-node.sh";
        }


        on node1.magedu.com {
                device  /dev/drbd0;
                disk    /dev/vg0/mydrbd;
                address 172.16.200.11:7789;
                meta-disk       internal;
        }

        on node2.magedu.com {
                device  /dev/drbd0;
                disk    /dev/vg0/mydrbd;
                address 172.16.200.12:7789;
                meta-disk       internal;
        }
}


报错及解决?
[root@node2 drbd.d]# drbdadm create-md file
Writing meta data...
md_offset 1085698048
al_offset 1085665280
bm_offset 1085628416

Found ext3 filesystem
     2104376 kB data area apparently used
     1060184 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.


Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

[root@node2 drbd.d]# 
执行如下命令:
[root@node2 drbd.d]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 2.16519 s, 48.4 MB/s
You have new mail in /var/spool/mail/root
[root@node2 drbd.d]# 

[root@node2 drbd.d]# drbdadm create-md file
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

[root@node2 drbd.d]# drbdadm create-md data
You want me to create a v08 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/sdb2 at byte offset 1085730816
Do you really want to overwrite the existing v08 meta-data?
[need to type 'yes' to confirm] yes


Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[root@node2 drbd.d]# 



主机 IP 功用
node1.anyisalin.com 172.16.1.2 drbd节点
node2.anyisalin.com 172.16.1.3 drbd节点
注意: 本文实验中所有主机SElinux和iptables都是关闭的

blob.png
分布式文件块(DRBD)是一种基于软件, 无共享的, 复制, 镜像主机间块设备的内容(lvm, partition, disk..)的解决方案

DRBD镜像数据的特点:

实时(in real time): 实时复制镜像设备的内容

透明(transparently): 对于用户和应用程序镜像数据的过程是透明的

同步、异步(synchronously、asynchronously):

同步模式下, 程序会通知所有
主机并在所有的写操作写入所有主机才会写入本地磁盘

异步模式下, 程序会在通知写操作写入其他主机之前就写入本地磁盘 


DRBD的三种协议

上面的图可以看出DRBD在I/O栈的位置, 也大体可以了解DRBD的工作流程, 其实DRBD有三种工作模型, 我们称它为三种工作协议, 分别为protcol A, protcol B, protocol C, 我们大体说一下这三种工作协议

Protocol A: Asynchronous, 也称为异步模型, 当DRBD将数据流传到本机网卡接口时就视为完成传输

Protocol B: Semi-Synchronous, 也成为半同步模型, 当DRBD将数据流传到目标主机的网卡接口时视为完成传输

Protocol C: Synchronous, 也成为同步模型, 当DRBD将数据流传到目标主机并且目标主机将数据写入DRBD设备时才视其为完成传输

DRBD在用户空间的管理命令

drbdadm: 在drbd套件用较为高级的程序, 配置方法较为简单, 获取配置文件中的参数来进行配置, 算是drbdsetup和drbdmeta的前端工具

drbdsetup: 可以直接配置加载的DRBD模块, 配置较为复杂

drbdmeta: 允许创建、转储、还原和修改DRBD元数据结构, 配置更为复杂

我这里系统是CentOS 6.7, 通过官方站点DRBD DownLoad下载drbd-8.4.4.tar.gz 

[root@node1 ~]# yum groupinstall "Development Tools" "Server Platform Development" -y --nogpgcheck #安装开发包组

[root@node1 ~]# wget #下载drbd

[root@node1 ~]# tar xf drbd-8.4.4.tar.gz -C /usr/src/

[root@node1 ~]# cd /usr/src/drbd-8.4.4/

#编译安装
[root@node1 drbd-8.4.4]# ./configure --prefix=/usr/local/drbd --sysconfdir=/etc/ --with-km


[root@node1 drbd-8.4.4]# make DIR=/usr/src/kernels/2.6.32-573.el6.x86_64/

[root@node1 drbd-8.4.4]# make install

[root@node1 drbd-8.4.4]# cd drbd

[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-573.el6.x86_64/

[root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-573.el6.x86_64/kernel/lib/


#装载模块

[root@node1 drbd]# depmod

[root@node1 drbd]# modprobe drbd

[root@node1 drbd]# lsmod | grep drbd

drbd                  327242  0 
libcrc32c               1246  1 drbd

node2的操作同上, 由于篇幅原因不做叙述 



配置DRBD   分区


注意:创建完分区后不能对其进行格式化, 下面的操作在node1和node2都需要执行

[root@node1 ~]# 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 0xa5927bb4.
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-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 ~]# partx -a /dev/sdb

BLKPG: Device or resource busy
error adding partition 1

配置文件


配置文件如下, /etc/drbd.d/glob-common.conf, 并复制到node2上

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 1000M;
        }

配置文件如下, /etc/drbd.d/data.res, 并复制到node2上

resource data {
        on node1.anyisalin.com  {
         device  /dev/drbd0;
         disk   /dev/sdb1;
         address 172.16.1.2:7789;
         meta-disk   internal;
        }
        on node2.anyisalin.com {
         device  /dev/drbd0;
         disk   /dev/sdb1;
         address 172.16.1.3:7789;
         meta-disk  internal;
        }
}

启动并设置DRBD

首先我们先在node1和node2分别初始化资源

[root@node1 drbd.d]# drbdadm create-md data  #node1运行

[root@node2 drbd.d]# drbdadm create-md data  #node2运行

同时在node1和node2上启动drbd

[root@node1 drbd.d]# service drbd start  #node1运行

[root@node2 drbd.d]# service drbd start  #node2运行

设置node1为主节点

[root@node1 drbd.d]# drbdadm primary --force data 

[root@node1 drbd.d]# cat /proc/drbd #可以看到同步过程, 手慢了没截到图

# 同步完成后

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/Diskless C r-----
 ns:0 nr:0 dw:0 dr:792 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10490052

格式化并挂载

我们需要对drbd设备格式化并挂载才能使用, P.S drbd正常情况下只有主节点能够挂载

[root@node1 drbd.d]# mkfs.ext4 /dev/drbd0  #格式化drbd设备

[root@node1 drbd.d]# mkdir /data

[root@node1 drbd.d]# mount /dev/drbd0 /data/ #挂载到data目录

[root@node1 drbd.d]# cd /data/

[root@node1 data]# touch node1.anyisalin.com  #创建文件在data目录
验证冗余性

我们将node1设置为seondary并将node2设置为primary

[root@node1 ~]# umount /data/   #首先要卸载drbd0

[root@node1 ~]# drbdadm secondary data  #设置为secondary

[root@node2 ~]# drbdadm primary data   #设置node2为primary


[root@node2 ~]# cat /proc/drbd   #现在为Primary

 2016-04-12 10:29:41 0: cs:Connected ro:Primary/Secondary ds:Diskless/UpToDate C r-----
    ns:0 nr:664 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


[root@node2 ~]# mkdir /data

[root@node2 ~]# mount /dev/drbd0 /data/  #挂载到/data

[root@node2 ~]# cd /data/  

[root@node2 data]# ls  #还是能查看到node1创建的文件

lost+found  node1.anyisalin.com

[root@node2 data]# touch node2.anyisalin.com 


系统版本:centos6.4最小化

node1:192.168.31.111

node2:192.168.31.112

编译环境:yum -y groupinstall "Development tools" "Server Platform Development"

drbd版本:drbd-8.4.7-1.tar.gz、drbd-utils-8.9.5.tar.gz

前提条件:
1、节点node1、node2基于ssh互信
2、节点之间时间同步
3、节点名称与hostname(uname -n)一致,不要使用dns解析

详细看操作:

node1:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.112

node2:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.31.111


yum -y install rdate

rdate -s time-b.nist.gov

crontab -u root -e

*/2 * * * * /usr/bin/rdate -s time-b.nist.gov


vim /etc/hosts

192.168.31.111    node1
192.168.31.112    node2

hostname node1

vim /etc/sysconfig/network
HOSTNAME=node1

vim /etc/hosts

192.168.31.111    node1
192.168.31.112    node2

hostname node2

vim /etc/sysconfig/network
HOSTNAME=node2


准备操作搞定于是编译安装drbd:

为了避免编译过程遇到的错误,先安装下依赖包

yum -y install libxslt docbook-style-xsl

tar xf drbd-8.4.7-1.tar.gz
cd drbd-8.4.7-1
make && make install

cd /root
tar xf drbd-utils-8.9.5.tar.gz
cd drbd-utils-8.9.5
./configure --prefix=/usr/local/drbd --sysconfdir=/etc/
make && make install

modprobe drbd

lsmod |grep drbd


#########################################################

为我的系统加上一块5G的磁盘(node1和node2分别加上)

node1:
fdisk /dev/sdb
p,n,p,1,+3G,w
partx /dev/sdb

node2同理


配置drbd文件:

三个配置文件:

/etc/drbd.conf,

/etc/drbd.d/global_common.conf,

再就是自己创建的资源配置文件/etc/drbd.d/web.res


vi global_common.conf

global {
        usage-count yes;
        # minor-count dialog-refresh disable-ip-verification
        # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
}


common {
        handlers {
                # These are EXAMPLE handlers only.
                # They may have severe implications,
                # like hard resetting the node under certain circumstances.
                # Be careful when chosing your poison.


                 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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }


        options {
                # cpu-mask on-no-data-accessible
        }


        disk {
                # size on-io-error fencing disk-barrier disk-flushes
                # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
                on-io-error     detach;
        }


        net {
                # protocol timeout max-epoch-size max-buffers unplug-watermark
                # connect-int ping-int sndbuf-size rcvbuf-size ko-count
                # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
                # after-sb-1pri after-sb-2pri always-asbp rr-conflict
                # ping-timeout data-integrity-alg tcp-cork on-congestion
                # congestion-fill congestion-extents csums-alg verify-alg
                # use-rle
                cram-hmac-alg   "sha1";
                shared-secret   "mydrbdlab";
        }
}

资源配置文件:vi web.res

resource web {
        on node1 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.31.111:7789;
                meta-disk       internal;
        }
        on node2 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.31.112:7789;
                meta-disk       internal;
        }
}

将在node1上配置好的文件传送到node2上

scp /etc/drbd.d/global_common.conf /etc/drbd.d/web.res node2:/etc/drbd.d/


由于两个节点现在都是初建立drbd于是进行初始化:

在node1和node2上分别执行:

drbdadm create-md web(web为资源名称)


在node1和node2上分别执行:

启动drbd
service drbd start


查看drbd状态:
cat /proc/drbd
[root@node1 drbd.d]# 
[root@node1 drbd.d]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@node1, 2016-05-13 20:06:11
 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:f oos:3156604


可以看出两个节点目前都是secondary,于是将node1改变为primary,执行以下操作:

drbdsetup /dev/drbd0 primary -o(这个命令本人亲测在自己的系统出错)改用下面的命令替换这个

drbdadm -- --overwrite-data-of-peer primary web(web为资源名称)

watch -n 1 ‘cat /proc/drbd’:每一秒同步一次命令执行的结果

同步数据完成后再次查看cat /proc/drbd

[root@node1 drbd.d]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@node1, 2016-05-13 20:06:11
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:1692760 nr:0 dw:0 dr:1693424 al:0 bm:0 lo:0 pe:2 ua:0 ap:0 ep:1 wo:f oos:1464956
[=========>..........] sync'ed: 53.7% (1464956/3156604)K
finish: 0:00:56 speed: 25,864 (17,804) K/sec


[root@node1 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@node1, 2016-05-13 20:06:11
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:3272832 nr:0 dw:116228 dr:3157977 al:40 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
至此安装配置已经完成

接下来挂载刚刚的分区

mkdir /mnt/drbd

mke2fs -j /dev/drbd0

mount /dev/drbd0 /mnt/drbd

cd /mnt/drbd

[root@node1 drbd]# ls

lost+found
创建一个文件:dd if=/dev/zero of=/mnt/drbd/tmp.txt bs=10K count=20

[root@node1 drbd]# ls
lost+found  tmp.txt


注意:只有primary节点才能挂载

于是为了验证从节点是否同步到了数据,该主节点必须卸载,然后让刚刚的从节点挂载上去查看


操作如下:
umount /mnt/drbd
drbdadm secondary web
cat /proc/drbd


[root@node1 ~]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@node1, 2016-05-13 20:06:11
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:3273108 nr:0 dw:116504 dr:3158338 al:41 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


node2:

drbdadm primary web
[root@node2 mnt]# cat /proc/drbd

version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@node2, 2016-05-13 20:12:04
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:3273108 dw:3273108 dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


mkdir /mnt/drbd
mount /dev/drbd0 /mnt/drbd
[root@node2 ~]# cd /mnt/drbd/
[root@node2 drbd]# ls
lost+found  tmp.txt

可以清晰的查看到tmp.txt文件,至此同步数据完成 


DRBD简介

DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信 来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台 主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可 以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的 目的。

实验环境

测试节点2个分别为:
node1.3glong.com  172.16.8.156
node2.3glong.com  172.16.8.157

系统环境为rhel6.4  64位

准备工作
配置SSH双机互信

修改hosts互相解析 

关闭selinux

安装配置

[root@node1 ~]# tar xf drbd-9.0.1-1.tar.gz 
[root@node1 ~]# cd drbd-9.0.1-1
[root@node1 drbd-9.0.1-1]# ls

ChangeLog  COPYING  drbd  drbd-headers  drbd-kernel.spec  filelist-redhat  filelist-suse  Makefile  misc  README  README.drbd-utils  rpm-macro-fixes
[root@node1 drbd-9.0.1-1]# cd 
[root@node1 drbd-9.0.1-1]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/

[root@node1 drbd-9.0.1-1]# make install
[root@node2 drbd-9.0.1-1]# modprobe drbd        #加载drbd模块

[root@node1 ~]# tar xf drbd-utils-8.9.6.tar.gz 
[root@node1 ~]# cd drbd-utils-8.9.6
[root@node1 drbd-utils-8.9.6]# ./configure --prefix=/usr/local/drbd-utils-8.9.6 --without-83support
[root@node1 drbd-utils-8.9.6]# make
[root@node1 drbd-utils-8.9.6]# make install

[root@node1 drbd-utils-8.9.6]# cp /usr/local/drbd-utils-8.9.6/etc/rc.d/init.d/drbd /etc/rc.d/init.d/

[root@node1 drbd-utils-8.9.6]# chkconfig --add drbd

[root@node1 drbd-utils-8.9.6]# chkconfig drbd on
修改配置文件

[root@node1 ~]# cat /usr/local/drbd-utils-8.9.6/etc/drbd.d/r0.res 

resource r0{  
        on node1.3glong.com{  
                device          /dev/drbd1; #逻辑设备的路径  
                disk            /dev/sdb;  #物理设备  
                address         172.16.8.156:7788;  
                meta-disk       internal;  
        }  
        on node2.3glong.com{  
                device          /dev/drbd1;  
                disk            /dev/sdb;  
                address         172.16.8.157:7788;  
                meta-disk       internal;  
        }  
}  

[root@node1 ~]# cat /usr/local/drbd-utils-8.9.6/etc/drbd.d/global_common.conf 

# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit

global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
# cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
}

common {
handlers {
# These are EXAMPLE handlers only.
# They may have severe implications,
# like hard resetting the node under certain circumstances.
# Be careful when chosing your poison.

# 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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}

options {
# cpu-mask on-no-data-accessible
}

disk {
# size on-io-error fencing disk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
}

net {
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
protocol C;
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
}
}


格式化分区
mke2fs -t ext4 /dev/sdb

用dd写入点数据,不然可能会出错

dd if=/dev/zero of=/dev/sdb bs=1M count=1

-------------------------------以上步骤分别在两台机上操作---------------------------------

[root@node1 drbd-utils-8.9.6]# drbdadm create-md r0      #建立 drbd resource

[root@node1 drbd-utils-8.9.6]# drbdadm up r0

[root@node1 drbd-utils-8.9.6]# drbdadm primary --force r0  #设为主服务器

两个节点分别执行service drbd start
测试


[root@node1 drbd-utils-8.9.6]# mount /dev/drbd1 /mnt

[root@node1 drbd-utils-8.9.6]# cd /mnt
[root@node1 mnt]# ls
lost+found
[root@node1 mnt]# touch 123.txt


[root@node1 ~]# umount /dev/drbd1

[root@node1 ~]# drbdadm secondary r0


[root@node2 drbd-utils-8.9.6]# cd /mnt
[root@node2 mnt]# ls
123.txt  lost+found
[root@node2 mnt]# touch 111.txt
[root@node2 mnt]# cd

[root@node2 ~]# umount /dev/drbd1
[root@node2 ~]# drbdadm secondary r0     #降级为备用服务器

[root@node1 ~]# drbdadm primary r0     设为主服务器

[root@node1 ~]# mount /dev/drbd1 /mnt

[root@node1 ~]# ls /mnt

111.txt  123.txt  lost+found




本配置共有两个测试节点,

管理节点202.207.178.8

分别node1和node2,相的IP地址分别为202.207.178.6和202.207.178.7,,对node1和node2进行配置

(为避免影响,先关闭防火墙和SElinux)

1、准备工作:
1)节点名称必须跟uname -n命令的执行结果一致

node1:
# hostname node1
# vim /etc/sysconfig/network
HOSTNAME=node1

node2:
# hostname node2
# vim /etc/sysconfig/network
HOSTNAME=node2


2)节点之间必须通过ssh互信通信
[root@node1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@202.207.178.7
[root@node2 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@202.207.178.6


3)集群各节点之间时间必须同步
使用ntp服务器同步时间
ntpdate ip(配置了ntp服务的主机地址)


4)配置本地解析:

[root@node1 ~]# vim /etc/hosts
202.207.178.6 node1
202.207.178.7 node2
[root@node1 ~]# scp /etc/hosts node2:/etc/


5)配置管理节点(如不需要,可以不配置)

[root@fsy ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@fsy ~]# ssh-copy-id -i .ssh/id_rsa.pub root@202.207.178.6
[root@fsy ~]# ssh-copy-id -i .ssh/id_rsa.pub root@202.207.178.7
[root@fsy ~]# vim /etc/hosts
202.207.178.6 node1
202.207.178.7 node2

2、安装yum源及所需软件包

[root@node1 ~]# rpm -Uvh

[root@node2 ~]# rpm -Uvh

[root@node1 ~]# yum -y install drbd83-utils kmod-drbd83

[root@node2 ~]# yum -y install drbd83-utils kmod-drbd83

3、准备存储设备

在node1和node2上分别创建1个大小为1G 的分区作为存储设备,我这里是/dev/sdb1

4、编辑主配置文件

[root@node1 ~]# vim /etc/drbd.d/global_common.conf
启用: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";
}
添加:disk {
                # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
                # no-disk-drain no-md-flushes max-bio-bvecs
                on-io-error detach; (发生故障时拆除硬盘)
        }
 net {
                # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
                # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
                # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
                cram-hmac-alg "sha1"; (数据报文验证时使用的算法)
                shared-secret "fsyhaonobi"; (密码)
        }
syncer {
                # rate after al-extents use-rle cpu-mask verify-alg csums-alg
                rate 200M; (同步时使用的速率)


        }

5、定义资源

[root@node1 ~]# cd /etc/drbd.d/

[root@node1 drbd.d]# vim mydrbd.res

resource mydrbd {
        device /dev/drbd0;
        disk /dev/sdb1;
        meta-disk internal; #数据写在磁盘内部
        on node1 {
        address 202.207.178.6:7789;
        }
        on node2 {
        address 202.207.178.7:7789;
        }
}

6、使两个节点上配置文件一致

[root@node1 ~]# scp -r /etc/drbd.* node2:/etc


7、在两个节点上初始化已定义的资源并启动服务:


1)初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md mydrbd

2)启动服务,在Node1和Node2上分别执行:
#/etc/init.d/drbd start

3)查看启动状态:(也可以使用drbd-overview命令来查看:# drbd-overview )

# cat /proc/drbd

4)我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:

# drbdsetup /dev/drbd0 primary –o

也可以在要设置为Primary的节点上使用如下命令来设置主节点:

# drbdadm -- --overwrite-data-of-peer primary mydrbd

之后会发现两个节点变为一主一从

8、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化

# mkfs.ext4 /dev/drbd0
# mkdir /mydata 
# mount /dev/drbd0 /mydata/

9、切换Primary和Secondary节点(测试DRBD是否工作正常)

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



主节点上(node1):
[root@node1 ~]# cd /mydata/
[root@node1 mydata]# ls
lost+found
[root@node1 mydata]# cp /etc/inittab ./
[root@node1 mydata]# ls
inittab  lost+found

[root@node1 ~]# umount /mydata/
[root@node1 ~]# drbdadm secondary mydrbd
[root@node1 ~]# drbd-overview 

0:mydrbd  Connected Secondary/Secondary UpToDate/UpToDate C r-----

从节点(node2):
[root@node2 ~]# drbdadm primary mydrbd
[root@node2 ~]# drbd-overview

0:mydrbd  Connected Primary/Secondary UpToDate/UpToDate C r-----

[root@node2 ~]# mkdir /mydata

[root@node2 ~]# mount /dev/drbd0 /mydata/

[root@node2 ~]# cd /mydata/
[root@node2 mydata]# ls
inittab  lost+found
此时,一切正常!





DRBD的所有控制都是在/etc/drbd.conf中,通常情况配置文件包含两行内容:

include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";

/etc/drbd.d/global_common.conf通常包含drbd配置的通用部分。

/etc/drbd.d/下面的res文件通常定义了drbd的资源

最简单的配置文件:

cat /etc/drbd.d/global_common.conf

global {
  usage-count yes;
}
# global配置段在配置文件中只出现一次。

# 通常只指定usage-count,是否参加DRBD使用者统计。默认是yes。注1

common {
# common配置段不是必须的,但可以用来设定多个resource共有的选项,以减少重复性工作。
# common配置段中可以包含如下配置段:disk、net、startup、syncer和handlers。

    protocol C;
# 这里定义了protocol。一共有3种可选。注2
}

cat /etc/drbd.d/r0.res

resource r0 {
# 定义名字叫r0的资源
  on alice {

  # 每个主机的说明以“on”开头,后面是主机名“alice”。在后面的{}中为这个主机的配置

    device    /dev/drbd0;
    disk      /dev/sdb1;
    # /dev/drbd0使用的磁盘分区是/dev/sdb1
    address   192.168.10.10:7789;
    # 设置DRBD的监听端口,用于与另一台主机通信
    meta-disk internal;
    # 定义metadata的存储方式,有2种。注3
  }
  on bob {
  # 第二台主机bob。注4
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   192.168.10.20:7789;
    meta-disk internal;
  }
}

以上是最简单的一个配置文件,更复杂的参数可以根据需要逐一添加或修改。

以下是common配置段的一个实例:

common {
        protocol C;
        startup { wfc-timeout 0; degr-wfc-timeout 120; }
        # startup配置段用来更加精细地调节drbd属性,它作用于配置节点在启动或重启时。注5
        disk { on-io-error detach; }
        # disk配置段用来精细地调节drbd底层存储的属性。注6
        syncer { rate 100M; }
        # syncer配置段用来更加精细地调节服务的同步进程。注7
        net {}
        # net配置段用来精细地调节drbd的网络相关的属性。注8
}


注1
关于global配置段:

      如果所有配置段都在同一个drbd.conf文件中,则该配置必须放在最顶端。

常用选项:
       minor-count:从(设备)个数,取值范围1~255,默认值为32。该选项设定了允许定义的resource个数,当要定义的resource超过了此选项的设定时,需要重新载入drbd内核模块

       dialog-refresh time:time取值0,或任一正数。默认值为1。我没理解官方对该选项的解释。很少见到此选项被启用。

       disable-ip-verification:是否禁用ip检查

       usage-count:是否参加用户统计,合法参数为yes、no或ask。根据官方示例的说法,一般只配置usage-count选项即可。 


metadata有两种存储方式:internally和externally.存储方式是在每个resource配置段中指定的。

Internal metadata:
       一个resource被配置成使用internal metadata,意味着DRBD把它的metadata,和实际生产数据存储于相同的底层物理设备中。该存储方式是在设备的最后位置留出一个区域来存储metadata。

       优点:因为metadata是和实际生产数据紧密联系在一起的,如果发生了硬盘损坏,不需要管理员做额外的工作,因为metadata会随实际生产数据的丢失而丢失,同样会随着生产数据的恢复而恢复。

       缺点:如果底层设备只有一块物理硬盘(和RAID相反),这种存储方式对写操作的吞吐量有负面影响,因为应用程序的写操作请求会触发DRBD的metadata的更新。如果metadata存储于硬盘的同一块盘片上,那么,写操作会导致额外的两次磁头读写移动。

       要注意的是:如果你打算在已有数据的底层设备中使用internal metadata,需要计算并留出DRBD的metadata所占的空间大小,并采取一些特殊的操作,否则很有可能会破坏掉原有的数据!至于需要什么样的 特殊操作,可以参考DRBD的官方文档。我要说的是,最好不要这样做!

external metadata:
        该存储方式比较简单,就是把metadata存储于一个和生产数据分开的专门的设备块中。

        优点:对某些写操作,提供某些潜在的改进。
        缺点:因为metadata和生产数据是分开的,如果发生了硬盘损坏,在更换硬盘后,需要管理员进行人工干预,从其它存活的节点向刚替换的硬盘进行完全的数据同步。

        什么时候应该使用exteranl的存储方式:设备中已经存有数据,而该设备不支持扩展(如LVM),也不支持收缩(shrinking)。

注4
      在2个节点的配置相同的情况下,可以简化配置文件,如本例:


resource r0 {
      on alice {
             device    /dev/drbd0;
             disk      /dev/sdb1;
             address   192.168.10.10:7789;
             meta-disk internal;
     }
     on bob {
             device    /dev/drbd0;
             disk      /dev/sdb1;
             address   192.168.10.20:7789;
             meta-disk internal;
     }
}
可以简化为:
resource r0 {
       device    /dev/drbd0;
       disk      /dev/sdb1;
       meta-disk internal;
       on alice { address 192.168.10.10:7789; }
       on bob   { address 192.168.10.20:7789; }
}
       配置文件中的这个选项设置的速率是永久性的,但可使用下列命令临时地改变rate的值:

       drbdsetup /dev/drbdnum syncer -r 100M

       把上述命令中的num替换成你的drbd设备的从设备号。只能在所有节点的其中一个节点上运行此命令。

       如果想重新恢复成drbd.conf配置文件中设定的速率,执行如下命令:
 
              drbdadm adjust resource


官方提示:速率的设定,最好设为有效可用带宽的30%。所谓有效可用带宽,是指网络带宽和磁盘读写速度中的最小者。有两个示例:

       如果I/O子系统所能维持的读写速度为180MB/s,而千兆网络所能维持的网络吞吐速度为110MB/s,那么有效可用带宽为110MB/s,该选项的推荐值为110 x 0.3 = 33MB/s。

       如果I/O速度为80MB/s,而网络连接速度可达千兆,那么有效可用带宽为80MB/s,推荐的rate速率应该为80 x 0.3 = 24MB/s


  al- extents:该选项用来设定hot area(即active set)的块数,取值范围是7~3843,默认为127,每个块标志4M大小的底层存储(即底层设备)。DRBD会自动检测host area,如果主节点意外地从集群中断开,当该节点重新加入集群时,hot area所覆盖的区域必须被重新同步。hot area的每次变化,实际上都是对metadata区域的写操作,因此,该选项的值越大,重新同步的时间越长,但需要更新的meta-data也越少。

  而用户手册的另外一部分提到,al-extents调整的是Activity Log的大小。如果使用DRBD设备的应用程序的写操作比较密集,那么,一般建议使用较大的Activity Log(active set),否则metadata频繁的更新操作会影响到写操作的性能。建议值:3389。


  verify-alg:该选项指定一个用 于在线校验的算法,内核一般都会支持md5、sha1和crc32c校验算法。在线校验默认关闭,必须在此选项设定参数,以明确启用在线设备校验。 DRBD支持在线设备校验,它以一种高效的方式对不同节点的数据进行一致性校验。在线校验会影响CPU负载和使用,但影响比较轻微。drbd 8.2.5及以后版本支持此功能。
  一旦启用了该功能,你就可以使用下列命令进行一个在线校验: 
  drbdadm verify resource


该命令对指定的resource进行检验,如果检测到有数据块没有同步,它会标记这些块,并往内核日志中写入一条信息。这个过程不会影响正在使用该设备的程序。
如果检测到未同步的块,当检验结束后,你就可以如下命令重新同步它们:
drbdadm disconnect resource
drbdadm connetc resource


可以安排一个cron任务来自动执行在线校验,如:
42 0 * * 0 root /sbin/drbdadm verify resource


如果开启了所有资源的在线检验,可以使用如下命令:
42 0 * * 0 root /sbin/drbdadm verify all


  csums- alg:该选项指定一个校验算法,用来标志数据块。如果不启用该选项,resync会从source发送所有的数据块到destination;而如果启 用了此选项,那么resync将只交换那些校验值不同的数据块,当网络带宽有限时,此选项非常有用。而且,在重启一个崩溃的primary节点时,该选项 会降低CPU带宽的占用。


注8
net配置段的常用的选项有:
       sndbuf-size:该选项用来调节TCP send buffer的大小,drbd 8.2.7以前的版本,默认值为0,意味着自动调节大小;新版本的drbd的默认值为128KiB。高吞吐量的网络(例如专用的千兆网卡,或负载均衡中绑 定的连接)中,增加到512K比较合适,或者可以更高,但是最好不要超过2M。
       timeout:该选项设定一个时间值,单位为0.1秒。如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡,因此将断开这次TCP/IP连接。默认值为60,即6秒。该选项的值必须小于connect-int和ping-int的值。
       connect-int:如果无法立即连接上远程DRBD设备,系统将断续尝试连接。该选项设定的就是两次尝试间隔时间。单位为秒,默认值为10秒。
       ping-int:该选项设定一个时间值,单位为秒。如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活。默认值为10秒。
       ping-timeout:该选项设定一个时间值,单位是0.1秒。如果对等端没有在此时间内应答keep-alive包,它将被认为已经死亡。默认值是500ms。
       max-buffers:该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
       max-epoch-size:该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好。


       用户手册的另外一部分也提到了max-buffers和max-epoch-size,跟drbd.conf部分的解释稍有不同:drbd.conf的帮助 文档中说,max-buffers设定的是最大请求数,max-epoch-size设定的是最高的数据块数;而这部分的帮助文档说,这两个选项影响的是 secondary节点写操作的性能,max-buffers设定的是最大的buffers数,这些buffers是drbd系统是为即将写入磁盘的数据 而分配的;max-epoch-size设定的是两次write barrier之间所允许的最大请求数。
       多数情况下,这两个选项应该并行地设置,而且两个选项的值应该保持一致。两个选项的默认值都是2048,在大多数合理的高性能硬件RAID控制器中,把它们设定为8000比较好。
        两个部分的解释结合起来看,max-buffers设定的是最大的数据块数,max-epoch-size设定的是所能请求的最大块数。


ko- count:该选项设定一个值,把该选项设定的值 乘以 timeout设定的值,得到一个数字N,如果secondary节点没有在此时间内完成单次写请求,它将从集群中被移除(即,primary node进入StandAlong模式)。取值范围0~200,默认值为0,即禁用该功能。
allow-two-primaries:这个是drbd8.0及以后版本才支持的新特性,允许一个集群中有两个primary node。该模式需要特定文件系统的支撑,目前只有OCFS2和GFS可以,传统的ext3、ext4、xfs等都不行!
cram-hmac-alg:该选项可以用来指定HMAC算法来启用对等节点授权。drbd强烈建议启用对等节点授权机制。可以指定/proc/crypto文件中识别的任一算法。必须在此指定算法,以明确启用对等节点授权机制。
shared-secret:该选项用来设定在对待节点授权中使用的密码,最长64个字符。
data-integrity-alg:该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。


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