• 为什么写博客,是因为遇到的坑,不希望别人在踩一遍!
  • 选择了,剩下的就是坚持和努力-------致自己!
  • 当能力达不到梦想时,更需要学习,努力,拼搏

Drbd 服务

Linux运维 雪豹 6年前 (2018-02-09) 581次浏览 0个评论

images

第1章 基本介绍

drbd(distrbuted replicated block device):分布式复制块设备

类似 rsync + inotify 的架构:inotify基于文件系统上层,当文件系统中有数据发生变化,就调用rsync服务,将文件系统中的文件同步到备库。

1.1 涉及对象

drbd 中的块设备可以是磁盘分区,lvm逻辑卷,或整块磁盘等。

1.2 原理

drbd软件工作位置是在文件系统层级以下,比文件系统更加靠近操作系统内核及IO栈。

基于网络的raid-1,当我们将数据写入本地磁盘系统时,数据还会被实时发送到网络中另一台主机中,以相同的形式记录在另一个磁盘系统中,使得本地(主节点)与远程主机(备节点)的数据保持实时数据同步。

如果本地系统出现故障,那么远程主机上还会保留有一份和主节点相同的数据备份可以继续使用。不会数据不会丢失。还会提升访问数据的用户访问体验(直接接管提供服务,降低宕机修复时间)。drbd服务的作用类似于磁盘阵形里的raid1功能,就相当于把网络中的两台服务器做成了类似磁盘阵列里的raid1一样。
Drbd工作原理图:

images

1.SERVICE 将数据写入==> FILE SYSTEM ==> BUFFER CACHE ==> DRBD

2.DRBD分两条路走,一条是通过磁盘驱动DISK DRIVER写入到磁盘

3.另一条通过tcp/ip协议,将数据通过网卡将数据发送到备节点…

1.1 两种工作模式

1)实时同步模式:

当数据写到本地磁盘和远端服务器磁盘都成功后才会返回成功写入。DRBD服务协议C级别就是这种模式,可以防止本地和远端数据丢失和不一致,此种模式是生产环境中最常用的模式。

2)异步同步模式:

当数据写入到本地服务器成功后就返回成功写入,不管远端服务器是否写入成功。

还可能是数据写入到本地服务器或远端服的buffer成功后,返回成功,就是DRBD服务协议的A,B级别

提示:在nfs网络文件系统的时候也有类似的参数和功能。例如:nfs服务参数sync和async,mount挂载参数也有sync和async。

1.2 DRBD3种同步复制协议

协议A:异步复制协议。本地写成功后立即返回,数据放在发送BUFFER中,可能丢失。

协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失(mysql5.5以上支持)。

协议C:同步复制协议。本地和对方服务器磁盘都写成功确认后返回成功。如果单机掉电后单机磁盘损坏,数据都不会丢失。

工作中一般用协议C。选择协议将影响流量,从而影响网络延时。

1.3 DRBD的生产应用模式

单主模式及主备模式,为典型的高可用性集群方案。

复主模式:需要采用共享cluster文件系统,如gfs和ocfs2。用于需要从2个节点并发访问数据的场合,需要特别配置。

1.4 DRBD的企业应用场景

生产场景中会有很多基于高可用服务器对drbd的数据同步解决方案。

例如:heartbeat+drbd+nfs/mfs/gfs,heartbeat+drbd+mysql/oracle等。实际上drbd可以配合任意需要数据同步的所有服务的应用场景。

1.5 相关数据同步工具介绍

1) Rsync(配合实时同步工具sersync,inotify,lsyncd)

2) Scp (也可以配合 实时同步工具sersync,inotify,lsyncd)

3) Nc

4) Nfs

5) Union双机同步

6) Csync2多机同步

7) 软件自身同步机制(mysql,oracle,mongdb,ttserver,redis…)

提示:文件放到数据库,同步到从库,再把文件拿出来。

8) Drbd

补充:

Oracle dg分为基于物理block和逻辑block

逻辑:基于sql,类似mysql

物理:基于block块

从8i到10G都是这样的方式,特点是备节点不能提供服务,只能让备节点断开同步,以readony的方式打开,提价查询服务。

从11G开始,oracle就像mysql一样,主库可以写,从库可以读,11G为什么可以实现,是因为主要还是基于服务层来同步的。

而drbd因为是基于block块的,太底层了,主节点可以提供读写服务,而备节点的磁盘分区是处于非可见状态的。

第2章 Drdb 部署结构图

Drbd 主备模式

images

Drdb 主主 模式

images

images

images

