码迷,mamicode.com
首页 > 其他好文 > 详细

2015/04/18 DRBD

时间:2015-04-19 06:44:11      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:drbd


一、 什么是DRBD?  

          DRBD是由内核模块和相关脚本构成, 用以构建高可用的集群, 其实现方式是通过网络来镜像整个设备. 它允许用户在远程机器上建立一个本地设备的实时镜像, 可以把它看成一个网络RAID 1.


二、 工作原理

          DRBD负责接收数据, 把数据写到本地磁盘, 然后发送给另一个主机. 另一个主机再将数据存到自己的硬盘中;

          DRBD每次只允许一个节点进行读写访问, 这对于通常的故障切换高可用集群已经够了;

          DRBD协议:

                              协议A: 数据一旦写入磁盘并发送到网络中就认为完成了写入操作;

                              协议B:  收到接受确认就认为完成了写入操作;

                              协议C:  收到写入确认就完成了写入操作;

          DRBD的三个进程:

                              drbd0--worker: 主进程

                              drbd0--asender: primary上drbd0的数据发送进程

                              drbd0--receiver: secondary上drbd0的数据接受进程

三、  DRBD安装

        1. 实验拓扑

技术分享技术分享

        2. 实验环境

虚拟机环境:     CentOS release 6.6 (Final)
主服务器IP:     192.168.15.11(Centos1)
备服务器IP:     192.168.15.12(Centos2)
软  件  包:     drbd-8.4.3.tar.gz
两台主机个添加一块硬盘, 分区为/dev/sdb1, 并且格式化;
关闭iptables与selinux防火墙

        3. 添加本地host(两台主机都添加);

[root@Node1 ~]# vim /etc/hosts
………………/省略
192.168.15.11   Node1
192.168.15.12   Node2

        4. 节点直接实现ssh无秘钥通信(两台主机设置为无秘钥通信);

[root@Node1 ~]# ssh-keygen -t rsa
[root@Node1 ~]# scp .ssh/id_rsa.pub root@192.168.15.12:/root

        5. 安装依赖包和环境;

