大纲:

   一、DRBD 是什么

   二、DRBD 主要功能

   三、DRBD 工作原理

   四、DRBD 复制模式

   五、DRBD 配置工具

   六、DRBD 配置文件

   七、DRBD 资源

   八、DRBD 支持的底层设备

   九、DRBD 配置步骤

   十、安装与配置 DRBD 详解
   十一、DRBD+MariaDB+Corosync+Pacekmaer HA安装配置详解

一、DRBD 是什么

    简单的说,DRBD (Distributed Replicated Block Device,分布式复制块设备)是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。可以把它看作是一种网络RAID1。


二、DRBD 主要功能

wKiom1NVIF3iTjc6AAF1PGQOynA390.jpg

图   DRBD在Linux的I/O堆栈中的位置


分布式复制块设备(DRBD技术)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。


DRBD镜像数据

实时性:当应用对磁盘的数据进行修改时,复制立即发生。

透明性:应用程序的数据存储在镜像设备上是独立和透明的,数据可存储在不同的服务器上。

同步镜像和异步镜像:同步镜像,当本地发申请进行写操作进行时,同步写到两台服务器上。异步镜像,当本地写申请已经完成对本地的写操作时,开始对对应的服务器进行写操作。


三、DRBD 工作原理

  每个设备(drbd 提供了不止一个设备)都有一个状态,可能是‘主’状态或‘从’状态。在主节点上,应用程序应能运行和访问drbd设备(/dev/drbd*)。每次写入都会发往本地磁盘设备和从节点设备中。从节点只能简单地把数据写入它的磁盘设备上。 读取数据通常在本地进行。 如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。如果发生故障的节点恢复工作,它就会成为新的从节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。



四、DRBD 复制模式

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

◆  协议B:一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在飞行中的数据可能不会被提交到磁盘。

◆ 协议C:只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I/O吞吐量依赖于网络带宽。

简言之:

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

B 收到接收确认就认为完成了写入操作。

C 收到写入确认就认为完成了写入操作。

就目前而言应用最多和应用最广泛的为协议C。


五、DRBD 配置工具


◆ drbdadm:高层的DRBD程序管理套件工具。它从配置文件/etc/drbd.conf中获取所有配置参数。drbdadm为drbdsetup和drbdeta两个命令充当程序的前端应用,执行drbdadm实际是执行的drbdsetup和drbdeta两个命令。

◆  drbdsetup:drbdsetup可以让用户配置已经加载在内核中运行的DRBD模块,它是底层的DRBD程序管理套件工具。使用该命令时,所有的配置参数都需要直接在命令行中定义,虽然命令和灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用debdsetup。

◆ drbdmeta:drbdmeta允许用户创建、转储、还原和修改drbd的原数据结构。这个命令也是用户极少用到。


六、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 name:可以是除了空白字符的任意的ACSII码字符

DRBD device:在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147

Disk configuration:在双方节点上,各自提供的存储设备

Nerwork configuration:双方数据同步时所使用的网络属性


resource mystore {              →#资源名为"mystore"

   on node1.magelinux.com {    →#设置节点cluster1  

   device    /dev/drbd0;       →#指出drbd的标示名

   disk      /dev/sda5;       →#指出作为drbd的设备

   address   172.16.41.1:7789; →#指定ip和端口号

   meta-disk internal;         →#网络通信属性,指定drbd的元数据在本机

  }  

   on node2.magelinux.com {  

   device    /dev/drbd0;  

   disk      /dev/sda5;  

   address   172.16.41.2:7789;  

   meta-disk internal;  

   }  

}


八、DRBD 支持的底层设备

 DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在商脉内创建文件系统。DRBD所支持的底层设备有以下这些类:

◆ 一个磁盘,或者是磁盘的某一个分区。

◆ 一个soft raid 设备。

◆ 一个LVM的逻辑卷。

◆ 一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷。

◆ 其他任何的块设备。


九、DRBD 配置步骤

◆ 安装drbd

◆ 配置资源文件(定义资料名称,磁盘,节点信息,同步限制等)

◆ 将drbd加入到系统服务chkconfig --add drbd  

