天天看点

DRBD原理知识

DRBD(Distributed Relicated Block Device 分布式复制块设备), 可以解决磁盘单点故障。一般情况下只支持2个节点。

大致工作原理如下图:

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872946cvQt.png" target="_blank"></a>

一般情况下文件写入磁盘的步骤是: 写操作 --&gt; 文件系统 --&gt; 内存缓存中 --&gt; 磁盘调度器 --&gt; 磁盘驱动器 --&gt; 写入磁盘。而DRBD的工作机制如上图所示,数据经过buffer cache后有内核中的DRBD模块通过tcp/ip协议栈经过网卡和对方建立数据同步。

这种机制,在某一时刻只允许有一个主节点。主节点的作用是可以挂在使用,写入数据等;从节点知识作为主节点的镜像,是主节点的备份。

这样的工作机制的好处是可以有效的避免磁盘出现单点故障,不会文件系统的错乱。

所谓双主模型是2个节点都可以当做主节点来挂载使用。那么,思考这样一个问题?当第一个主节点对某一文件正在执行写操作,此时另一个节点也正在对同一文件也要执行写操作,结果会如何呢??

一般这种情况会造成文件系统的错乱,导致数据不能正常使用。原因是:对文件的加锁机制是由操作系统内核所管理的,一个节点对文件加速之后,另一个节点并不知道对方的锁信息。

解决办法是:使用集群文件系统。集群文件系统使用分布式文件锁管理器,当一个节点对文件加锁之后会通过某种机制来通知其他节点锁信息,从而实现文件锁共享。

当某一进程对某一文件执行了写操作时,写操作在上图执行到那个过程时就认为文件已经同步完成。

A协议:异步复制(asynchronous)如上图 文件写操作执行到A点是就认为写入磁盘成功。性能好,数据可靠性差。

B协议:半同步复制(semi sync)如上图 文件写操作执行到B点是就认为写入磁盘成功。性能好,数据可靠性介于A和C之间。

C协议:同步复制( sync)如上图 文件写操作执行到C点是就认为写入磁盘成功。性能差,数据可靠性高。也是drbd默认使用的复制协议

2个节点:

172.16.10.50 director1.example.com

172.16.10.51 director2.example.com

1

2

<code># drbd 2个节点之间通信是基于主机名的</code>

<code># 设置主机名和主机名解析文件</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_141087294757I0.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872948r1MO.png" target="_blank"></a>

<code># 准备好大小相同的磁盘,这里使用大小相同的分区代替。只需划好分区就好,不需要格式化。</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410873104oERo.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410873105ZKLE.png" target="_blank"></a>

3

4

5

6

7

8

9

10

<code>drbd共有两部分组成:内核模块和用户空间的管理工具。</code>

<code>其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果内核版本高于</code>

<code>此版本的话,只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,</code>

<code>并且此两者的版本号一定要保持对应。</code>

<code># 对应的内核模块的名字分别为 drbd-kmod</code>

<code>注意:</code>

<code>drbd和drbd-kmdl的版本要对应;另一个是drbd-kmdl的版本要与当前系统的内核版本(</code><code>uname</code> <code>-r)相</code>

<code>   </code><code>对应。</code>

<code>下载地址:   直接安装即可。</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872950BJcn.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872951YfgD.png" target="_blank"></a>

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

<code>drbd的主配置文件为</code><code>/etc/drbd</code><code>.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,</code>

<code>且都保存至</code><code>/etc/drbd</code><code>.d/目录中,</code>

<code>主配置文件中仅使用</code><code>"include"</code><code>指令将这些配置文件片断整合起来。通常,</code><code>/etc/drbd</code><code>.d目录中的配置</code>

<code>文件为global_common.conf和所有以.res结尾的文件。</code>

<code>其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。 </code>

<code>在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开</code>

<code>为多个文件的话,global段必须位于配置文件的最开始处。</code>

<code>目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification</code>

<code>  </code><code>和usage-count。 </code>

<code>common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段</code>

<code>中定义。</code>

<code>实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置</code>

<code>文件的复杂度。 </code>

<code>resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于</code><code>/etc/drbd</code><code>.d目录中的以.res结</code>

<code>尾的文件中。</code>

<code>资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。</code>

<code>每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从</code>

<code>    </code><code>common段或drbd的默认中进行继承而无须定义。配置过程:</code>

<code>###############下面的操作在director1.example.com上完成。</code>

<code># 1 配置/etc/drbd.d/global-common.conf</code>

