DRBD概念详解及配置

来源:互联网 发布:timbuk2什么档次知乎 编辑:程序博客网 时间:2024/05/22 14:33

一、进程间通信方式与存储方式
进程间通信的三种方式
消息队列:消息被发送到队列中,”消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它;消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。
旗语&信号量: Linux的旗语就是操作系统原理中的信号量,有PV操作,释放旗语会自动唤醒下一个等待获取旗语的进程;
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。
信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(P信号变量)和发送(V信号变量)信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。
共享内存:允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
数据存储类型:
DAS(Direct-Attached Storage)直连式存储,是指将存储设备通过SCSI接口或光纤通道直接连接到一台计算机上。当服务器在地理上比较分散,很难通过远程进行互连 时,DAS是比较好的解决方案。但是这种式存储只能通过与之连接的主机进行访问,不能实现数据与其他主机的共享,同时,DAS会占用服务器操作系统资源, 例如CPU资源、IO资 源等,并且数据置越大,占用操作系统资源就越严重。
NAS(Network Attach Srorage)网络附加存储,它就是个文件服务器,是文件系统级别,NAS和传统的文件存储服务或直接存储设备不同的地方在于NAS设备上面的操作系统和软件只提供了数据存储、数据访问、以及相关的管理功能;此外,NAS设备也提供了不止一种文件传输协议。NAS系统通常有一个以上的硬盘,而且和传统的文件服务器一样,通常会把它们组成RAID来提供服务;有了NAS以后,网络上的其他服务器就可以不必再兼任文件服务器的功能。NAS的型式很多样化,可以是一个大量生产的嵌入式设备,也可以在一般的计算机上运行NAS的软件。
SAN(Storage Area Network)存储区域网络,把SCSI协议借助于其它网络协议实现传送的;1991年,IBM公司在S/390服务器中推出了ESCON(Enterprise System Connection)技术。它是基于光纤介质,最大传输速率达17MB/s的服务器访问存储器的一种连接方式。在此基础上,进一步推出了功能更强的ESCON Director(FC SWitch),构建了一套最原始的SAN系统。
它是一种高速网络或子网络,提供在计算机与存储系统之间的数据传输。存储设备是指一台或多台用以存储计算机数据的磁盘设备,通常指磁盘阵列。
DAS、NAS和SAN三种存储方式比较
存储应用最大的特点是没有标准的体系结构,这三种存储方式共存,互相补充,已经很好满足企业信息化应用。
从连接方式上对比,DAS采用了存储设备直接连接应用服务器,具有一定的灵活性和限制性;
NAS通过网络(TCP/IP,ATM,FDDI)技术连接存储设备和应用服务器,存储设备位置灵活,随着万兆网的出现,传输速率有了很大的提高;
SAN则是通过光纤通道(Fibre Channel)技术连接存储设备和应用服务器,具有很好的传输速率和扩展性能。
NAS用的是以文件为单位的通信协议,例如像是NFS(在UNIX系统上很常见)或是SMB(常用于Windows系统)。而SAN用的则是以区块为单位的通信协议、通常是通过SCSI再转为光纤通道或是iSCSI。(还有其他各种不同的SAN通信协议,像是ATA over Ethernet和HyperSCSI,不过这些都不常见。)
三种存储方式各有优势,相互共存,占到了磁盘存储市场的70%以上。SAN和NAS产品的价格仍然远远高于DAS.许多用户出于价格因素考虑选择了低效率的直连存储而不是高效率的共享存储。客观的说,SAN和NAS系统已经可以利用类似自动精简配置(thin provisioning)这样的技术来弥补早期存储分配不灵活的短板。然而,之前它们消耗了太多的时间来解决存储分配的问题,以至于给DAS留有足够的时间在数据中心领域站稳脚跟。此外,SAN和NAS依然问题多多,至今无法解决。
DRBD的官方文档http://www.drbd.org/users-guide/
翻译版http://www.linuxidc.com/Linux/2013-08/89034.htm
二、DRBD 简介
DRBD (Distributed Replicated Block Device)分布式复制块设备,是由内核模块和相关脚本而构成,它是 Linux 平台上的分散式储存系统,通常用于构建高可用性的集群。DRBD 类似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是通过网络来镜像整个设备。
DRBD的组成部分:

  • 用户空间工具:跟内核版本关系比较松散,只要是能适用于CentOS 6及对应硬件平台的就OK;
  • 内核模块:必须与当下内核版本严格对应;其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果内核版本高于此版本只需要安装管理工具即可;否则,需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。

