首页 > 代码库 > Mysql+DRBD+Heartbeat 实现mysql高可用的双击热备(DRBD篇)

Mysql+DRBD+Heartbeat 实现mysql高可用的双击热备(DRBD篇)

DRBD官方tar包下载地址:   http://oss.linbit.com/drbd/


环境介绍: 


系统版本:CentOS 6.4 (64位)  

内核版本  2.6.32-358.el6.x86_64 


软件版本:drbd-8.4.3.tar.gz 


主:10.0.0.1   从:10.0.0.2


两台机器上的hosts都需要修改:

[root@localhost ~]# vim /etc/hosts

 10.0.0.1    node1

 10.0.0.2    node2 


两台服务器双网卡,其中10.0.0.x的网卡用于传输drbd数据,两台服务器网线直连,用做传输心跳线。



****为了方便实验,两台机器都各自加一块15G的硬盘,用过来做DRBD存储盘 (两台机器都需要此操作)


对新添加的硬盘进行分区:

#fdisk /dev/sdb                                                  //准备为 sdb 建立分区


 The number of cylinders for this disk is set to 20805.

 There is nothing wrong with that, but this is larger than 1024,

 and could in certain setups cause problems with:

 1) software that runs at boot time (e.g., old versions of LILO)

 2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

 Command (m for help): n                                              //键入 n 表示要建立分区

 Command action

    e   extended

    p   primary partition (1-4)

 p                                                                    //键入 p 表示建立主要分区

 Partition number (1-4): 1                                            //键入 1 为此主要分区代号

 First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可

 Using default value 1

 Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可

 Using default value 20805

 Command (m for help): w                                              //键入 w 表示确定执行刚才设定

 The partition table has been altered!

 Calling ioctl() to re-read partition table.

 Syncing disks.


[root@node1 ~]# partprobe                                  //使刚才的 partition table 变更生效


分区进行格式化:


[root@node1 ~]# mkfs.ext4 /dev/sdb1


编译安装drbd-8.4.3  :


[root@node1 soft]# tar zxf drbd-8.4.3.tar.gz  

[root@node1 soft]# cd drbd-8.4.3 

[root@node1 soft]# mkdir /usr/local/drbd/