◆ 初始化资源组drbdadm create-md resource_name

◆ 启动服务 service drbd start

◆ 设置primary主机,并同步数据

◆ 在作为主的节点上面分区、格式化/dev/drbd*

◆ 一个节点进行挂载


十、安装与配置DRBD详解

1.实验拓扑

wKioL1NVJJ7DmB32AACz4_IQjBc011.jpg

2.实验环境

(1).操作系统

CentOS 6.4 X86_64

(2).软件环境

◆ drbd-8.4.3-33.el6.x86_64.rpm

◆ drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


3.安装DRBD

    说明:drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。CentOS 6.5的内核版本是22.6.32-431.el6.x86_64,所以还提安装内核模块。

node1:

[root@node1 ~]# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm

node2:

[root@node2 ~]# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


4.配置DRBD

(1).查看一下配置文件

[root@node1 ~]# ll /etc/drbd.conf  /etc/drbd.d/

-rw-r--r-- 1 root root  133 May 14  2013 /etc/drbd.conf //主配置文件文件


/etc/drbd.d/:  //其他模块存放路径

total 4

-rw-r--r-- 1 root root 1836 May 14  2013 global_common.conf

[root@node1 ~]#


[root@node1 ~]# vim /etc/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";   //告诉我们这些文件被包含在/etc/drbd.d目录下


//查看主配置文件

[root@node1 ~]# cat /etc/drbd.conf


global {

       usage-count yes;

       # minor-count dialog-refresh disable-ip-verification

}


common {

       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-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigg

               # 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 {

               # 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

       }

}



(2).修改全局配置文件  

global {

       usage-count no;

       # minor-count dialog-refresh disable-ip-verification

}


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";

       }


       startup {

               #wfc-timeout 120;

               #degr-wfc-timeout 120;

       }


       disk {

               on-io-error detach;

               #fencing resource-only;

       }


       net {

               cram-hmac-alg "sha1";

               shared-secret "guomaoqiu150019";

       }


       syncer {

               rate 1000M;

       }

}



(3).增加资源

[root@node1 drbd.d]# vim mystore.res  

resource mystore {

       on node1.magelinux.com {

       device    /dev/drbd0;

       disk      /dev/sda3;

       address   172.16.41.1:7789;  

       meta-disk internal;

       }

       on node2.magelinux.com {

       device    /dev/drbd0;

       disk      /dev/sda3;

       address   172.16.41.2:7789;  

       meta-disk internal;

       }

}


(4).将配置文件同步到node2

[root@node1 drbd.d]# scp global_common.conf mystore.res node2.magelinux.com:/etc/drbd.d/

global_common.conf                  100% 1400     1.4KB/s   00:00    

mystore.res                         100%  291     0.3KB/s   00:00  


(5).在node1与node2上初始化初始化资源

node1

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

Writing meta data...

initializing activity log

NOT initializing bitmap

lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory

New drbd meta data block successfully created.

lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory

You have new mail in /var/spool/mail/root


node2

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

Writing meta data...
initializing activity log
NOT initializing bitmap
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory
New drbd meta data block successfully created.
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory
[root@node2 ~]#


(6).node1与node2上启动DRBD服务

node1

[root@node1 drbd.d]# service drbd start

Starting DRBD resources: [

    create res: mystore

  prepare disk: mystore

   adjust disk: mystore

    adjust net: mystore

]

.

node2

[root@node2 ~]# service drbd start

Starting DRBD resources: [

    create res: mystore

  prepare disk: mystore

   adjust disk: mystore

    adjust net: mystore

]

.

\\或者用命令drbdadm命令查看

node1


[root@node1 drbd.d]# drbd-overview  

 0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

node2

[root@node2 ~]# drbd-overview  

 0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

[root@node2 ~]#


(7).查看一下启动状态

node1

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

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00

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:f oos:1059216


node2

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

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00

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:f oos:1059216

[root@node2 ~]#

   从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:

[root@node1 drbd.d]# drbdadm primary --force RESOURCE

也可以在要设置为Primary的节点上使用如下命令来设置主节点:

