Home » ops » DRBD配置
DRBD配置

这段时间正在考虑如何激励大家去做code review的事情,我想到的是在gitlab上做二次开发,加入打分的功能。

首先master分支作为线上分支,任何想要上线的feature都要提merge request。每一个merge request要想被接受,必须得到至少5分。 一般开发者最多只能打2分,master身份的人可以打5分,所有人如果觉得代码写得不太好,可以打负分。希望通过这个打分机制,让大家都能去review别人的代码。

开发完了之后问了问公司的gitlab的HA方案,得到的结果比较让人吃惊,于是我们决定研究一下如何做gitlab的高可用。

简单的来说,gitlab这个项目分为ruby on rails和git2个部分,rails那边主要就是web端展示和一些网页上的操作,git端就是git的各种操作。 rails在这部分和git这部分的通讯走的是用sidekiq(redis)作的消息队列,数据库用的postgres。gitlab官方推荐了一些HA的方案,我们选择的是它推荐的双机HA方案。

这个方案就是用DRBD这个中间件做了磁盘的网络备份。它允许用户在远程机器上建立一个本地块设备的实时镜像。它在linux内核2.6.33版本以及以上都是内置的一个模块。 它的同步策略有3种,我们采用的Protocol C,也就是备机同步完成才算写操作完成,这也是官方推荐的配置。

服务器配置

依赖安装

运行下面命令,安装编译所需依赖:

yum install gcc libxslt kernel-headers kernel-devel-`uname -r` make wget rpm-build flex

下载安装源码包

在指定路径下如 /opt/resource 下运行:

wget http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz && tar xzvf drbd-8.4.0.tar.gz
cd drbd-8.4.0
./configure --prefix=/opt/drbd --localstatedir=/var --sysconfdir=/etc --with-km
make && make install
cp /opt/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
chkconfig --add drbd
chkconfig drbd on

编译模块

cd drbd
make clean all
make KDIR=/lib/modules/`uname -r`
cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
depmod

准备分区

运行 fdisk -l 得到机器的硬盘信息,比如有一块没有分区的盘/dev/xvdb。现在就对这块盘分区作为同步的磁盘。

运行 fdisk /dev/xvdb ,输入m会得到帮助信息,这里我们需要新建分区,所以需要选择n。 接着选择是主分区还是拓展分区,这里选主分区,也就是p。 然后选择分区号,由于这是块裸盘,所以选1. 紧接着选择开始和结束的柱面,我们只分一个区,所以都用默认值就好了。 最后输入w,完成分区。

运行 partx /dev/xvdb ,让内核重新读取分区,这个时候再运行 fdisk -l 或者 cat /proc/partitions 就能看到刚分的区了。

这个步骤需要在2个机器上都去执行。

DRBD配置

打开/opt/drbd/etc/drbd.d/global_common.conf文件,确保在global中usage-count yes配置,以及common中的net里面有protocal C。

然后在/opt/drbd/etc/drbd.d/中创建一个r0.res的文件,输入如下信息:

resource r0 {
  on host_84_109 {
    device    /dev/drbd1;
    disk      /dev/xvdb1;
    address   10.31.84.109:7789;
    meta-disk internal;
  }
  on host_84_206 {
    device    /dev/drbd1;
    disk      /dev/xvdb1;
    address   10.31.84.206:7789;
    meta-disk internal;
  }
}

要注意主机名和服务器的主机名一致。

建立资源

首先载入drbd模块

modprobe drbd

确认drbd模块载入

lsmod | grep drbd

清空分区数据,如果下面配文件系统失败,很有可能是这里需要清一下

dd if=/dev/zero of=/dev/sda3 bs=1M count=100

建立资源r0

drbdadm create-md r0

启动drbd服务

在2台机器上运行下面命令启动服务:

service drbd start

可以通过 /opt/drbd/sbin/drbd-overview 命令查看集群状态。

在一台上运行 drbdadm -- --overwrite-data-of-peer primary r0 来进行初始化的同步。

创建文件系统比挂载

运行:mkfs.ext4 /dev/drbd1 创建文件系统,然后选择要挂载到的地址: mount /dev/drbd1 /opt/gitlab

切换角色

可以通过命令 drbdadm secondary r0drbdadm primary r0 来做角色的切换,要确保没有2个角色同时为主。

测试

在当前的主节点上挂载点上创建一些文件,如 touch test.txt,然后要确保切换角色之前要讲主节点的资源不在被使用。 运行 umount /opt/gitlab .

通过命令将主节点降为此节点 drbdadm secondary r0 .

在次节点上运行命令升为主节点 drbdadm primary r0 , 在次节点上挂载资源 mount /dev/drbd1 /opt/gitlab ,此时cd进去就能看到在另一台机器创建的文件了。