DRBD详解 及 DRBD+Mysql应用

1、认识DRBD

       DRBD(Distributed Replicated Block Device,分布式复制块设备)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。DRBD是镜像块设备,是按数据位镜像成一样的数据块。

       简单说DRBD是实现活动节点存储数据更动后自动复制到备用节点相应存储位置的软件。

1-1、DRBD工作原理

       上图是官方文档里给出的DRBD工作栈模型,可以看到DRBD需要运行在各个节点上,且是运行在节点主机的内核中,所以DRBD是内核模块,在Linux2.6.33版本起开始整合进内核。

       上图假设左节点为活动节点(实箭头),右节点为备用节点。左节点接收到数据发往内核的数据通路,DRBD在数据通路中注册钩子检查数据(类似ipvs),当发现接收到的数据是发往到自己管理的存储位置,就复制另一份,一份存储到本机的DRBD存储设备,另一份就发给TCP/IP协议栈,通过网卡网络传输到另一节点主机的网上TCP/IP协议栈;而另一节点运行的DRBD模块同样在数据通路上检查数据,当发现传输过来的数据时,就存储到DRBD存储设备对应的位置。

       如果左节点宕机,右节点可以在高可用集群中成为活动节点,当接收到数据先存储到本地,当左节点恢复上线时,再把宕机后右节点变动的数据镜像到左节点。

       镜像过程完成后还需要返回成功/失败的回应消息,这个回应消息可以在传输过程中的不同位置返回,如图上的A/B/C标识位置,可以分为三种复制模式:

A:Async, 异步,本地写成功后立即返回,数据放在发送buffer中,可能丢失,但传输性能好;

B:semi sync, 半同步;

C:sync, 同步,本地和对方写成功确认后返回,数据可靠性高,一般都用这种;

1-2、DRBD 支持的底层设备

       DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在DRBD设备内创建文件系统。

       DRBD所支持的底层设备有这些类别:磁盘,或者是磁盘的某一个分区;soft raid 设备;LVM的逻辑卷;EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;或其他任何的块设备。

1-3,DRBD资源

      DRBD资源为DRBD管理的存储空间及相关信息,主要配置四个选项:

资源名称:可以是除了空白字符外的任意ACSII码字符;

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

磁盘:在双方节点上,各自提供的存储设备;

网络配置:双方数据同步时所使用的网络属性;

1-4,DRBD 配置工具

drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。

drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。

drbdmeta:管理META数据结构,平时很少直接用。

1-5,DRBD与RAID1区别

       RAID1也是实现不同存储设备间的数据镜像备份的,不同的是RAID1各存储设备是连接一个RAID控制器接入到一台主机上的,而DRBD是通过网络实现不同节点主机存储设备数据的镜像备份。

1-6、DRBD与集群共享存储

       如果各节点访问同一个数据文件都是在同一个存储空间内的,就是说数据共享的就一份,而这个存储空间就共享存储。

       而DRBD定义上就指出了"无共享"--不同节点存储设备空间是镜像,DRBD可以直接应用在主备模型的集群中,也可通过高可用软件如corosycn应用在双主模型集群中,不过这就需要DML/OCFS2/GFS2分布式集群文件系统为双主读写的时候分配锁;还有就是DRBD为NFS共享存储提供高可用镜像备份,等等…

2、相关准备配置

       注意这里不是配置高可用集群,所以corosync等并不需要。

2-1、具体使用资源

1、节点主机系统:RHEL 5.8 64bit

2、两台节点主机node1,node2:

Node1: IP:192.168.18.241 host name:node1.tjiyu,com;

Node2: IP:192.168.18.242 host name:node2.tjiyu.com;

 

3、DRBD:

Disk:/dev/sda5  1G

DRBD device:/dev/drbd0

DRBD resource:mydrbd

mountdirectory:/drbd

2-2、配置前所需要的准备

1、配置IP、关闭防火墙;

2、配置各节点名称;