[root@node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary RESOURCE


(8).将node1设置为主节点

[root@node1 drbd.d]# drbdadm primary --force mystore  //提升当前节点为主primary

[root@node1 ~]# watch -n1 'cat /proc/drbd' //通过该命令监视同步状态
Every 1.0s: cat /proc/drbd                                                        Tue Apr 22 19:46:34 2014

version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
   ns:2788500 nr:0 dw:0 dr:2797216 al:0 bm:170 lo:0 pe:3 ua:8 ap:0 ep:1 wo:f oos:370332
       [================>...] sync'ed: 88.4% (370332/3156636)K
       finish: 0:00:03 speed: 96,560 (96,076) K/sec


[root@node1 drbd.d]# drbd-overview  

 0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate C r-----

[root@node2 ~]# drbd-overview  

 0:mystore/0  Connected Secondary/Primary UpToDate/UpToDate C r-----

[root@node2 ~]#

//在两个节点各自看到的效果是不一样的...


(9).格式化并挂载

   文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化

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

mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

66240 inodes, 264804 blocks

13240 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=272629760

9 block groups

32768 blocks per group, 32768 fragments per group

7360 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376


Writing inode tables: done                            

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 29 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@node1 ~]#



[root@node1 ~]# mkdir /mydata

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

[root@node1 ~]# ls /mydata/

lost+found

[root@node1 ~]# mount | grep drbd

/dev/drbd0 on /mydata type ext4 (rw)

[root@node1 ~]# cp /etc/issue /mydata/

[root@node1 ~]# ls /mydata/

issue  lost+found

[root@node1 ~]#


(10)切换Primary和Secondary节点

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

node1:

[root@node1 ~]# umount /mydata/

[root@node1 ~]# drbdadm secondary mystore

[root@node1 ~]# drbd-overview

 0:mystore/0  Connected Secondary/Secondary UpToDate/UpToDate C r-----

[root@node1 ~]#


node2:

[root@node2 ~]# drbdadm primary mystore


//查看状态node2

[root@node2 ~]# drbd-overview  

0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate C r-----  

[root@node2 ~]# mkdir /mydata

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


//查看之前在主节点上复制至此设备的文件是否存在

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

[root@node2 ~]# ls /mydata/

issue  lost+found

[root@node2 ~]#


//ok,完全没有问题,下面我们来个配置示例


   注意:以上配置过程中分别在node1和node2上面创建的挂载目录可以保持不一致,但是如果与Pacemaker结合工作那两节点就必须保持一致性了,因为在其定义资源时是要指定挂载点!


十一、DRBD+MariaDB+Corosync+Pacekmaer HAA安装配置详解

1.安装MariaDB
按照上面的步骤继续:
(1)启动DRBD,将DRBD 在node1节点上提升为Primary

node1

[root@node1 ~]# service drbd start;ssh node2 "service drbd start"

[root@node1 ~]# drbdadm primary --force mystore

[root@node1 ~]# drbd-overview

 0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate C r-----

[root@node1 ~]#


node2

[root@node2 ~]# drbd-overview
 0:mystore/0  Connected Secondary/Primary UpToDate/UpToDate C r-----
[root@node2 ~]#

(2)在Primary所在节点node1,挂载drbd设备到/mydata目录

node1

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

[root@node1 ~]# ls /mydata/
issue  lost+found
[root@node1 ~]#

(3)node1/node2解压安装MariDB<这里使用二进制包>

node1

[root@node1 ~]# groupadd -r mysql
[root@node1 ~]# groupdel mysql
[root@node1 ~]# groupadd -r -g 306 mysql
[root@node1 ~]# useradd -r -u 306 -g mysql mysql
[root@node1 ~]# id mysql
uid=306(mysql) gid=306(mysql) groups=306(mysql)
[root@node1 ~]# tar -xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/

