通过DRBD实现文件数据的主从同步和主从节点切换

通过DRBD实现文件数据的主从同步和主从节点切换

步骤目录:
步骤一:环境准备
1.1 准备两台主机,一台做主节点,一台做从节点
1.2 两台主机的系统环境为centos7或者centos6(最好是centos7)
1.3 主节点主机改名为node1,从节点命名为node2
1.4 两台主机能够相互ping通(站主的node1 ip地址为:192.168.1.221,node2 ip地址为:192.168.1.222)
1.5 两台主机能够通过主机名ping通自己和对方(通过修改配置文件/etc/hosts实现)、
1.6 两台主机要能够无密钥ssh远程对方,包括远程ip地址和主机名(可以使用ssh-keygen和ssh-copy-id命令实现)
1.7 两台主机要保证时间同步
1.8 两台主机都要配置好centos系统镜像的默认yum源
1.9 两台主机都要新加一块同样大小的硬盘

步骤二:安装drbd文件系统主从同步软件(同时在node1和node2上操作)
2.1 drbd的安装方式选择
2.1.1 使用drbd官方提供的网络yum安装(站主本次选用的方法)
2.1.2 使用drbd官方源码安装(不推荐)
2.1.3 使用drbd的rpm包安装
2.2 使用drbd官方的网络yum源安装drbd(要保证两台服务器能连外网)
2.2.1 CentOS 6.x的安装方式如下
2.2.2 CentOS 7.x的安装方式如下

步骤三:配置drbd的配置文件
3.1 修改/etc/drbd.conf配置文件
3.2 修改/etc/drbd.d/global_common.conf配置文件
3.3 创建/etc/drbd.d/nfsdrbd.res配置文件
3.4 将在node1上配置好的/etc/drbd.conf、/etc/drbd.d/global_common.conf和/etc/drbd.d/nfsdrbd.res配置文件拷贝到node2上面

步骤四:启动drbd服务并创建drbd设备
4.1 启用drbd服务
4.2 创建并查看drbd服务新生成的硬盘
4.2.1 在生成drbd硬盘之前是有没有drbd硬盘的
4.2.2 创建drbd硬盘
4.2.3 创建drbd硬盘后就能看到对应的drbd硬盘了

步骤五:使用drbd服务
5.1 查看以下就会发现,默认drbd的所有节点都是从节点,需要设置之后才能进行主从同步
5.2 设置drbd主节点
5.3 拥有主节点之后就可以在主节点上格式化并挂载(格式化只是在磁盘上写入信息,所以也是可以同步过去的)
5.3.1 格式化drbd文件系统
5.3.2 挂载drbd文件系统
5.3.3 此时就可以在drbd文件系统里写入数据了

步骤六:drbd主节点和从节点的角色切换
6.1 取消主节点上的drbd文件挂载
6.2 取消主机节点上主节点角色
6.3 将过去的从节点任命为主节点
6.4 过去的从节点,如今的主节点挂载drdb文件
6.5 过去的从节点,如今的主节点现在可以查看到在上一个主节点创建的文件数据了
6.6 此时在查看drbd的主从关系发现已经切换好了

具体的操作步骤:
步骤一:环境准备
1.1 准备两台主机,一台做主节点,一台做从节点
1.2 两台主机的系统环境为centos7或者centos6(最好是centos7)
1.3 主节点主机改名为node1,从节点命名为node2
1.4 两台主机能够相互ping通(站主的node1 ip地址为:192.168.1.221,node2 ip地址为:192.168.1.222)
1.5 两台主机能够通过主机名ping通自己和对方(通过修改配置文件/etc/hosts实现)、
1.6 两台主机要能够无密钥ssh远程对方,包括远程ip地址和主机名(可以使用ssh-keygen和ssh-copy-id命令实现)
1.7 两台主机要保证时间同步
1.8 两台主机都要配置好centos系统镜像的默认yum源
1.9 两台主机都要新加一块同样大小的硬盘
(站主在node1和node2新加的硬盘都叫vdb,大家添加完成了之后使用以下命令确认一下:
[root@node1 ~]# fdisk -l | grep /dev/sdb
磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
[root@node2 ~]# fdisk -l | grep /dev/sdb
磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
)

步骤二:安装drbd文件系统主从同步软件(同时在node1和node2上操作)
2.1 drbd的安装方式选择
(drbd在默认yum源里是没有安装包的,要安装drbd可以选择以下几种方式)
2.1.1 使用drbd官方提供的网络yum安装(站主本次选用的方法)
2.1.2 使用drbd官方源码安装(不推荐)
2.1.3 使用drbd的rpm包安装

