网络RAID技术----DRBD解析

简介

DRBD全称(Distributed Replicated Block Device),即分布式块设备复制

由内核模块和相关脚本而构成。虽然它每次只允许对一个节点进行读写与访问但对于通常的故障切换高可用集群来说已经足够。实现方式是通过网络来镜像整个设备,可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。

实际工作中将其分为两个角色,primary与secondary。主(primary)负责接收数据,并将数据写到本地磁盘并发送给从(secondary)。从(secondary)将数据存到自己的磁盘中。


DRBD通常用于HA高可用性集群的原因

1.DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分(primary与secondary)。

2.应用程序和操作系统可以运行在带有主要设备的DRBD上 。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,备用节点的DRBD设备再将数据写入备用节点的磁盘设备上。

3.DRBD在TCP/IP网络中运行,作为共享存储设备价格要比专用的存储网络便宜很多。

4.性能与稳定性方面较好。


DRBD复制模式

协议A: 异步复制协议。

当本地磁盘的写入操作已经完成,数据包已在发送队列中时,写入动作就会被认为是已经完成的。当一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。通常用于地理上分开的节点。

协议B: 内存同步(半同步)复制协议。

当本地磁盘写入已完成并且复制数据包达到了对等节点,就会认为写入到主节点上的动作被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。
       

协议C: 同步复制协议。

只有在本地和远程节点的磁盘已经确认了写操作完成,写入才被认为完成。不会有任何数据丢失,所以这是一个群集节点的流行模式,但I/O吞吐量依赖于网络带宽 。
我们一般使用协议C,但选择C协议会影响流量,从而影响网络时延。

(为了数据可靠性,我们在生产环境使用时须慎重选择协议。)


DRBD安装配置(centos7)


环境准备

1.选择两台服务器作为两个节点node1和node2;均为Centos7系统;每个节点两块磁盘,一块用作安装系统,一块用作drbd【必选】

        

2.禁止防火墙或添加规则【必选】   

systemctl stop iptables;systemctl disable iptables

setenforce 0

sed -i.bak "/^SELINUX=enforcing/cSELINUX=disabled" /etc/selinux/config

systemctl disable firewalld.service

systemctl stop firewalld.service


3.修改主机名【可选】

echo "node1"  >/etc/hostname

echo "node2"  >/etc/hostname
        

4.时间同步【可选】

yum -y install ntp  

ntpdate cn.pool.ntp.org

           

5.互信【可选】

ssh-keygen   -f  /root/.ssh/id_rsa  -N  " "            创建密钥

mv  /root/.ssh/{id_rsa.pub,authorized_keys}     改变密钥文件名,authorized_keys为固定格式,可被系统识别

scp   -r  /root/.ssh  node2:/root/                           推送密钥

date;ssh node2 "date"                                         检测时间同步, 时间相同即成功同步


创建lvm【可选】每个节点都需执行      

pvcreate /dev/sdb

vgcreate data /dev/sdb

lvcreate -L 10G -n mysql data         

 

安装drbd
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum install -y kmod-drbd84 drbd84-utils


修改配置文件

vim    /etc/drbd.d/global_common.conf                                             全局配置文件

               global {
               usage-count no;                                                                    是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量
               # minor-count dialog-refresh disable-ip-verification
               }
               common {
               protocol C;                                                                             使用DRBD的同步协议
               handlers {
               # These are EXAMPLE handlers only.
               # They may have severe implications,
               # like hard resetting the node under certain circumstances.
               # Be careful when chosing your poison.
          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";

              # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
              # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
              # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

              # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
              # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
              }
              startup {
              # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
              }
              options {
              # cpu-mask on-no-data-accessible
              }
             disk {
             on-io-error detach;                                                                               配置I/O错误处理策略为分离
             # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
             # disk-drain md-flushes resync-rate resync-after al-extents
             # c-plan-ahead c-delay-target c-fill-target c-max-rate
             # c-min-rate disk-timeout
             }
             net {

             # protocol timeout max-epoch-size max-buffers unplug-watermark
             # connect-int ping-int sndbuf-size rcvbuf-size ko-count
             # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
             # after-sb-1pri after-sb-2pri always-asbp rr-conflict
             # ping-timeout data-integrity-alg tcp-cork on-congestion
             # congestion-fill congestion-extents csums-alg verify-alg
             # use-rle
              }
             syncer {
             rate 1024M;                                                                                          设置主备节点同步时的网络速率
             }
             }


创建资源 

vim  /etc/drbd.d/mysql.res               mysql.res为配置文件名,后缀必为res

            resourcemysql{                         资源名称
            protocol C;                                 使用协议
            meta-disk internal;
            device /dev/drbd1;                    DRBD设备名称
            syncer {
            verify-alg sha1;                          加密算法
            }
            net {
            allow-two-primaries;
             }
            on node1 {                                   节点名
            disk /dev/data/mysql;                 drbd1使用的磁盘分区
            address 172.16.30.100:7789; 设置DRBD监听地址与端口
            }
            on node2 {
            disk /dev/data/mysql;
            address 172.16.30.200:7789;
            }
            }


文件发送

scp  -rp  /etc/drbd.d/*   node2:/etc/drbd.d/


启用drbd

drbdadm create-md mysql                           创建drbd,mysql为名【任意】

modprobe drbd

drbdadm up mysql                                         启动drbd

drbdadm -- --force primary mysql                设定节点身份为primary


配置对端节点(可远程发送命令)

ssh node2 "drbdadm create-md mysql"

ssh node2 "modprobe drbd"

ssh node2 "drbdadm up mysql"   

无需设定身份,默认secondary


格式化设备并挂载[根据情况]             创建文件系统

mkfs.xfs /dev/drbd1

mount /dev/drbd1 /mnt


启用和禁用资源

drbdadm up                                 手动启动资源

drbdadm down                            手动禁用资源

resource:为资源名称


升级和降级资源

drbdadm primary                         升级资源

drbdadm secondary                    降级资源
          

在单主模式下,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主

两个节点中只能有一个主,如果已经有一个主,需先降级再进行升级操作

在双主模式下没有这个限制


初始化设备同步

drbdadm -- --overwrite-data-of-peer primary mysql

注意:要先选择一个初始同步源

            如果其中一个节点已经包含数据,要小心选择同步源,否则会造成数据丢失

 cat  /proc/drbd                                                查看同步进度  

    

查看

drbdadm cstate mysql                                   查看资源连接状态

资源的连接状态:

StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况

Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的

Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams

Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空

BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空

NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空

ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空

TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空

WFConnection:等待和对等节点建立网络连接

WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包

Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态

StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS

StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID

WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS

WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID

WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT

SyncSource:以本节点为同步源的同步正在进行

SyncTarget:以本节点为同步目标的同步正在进行

PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步

PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步

VerifyS:以本地节点为验证源的线上设备验证正在执行

VerifyT:以本地节点为验证目标的线上设备验证正在执行


drbdadm role mysql                               查看资源角色

(Primary主         Secondary次         Unknown资源角色目前未知)

  

drbdadm dstate mysql                           查看硬盘状态

Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离

Attaching:读取无数据时候的瞬间状态

Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘

Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态

Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态

Outdated:数据资源是一致的,但是已经过时

DUnknown:当对等节点网络连接不可用时出现这种状态

Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated 

UpToDate:一致的最新的数据状态,这个状态为正常状态


drbd-overview                                         查看节点状态


你可能感兴趣的:(Linux中的各类服务,运维日常的FAQ)