目录

    6.测试

1.工作原理图-->


目的-->
解决共享存储问题

工作原理-->
提供两个大小相同的分区,在数据流的层次上构建一个磁盘镜像,就如同raid1,所以又被称为分布式raid
主从架构:primary/secondary
默认结构,两节点的所有存储属性,内容皆相同;
同一时刻只能有一个节点上线(即从节点,读写皆不可),主节点接到数据后,将数据备份到磁盘,同时传递给从节点,并存放到磁盘中.
双主模型:
组内节点皆上线;
节点必须为集群文件系统;
必须支持分布式文件锁(内核支持),主节点写入的时候,从节点就从文件锁得知对方在写入;
高可用集群的底层文件信息通道(必须将DRBD做成集群资源).

因为drbd工作在内核,故需要用户空间工具提供规则,所以它由用户空间工具和内核模块组成,就如同iptables和LVS一样.
不支持多个从,至少当前不支持

2.用户空间工具-->告知内核哪个分区是drbd设备

drbdadm    /etc/drbd.d/
    |__ drbdadm primary resource_name    升级为主节点
    |__ drbdadm secondary resource_name    降级为备节点

drbdsetup
drbdmeta

查看drbd状态,有两种方法
cat /proc/drbd
drbd-overview

3.工作模式-->DRbd有三种工作模式告知上层进程写入完成:A异步,B半同步,C同步

A模式:主节点接到数据,只保证发送到本地网卡的数据缓冲区
(性能最好)
B模式:主节点接到数据,保证数据发送到从节点缓冲区,且存到了从节点的内核区,但是是否数据存储到从节点的硬盘,则不清楚
C模式:主节点接到数据,保证数据发送到从节点缓冲区,同时接到从节点存到从节点硬盘的信息
(安全最高)



利用高可用的底层信息通道(如HA的heartbeat或者corosync)+pacemaker进行资源监控,将drbd定义为资源,且drbd资源有主从之分.

5.所需的软件包-->drbd在红帽中并没有编译,故而需要自己制作或者采用第三方rpm包

一定要使用与内核相匹配的包(google或者rpmfind搜索)
rhel6:官方不提供,由第三方提供
drbd-kmdl(内核空间)和drbd(用户空间)
rhel5:
kmod-drbd(内核空间)和drbd(用户空间)

6.配置-->分段式配置

drbd_resource组成: resource_name device disk network
global{}基本没意义的配置
common{}定义drbd设备共享的属性信息(磁盘信息,网络信息,认证信息),可能存在多组drbd设备,每组包含一个主从
剩余配置信息是不同的属性
每一组drbd叫做drbd资源(资源名必须是小写字符),并以文件形式存放在/etc/drbd.d/资源名.res,资源之间以套接字方式互相通信
每一组drbd,主从所在的磁盘分区必须大小相等

7.详细配置过程-->一个共享区域资源的例子

前提准备:提供两个大小相同的磁盘或者磁盘分区空间

7-1.配置通用属性信息-->/etc/drbd.d/global-common.conf
global {
        usage-count no;
        #是否给官方发送统计报告,这个不用说,还是关了吧
        # minor-count dialog-refresh disable-ip-verification
}

#定义drbd节点的共同点属性
common {
        protocol 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";
                # 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 120;
                #degr-wfc-timeout 120;
        }

        disk {
                on-io-error detach;
                #fencing resource-only;
        }

        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
        }
#定义同步速率
        syncer {
                rate 1000M;
        }
}


7-2.定义一个资源-->/etc/drbd.d/mysql.res
resource mysql {
  on node1 {
    device    /dev/drbd0;
    disk      /dev/sdc5;
    address   172.16.100.15:7789;
    #internal表示将drbd自己的源数据放在drbd资源磁盘空间中
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd0;
    disk      /dev/sdc5;
    address   172.16.100.16:7789;
    meta-disk internal;
  }
}

以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
# scp  /etc/drbd.d/*  node2:/etc/drbd.d/


1)初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md mysql
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

此处可能会报 Command 'drbdmeta 0 v08 /dev/sdc5 internal create-md' terminated with exit code 40 错误,解决办法:首先看提示命令中的磁盘是否是你配置文件中的磁盘,如果不是,说明生效的配置文件不是你所认为的那个,其次,如果是,说明配置文件没错,那么可以使用dd命令往对应磁盘中输入些数据,此处磁盘分区是sdc5,故命令如下:dd if=/dev/zero of=/dev/sdc5 bs=100M count=1
2)启动服务,在Node1和Node2上分别执行:
#/etc/init.d/drbd start


3)查看启动状态:
# watch -nl "cat /proc/drbd"
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 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:b oos:505964

也可以使用drbd-overview命令来查看:
# drbd-overview 
  0:mysql  Connected Secondary/Secondary Inconsistent/Inconsistent C r---- 


7-4.设置主节点-->从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令
# drbdadm primary --force mysql