[root@node1 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql
`mysql' -> `mariadb-10.0.10-linux-x86_64'

[root@node1 local]# cd mysql/



[root@node1 mysql]# chown -R  root:mysql .*


[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

cp: overwrite `/etc/my.cnf'?y

[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld

[root@node1 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh

[root@node1 mysql]# source /etc/profile.d/mysql.sh

[root@node1 mysql]# vim /etc/my.cnf


datadir = /mydata/data//添加数据目录
innodb_file_per_table = on  
//独立表空间

log-bin=/mydata/binlogs/mysql-bin //二进制日志存放目录

[root@node1 mysql]# mkdir /mydata/binlogs
[root@node1 mysql]# mkdir /mydata/data
[root@node1 mysql]# chown mysql:mysql -R /mydata/*
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql  //初始化MariaDB
[root@node1 data]# service mysqld start
Starting MySQL.                                            [  OK ]
[root@node1 data]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>  //ok!已经成功登录了.



[root@node1 data]# scp -p /etc/my.cnf node2:/etc/my.cnf
my.cnf                                     100% 4966     4.9KB/s   00:00  

[root@node1 data]# scp -p /etc/profile.d/mysql.sh node2:/etc/profile.d/mysql.sh

mysql.sh                                   100%  126     0.1KB/s   00:00  

[root@node1 data]# scp -p /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d/
mysqld                                     100%   11KB  11.4KB/s   00:00  
[root@node1 ~]# scp mariadb-10.0.10-linux-x86_64.tar.gz node2:/root/
mariadb-10.0.10-linux-x86_64.tar.gz                                                                              100%  282MB  31.4MB/s   00:09    

[root@node1 ~]#



//在node2上面安装MariaDB.(只需要将安装包展开并创建用户即可,无需初始化)

node2

[root@node2 ~]# groupadd -r -g 306 mysql
[root@node2 ~]# useradd -r -u 306 -g mysql mysql
[root@node2 ~]# tar -xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql
`mysql' -> `mariadb-10.0.10-linux-x86_64'

[root@node2 local]#


//切换一下drbd的角色

node1

[root@node1 ~]# service mysqld stop
Shutting down MySQL..                                      [  OK  ]

[root@node1 ~]# umount /mydata/

[root@node1 ~]# drbdadm secondary mystore




node2

[root@node2 mysql]# drbdadm primary mystore  //将node2节点上的drbd提升为primary
You have new mail in /var/spool/mail/root
[root@node2 mysql]# drbd-overview
 0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
[root@node2 mysql]# mount /dev/drbd0 /mydata/
[root@node2 ~]# ls /mydata/
binlogs  data  lost+found    
[root@node2 ~]#


[root@node2 ~]# service mysqld start
Starting MySQL.                                            [  OK ]
[root@node2 ~]# /usr/local/mysql/bin/mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>


//从以上配置过程我们了解了DRBD与MariaDB结合的工作模式,同时也发现了在DRBD自身不能够进行角色切换时只能依赖于人工手动进行;下面的示例将DRBD与Pacemaker结合实现DRBD的角色自动切换



(4)关闭mysql服务、drbd服务,并禁止开机自启动;为后续的HA配置做好准备

node1

[root@node1 ~]# service mysqld stop

Shutting down MySQL..                                      [  OK  ]
[root@node1 ~]# chkconfig mysqld off
[root@node1 ~]# service drbd stop
Stopping all DRBD resources: .
[root@node1 ~]# chkconfig drbd off
[root@node1 ~]#


node2

[root@node2 bin]# service mysqld stop

Shutting down MySQL..                                      [  OK  ]
You have new mail in /var/spool/mail/root
[root@node2 bin]# chkconfig mysqld off
[root@node2 bin]# service drbd stop
Stopping all DRBD resources:
.
[root@node2 bin]# chkconfig drbd off
[root@node2 bin]#




2.安装Corosync,Pacemaker

(1).操作系统

   CentOS 6.5 X86_64

(2).软件环境

   下面两个包系统盘已自带

◆ corosync-1.4.1-17.el6.x86_64

◆ pacemaker-1.1.10-14.el6.x86_64

   下面两个包需要自己下载

◆ crmsh-1.2.6-4.el6.x86_64

◆ pssh-2.3.1-2.el6.x86_64

前提:配置好yum源

node1

[root@node1 ~]# yum install -y corosync pacemaker crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm


node2

[root@node1 ~]# yum install -y corosync pacemaker crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm


(3)查看修改Corosync配置文件:

[root@node1 ~]# cd /etc/corosync/

[root@node1 corosync]# cp corosync.conf.example corosync.conf

[root@node1 corosync]# vim corosync.conf


compatibility: whitetank


totem {

       version: 2

       secauth: on

       threads: 0

       interface {

               ringnumber: 0

               bindnetaddr: 172.16.41.100

               mcastaddr: 226.41.41.41

               mcastport: 5405

               ttl: 1

       }

}


logging {

       fileline: off

       to_stderr: no

       to_logfile: yes

       to_syslog: no

       logfile: /var/log/cluster/corosync.log

       debug: off

       timestamp: on

       logger_subsys {

               subsys: AMF

               debug: off

       }

}


amf {

       mode: disabled

}


//添加如下两段:

service {

      name:   pacemaker

      ver:    0

}


aisexec {

      user: root

      group: root


}


(4)生成密钥文件:

   注:corosync生成key文件会默认调用/dev/random随机数设备,一旦系统中断的IRQS的随机数不够用,将会产生大量的等待时间,因此,这里实验为了节约时间,我们在生成key之前讲random替换成urandom,以便节约时间;如果是在实际生产环境中还是老老实实敲吧!

[root@node1 corosync]# mv /dev/{random,random.bak}

[root@node1 corosync]# ln -s /dev/urandom /dev/random

[root@node1 corosync]# corosync-keygen

Corosync Cluster Engine Authentication key generator.

Gathering 1024 bits for key from /dev/random.

Press keys on your keyboard to generate entropy.

Writing corosync key to /etc/corosync/authkey.

[root@node1 corosync]# rm -rf /dev/random

You have new mail in /var/spool/mail/root

[root@node1 corosync]# mv /dev/{random.bak,random}


//查看是否生成

[root@node1 corosync]# ls

authkey  corosync.conf  corosync.conf.example  corosync.conf.example.udpu  service.d  uidgid.d

[root@node1 corosync]#



(5)将key文件authkey与配置文件corosync.conf复制到node2上

[root@node1 corosync]# scp authkey corosync.conf node2:/etc/corosync/

authkey                                 100%  128     0.1KB/s   00:00  

corosync.conf                           100%  556     0.5KB/s   00:00

[root@node1 corosync]#


(6)启动corosync

node1

[root@node1 corosync]# service corosync start

Starting Corosync Cluster Engine (corosync):               [ OK ]


node2

[root@node2 corosync]# service corosync start

Starting Corosync Cluster Engine (corosync):               [ OK ]


(7)查看群集状态

node1

[root@node1 ~]# crm status

Last updated: Mon Apr 21 23:30:38 2014

Last change: Mon Apr 21 23:26:46 2014 via crmd on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

0 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]

[root@node1 ~]#


node2

[root@node2 ~]# crm status

Last updated: Thu Apr 17 22:00:13 2014

Last change: Mon Apr 21 23:26:46 2014 via crmd on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

0 Resources configured


Online: [ node1.magelinux.com node2.magelinux.com ]

[root@node2 ~]#


大家可以看到,Corosync+Pacemaker运行正常,node1与node2都在线,DC是node1节点。但是还没有配置资源;不慌,下面我们继续...


3.配置当前集群的配置信息,确保已经配置全局属性参数为两节点集群所适用:

[root@node1 ~]# crm

crm(live)# configure

crm(live)configure# property no-quorum-policy=ignore

crm(live)configure# property stonith-enabled=false

crm(live)configure# rsc_defaults resource-stickiness=100 //定义黏性为100

crm(live)configure# verify

crm(live)configure# show

node node1.magelinux.com

node node2.magelinux.com

property $id="cib-bootstrap-options" \

dc-version="1.1.10-14.el6-368c726" \

cluster-infrastructure="classic openais (with plugin)" \

expected-quorum-votes="2" \

no-quorum-policy="ignore" \

stonith-enabled="false"


rsc_defaults $id="rsc-options" \

resource-stickiness="100"

crm(live)configure# commit

crm(live)configure#


//在如上输出的信息中,请确保有stonith-enabled和no-quorum-policy出现且其值与如上输出信息中相同



3.将已经配置好的drbd设备/dev/drbd0定义为集群服务

(1)按照集群服务的要求,首先确保两个节点上的drbd服务已经停止,且不会随系统启动而自动启动(前面我已经停止过了)

(2)配置drbd为集群资源:

提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。我们可以使用如下命令来查看此RA及RA的meta信息:

[root@node1 ~]# crm

crm(live)# ra

crm(live)ra# classes  //查看有那些资源代理类型

lsb

ocf / heartbeat linbit pacemaker

service

stonith

crm(live)ra# list ocf linbit  //查看linbit所提过的资源代理

drbd      

crm(live)ra# meta ocf:linbit:drbd //查看此资源代理的详细信息


Manages a DRBD device as a Master/Slave resource (ocf:linbit:drbd)


This resource agent manages a DRBD resource as a master/slave resource.

DRBD is a shared-nothing replicated storage device.

Note that you should configure resource level fencing in DRBD,

this cannot be done from this resource agent.

See the DRBD User's Guide for more information.

http://www.drbd.org/docs/applications/


Parameters (* denotes required, [] the default):


drbd_resource* (string): drbd resource name

   The name of the drbd resource from the drbd.conf file.


drbdconf (string, [/etc/drbd.conf]): Path to drbd.conf

   Full path to the drbd.conf file.


stop_outdates_secondary (boolean, [false]): outdate a secondary on stop

   Recommended setting: until pacemaker is fixed, leave at default (disabled).


   Note that this feature depends on the passed in information in

   OCF_RESKEY_CRM_meta_notify_master_uname to be correct, which unfortunately is

   not reliable for pacemaker versions up to at least 1.0.10 / 1.1.4.


   If a Secondary is stopped (unconfigured), it may be marked as outdated in the

   drbd meta data, if we know there is still a Primary running in the cluster.

   Note that this does not affect fencing policies set in drbd config,

   but is an additional safety feature of this resource agent only.

   You can enable this behaviour by setting the parameter to true.


   If this feature seems to not do what you expect, make sure you have defined

   fencing policies in the drbd configuration as well.


Operations' defaults (advisory minimum):


   start         timeout=240

   promote       timeout=90

   demote        timeout=90

   notify        timeout=90

   stop          timeout=100

   monitor_Slave timeout=20 interval=20

   monitor_Master timeout=20 interval=10


   drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多态(Multi-state)clone类型,即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。

[root@node1 ~]# crm

crm(live)#configure

crm(live)configure# primitive drbd_mysql ocf:linbit:drbd params drbd_resource="mystore" op monitor interval="29s" role=Master op monitor interval="31s" role="Slave" op start timeout=240s op stop timeout=100s

crm(live)configure# ms ms_drbd_mysql drbd_mysql meta master-max="1" master-node-max="1" clone-max="1" clone-node-max="1" notify="true"

crm(live)configure# verify

crm(live)configure# commit


//查看当前集群状态:


crm(live)configure# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:10:17 2014

Last change: Wed Apr 23 02:05:05 2014 via cibadmin on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node2.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

1 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]