2.2 使用drbd官方的网络yum源安装drbd(要保证两台服务器能连外网)
2.2.1 CentOS 6.x的安装方式如下
(在node1和node2上都要操作)
[root@node1 ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[root@node1 ~]# yum -y install drbd83-utils kmod-drbd83

[root@node2 ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[root@node2 ~]# yum -y install drbd83-utils kmod-drbd83

2.2.2 CentOS 7.x的安装方式如下
(在node1和node2上都要操作)
[root@node1 ~]# rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@node1 ~]# yum install -y drbd84-utils kmod-drbd84

[root@node2 ~]# rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@node2 ~]# yum install -y drbd84-utils kmod-drbd84

步骤三:配置drbd的配置文件
3.1 修改/etc/drbd.conf配置文件
(只在node1上面操作)
[root@node1 ~]# vim /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

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

3.2 修改/etc/drbd.d/global_common.conf配置文件
(只在node1上面操作)
[root@node1 ~]# vim /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 http://www.linbit.com

global {
    usage-count no;                #让不让linbit公司收集目前drbd的使用情况,这个在默认的情况下是yes,也就是开启的,写no就是关闭
}
common {                            #common的作用是如果DRBD没有额外定义属性那么就使用common里的属性;
    protocol C;                     #使用 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";    #在本地磁盘发生io错误以后,所做的操作。通告i/o错误,通告我要关机了,强制关机
    }
    startup {
    }
    options {
    }
    disk {
        on-io-error detach;         #设置同步IO错误的策略,drbd发生i/o错误以后,所做的动作,detach让资源离线。
    }
    net {
    }
    syncer {
                rate 1000M;    #定义同步速率,这个很容易就把整个网络占满,所以在第一次同步完成后,可以改小点。
        }

}

(补充:这里on-io-error 策略可以为以下选项之一: 
detach      :分离,这是默认和推荐的选项,如果在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下 
pass_on     :DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,但是在此节点上就往往忽略(因此此节点上没有可以报告的上层) 
-local-in-error:调用本地磁盘I/O处理程序定义的命令;这需要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误 )

3.3 创建/etc/drbd.d/nfsdrbd.res配置文件
(只在node1上面操作)
[root@nfs-0001 /]# vim /etc/drbd.d/nfsdrbd.res
resource data {                       #设置本次文件数据主从同步的资源名为"data"
  on nfs-0001 {                       #设置第一个节点,注意on后面的主机名要与第一个节点输入`# uname -n` 命令之后显示的结果一致,否则会报错
    device    /dev/drbd0;             #设置drbd的标示名,在双方的节点上要一样,drdb启动后这将变成DRBD设备的设备文件,名字为/dev/drbd0
    disk      /dev/vdb1;              #设置为drdb0硬盘提供存储的硬件设备
    address   192.168.1.221:7789;    #设置此节点的ip和端口号
    meta-disk internal;               #网络通信属性,指定drbd的元数据在本机
  }
  on nfs-0002 {              #设置第二个节点,注意on后面的主机名要与第二个节点输入`# uname -n` 命令之后显示的结果一致,否则会报错
    device    /dev/drbd0;        #设置drbd的标示名,在双方的节点上要一样,drdb启动后这将变成DRBD设备的设备文件,名字为/dev/drbd0
    disk      /dev/vdb1;         #设置为drdb0硬盘提供存储的硬件设备
    address   192.168.1.222:7789;   #设置此节点的ip和端口号
    meta-disk internal;         #网络通信属性,指定drbd的元数据在本机
  }
}

(注意:
两个节点的存储设备大小最好一样。如果主节点的存储比从节点的存储大,不知道会发生什么
一开始未同步之前,磁盘是不用格式化的。要知道DRBD是块级别的同步,是在文件系统下面的。格式化也不过是在磁盘上写有关文件系统的信息。

上面的meta-disk有两种存储方式:internal和external。
(1)internal表示DRBD的元数据信息与普通数据存在同一个底层存储上,存在存储设备的最后的位置。优点:容易管理,要坏一起坏,要好一起好。缺点磁盘开销大,而且如果磁盘原来有很多数据,建立DRBD的时候元数据可能会把原来的数据覆盖掉。(不管是哪种方式,都最好不要玩有数据的磁盘)。
(2)external,是把元数据存在另一块磁盘上。优点性能好,缺点:如果元数据坏了,还要恢复元数据,如果数据坏了,还要修改元数据。
)

3.4 将在node1上配置好的/etc/drbd.conf、/etc/drbd.d/global_common.conf和/etc/drbd.d/nfsdrbd.res配置文件拷贝到node2上面
(只在node1上面操作)
[root@node1 /]# scp -r /etc/drbd.d/* node2:/etc/drbd.d/

步骤四:启动drbd服务并创建drbd设备
4.1 启用drbd服务
(在node1和node2上都要操作)
[root@node1 /]# service drbd start
[root@node2 /]# service drbd start

4.2 创建并查看drbd服务新生成的硬盘
4.2.1 在生成drbd硬盘之前是有没有drbd硬盘的
(在node1和node2上都要操作)
[root@node1 /]# ls /dev/drbd0
[root@node2 /]# ls /dev/drbd0
(发现两台主机都还没有生成drbd0硬盘)
(注意:这里的drbd0是刚刚在/etc/drbd.d/nfsdrbd.res配置文件里,在device后面设置的drbd设备名称)

4.2.2 创建drbd硬盘
(在node1和node2上都要操作)
[root@node1 /]# drbdadm create-md data
......
New drbd meta data block successfully created.    #创建成功
[root@node2 /]# drbdadm create-md data
......
New drbd meta data block successfully created.    #创建成功
(注意:这里的data是刚刚在/etc/drbd.d/nfsdrbd.res配置文件里,在resource后面设置的资源名)

4.2.3 创建drbd硬盘后就能看到对应的drbd硬盘了
(在node1和node2上都要操作)
[root@node1 /]# ls /dev/drbd0
/dev/drbd0
[root@node2 /]# ls /dev/drbd0
/dev/drbd0
(注意:这里的drbd0是刚刚在/etc/drbd.d/nfsdrbd.res配置文件里,在device后面设置的drbd设备名称)

步骤五:使用drbd服务
5.1 查看以下就会发现,默认drbd的所有节点都是从节点,需要设置之后才能进行主从同步
(在node1和node2上都要操作)
[root@node1 /]# cat /proc/drbd
cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:8 nr:0 dw:8 dr:3185 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 /]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:8 dw:8 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