前面说到的高可用集群已有详细介绍,这里就不再给出了。

2-3、创建磁盘分区

       但这需要分别在两节点主机上创建/dev/sda5的磁盘分区,注意这并不需要格式化,下面配置好DRBD并启动后,再格式化,因为文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化,这样就会连格式化后的全部信息都镜像到另一个节点,创建过程如下:

[root@node1 ~]# fdisk /dev/sda

[root@node1 ~]# partprobe /dev/sda

[root@node1 ~]# fdisk –l

     下面先将DRBD下载安装。

3、DRBD下载安装

       由于这里用到的是RHEL 5.8 64bit系统,使用的内核为2.6.18-308.el5,上面说到2.6.33版本起才开始整合进内核,所以系统中没有DRBD,但可以通过RPM包安装整合到内核中,注意内核版本与DRBD版本的兼容,可以到网址:http://vault.centos.org/5.8/extras/x86_64/RPMS/,下载能完全兼容centos5的比较新rpm包,下载drbd83-8.3.15-2.el5.centos.x86_64.rpm和kmod-drbd83-8.3.15-3.el5.centos.x86_64.rpm,前者是用户空间的管理配置工具,后者是DRBD内核核心模块(类似ipvsadm与ipvs),分别放到两节点主机上执行安装,过程如下:

[root@node1 ~]# yum --nogpgcheck localinstall *drbd*.rpm

两节点主机如上安装好,下面开始配置。

4、配置DRBD

       执行rpm -ql drbd83可以看DRBD安装的文件信息,其中/etc/drbd.conf是主配置文件,主要用来把全局配置文件和各资源配置文件(所有以.res结尾的文件)包含进来的;而其它模块配置文件在/etc/drbd.d/下,包括/etc/drbd.d/global_common.conf全局配置文件,下面将会配置的资源配置文件也会放到这里。

4-1、配置/etc/drbd.conf文件

       /etc/drbd.conf是主配置文件,主要用来把全局配置文件和各资源配置文件包含进来的,但安装后文件中没有配置任何东西,不过提示了一样例文件,直接复制样例文件使用,即可,里面配置了包含关系,如下:

 [root@node1 ~]# cp /usr/share/doc/drbd83-8.3.15/drbd.conf /etc/drbd.conf

