基于pacemaker和drbd提供mysql高可用

1.DRBD基本介绍

DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。它是由内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能,也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的),所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
   在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。

   DRBD结构示意图:


2.下面首先来配置DRBD:

前提:

1)本配置共有两个测试节点,分别node1.luojianlong.com和node2.luojianlong.com,相的IP地址分别为192.168.30.116和192.168.30.117;

2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sdb1,大小为10G;

3)系统为CentOS 6.4,x86_64平台;


准备工作:

两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:

[root@node1 ~]# cat /etc/hosts
192.168.30.116 node1.luojianlong.com node1
192.168.30.117 node2.luojianlong.com node2
[root@node2 ~]# cat /etc/hosts
192.168.30.116 node1.luojianlong.com node1
192.168.30.117 node2.luojianlong.com node2


为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:


[root@node1 ~]# sed -i ‘s@\(HOSTNAME=\).*@\1node1.magedu.com@g‘ /etc/sysconfig/network
[root@node2 ~]# sed -i ‘s@\(HOSTNAME=\).*@\1node2.magedu.com@g‘ /etc/sysconfig/network


安装软件包


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


目前适用CentOS 5的drbd版本主要有8.0、8.2、8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。而适用于CentOS 6的版本为8.4,其对应的rpm包为drbd和drbd-kmdl,但在实际选用时,要切记两点:drbd和drbd-kmdl的版本要对应;另一个是drbd-kmdl的版本要与当前系统的内容版本相对应。各版本的功能和配置等略有差异;我们实验所用的平台为x86_64且系统为CentOS 6.4,因此需要同时安装内核模块和管理工具。我们这里选用最新的8.4的版本(drbd-8.4.3-33.el6.x86_64.rpm和drbd-kmdl-2.6.32-431.3.1.el6-8.4.3-33.el6.x86_64.rpm),下载地址为ftp://rpmfind.net/linux/atrpms/


[root@node1 ~]# wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/drbd-8.4.3-33.el6.x86_64.rpm
[root@node1 ~]# wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/drbd-kmdl-2.6.32-431.3.1.el6-8.4.3-33.el6.x86_64.rpm
[root@node1 ~]# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.3.1.el6-8.4.3-33.el6.x86_64.rpm
[root@node1 ~]# scp drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.3.1.el6-8.4.3-33.el6.x86_64.rpm node2.luojianlong.com:/root/
[root@node2 ~]# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.3.1.el6-8.4.3-33.el6.x86_64.rpm


创建用于drbd的磁盘设备:

[root@node1 ~]# fdisk /dev/sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305):      
Using default value 1305
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3ac91d3f
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1305    10482381   83  Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy).  As a result, it may not reflect all of your changes until after reboot.

在node2上执行相同的操作,重启系统。

[root@node1 ~]# cat /proc/partitions
major minor  #blocks  name
   8        0   31457280 sda
   8        1     512000 sda1
   8        2   30944256 sda2
   8       16   10485760 sdb
   8       17   10482381 sdb1
 253        0   26877952 dm-0
 253        1    4063232 dm-1
[root@node2 ~]# cat /proc/partitions
major minor  #blocks  name
   8        0   31457280 sda
   8        1     512000 sda1
   8        2   30944256 sda2
   8       16   10485760 sdb
   8       17   10482381 sdb1
 253        0   26877952 dm-0
 253        1    4063232 dm-1





配置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的默认中进行继承而无须定义。


下面的操作在node1.luojianlong.com完成

[root@node1 ~]# mv /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak
[root@node1 ~]# vi /etc/drbd.d/global_common.conf
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";
                # 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;
        }
}


定义一个资源/etc/drbd.d/web.res

[root@node1 ~]# vi /etc/drbd.d/web.res
resource web {
  on node1.luojianlong.com {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   192.168.30.116:7789;
    meta-disk internal;
  }
  on node2.luojianlong.com {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   192.168.30.117:7789;
    meta-disk internal;
  }
}


以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点

[root@node1 ~]# scp /etc/drbd.d/* node2.luojianlong.com:/etc/drbd.d/


在两个节点上初始化已定义的资源并启动服务:


# 初始化资源,在Node1和Node2上分别执行:
[root@node1 ~]# drbdadm create-md web
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 ~]# drbdadm create-md web
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
# 启动服务,在Node1和Node2上分别执行:
[root@node1 ~]# /etc/init.d/drbd start
# 查看启动状态:
[root@node1 ~]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2014-01-05 14:30:44
 0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----s
    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:10482024
[root@node2 ~]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2014-01-05 14:30:44
 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:10482024
# 也可以使用drbd-overview命令来查看
[root@node2 ~]# drbd-overview
  0:web/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
[root@node1 ~]# drbd-overview
  0:web/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----


[root@node1 ~]# drbd-overview
  0:web/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary web
# 而后再次查看状态,可以发现数据同步过程已经开始
[root@node1 ~]# drbd-overview
  0:web/0  SyncSource Primary/Secondary UpToDate/Inconsistent C r---n-
    [>...................] sync‘ed:  5.5% (9684/10236)M


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

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


创建文件系统

[root@node1 ~]# mke2fs -j -L DRBD /dev/drbd0
[root@node1 ~]# mkdir /mnt/drbd
[root@node1 ~]# mount /dev/drbd0 /mnt/drbd


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


[root@node1 ~]# cp /etc/fstab /mnt/drbd/
[root@node1 ~]# umount /mnt/drbd/
[root@node1 ~]# drbdadm secondary web
[root@node1 ~]# drbd-overview
  0:web/0  Connected Secondary/Secondary UpToDate/UpToDate C r-----
[root@node2 ~]# drbdadm primary web
[root@node2 ~]# drbd-overview
  0:web/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
[root@node2 ~]# mkdir /mnt/drbd
[root@node2 ~]# mount /dev/drbd0 /mnt/drbd/
[root@node2 ~]# ls /mnt/drbd/
fstab  lost+found


本文出自 “龍行天下” 博客,请务必保留此出处http://luojianlong.blog.51cto.com/4412415/1384294

基于pacemaker和drbd提供mysql高可用,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。