[root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km 注意:--with-km是启用内核模块 

[root@node1 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/      注意KDIR的路径 (这个内核源码路径需要根据自己的系统修改) 

[root@node1 drbd-8.4.3]# make install  

[root@node1 ~]# mkdir -p /usr/local/drbd/var/run/drbd 


配置启动脚本以及开机自启动

[root@node1 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/ 

[root@node1 ~]# chkconfig --add drbd 

[root@node1 ~]# chkconfig drbd on


拷贝DRBD模块到内核,并加载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

drbd                  325626  3 

libcrc32c               1246  1 drbd


*********别忘了同样在node2上也进行以上步骤操作****************


********************************配置DRBD************************************

[root@node1 ~]# cd /usr/local/drbd/etc/

[root@node1 etc]# cat drbd.conf


# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example


include "drbd.d/global_common.conf";

include "drbd.d/*.res";


由此可见:主配置文件里面已经包含了全局配置文件和drbd目录下以.res结尾的文件


修改全局配置文件:                    *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********


[root@node1 etc]# cd drbd.d/

[root@node1 drbd.d]# cat global_common.conf 

global {

usage-count no;    #是否参加DRBD使用者统计,默认为yes

}


common {

syncer { rate 200M; }   #设置主、备节点同步时的网络速率最大值,单位是字节

        protocol        C;  #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后,认为写入完成

        handlers {

         pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";

         pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";

         local-io-error "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";

        }


        net {

                cram-hmac-alg   "sha1";    

                shared-secret   "MySQL-HA";   #DRBD 同步时使用的验证方式和密码信息

        }


        disk {

                on-io-error     detach;       #配置I/O错误处理策略为分离

         #       fencing resource-only;

        }


        startup {  

         #       wfc-timeout     120;

         #       degr-wfc-timeout    120;

        }

}



修改资源配置文件,默认没有此文件,需要手动创建:    *****下面是笔者所用配置,为了高效配制成功,请务必保证文件各项配置一致********

[root@node1 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res

resource r0 {     #这个r0是定义资源的名字

        on node1 { #每个主机的说明以on开头,后面的名称需要与hostname、uname -n一致,其后的{}中的配置是此主机的配置

device /dev/drbd0;         #drbd设备名称

        disk    /dev/sdb1; #/dev/drbd0使用的磁盘分区为sdb1

        address         10.0.0.1:7788;      #设置drbd监听地址与端口

        meta-disk       internal;    #DRBD的元数据存放方式

        }


        on node2 {

device  /dev/drbd0;

        disk    /dev/sdb1;

        address         10.0.0.2:7788;

        meta-disk       internal;

        }

}


****************************此时,DRBD的配置文件完成!***************************


为了保证配置项一致,将两个配置文件拷贝到node2上:


[root@node1 drbd]#scp etc/drbd.d/global_common.conf etc/drbd.d/drbd.res root@10.0.0.2:/root/


切换到node2 将配置文件放到drbd目录:


[root@node2 ~]#mv drbd.res global_common.conf /usr/local/drbd/etc/drbd.d/


在node1上初始化资源

[root@node1 ~]# drbdadm create-md r0

You want me to create a v08 style flexible-size internal meta data block.

There appears to be a v08 flexible-size internal meta data block

already in place on /dev/sdb1 at byte offset 16105058304

Do you really want to overwrite the existing v08 meta-data?

[need to type ‘yes‘ to confirm] yes


Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.


同样,在node2上初始化资源

[root@node2 ~]# drbdadm create-md r0


***注意:如果初始化资源报错:


Command ‘drbdmeta 0 v08 /dev/sdb1 internal create-md‘ terminated with exit code 40

这是因为sdb1已经有文件系统了,已经有数据存在了(进行下面的操作前,请保证/dev/sdb1里的数据是否备份)

解决方法:

[root@node1 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1  ***注意,此处就是/dev/sdb1此硬盘,而不是他的挂载目录


请务必在两台服务器上同时启动服务:


[root@node1 ~]# service drbd start

Starting DRBD resources: [

     create res: r0

   prepare disk: r0

    adjust disk: r0

     adjust net: r0

]

......

[root@node2 ~]# service drbd start


查看drbd监听端口:

[root@node2 ~]# netstat -anptul |grep 7788

tcp        0      0 10.0.0.2:50569              10.0.0.1:7788               ESTABLISHED -                   

tcp        0      0 10.0.0.2:7788               10.0.0.1:39663              ESTABLISHED -          


********************************设置DRBD主、备节点***************************************


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


[root@node1 ~]# drbdadm role r0         #查看r0主、备节点的命令

Secondary/Secondary


由于默认没有主备节点之分,因而需要设置两个主机的主备节点,选择需要设置为主节点的主机,然后执行如下命令:


[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary all


第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:


drbdadm primary all


查看资源的连接状态:


[root@node1 ~]# drbdadm cstate r1

SyncSource


资源连接状态可能有以下状态中的一种:


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:以本地节点为验证目标的线上设备验证正在执行


查看资源角色的命令:


[root@node1 ~]# drbdadm role r1


Primary/Secondary (在前面为当前节点)


Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上

Secondary 备:资源目前为备,正常接收对等节点的更新

Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态



查看硬盘状态:


[root@node1 ~]# drbdadm dstate r1


UpToDate/UpToDate


本地和对等节点的硬盘有可能为下列状态之一:

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

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

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

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

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

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

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

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

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



查看同步进度:


[root@node1 ~]# cat /proc/drbd 

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:24 nr:16108076 dw:16108100 dr:1017 al:2 bm:960 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

【注】:

从输出的”ds“ 信息得知,磁盘状态都是“UpToDate”,表示数据同步已经完成了

ro是角色信息,Primary/Secondary 说明了当前主机是primary主节点,另一台是secondary备节点

ds是磁盘状态,显示数据是否一致,(如果显示UpToDate/UpToDate 表明同步没有延时)

ns是网络发送的数据包,以K字节计算

dw是磁盘写信息

dr是磁盘读信息


**************************最后一步,挂载drbd0设备**************************


注意:

  *****挂载DRBD分区之前,首先需要确认当前主机的DRBD分区是Primary状态,可以从"/cat/proc/drbd" 命令中查询到


[root@node1 ~]# cat /proc/drbd |grep ro

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

 

  *****处于主状态的主机,才能进行挂载*****


格式化文件系统(文件格式根据自己的系统环境选择)


[root@node1 ~]# mkfs.ext4 /dev/drbd0


挂载此文件系统

[root@node1 ~]# mkdir /data

[root@node1 ~]# mount /dev/drbd0  /data/

[root@node1 ~]# df -Th

文件系统    类型      容量  已用  可用 已用%% 挂载点

/dev/sda3     ext4     11G  3.5G  6.9G  34% /

tmpfs        tmpfs    499M     0  499M   0% /dev/shm

/dev/sda1     ext4    2.0G   68M  1.9G   4% /tmp

/dev/drbd0    ext4     15G  166M   14G   2% /data


**************************此时,DRBD的配置已经完成!***************************



**************************测试验证***********************************************


命题:在挂载的data目录中创建一个测试文件,然后卸载挂载目录,然后切换主备节点,在备用节点上查看刚刚建立的测试文件还是否存在


[root@node1 ~]# touch /data/test

[root@node1 ~]# umount /data/


然后将node1变为备用节点:


[root@node1 ~]# drbdadm secondary r0


[root@node1 ~]# drbdadm role r1

Secondary/Secondary


DRBD执行角色切换前,需要在主节点执行 umount 命令, 去掉对DRBD设备的挂载,然后在另一台主机上将DRBD的角色修改为”Primary“,最后再进行挂载


接着在node2上进行操作:


[root@node2 ~]# drbdadm primary all

[root@node2 ~]# mount /dev/drbd0  /data


查看文件是否存在:

[root@node2 ~]# ls /data/

lost+found  test


******************************此时表明DRBD配置已成功!!!**************************



本文出自 “Fate” 博客,请务必保留此出处http://czybl.blog.51cto.com/4283444/1426055