Masters: [ node1.magelinux.com ]

Slaves: [ node2.magelinux.com ]


//ok!此时Master运行在node1上,Slave运行在node2上.配置drdb主从资源搞定!

crm(live)#



(3)模拟测试drbd主从资源是否能够自动切换

crm(live)# node

crm(live)node# standby node1.magelinux.com

crm(live)node# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:28:47 2014

Last change: Wed Apr 23 02:27:53 2014 via crm_attribute on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

2 Resources configured



Node node1.magelinux.com: standby

Online: [ node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]

Masters: [ node2.magelinux.com ]//此时node2节点为Master

Stopped: [ node1.magelinux.com ]//此时node1节点为离线停止状态

crm(live)#


//让node1从新上线

crm(live)# node

crm(live)node# online node1.magelinux.com

crm(live)node# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:39:07 2014

Last change: Wed Apr 23 02:39:02 2014 via crm_attribute on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

2 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]


Masters: [ node2.magelinux.com ] //此时node2节点为Master

Slaves: [ node1.magelinux.com ]//此时node1上线后为Slave

crm(live)#


//故,经验证,drdb主从服务自动切换已初步完成!


(4)为Primary节点上的mysql资源创建自动挂载的集群服务

drbd_mysql的Master节点即为drbd服务mysql资源的Primary节点,此节点的设备/dev/drbd0可以挂载使用,且在mysql集群服务的应用当中也需要能够实现自动挂载。