也可以在要设置为Primary的节点上使用如下命令来设置主节点:
     # drbdadm  --overwrite-data-of-peer primary mysql
而后再次查看状态,可以发现数据同步过程已经开始:
# drbd-overview 
  0:mysql  SyncSource Primary/Secondary UpToDate/Inconsistent C r---- 
    [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35

    
等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:
# drbd-overview 
  0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r---- 


需要注意的是,只需要在主节点上进行格式化,且只能在主节点上挂载,若主节点下线,从节点上线,则从节点可以直接挂载,不需要再次格式化.
# mke2fs -t ext4 -L DRBD /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata


对主Primary/Secondary模型的drbd服务来讲,在某个时刻[只能有一个节点为Primary],因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:

Node1:创建测试文件到挂载点,并将其下线
# cd /mydata 
# vi test
# date >> test
# cat test
  Thu Mar 13 17:00:18 CST 2014
# cd .. && umount /test 
# drbdadm secondary mysql    --降级(下线)

查看状态:
# drbd-overview 
  0:mysql  Connected Secondary/Secondary UpToDate/UpToDate C r---- 


Node2:将其上线,查看是否有文件存在
# drbdadm primary mysql    --升级(上线)
# drbd-overview 
  0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r---- 
# mkdir /mydata
# mount /dev/drbd0 /mydata
# ls /mydata
  lost+found  test
# cat test
  Thu Mar 13 17:00:18 CST 2014


7-7.问题-->
问题描述:设备被其他人占用,无法停止或者下线资源
0: State change failed: (-12) Device is held open by someone
解决办法:查看是否设备挂载,umount即可
问题描述:0:mydrbd WFConnection Primary/Unknown UpToDate/DUnknown C r-----,即总有一个节点是未知状态
解决办法:
主节点上执行:
drbdadm connect all
从节点上执行:
drbdadm -- --discard-my-data connect all



高可用集群(HA)之DRBD原理和基础配置的更多相关文章

  1. 高可用集群(HA)之Keeplived原理+配置过程

    原理--> 通过vrrp协议,定义虚拟路由,在多个服务节点上进行转移. 通过节点优先级,将初始虚拟路由到优先级高的节点上,checker工作进程检测到主节点出问题时,则降低此节点优先级,从而实现 ...

  2. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

  3. linux高可用集群(HA)原理详解(转载)

    一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个 节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用 ...

  4. linux高可用集群(HA)原理详解

    高可用集群 一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服 ...

  5. (四)FastDFS 高可用集群架构学习---后期运维--基础知识及常用命令

    1.fastdfs 七种状态 FDFS_STORAGE_STATUS:INIT :初始化,尚未得到同步已有数据的源服务器 FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到 ...

  6. corosync+pacemaker and drbd实现mysql高可用集群

    DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下 DRBD 有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的 ...

  7. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  8. Hadoop部署方式-高可用集群部署(High Availability)

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的高可用集群是建立在完全分布式基础之上的,详情请参考:https://www.cnblogs.com/yinzhengjie/p/90651 ...

  9. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

随机推荐

  1. [linux] linux知识积累(不断更新中…)

    一.vim知识 f(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符. D 删除当前字符至行尾.D=d$ :split或new 打开一个新窗口,光标停在顶层 ...

  2. Android设置选项开发及自定义Preference样式

    一个完整的Android应用程序都应该提供选项(或者叫偏好设置等等)让用户对APP的表现形式能够进行设置,比如说是否加入用户体验计划,或者是否自动升级.定时提醒.开启自启动.后台运行等等.提供一个好的 ...

  3. Scala学习文档-各种使用模式的情况

    模式在变量定义中 在定义val或者var的时候,可以使用模式替代简单的标识符,如可以使用模式拆分元组,并把每个值分配给变量 val myTuple = (123,"abc") va ...

  4. Jasper_plug_install

    1.open eclipse -> Help -> Eclipse Marketplace. 2.at new window, find jasper, will find Jaspers ...

  5. 消息提醒,初探Notification

    1:MainActivity.java package com.example.notificationtest; import android.app.Activity; import androi ...

  6. Qt编程之实现在QFileDialog上添加自定义的widget

    上网搜索找到的方法如下: http://www.qtforum.org/article/20841/how-to-add-a-qwidget-in-qfiledialog.html#post78422 ...

  7. MySQL库表状态查询

    一. 查看库的各链接状态 对于一个mysql连接或者一个线程,任何时刻都有一个状态,表示其当前正在做什么.一般使用show full processlist查看. +---------+------- ...

  8. 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

    原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...

  9. Shell下通过echo+telnet在远端执行命令

    创建脚本cmd.sh,用于输入telnet的用户与密码,以及生成远端需要执行的命令   执行命令 MY_SIGN=/tmp/sign; (sh cmd.sh ) | (telnet localhost ...

  10. Merlin 的魔力: SpringLayout 管理器

    摘自http://tech.it168.com/a2009/0211/265/000000265087_all.shtml 摘自http://cache.baiducontent.com/c?m=9f ...