[root@Node1 ~]# yum -y install gcc kernel-devel kernel-headers flex perl        
                                                             ####建议使用本地yum源安装;

        6. 下载DRBD(/http://oss.linbit.com), 并安装;

[root@Node1 ~]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
[root@Node1 ~]# tar -zxvf drbd-8.4.3.tar.gz
[root@Node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km      
                    ### --prefix是制定安装路径,--with-km是启用内核模块;
[root@Node1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64     
                    ### KDIR指的是自己的内核路径;
[root@Node1 drbd-8.4.3]# make install
[root@Node1 drbd-8.4.3]# mkdir -p /usr/local/drbd/var/run/drbd     
                    ### 这里必须创建则这个目录, 不然启动会报错;
[root@Node1 drbd-8.4.3]# cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/  
###将drbd拷贝到/etc/init.d/目录下;
[root@Node1 drbd-8.4.3]# chkconfig --add drbd          # 将drbd添加到系统服务中;
[root@Node1 drbd-8.4.3]# chkconfig drbd on             # 实现drbd实现开机自启;
[root@Node1 drbd-8.4.3]# cd drbd
[root@Node1 drbd]# make clean 
[root@Node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/  #安装drbd模块;
[root@Node1 drbd]# cp drbd.ko /lib/modules/2.6.32-358.el6.x86_64/kernel/lib/
[root@Node1 drbd]# modprobe drbd                       # 加载内核模块;
[root@Node1 drbd]# lsmod | grep drbd

技术分享技术分享

[root@Node2 drbd]# lsmod | grep drbd

技术分享


        7. 配置DRBD;

[root@Node1 drbd]# cd /usr/local/drbd/etc/drbd.d/
drbd的主配置文件为/usr/local/drbd/etc/drbd.conf, 为了管理的便捷性, 目前通常会将这些配置文件分成多个部分;
且都保存只/usr/local/drbd/etc/drbd.d/目录中, 主配置文件中仅使用"include"指令将这些配置文件片断整合起来;
[root@Node1 drbd.d]# cp global_common.conf global_common.conf.bak   #备份
[root@Node1 drbd.d]# vi global_common.conf    
global {
        usage-count yes;                     #是否参加drbd的使用者统计, 默认为yes
        # minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;                                   #使用协议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";                              
                                              ###一旦本地io错误的处理是关机
        }

        disk {
                on-io-error detach;           #配置I/O错误处理策略为分离;
                rate 50M;                     #设置主备节点同步时的网络速率;
        }
        net {
                cram-hmac-alg "sha1";         #DRBD同步时使用的验证方式和密码信息;
                shared-secret "drbd";         # 消息摘要认证密钥
        }
[root@Node1 drbd.d]# scp global_common.conf root@192.168.15.12:/usr/local/drbd/etc/drbd.d

        8. 定义一个资源drbd.res文件;

[root@Node1 drbd.d]# pwd
/usr/local/drbd/etc/drbd.d
[root@Node1 drbd.d]# vim drbd.res
resource drbd {                            #定义的资源名称;
   on Node1 {                              #on后面是主机名;
   address 192.168.15.11:7801;             #设置DRBD的监听端口, 用于与另一台主机通信;
   device /dev/drbd0;                      #DRBD设备名称;
   disk /dev/sdb1;                         #drbd使用的磁盘分区为/dev/sdb1;
   meta-disk internal;                     #DRBD的元数据存放方式;
      }
   on Node2 {
   address 192.168.15.12:7801;
   device /deb/drbd0;
   disk /dev/sdb1;
   meta-disk internal;
      }
}
[root@Node1 drbd.d]# scp drbd.res root@192.168.15.12:/usr/local/drbd/etc/drbd.d
以上文件(global_common.conf和drbd.res)在两个节点上必须相同, 因此, 可以基于ssh将刚才配置的文件全部同步到另外一个节点;

        9. 初始化资源并启动服务;

[root@Node1 drbd.d]# drbdadm create-md drbd       
Command ‘drbdmeta 0 v08 /dev/sdb1 internal create-md‘ terminated with exit code 40          #报错
↑ #解决方案: 使用dd指令将一些资料塞到/dev/sdb1, 然后在执行drdbadm;
[root@Node1 drbd.d]#  dd if=/dev/zero of=/dev/sdb1 bs=1KB count=100
[root@Node1 drbd.d]# drbdadm create-md drbd

技术分享

[root@Node1 drbd.d]# service drbd start               #启动DRBD服务;

技术分享

[root@Node2 drbd.d]# dd if=/dev/zero of=/dev/sdb1 bs=1KB count=10
[root@Node2 drbd.d]# drbdadm create-md drbd
[root@Node2 drbd.d]# service drbd start

技术分享

[root@Node1 drbd.d]# service drbd start
[root@Node1 drbd.d]# netstat -anpt | grep 7789          #查看监听端口;

技术分享

[root@Node2 drbd.d]# netstat -anpt | grep 7789

技术分享

[root@Node1 drbd.d]# cat /proc/drbd                   #查看启动状态;

技术分享

[root@Node1 drbd.d]# cat /proc/drbd

技术分享从上面信息可以看出此时两个节点均处于Secondary状态, 于是, 接下来需要将其中一个节点设置为Primary状态.

ro: 第一个启动drbd时, 两个节点默认都处于Secondary状态;

ns: 网络发送的数据包信息;

dw:磁盘写信息;

dr: 磁盘读信息; 

       10. 设置主用节点(将Node1设置为主节点);

由于默认没有主次节点之分, 因此需要设置主机的主次节点,选择主机节点执行以下命令:
[root@Node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary all
[root@Node1 drbd.d]# cat /proc/drbd

技术分享

[root@Node2 drbd.d]# cat /proc/drbd

技术分享

       11. 创建文件系统;

文件系统的挂载只能在Primary节点进行, 因此, 也只有设置了主节点后才可以对drbd设备进行格式化;
[root@Node1 drbd.d]# mkfs.ext3 -j -L DRBD /dev/drbd0
[root@Node1 drbd.d]# mkdir /mydrbd/
[root@Node1 drbd.d]# mount /dev/drbd0 /mydrbd/
[root@Node1 drbd.]# df -h

技术分享

[root@Node1 ~]# ll /mydrbd/

技术分享

ps: Node2节点无法挂载/dev/drbd0, 因为处于Secondary状态

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

###ON Node1

[root@Node1 ~]# cp /etc/inittab /mydrbd/
[root@Node1 ~]# ll /mydrbd/

技术分享

[root@Node1 ~]# umount /mydrbd/
[root@Node1 ~]# drbdadm secondary drbd          #设置drbd状态为Secondary状态;
[root@Node1 ~]# cat /proc/drbd

技术分享

##ON Node2
#设置Node2的drbd为Primary
[root@Node2 ~]# drbdadm primary drbd
[root@Node2 ~]# cat /proc/drbd

技术分享

[root@Node2 ~]# mkdir /mydrbd/
[root@Node2 ~]# mount /dev/drbd0 /mydrbd/
[root@Node2 ~]# ls -l /mydrbd/

技术分享技术分享

ps: 可以看到已经复制到node2节点上.. 如果将node2设置为secondary状态, 第一步卸载/dev/drbd0挂载点, 第二步执行drbdadm secondary drbd, 第三步node1执行drbdadm primary drbd, 第四步挂载/dev/drbd0


此文章参考别人加上后期修改而成.

本文出自 “陈小贱。” 博客,请务必保留此出处http://chenxiaojian.blog.51cto.com/9345444/1634859

2015/04/18 DRBD

标签:drbd

原文地址:http://chenxiaojian.blog.51cto.com/9345444/1634859

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!