上面我们已经定义好了drbd的主从资源,下面是定义其他关于mysql的必要资源:

//文件系统

crm(live)# configure
crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op start timeout=60s op stop timeout=60s


//VIP资源

crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="172.16.41.100"


//mysql服务

crm(live)configure# primitive mysqldserver lsb:mysqld  

crm(live)configure# verify


//ok,目前所有的资源都已经配置好,下面还需要对每个资源的位置、启动(关闭)顺序做一下调整

crm(live)configure# colocation fs_mysql_with_drbd_mysql inf: fs_mysql ms_drbd_mysql:Master //让文件系统fs_mysql与ms_drdb_mysql的主节点在一起



crm(live)configure# order fs_mysql_after_ms_drbd_mysql  inf: ms_drbd_mysql:promote fs_mysql:start   //让ms_drdb_mysql先于fs_mysql启动



crm(live)configure# colocation myip_with_ms_drbd_mysql inf: myip ms_drbd_mysql:Master  //让VIP与ms_drbd_mysql的主节点在一起




crm(live)configure# order fs_mysq_after_myip inf: myip fs_mysql:start//让fs_mysql晚于VIP启动


crm(live)configure# colocation mysqldserver_with_fs_mysql  inf: mysqldserver fs_mysql //让mysql服务于fs_mysql在一起