(此时drbd主从同步正处于Secondary/Secondary状态,没有主库,所以无法同步)

5.2 设置drbd主节点
(只在node1上面操作)
[root@node1 /]# drbdadm primary --force data  #强制为主节点
[root@node1 /]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:8 nr:0 dw:8 dr:5289 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
(生成后就可以发现node1现在是主节点模式:Primary/Secondary)

(只在node2上面操作)
[root@node2 /]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:8 dw:8 dr:2104 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
(而此时的node就是从节点模式了:Secondary/Primary)

5.3 拥有主节点之后就可以在主节点上格式化并挂载(格式化只是在磁盘上写入信息,所以也是可以同步过去的)
5.3.1 格式化drbd文件系统
(只在node1上面操作)
[root@node1 /]# mke2fs -t ext4 /dev/drbd0

5.3.2 挂载drbd文件系统
(只在node1上面操作)
[root@node1 /]# mkdir /content/
[root@node1 /]# mount /dev/drbd0 /content/

5.3.3 此时就可以在drbd文件系统里写入数据了
(注意:drbd同步做好了之后,在node1的/content写入的数据会被同步到node2中,但是drbd同一时间只有能有一个主节点,所以必须要切换了主从之后,node2才能看到自己从node1同步的数据)

步骤六:drbd主节点和从节点的角色切换
6.1 取消主节点上的drbd文件挂载
(只在node1上面操作)
[root@node1 /]# umount /content/
(在刚刚的步骤里,我们的drbd文件系统是挂载在/content/目录下的)

6.2 取消主机节点上主节点角色
(只在node1上面操作)
[root@node1 /]# drbdadm secondary data
(注意:这里的data是刚刚在/etc/drbd.d/nfsdrbd.res配置文件里,在resource后面设置的资源名)

6.3 将过去的从节点任命为主节点
(只在node2上面操作)
[root@node2 /]# drbdadm primary data
(注意:这里的data是刚刚在/etc/drbd.d/nfsdrbd.res配置文件里,在resource后面设置的资源名)

6.4 过去的从节点,如今的主节点挂载drdb文件
(只在node2上面操作)
[root@node2 /]# mkdir /content/ 
[root@node2 /]# mount /dev/drbd0 /content/

6.5 过去的从节点,如今的主节点现在可以查看到在上一个主节点创建的文件数据了
(只在node2上面操作)
[root@node2 /]# ls /content/

6.6 此时在查看drbd的主从关系发现已经切换好了
(在node1和node2上都要操作)
[root@node1 /]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:8 nr:0 dw:8 dr:5289 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 /]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:8 dw:8 dr:4208 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
(这时就会看到node1的状态是Secondary/Primary,node2的状态是Primary/Secondary)