IP规划
提示:第二块网卡不要配置网关
检查环境两台的hosts
[root@linux-node1 html]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.80 linux-node1
172.16.1.81 linux-node2
查看
[root@linux-node2 html]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.80 linux-node1
172.16.1.81 linux-node2

因此我们创建了两个分区

images

[root@linux-node1 ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0001c2db
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         131     1048576   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             131         391     2088960   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             391        2611    17832960   83  Linux
Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@linux-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 0xea60a6df.
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-512, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-512, default 512): 
Using default value 512

Command (m for help): ^C
[root@linux-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 0xf6d2e886.
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-512, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-512, default 512): +384M

Command (m for help): p     

Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf6d2e886

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         385      394224   83  Linux

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
1
Invalid partition number for type `1'
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2  
First cylinder (386-512, default 386): 
Using default value 386
Last cylinder, +cylinders or +size{K,M,G} (386-512, default 512): 
Using default value 512

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@linux-node1 ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0001c2db

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         131     1048576   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             131         391     2088960   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             391        2611    17832960   83  Linux

Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf6d2e886

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         385      394224   83  Linux
/dev/sdb2             386         512      130048   83  Linux
[root@linux-node1 ~]# partprobe
[root@linux-node1 ~]# mkfs -t ext4 -c /dev/sdb1
[root@linux-node1 ~]# mount /dev/sdb2 /mnt
提示:如果硬盘大于2T 不能使用fdisk 可以使用parted

第1章 Drdb 安装

有两种安装方法,编译和包含Drdb的

有两种安装方法,编译和包含Drdb的
# 上传drbd-8.4.4.tar.gz的安装包
[root@linux-node1 tools]# ls
drbd-8.4.4.tar.gz  epel-release-6-8.noarch.rpm
# 解压进入目录
[root@linux-node1 tools]# tar xf drbd-8.4.4.tar.gz 
[root@linux-node1 tools]# cd drbd-8.4.4
# 编译安装
[root@linux-node1 drbd-8.4.4]# ./configure --prefix=/application/drbd8.4.4 --with-km --with-heartbeat --sysconfdir=/etc/
# 指定内核源码路径,先查询 ,如果没有kernels 安装yum -y install kernel-devel kernel-headers flex gcc
[root@linux-node1 drbd-8.4.4]# ls -ld /usr/src/kernels/$(uname -r)
drwxr-xr-x. 22 root root 4096 5月  21 01:34 /usr/src/kernels/2.6.32-573.el6.x86_64
# 执行命令
[root@linux-node1 drbd-8.4.4]# make KDIR=/usr/src/kernels/$(uname -r)/
# 提示successful 就为正确

images

# 执行make && make install
[root@linux-node1 drbd-8.4.4]# make && make install
# 创建软连接 并检查
[root@linux-node1 application]# ln -s /application/drbd8.4.4/ /application/drbd
[root@linux-node1 application]# ls -l /application/
总用量 4
lrwxrwxrwx 1 root root   23 10月 16 01:44 drbd -> /application/drbd8.4.4/
drwxr-xr-x 6 root root 4096 10月 15 23:30 drbd8.4.4

第1章 pDrdb的相关配置

提示:DRBD 比较关键的DRBD 逻辑设备。DRBD是工作在内核中的
检查drbd 是否被正确加载到内核
[root@linux-node1 dev]# modprobe drbd
[root@linux-node1 dev]# lsmod |grep drbd
drbd                  322182  0 
libcrc32c               1246  1 drbd
[root@linux-node1 dev]# echo "modprobe drbd" >>/etc/rc.local 
[root@linux-node1 dev]#

global {
        usage-count     no;  
}
common {
  syncer {
        rate            1000M;
        verify-alg      crc32c;  
  }
}
 
# primary for drbd1 
resource data{
  protocol C; 
  disk {
        on-io-error     detach;
  } 
# server 1
  on linux-node1 {
        device          /dev/drbd0;  
        disk            /dev/sdb1;
        address         172.16.1.80:7788;  #IP 地址
        meta-disk       /dev/sdb2[0];  
  }
#server 2
  on linux-node2 {
        device          /dev/drbd0;
        disk            /dev/sdb1;
        address         172.16.1.81:7788;
        meta-disk       /dev/sdb2[0];
  } 
}
 没有中文版本
global {
        usage-count     no; 
}
common {
  syncer {
        rate            1000M;
        verify-alg      crc32c; 
  }
}
 
resource data{
  protocol C; 
  disk {
        on-io-error     detach;
  } 
  on linux-node1 {
        device          /dev/drbd0;
        disk            /dev/sdb1;
        address         172.16.1.80:7788; 
        meta-disk       /dev/sdb2[0];  
  }

  on linux-node2 {
        device          /dev/drbd0;
        disk            /dev/sdb1;
        address         172.16.1.81:7788;
        meta-disk       /dev/sdb2[0];
  } 
}

第1章 drbd初始化数据

6.1 linux-node1 初始化
[root@linux-node1 etc]# drbdadm --help
初始化 data
[root@linux-node1 etc]# drbdadm create-md data
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
提示:其中初始化 data 是/etc/drbd.conf 配置的文件

images

6.2 linux-node2 初始化

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

6.3 启动DRBD

6.3.1 linux-node1 启动drdb
[root@linux-node1 ~]#  mkdir -p /application/drbd8.4.4/var/run/drbd
[root@linux-node1 ~]# drbdadm up data
[root@linux-node1 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07
 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:262128
提示:Secondary/Secondary 表示正确

6.3.2 linux-node2 启动drdb

[root@linux-node1 ~]#  mkdir -p /application/drbd8.4.4/var/run/drbd
[root@linux-node1 ~]# drbdadm up data
[root@linux-node1 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07
 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:262128

第7章 启动drbd 并配置主从同步数据

提示:
1、 如果为空硬盘,可以随意执行操作不需要考虑数据。
2、 如果两边数据不一样(要特别注意同步数据的方向,否则可能会丢失数据)
[root@linux-node1 ~]# drbdadm — –overwrite-data-of-peer primary data
# 这条命令将linux-node1 服务器/dev/sdb1 的资源同步到linux-node2 /dev/sdb1 分区中。

7.1.1 查看linux-node1

# 在哪执行drbdadm 哪台就是主,执行后 查看/proc/drbd 显示进度条 
[root@linux-node1 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:39364 nr:0 dw:0 dr:42228 al:0 bm:2 lo:0 pe:2 ua:3 ap:0 ep:1 wo:f oos:224240
	[==>.................] sync'ed: 15.7% (224240/262128)K
   #进度条
	finish: 0:00:11 speed: 18,944 (18,944) K/sec
# 执行结束后 查看cat /proc/drbd
[root@linux-node1 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node1, 2017-10-15 23:30:07
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
# 提示 Connected 连接 ro: Primary主/Secondary 次 ds: UpToDate/UpToDate 已同步数据
    ns:262128 nr:0 dw:0 dr:262792 al:0 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
发现 

7.1.2 查看linux-node2

[root@linux-node2 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node2, 2017-10-16 06:32:06
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
# 提示 Connected 连接 ro: Secondary 次/ Primary 主 ds: UpToDate/UpToDate 已同步数据
    ns:0 nr:262128 dw:262128 dr:0 al:0 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

7.2 如果遇到问题:

1、 检查两台drdb服务器物理网卡,或者IP。
2、 检查防火墙
3、 是否是drbd脑裂导致

第8章 挂载测试数据库同步案例

# 查看是否有data 目录
[root@linux-node1 ~]# ll /data
ls: 无法访问/data: 没有那个文件或目录
# 没有创建
[root@linux-node1 ~]# mkdir /data
8.1 挂载/data

[root@linux-node1 ~]# mount /dev/drbd0 /data/
# 提示:drdb 不是通过直接挂载,而是通过/dev/drbd0 
# 查看
 [root@linux-node1 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        17G  4.7G   12G  30% /
tmpfs           491M   16K  491M   1% /dev/shm
/dev/sda1       976M   40M  886M   5% /boot
/dev/drbd0      244M  2.1M  230M   1% /data
8.2 测试 在Linux-node1 创建20个目录
[root@linux-node1 ~]# cd /data/
[root@linux-node1 data]# ls
lost+found
 [root@linux-node1 data]# touch `seq 20`
[root@linux-node1 data]# ls
1	10  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  7  8  9  lost+found
8.3 测试 在Linux-node2 查看数据
# 提示 如果在Linux-node2 是无法挂载
[root@linux-node2 ~]# drbdadm down data
[root@linux-node2 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@linux-node2, 2017-10-16 06:32:06
[root@linux-node2 ~]# ll /data
ls: 无法访问/data: 没有那个文件或目录
[root@linux-node2 ~]# mkdir /data
[root@linux-node2 ~]# mount /dev/sdb
sdb   sdb1  sdb2  
[root@linux-node2 ~]# mount /dev/sdb1 /data/
[root@linux-node2 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        17G  2.4G   14G  16% /
tmpfs           491M   12K  491M   1% /dev/shm
/dev/sda1       976M   40M  886M   5% /boot
/dev/sdb1       244M  2.1M  230M   1% /data
[root@linux-node2 ~]# ls /data/
1  10  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  7  8  9  lost+found

有需要可以联系微信xuebao19930721和加入微信群
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址