crm(live)configure# order mysqldserver_after_fs_mysql  inf: fs_mysql mysqldserver:start  //让mysql服务优先于fs_mysql启动


最后要检测一下,并提交。

crm(live)configure# verify
crm(live)configure# show
crm(live)configure# commit


//下面看一下集群状态

crm(live)configure# cd ..
crm(live)# status
Last updated: Wed Apr 23 12:32:46 2014
Last change: Wed Apr 23 12:30:15 2014 via cibadmin on node1.magelinux.com
Stack: classic openais (with plugin)
Current DC: node1.magelinux.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
5 Resources configured


Online: [ node1.magelinux.com node2.magelinux.com ]

Master/Slave Set: ms_drbd_mysql [drbd_mysql]
    Masters: [ node1.magelinux.com ]
    Slaves: [ node2.magelinux.com ]
fs_mysql     (ocf::heartbeat:Filesystem):     Started node1.magelinux.com
myip     (ocf::heartbeat:IPaddr):     Started node1.magelinux.com
mysqldserver     (lsb:mysqld):     Started node1.magelinux.com
crm(live)#

//从上面可以看出来主节点是node1,从节点是node2,下面将node1变为standby,看一下服务是否能够转移到node2上面

crm(live)# node
crm(live)node# standby node1.magelinux.com
crm(live)node# cd ..
crm(live)# status
Last updated: Wed Apr 23 12:38:32 2014
Last change: Wed Apr 23 12:38:15 2014 via crm_attribute on node1.magelinux.com
Stack: classic openais (with plugin)
Current DC: node1.magelinux.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
5 Resources configured


Node node1.magelinux.com: standby
Online: [ node2.magelinux.com ]

Master/Slave Set: ms_drbd_mysql [drbd_mysql]
    Masters: [ node2.magelinux.com ]
    Stopped: [ node1.magelinux.com ]
fs_mysql     (ocf::heartbeat:Filesystem):     Started node2.magelinux.com
myip     (ocf::heartbeat:IPaddr):     Started node2.magelinux.com
mysqldserver     (lsb:mysqld):     Started node2.magelinux.com
crm(live)#


//从上面可以看出来所有的服务都转移到了node2上;表明所有的服务、配置已经完成!后续我登录了mysql服务器,毫无问题,能够在两个节点间自动切换;



至此,DRBD+Corosync+Pacemaker+Mysql高可用集群实验成功完成!

j_0010.gif