三、DRBD 工作原理
每个设备(DRBD 提供了不止一个设备)都有一个状态,可能是主状态或从状态。在主节点上,应用程序应能运行和访问drbd设备(/dev/drbd#)。每次写入都会发往本地磁盘设备和从节点设备中。从节点只能简单地把数据写入它的磁盘设备上。 读取数据通常在本地进行。 如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换到主状态,并启动其上的应用程序。(如果将它和无日志FS 一起使用,则需要运行fsck)。如果发生故障的节点恢复工作,它就会成为新的从节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。
四、DRBD 主要功能
官方提供的DRBD的工作流程图:
这里写图片描述
DRBD 负责接收数据,把数据写到本地磁盘,然后通过网络将同样的数据发送给另一个主机,另一个主机再将数据存到自己的磁盘中。
五、DRBD远程传输支持模式:

  • 协议A:异步复制,本地写成功后立即返回;DRBD只需要把数据放到本地的TCP/IP协议栈,放到发送队列中准备发送就返回了;数据发送成功与否不确定,这种方式更高效。
  • 协议B:半同步复制,本地写成功并且确认对方接收数据成功后返回;DRBD将数据发送到对方的TCP/IP协议栈上,对方的TCP/IP协议栈把数据接收下来了就返回,数据存储成功与否不确定;如果双机掉电,数据可能丢失。
  • 协议C:同步复制,本地写成功并且确认对方写成功后返回;DRBD必须确保对方把数据写入对方的磁盘再返回;如果双机掉电或磁盘同时损坏,则数据可能丢失。为了数据可靠性,在生产环境中通常用C协议,但影响流量,会有网络时延。

六、DRBD与HA 集群
大部分现行高可用性集群(如:惠普、IBM、Dell)使用的是共享存储器,因此存储器连接多个节点(用共享的SCSI 总线或光纤通道就可以做到)。DRBD 也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在IP 网络中运行,而且在价格上IP 网络要比专用的存储网络经济的多。目前,DRBD 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。现在的版本将支持两个节点同时进行读写存取。这很有用,比如对GFS 来讲就是如此。兼容性DRBD可以在IDE、SCSI 分区和整个驱动器之上运行,但不能在回路模块设备上运行。(如果硬要这样做,它就会发生死锁)。DRBD 也不能在回送网络设备中运行。(因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在sock_sendmsg()中。有时,接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。
七、DRBD 配置工具

  • drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。
  • drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。
  • drbdmeta:管理META数据结构,平时很少直接用。

八、DRBD 配置文件
DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用”include”指令将这些配置文件片断整合起来。通常/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。
resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
九、DRBD Resource:

  • Resource name:可以是除了空白字符的任意的ACSII码字符
  • DRBD device:在双方节点上,DRBD设备的访问路径;一般为设备文件/dev/drbdN,其主设备号147
  • Disk configuration:各节点为组成此drbd设备所提供的存储设备,通常是一个磁盘分区;
  • Nerwork configuration:节点双方为了实现跨主机磁盘镜像而使用的网络配置;

注意:用户空间工具与drdb与内核中使用的模块版本要保持一致,只有在使用drbdadm工具时才会读取配置文件,对多个资源的公共配置,可以提取出来只配置一次,通常保存在Common中,此外还有global配置,这种配置跟资源本身没有关系的;
十、DRBD 支持的底层设备
DRBD需要在底层设备之上构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在创建文件系统。
DRBD所支持的底层设备有以下这些类:
一个磁盘,或者是磁盘的某一个分区
一个soft RAID设备。
一个LVM的逻辑卷。
一个EVMS卷(Enterprise Volume Management System,企业卷管理系统)
其他任何的块设备。
十一、DRBD 配置步骤
前提:

  • 本配置共有两个测试节点,分别Node1和Node2,相的IP地址分别为10.33.100.77和10.33.100.99;
  • 为了避免重复工作,采用跳板机的思想,来对Node1和Node2进行配置,前端跳板机为10.33.100.66
  • Node1和Node2两个节点上各提供了一个大小相同的分区作为drbd设备:/dev/sda6,大小为512M;
  • 系统为CentOS6.4,x86平台;

1、准备工作
跳板机上主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟”uname -n“命令的结果保持一致;因此,跳板机上的/etc/hosts文件均为下面的内容:
这里写图片描述
跳板机与Node1,Node2实现互信通信

[root@DQ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.77[root@DQ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.99

Node1与Node2时间同步,至此准备工作完成,具体设置可见heartbeat3.0.6配置,这里不再赘述
这里写图片描述
提供DRBD设备,先编辑好自动创建新分区脚本
这里写图片描述
先在跳板机上测试,成功创建512M新分区
这里写图片描述
通过跳板机为两个节点创建DRBD设备
这里写图片描述
2、安装软件包
目前在用的drbd版本主要有8.0-8.3,8.4,9.0三个版本,各版本的功能和配置等略有差异;本实验需要同时安装内核模块和管理工具。这里选用8.4版本,实际使用中,需要根据自己的系统平台等下载软件包版本,各版本的下载地址http://oss.linbit.com/drbd/
首先查看官方文档http://drbd.linbit.com/docs/install/
这里写图片描述
首先安装EPEL源(详细配置过程见EPEL博文,这里不再赘述),再yum安装即可,在跳板机上通过以下脚本安装
这里写图片描述
检验是否成功安装
这里写图片描述
3、在Node1上配置drbd
复制样例配置文件为即将使用的配置文件:
这里写图片描述
配置/etc/drbd.d/global-common.conf
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

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错误时应该怎么处理

4、定义一个资源/etc/drbd.d/web.res,内容如下:
这里写图片描述
以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
这里写图片描述
5、在两个节点上初始化已定义的资源并启动服务:
初始化资源,在Node1和Node2上分别执行:
这里写图片描述
启动服务,在Node1和Node2上分别执行:
这里写图片描述
查看启动状态:
这里写图片描述
也可以使用drbd-overview命令来查看:
这里写图片描述
从上面的信息中可以看出此时两个节点均处于Secondary状态
于是,接下来需要将其中一个节点设置为Primary,在Node1上执行如下命令:
这里写图片描述
而后再次查看状态,可以发现数据同步过程已经开始;等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次
drbd 8.4中第一次设置某节点成为主节点也可以使用如下命令

# drbdadm primary --force resource

6、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
这里写图片描述
7、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
Node1:查看状态已经为Secondary
这里写图片描述
Node2:使用ls /mnt/drbd命令查看在此前在主节点上复制至此设备的文件是否存在
这里写图片描述
附:配置资源双主模型的示例:

resource mydrbd {        net {                protocol C;                allow-two-primaries yes;        }        startup {                become-primary-on both;        }        disk {                fencing resource-and-stonith;        }        handlers {                # Make sure the other node is confirmed                # dead after this!                outdate-peer "/sbin/kill-other-node.sh";        }        on node1.magedu.com {                device  /dev/drbd0;                disk    /dev/vg0/mydrbd;                address 172.16.200.11:7789;                meta-disk       internal;        }        on node2.magedu.com {                device  /dev/drbd0;                disk    /dev/vg0/mydrbd;                address 172.16.200.12:7789;                meta-disk       internal;        }}

参考文档
http://www.linuxidc.com/Linux/2013-08/89035.htm
http://www.cnblogs.com/xiaocen/p/3705937.html

0 0