4-2、配置global_common.conf配置文件

       /etc/drbd.d/global_common.conf全局配置文件,下面在原来的配置上主要改动了信息处理策略、磁盘出错处理和加密,vim /etc/drbd.d/global_common.conf进行配置后如下:

  1. global {  
  2.   
  3.     usage-count no;#不让linbit公司收集目前drbd的使用情况  
  4.   
  5.     # minor-count dialog-refresh disable-ip-verification  
  6.   
  7. }  
  8.   
  9. common {  
  10.   
  11.     protocol C;#上面说到的A/B/C复制模式,默认C,数据可靠性高  
  12.   
  13.     handlers {#信息处理的一些策略  
  14.   
  15.     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";  
  16.   
  17.     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";  
  18.   
  19.     local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";  
  20.   
  21.     # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";  
  22.   
  23.     # split-brain "/usr/lib/drbd/notify-split-brain.sh root";  
  24.   
  25.     # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";  
  26.   
  27.     # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";  
  28.   
  29.     # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;  
  30.   
  31. }  
  32.   
  33. startup {  
  34.   
  35.     # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb  
  36.   
  37. }  
  38.   
  39. disk {  
  40.   
  41.     # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes  
  42.   
  43.     # no-disk-drain no-md-flushes max-bio-bvecs  
  44.   
  45.     on-io-error detach;#同步IO错误的做法:分离该磁盘  
  46.   
  47. }  
  48.   
  49. net {  
  50.   
  51.     # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers  
  52.   
  53.     # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret  
  54.   
  55.     # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork  
  56.   
  57.     cram-hmac-alg "sha1";#设置加密算法sha1  
  58.   
  59.     shared-secret "mydrbdtjiyu";#设置加密随机key  
  60.   
  61. }  

4-3、配置DRBD资源

       每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义,这样就构成前面据说的四个配置选项。

      下面配置添加上面创建的两节点主机/dev/sda5分区为DRBD设备资源mydrbd,mydrbd.res文件配置如下 :

  1. resource mydrbd {  
  2.   
  3.     on node1.tjiyu.com {  
  4.   
  5.         device /dev/drbd0;  
  6.   
  7.         disk /dev/sda5;  
  8.   
  9.         address 192.168.18.241:7789;  
  10.   
  11.         meta-disk internal;  
  12.   
  13.     }  
  14.   
  15.     on node2.tjiyu.com {  
  16.   
  17.         device /dev/drbd0;  
  18.   
  19.         disk /dev/sda5;  
  20.   
  21.         address 192.168.18.242:7789;  
  22.   
  23.         meta-disk internal;  
  24.   
  25.     }  
  26.   
  27. }  

4-4、两个文件远程复制到node2

      上面在node1上配置好了这三个文件,可以直接远程复制到node2上:

[root@node1 ~]# scp /etc/drbd.conf node2:/etc/

[root@node1 ~]# scp /etc/drbd.d/{global_common.conf,mydrbd.res} node2:/etc/drbd.d

4-5、创建初始化DRBD设备元数据

       分别在两节点上创建DRBD设备元数据,但由于上面创建分区数据没有初始为0,所以创建失败(Command 'drbdmeta 0 v08 /dev/sda5 internal create-md' terminated with exit code 40),得先执行:

[root@node1 ~]# dd if=/dev/zero of=/dev/sda5 bs=1M count=100

      然后再创建,它会根据刚才的配置进行创建初始化:

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

4-6、启动DRBD服务

      分别在两节点上同时启动DRBD服务,注意只在一个节点是启动,另一个节点不启动,不会成功,需要在一个节点是启动后,立即启动另一个节点的服务,如下:

4-7、查看启动状态

      使用cat /proc/drbd或 drbd-overview可以查看DRBD的启动状态,可以看到启动,两节点都处理备用状态,没有上线:

[root@node1 ~]# drbd-overview

4-8、配置node1节点为Primary,并同步数据

      在要设置为Primary的节点上执行如下命令:

# drbdsetup /dev/drbd0 primary –o

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

# drbdadm -- --overwrite-data-of-peer primary web

      而后再次查看状态,可以发现数据同步过程已经开始:

# drbd-overview

0:mydrbd SyncSource Primary/Secondary UpToDate/Inconsistent C r-----

    [>....................] sync'ed: 1.7% (976888/987896)K

      等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:

# drbd-overview

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

      整个过程如下:

4-9、创建文件系统

       前面创建磁盘分区时也说过:文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化。现在可以在ndoe1上进行了,格式化后把它挂载到/drbd目录上,过程如下:

[root@node1 ~]# mke2fs -j /dev/drbd0

[root@node1 ~]# mkdir /drbd

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

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

[root@node1 ~]# ll /drbd

5、测试文件镜像复制

5-1、复制文件

      在ndoe1上把格式化后的DRBD设备挂载到/drbd目录上,然后复制drbd.conf文件进去测试,这时候DRBD自动镜像到node2上,过程如下

5-2、切换Primary和Secondary节点,查看镜像文件

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

      所以,在node1上先卸载DRBD目录,再设置为从节点:

      然后到node2上设置为主节点,再把目录挂载到/drbd,可以查看该目录下有前面复制进去的drbd.conf文件,说明前面在node1上复制文件进去的时候,DRBD自动镜像到node2上,过程如下:

 

6、DRBD脑裂

     如果配置过程中发生,DRBD脑裂问题,如下:

  1. blockdrbd0: Split-Brain detected but unresolved, dropping connection!  
  2.   
  3. blockdrbd0: meta connection shut down by peer.  
  4.   
  5. blockdrbd0: error receiving ReportState, l: 4!  
  6.   
  7. blockdrbd0: Discarding network configuration.  


     解决方法如下:

将Node1设置为主节点并挂载测试:

[root@node1 ~]#drbdadm primary mydrbd

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

[root@node1 ~]#ll /mydata/

将Node2设置为从节点并丢弃资源数据:

[root@node2 ~]#drbdadm secondary mydrbd

[root@node2 ~]#drbdadm -- --discard-my-data connect mydrbd

在Node1主节点上手动连接资源:

[root@node1~]# drbdadm connect mydrbd

      最后查看各个节点状态,连接已恢复正常,整个过程如下:

 

    

      到这里,配置DRBD 可以正常运行了,下面进行DRBD + corosync + pacemaker的mysql高可用集群的相关配置……

 

 

DRBD + corosync + pacemaker 配置mysql高可用集群

1、架构设计

具体架构资源如下:

1、节点主机系统:RHEL 5.8 64bit

2、高可用集群软件:corosync + pacemaker

3、两台节点主机node1,node2:

Node1: IP:192.168.18.241 host name:node1.tjiyu,com;

Node2: IP:192.168.18.242 host name:node2.tjiyu.com;

VIP: 192.168.18.240

4、DRBD:

Disk:/dev/sda5 1G

DRBD device:/dev/drbd0

DRBD resource:mydrbd

mount directory:/drbd

5、所提供服务:mysql

Data directory:/mydata/data (DRBD device)

两节点相同用户:mysql mysql(组) 3306(uid、gid)

2、相关准备配置

      本文是在前面的一些文章的配置基础上进行的,前面说到的集群高可用配置前所需要的准备,如:

1、配置IP、关闭防火墙;

2、配置各节点名称;

3、建立各节点间的SSH互信通信;

4、各节点间的时间同步;

5、corosync 和 pacemaker安装配置,配置corosync+pacemaker 可以正常运行;

6、DRBD安装配置,配置DRBD 可以正常运行;

      以上这些准备配置,这里就不再详细给出了。

3、配置mysql数据到DRBD

      mysql5.5版本相对5.6/5.7要小很多,就先用5.5的来测试;先到官网下载mysql-5.5.28-linux2.6-x86_64.tar.gz,放到两节点主机上;如果用yum安装反而比较麻烦,要做数据目录迁移等工作。

3-1、创建mysql用户

       集群系统各节点mysql用户都需要对挂载DRBD设备目录下的mysql数据文件进行读写操作,这就需要用户有对该目录的读写权限,为方便,我们在两台节点主机分别创建相同的普通用户:用户名mysql ,属于mysql组,uid、gid都为 3306(如果uid、gid不一样就得对目录分别配置权限),稍后会为它们配置/mydata/data目录的读写权限,创建过程如下

  1. [root@node1 ~]# groupadd -g 3306 mysql  
  2. [root@node1 ~]# useradd -u 3306 -g mysql -s /sbin/nologin -M mysql  
  3. [root@node1 ~]# id mysql   

3-2、解压mysql,并给mysql用户分配权限(node1)

      先在node1上对mysql进行初始化,首先解压mysql程序包,配置解压后程序目录文件的属组和属主为root组和上面创建的mysql用户:

  1. [root@node1 ~]# tar -xf mysql-5.5.28-linux2.6-x86_64.tar.gz -C /usr/local  
  2. [root@node1 ~]# cd /usr/local/  
  3. [root@node1 local]# ln -sv mysql-5.5.28-linux2.6-x86_64 mysql  

      创建指向"mysql-5.5.28-linux2.6-x86_64"的符号链接"mysql"

  1. [root@node1 local]# cd mysql  
  2. [root@node1 mysql]# chown -R root:mysql ./*  
  3. [root@node1 mysql]# ll  

3-3、初始化mysql配置(node1)

       注意,先查看DRBD状态,因为现在在node1上操作,查看DRBD的活动节点是不是node1,如果不是先转换。这里是按上篇测试后的配置,所以node2为活动节点,先转换,如下:

  1. Node2:  
  2.     [root@node2 ~]# drbd-overview  
  3.     [root@node2 ~]# umount /drbd/  
  4.     [root@node2 ~]# drbdadm secondary mydrbd  
  5. Node1:  
  6.     [root@node1 mysql]# drbdadm primary mydrbd  
  7.     [root@node1 mysql]# drbd-overview  

       然后创建DRBD设备的挂载目录/mydata,挂载后,再创建/mydata/data目录为mysql的数据目录,并为该目录配置上面创建的mysql用户/组为属主/属组,使其具有读写权限,如下:

  1. [root@node1 mysql]# mkdir /mydata  
  2. [root@node1 mysql]# mount /dev/drbd0 /mydata  
  3. [root@node1 mysql]# mkdir /mydata/data  
  4. [root@node1 mysql]# chown -R mysql.mysql /mydata/data/  
  5. [root@node1 mysql]# ll -d /mydata/data/  

       初始化mysql数据到/mydata/data目录,同时指定为mysql用户;完成查看数据目录下是否存在数据文件,并且属主和配置的致,配置过程如下:

  1. [root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/  
  2. [root@node1 mysql]# ls -l /mydata/data/  

3-4、配置mysql配置文件,并启动测试(node1)

      先把mysql配置文件my.cf放到/etc下,并添加mysql数据目录项datadir为上面配置的共享目录/mydata/data,以及加上每个innodb表为一个文件的配置;

datadir = /mydata/data

innodb_file_per_table = 1

      再把mysql服务脚本放到/etc/init.d/下(LSB),重命名mysqld,方便高可用集群的资源管理,然后配置禁止开机启动,配置如下:

  1. [root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf  
  2. [root@node1 mysql]# vim /etc/my.cnf  
  3. [root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld  
  4. [root@node1 mysql]# chkconfig --add mysqld  
  5. [root@node1 mysql]# chkconfig mysqld off  
  6. [root@node1 mysql]# chkconfig --list mysqld  

     启动mysql服务,并进行创建数据库的测试,如下:

  1. [root@node1 mysql]# service mysqld start  
  2. [root@node1 mysql]# ./bin/mysql  
  3. mysql> create database tjuyi_db;  
  4. mysql> show databases;  

3-5、node2配置mysql,并启动测试

       上面node1测试好的,接着转到node2上进行mysql的相关配置。

       首先像在4-1一样,在node2上解压mysql程序包,配置解压后程序目录文件的属组和属主为root组和上面创建的mysql用户;

       然后远程复制node1上刚才配置的两个文件/etc/my.cnf和/etc/init.d/mysqld到node2相同位置,配置mysqld禁止开机启动,这就行了,和在node1上配置差不多,区别是不需要进行初始化数据到共享目录,因为在node1初始化的时候,DRBD已经把相关文件也同步到node2上,具体过程如下:

  1. [root@node1 mysql]# scp -p /etc/my.cnf node2:/etc  
  2. [root@node1 mysql]# scp -p /etc/init.d/mysqld node2:/etc/init.d/  

       启动mysql服务前,先停止node1上的mysql服务,然后切换Primary和Secondary节点,使node2成为活动节点:

  1. Node1:  
  2.     [root@node1 mysql]# service mysqld stop  
  3.     [root@node1 mysql]# umount /mydata  
  4.     [root@node1 mysql]# drbdadm secondary mydrbd  
  5.     [root@node1 mysql]# drbd-overview  
  6. Node2:  
  7.     [root@node2 mysql]# drbdadm primary mydrbd  
  8.     [root@node2 mysql]# drbd-overview  

      接着在node2上创建DRBD设备的挂载目录/mydata,并挂载,可以看到/mydata/data下存在了mysql初始化的相关文件

  1. [root@node2 mysql]# mkdir /mydata  
  2. [root@node2 mysql]# mount /dev/drbd0 /mydata/  
  3. [root@node2 mysql]# ll /mydata/data/  

      然后在node2上启动mysql服务,进行测试,可以看到在node1上创建的tjiyu_db数据库,如下:

  1. [root@node2 mysql]# service mysqld start  
  2. [root@node2 mysql]# ./bin/mysql  
  3.     mysql> show databases;  

      以上测试说明了,在node1初始化mysql和操作mysql数据(创建数据)的时候,DRBD自动把相关文件也同步到node2上。

4、配置高可用集群资源

 下面将用crm sh来配置DRBD、DRBD设备存储、mysql和VIP四个集群资源,以及它们间资源约束。

4-1、停止mysql和DRBD服务,开启corosync

      上面测试好后,开始配置集群资源前,需要先停止mysql服务,并停止两节点上的DRBD服务,以及禁止开机启动,如下:

  1. Node2:  
  2.     [root@node2 mysql]# service mysqld stop  
  3.     [root@node2 mysql]# umount /mydata  
  4.     [root@node2 mysql]# drbdadm secondary mydrbd  
  5.     [root@node2 mysql]# service drbd stop  
  6.     [root@node2 mysql]# chkconfig --list drbd  
  7.     [root@node2 mysql]# chkconfig drbd off  
  8.     [root@node2 mysql]# chkconfig --list drbd  
  9. Node1:  
  10.     [root@node1 mysql]# service drbd stop  
  11.     [root@node1 mysql]# chkconfig drbd off  
  12.     [root@node1 mysql]# chkconfig --list drbd  

      启动两节点上的corosync服务,并保证都是在线状态:

  1. [root@node1 ~]# service corosync start  
  2. [root@node1 ~]# ssh node2 'service corosync start'  
  3. [root@node1 ~]# crm  
  4. crm(live)# status  
  5. crm(live)# node  
  6. crm(live)node# online  
  7. crm(live)node# online node2.tjiyu.com  
  8. crm(live)node# cd ..  
  9. crm(live)# status  

4-2、解决STONITH和不满足合法票数的问题

      先解决刚开始默认STONITH配置错误,因为没有STONITH设备,修改默认属性配置,如下:

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

       不满足合法票数的问题,可以通过如下的命令来修改忽略quorum不能满足的集群状态检查:

  1. crm(live)configure# property no-quorum-policy=ignore  
  2. crm(live)configure# verify  
  3. crm(live)configure# commit  

4-3、配置DRBD资源

      可用crm(live)ra# info drbd查看DRBD资源代理相关信息,发现给出的是ocf:heartbeat:drbd,这应该是版本问题,下面还是用官方的ocf:linbit:drbd;

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

  1. [root@node1 ~]# crm  
  2. crm(live)# configure  
  3. crm(live)configure# primitive res_drbd ocf:linbit:drbd params drbd_resource=mydrbd op start timeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30  
  4. crm(live)configure# ms ms_drbd res_drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true  
  5. crm(live)configure# show  
  6. crm(live)configure# verify  
  7. crm(live)configure# commit  
  8. crm(live)configure# cd ..  
  9. crm(live)# status   

       配置后,发现DRBD服务的Primary节点为node1,Secondary节点为node2,如下:

4-4、配置DRBD设备存储资源

       ms_drbd的Master节点node1即为drbd服务资源的Primary节点,此节点的设备/dev/drbd0可以挂载使用,且在集群服务的应用当中需要能够实现自动挂载,挂载至mysql数据目录/mydata,如下:

  1. crm(live)configure# primitive res_storage ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60  
  2. crm(live)configure# verify  
  3. crm(live)configure# show  
  4. crm(live)configure# cd ..  
  5. There are changes pending. Do you want to commit them? y  
  6. crm(live)# status  

4-5、配置mysql和VIP资源

       把最后两个资源配置了,查看状态,发现node2上启动不了mysql,这是因为数据存储资源运行在node1,所以下面还需要配置资源约束,让它们运行在活动节点,如下:

  1. crm(live)configure# primitive mysqld lsb:mysqld  
  2. crm(live)configure# verify  
  3. crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.18.240 nic=eth0 cidr_netmask=255.255.255.0  
  4. crm(live)configure# verify  
  5. crm(live)configure# commit  
  6. crm(live)configure# cd ..  
  7. crm(live)# status  

4-6、配置排列(协同)约束

       mysql服务资源mysqld依赖于DRBD存储资源res_storage,DRBD存储资源res_storage依赖于DRBD服务主资源ms_drbd:Master,DRBD服务主资源ms_drbd:Master依赖于VIP资源vip(注意:一定是DRBD服务主资源ms_drbd:Master,如果没有后面的Master,集群是无法正常式作的,还有可能导致DRBD脑裂),配置如下:

  1. crm(live)configure# colocation mysqld_with_storage inf: mysqld res_storage  
  2. crm(live)configure# colocation storage_with_ms_drbd inf: res_storage ms_drbd:Master  
  3. crm(live)configure# colocation ms_drbd_with_vip inf: ms_drbd:Master vip  
  4. crm(live)configure# verify  
  5. crm(live)configure# commit   

4-7、配置顺序约束

        mysql服务资源mysqld在启动DRBD存储资源res_storage后再启动,DRBD存储资源res_storage在启动DRBD服务主从资源ms_drbd后再启动(注意:res_storage只有在DRBD服务主从资源ms_drbd处于promote状态,也就是DRBD服务成功了主从切换后,其才能进行挂载,否则集群是无法正常式作的,还有可能导致DRBD脑裂),配置如下:

  1. crm(live)configure# order mysqld_after_storage mandatory: res_storage mysqld  
  2. crm(live)configure# order storage_after_ms_drbd mandatory: ms_drbd:promote res_storage:start  
  3. crm(live)configure# verify  
  4. crm(live)configure# commit  

       最后提交的信息如下:

5、测试

5-1、清理资源错误状态

       上面配置好后,有的资源启动可能会发生错误,因为刚开始资源不在一个节点。把资源状态都清理一下,让它们按配置再重新启动就好了,可以看到全部资源都运行在了node2上,如下:

  1. crm(live)# resource  
  2. crm(live)resource# cleanup ms_drbd  
  3. crm(live)resource# cleanup res_storage  
  4. crm(live)resource# cleanup mysqld  

5-2、测试node2的mysql

       从上面知道,各资源在node2上正常运行,我们就先在node2上的mysql给root分配权限和设置密码,如下:

  1. [root@node2 ~]# /usr/local/mysql/bin/mysql  
  2. mysql> GRANT ALL ON *.* to 'root'@'%' IDENTIFIED BY '123456';  
  3. mysql> FLUSH PRIVILEGES;  

        然后在客户端上用VIP远程登录mysql,正常登录,看到里面有前面创建的tjiyu_db数据库;并且在里面新建drbd_db数据库,库内新建test表,如下:

5-3、切换到node1上,进行测试

      在资源活动节点node2上操作,使node2成为备节点, node1成为主节点,让各资源转移到node1上,并正常运行,然后使node2再次上线,如下:

  1. crm(live)# node  
  2. crm(live)node# standby  
  3. crm(live)node# cd ..  
  4. crm(live)# status  
  5. crm(live)# node  
  6. crm(live)node# online  
  7. crm(live)node# cd ..  
  8. crm(live)# status  

      再通过客户端上用VIP远程登录mysql,正常登录,并且可以看到在node2上创建drbd_db库和test表:

      到这里,配置DRBD + corosync + pacemaker的mysql高可用集群就可以正常运行了,后面将会继续关注分布式文件系统和其他高可用方案……

posted @ 2017-09-16 17:49  chenghuan  阅读(571)  评论(0编辑  收藏