Rootop 服务器运维与web架构

centos6.5下drbd-8.4.1的编译安装与配置

Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。DRBD工作在内核当中的,类似于一种驱动模块。

DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。

系统版本:CentOS6.5_x64
内核版本:2.6.32-431.el6.x86_64

IP规划:
主节点 node1 192.168.0.175
备节点 node2 192.168.0.176

修改主机名:
主节点
[root@node1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1
[root@node1 ~]# hostname node1
备节点
[root@node2 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2
[root@node2 ~]# hostname node2

修改两台机器的host:
node1添加
192.168.0.175 node1
192.168.0.176 node2

node2添加
192.168.0.175 node1
192.168.0.176 node2

selinux关闭、iptables关闭

drbd官方网站:http://oss.linbit.com/drbd/

安装编译环境:
[root@node1 ~]# yum install -y gcc gcc-c++ kernel-headers flex
其中还需要一个包,就是内核源码包kernel-devel,这里不通过yum安装,因为yum list出来的版本为2.6.32-504.8.1.el6。
而我系统内核版本为2.6.32-431.el6.x86_64,如果安装了最新的kernel-devel,在执行make KDIR=的时候会报错。
所以选择通过iso镜像中的rpm包安装。提取kernel-devel-2.6.32-431.el6.x86_64.rpm传到服务器中,直接rpm -ivh安装。

下载drbd源码包:
[root@node1 ~]# wget -c http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz

解压编译:

[root@node1 drbd-8.4.1]# ./configure --prefix=/usr/local/drbd --with-km
[root@node1 drbd-8.4.1]# make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@node1 drbd-8.4.1]# make install
[root@node1 drbd-8.4.1]# mkdir -p /usr/local/drbd/var/run/drbd
[root@node1 drbd-8.4.1]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[root@node1 drbd-8.4.1]# chkconfig --add drbd
[root@node1 drbd-8.4.1]# chkconfig drbd on

安装内核模块:

[root@node1 drbd-8.4.1]# cd drbd
[root@node1 drbd]# make clean
[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
[root@node1 drbd]# depmod

drbd配置:
对两台机器添加新硬盘,这里为/dev/sdb,分区,fdisk /dev/sdb 根据提示操作创建新分区(/dev/sdb1)。

创建挂载点: mkdir /db

配置主配置文件drbd.conf:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.conf 确认为以下两行

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

配置global_common.conf:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.d/global_common.conf

common {
	net {

        protocol C;
		}
	}

主要在net段中添加同步协议 protocol C;

配置资源文件:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.d/r0.res

resource r0 {
  on node1 {
    device    /dev/drbd1;
    disk      /dev/sdb1;
    address   192.168.0.175:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd1;
    disk      /dev/sdb1;
    address   192.168.0.176:7789;
    meta-disk internal;
  }
}

创建资源r0:

node1和node2均执行
[root@node1 ~]# modprobe drbd    #载入模块
[root@node1 ~]# lsmod|grep drbd #确认载入
drbd 303444 3
libcrc32c 1246 1 drbd
[root@node1 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 #复制些数据,防止create-md时出错
[root@node1 ~]# drbdadm create-md r0 #创建drbd resource
[root@node1 ~]# drbdadm up r0               #启动创建的资源r0

以上编译安装配置操作过程均在node2中同样执行

配置完成后,查看主备资源状态:
主节点

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: 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:52427148

备节点

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: 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:52427148

node1和node2状态都是Secondary,现在需要设置一个Primary做为主节点。

把node1做为主节点,在node1上执行:
[root@node1 ~]# drbdadm primary  r0
再看下状态

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:484352 nr:0 dw:0 dr:485016 al:0 bm:28 lo:2 pe:9 ua:0 ap:0 ep:1 wo:b oos:51952012
	[>....................] sync'ed:  1.0% (50732/51196)M
	finish: 0:16:23 speed: 52,792 (52,792) K/sec

node2状态

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:1522688 dw:1520640 dr:0 al:0 bm:92 lo:3 pe:2 ua:2 ap:0 ep:1 wo:b oos:50906508
	[>....................] sync'ed:  3.0% (49712/51196)M
	finish: 0:11:06 speed: 76,312 (69,120) want: 100,160 K/sec

同步配置完成。

格式化挂载/dev/drbd1(只能在node1上执行):
[root@node1 ~]# mkfs.ext3 /dev/drbd1
[root@node1 ~]# mount /dev/drbd1 /db/
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 14G 1.3G 12G 10% /
tmpfs 489M 0 489M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
/dev/drbd1 50G 180M 47G 1% /db

现在在node1的/db下创建文件等操作都会同步到node2的/dev/sdb1中
在/db下创建个测试文件
[root@node1 db]# touch TestWriteFromPrimary

停掉node2的drbd看是否同步过去。因为在drbd启动的时候,备机是无法挂载的。会提示个unknown filesystem type ‘drbd’

[root@node2 ~]# drbdadm down r0
[root@node2 ~]# mount /dev/sdb1 /db
[root@node2 ~]# ll /db/
total 16
drwx——. 2 root root 16384 Mar 11 10:47 lost+found
-rw-r–r–. 1 root root 0 Mar 11 10:48 TestWriteFromPrimary
看到TestWriteFromPrimary已经同步。

测试手动切换主备:
比如把node1改为Secondary,node2改为Primary,首先停掉挂载。

[root@node1 ~]# umount /dev/drbd1      #卸载
[root@node1 ~]# drbdadm secondary r0 #更改角色

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:52829360 nr:0 dw:958132 dr:51872669 al:446 bm:3202 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

[root@node2 ~]# drbdadm primary r0

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:829720 dw:829720 dr:664 al:0 bm:54 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

node2挂载/dev/drbd1
[root@node2 ~]# mount /dev/drbd1 /db/
[root@node2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 14G 1.2G 12G 10% /
tmpfs 489M 0 489M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
/dev/drbd1 50G 180M 47G 1% /db
[root@node2 ~]# cd /db
[root@node2 db]# touch TestWriteFromNode2

去node1停掉drbd,挂载sdb1看是否同步过去。
[root@node1 ~]# drbdadm down r0
[root@node1 ~]# mount /dev/sdb1 /db
[root@node1 ~]# ll /db
total 16
drwx——. 2 root root 16384 Mar 11 10:47 lost+found
-rw-r–r–. 1 root root 0 Mar 11 10:59 TestWriteFromNode2
-rw-r–r–. 1 root root 0 Mar 11 10:48 TestWriteFromPrimary
文件已同步。

关于drbdadm更多的参数可在命令行下直接执行 drbdadm 即可看到。

关于drbd的数据同步协议
drbd有三种数据同步模式:同步,异步,半同步
异步 :指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成
半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入
同步 :指的是主节点已写入,从节点磁盘也写入
drbd的复制模型是靠protocol关键字来定义的:protocol A表示异步;protocol B表示半同步;protocol C表示同步,默认为protocol C。
在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。
注意:drbd的主不会监控从的状态所以有可能会造成数据重传

 

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/3295.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。