<code>global {</code>

<code>        </code><code>usage-count no; </code><code># 是否为drbd官方收集数据</code>

<code>        </code><code># minor-count dialog-refresh disable-ip-verification</code>

<code>}</code>

<code># common是各个资源共用的选项</code>

<code>common {</code>

<code>        </code><code>protocol C; </code><code># 复制协议</code>

<code>        </code><code>handlers {</code>

<code>                </code><code>pri-on-incon-degr "</code><code>/usr/lib/drbd/notify-pri-on-incon-degr</code><code>.sh;</code>

<code>                </code><code>/usr/lib/drbd/notify-emergency-reboot</code><code>.sh;</code>

<code>                </code><code>echo</code> <code>b &gt; </code><code>/proc/sysrq-trigger</code> <code>; reboot -f";</code>

<code>                </code><code>pri-lost-after-sb "</code><code>/usr/lib/drbd/notify-pri-lost-after-sb</code><code>.sh;</code>

<code>                 </code><code>/usr/lib/drbd/notify-emergency-reboot</code><code>.sh;</code>

<code>                </code><code>local</code><code>-io-error "</code><code>/usr/lib/drbd/notify-io-error</code><code>.sh; </code>

<code>                </code><code>/usr/lib/drbd/notify-emergency-shutdown</code><code>.sh;</code>

<code>                </code><code>echo</code> <code>o &gt; </code><code>/proc/sysrq-trigger</code> <code>; halt -f";</code>

<code>                </code><code># fence-peer "/usr/lib/drbd/crm-fence-peer.sh";</code>

<code>                </code><code># split-brain "/usr/lib/drbd/notify-split-brain.sh root";</code>

<code>                </code><code># out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";</code>

<code>   </code><code># before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";</code>

<code>                </code><code># after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;</code>

<code>        </code><code>}</code>

<code>        </code><code>startup {</code>

<code>                </code><code>#wfc-timeout 120;</code>

<code>                </code><code>#degr-wfc-timeout 120;</code>

<code>        </code><code>disk {</code>

<code>                </code><code>on-io-error detach; </code><code># 发生i/o错误的处理方法,detach将镜像磁盘直接拔除</code>

<code>                </code><code>#fencing resource-only;</code>

<code>        </code><code>net {</code>

<code>                </code><code>cram-hmac-alg </code><code>"sha1"</code><code>;</code>

<code>                </code><code>shared-secret </code><code>"mydrbdlab"</code><code>;</code>

<code>        </code><code>syncer {</code>

<code>                </code><code>rate 1000M;</code>

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

<code>resource </code><code>test</code> <code>{</code>

<code>  </code><code>on director1.example.com {</code>

<code>    </code><code>device    </code><code>/dev/drbd0</code><code>;</code>

<code>    </code><code>disk      </code><code>/dev/sda3</code><code>;</code>

<code>    </code><code>address   172.16.10.50:7789;</code>

<code>    </code><code>meta-disk internal;</code>

<code>  </code><code>}</code>

<code>  </code><code>on director2.example.com {</code>

<code>    </code><code>address   172.16.10.51:7789;</code>

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

<code>scp</code>  <code>/etc/drbd</code><code>.d/*  director2.example.com:</code><code>/etc/drbd</code><code>.d</code>

<code>1)初始化资源,在 director1 和 director2上分别执行:</code>

<code>drbdadm create-md </code><code>test</code> 

<code>2)启动服务,在 director1 和 director2 上分别执行:</code>

<code>/etc/init</code><code>.d</code><code>/drbd</code> <code>start</code>

完成以上2步骤后,查看启动状态:

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872952tBgp.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872953hrcc.png" target="_blank"></a>

<code># 将director1.example.com 节点设置为Primary。在要设置为Primary的节点上执行如下命令:</code>

<code>drbdadm primary --force </code><code>test</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_14108729559wGj.png" target="_blank"></a>

<code>mke2fs -t ext4 -L DRBD </code><code>/dev/drbd0</code>

<code>mount</code> <code>/dev/drbd0</code> <code>/mnt/</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872956eD2t.png" target="_blank"></a>

配置完成。

drbd主从模型只有主节点才能挂载使用。所以就会有升级降级的操作。对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。

具体使用如下:

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872957dulj.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/16/8886857_1410872958MmKz.png" target="_blank"></a>

这样的切换需手动升级,降级。通常drbd会于HA一起使用来达到自动切换的效果,此时drbd是HA的一种clone资源。

drbd的双主模型,需借助于集群文件系统,在以后会详细介绍。

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1553462,如需转载请自行联系原作者

上一篇: 自定义动画

继续阅读