mysql+drbd+heartbeat

1.Drbd是基于块设备的高可用集群,所以在使用drbd 之前我需要创建一个分区(mysql-a和mysql-b都要去创建分区。分区为/dev/sdb1

当然分区也可以一样,也可以不一样,可以在drbd的配置文件指定。

第一步,节点上分区

[root@mysql-a /]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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: 0xf5c6ec8b

 

   Device Boot      Start        End      Blocks  Id  System

/dev/sdb1              1        2610    20964793+ 83  Linux

[root@mysql-b /]# fdisk -l /dev/sdb

 

Disk /dev/sdb: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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: 0x274e7b9c

 

   Device Boot      Start         End      Blocks  Id  System

/dev/sdb1              1        2610    20964793+ 83  Linux

第二步安装drbd

解压后

安装之前的准备工作

参考资料 

http://drbd.linbit.com/users-guide-8.4/ap-man-pages.html   drbd的手册页 主要包括drbd.confConfigurationfile for DRBD's devices

drbdadmAdministrationtool for DRBD

drbdsetupSetuptool for DRBD

drbdmetaDRBD'smeta data management tool

http://drbd.linbit.com/users-guide-8.4/  版本手册

http://drbd.linbit.com/users-guide-8.4/s-build-from-source.html#s-build-prepare-checkout安装参考资料

阅读完安装手册进行安装

make, gcc, the glibcdevelopment libraries, and the flex scanner generator must be installed

[root@mysql-a drbd-8.4.4]#  ./configure --prefix=/usr/local/drbd--localstatedir=/usr/local/ --sysconfdir=/etc --with-km

[root@mysql-a drbd-8.4.4]# make && make install

CompilingDRBD as a kernel module

[root@mysql-a drbd-8.4.4]# cd drbd

[root@mysql-a drbd]# make clean all 

Buildingagainst precompiled kernel headers

查看当前我正在用的内核,将机器重启看到我又更新内核

我使用的是2.6.32.-504.8.1

[root@mysql-a drbd]# make clean

rm -rf .tmp_versions Module.markers Module.symversmodules.order

rm -f *.[oas] *.ko .*NaNd .*.d .*.tmp *.mod.c .*.flags.depend .kernel*

rm -f compat/*.[oas] compat/.*NaNd

[root@mysql-a drbd]# make KDIR=/lib/modules/2.6.32-504.8.1.el6.x86_64/build/

Buildingagainst a kernel source tree

[root@mysql-a drbd]# make clean

rm -rf .tmp_versions Module.markers Module.symversmodules.order

rm -f *.[oas] *.ko .*NaNd .*.d .*.tmp *.mod.c .*.flags.depend .kernel*

rm -f compat/*.[oas] compat/.*NaNd

[root@mysql-a drbd]# makeKDIR=/lib/modules/2.6.32-504.8.1.el6.x86_64/source

 

Using anon-default C compiler

[root@mysql-a drbd]# make clean

rm -rf .tmp_versions Module.markers Module.symvers modules.order

rm -f *.[oas] *.ko .*NaNd .*.d .*.tmp *.mod.c .*.flags.depend .kernel*

rm -f compat/*.[oas] compat/.*NaNd

[root@mysql-a drbd]# make CC=gcc

检查

If themodule build completes successfully, you should see a kernel module file named drbd.ko in the drbd directory. You mayinterrogate the newly-built module with /sbin/modinfo drbd.ko if you are soinclined.

[root@mysql-a kernels]# find / -namedrbd.ko

/usr/local/src/drbd-8.4.4/drbd/drbd.ko

/lib/modules/2.6.32-504.8.1.el6.x86_64/updates/drbd.ko

查看drbd的配置文件,因为我安装的时候指定drbd配置文件的路径为/etc/可以直接去/etc/修改

[root@mysql-a kernels]# cd /etc/dr

dracut.conf   dracut.conf.d/ drbd.conf     drbd.d/       

[root@mysql-a kernels]# cd /etc/drbd.conf

[root@mysql-a /]# ls /etc/init.d/drbd   也不需要去cp启动脚本了 发现这样好方便

/etc/init.d/drbd

[root@mysql-a /]#

修改drbd的配置文件

http://drbd.linbit.com/users-guide-8.4/re-drbdconf.html   drbd.conf 官网说明

配置参考

http://drbd.linbit.com/users-guide/s-configure-resource.html#s-drbdconf-example 

 

[root@mysql-a /]# 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";

The file /etc/drbd.conf is read bydrbdadm.   Drbdadm 是读取drbd.conf 这个主配置文件的,但是默认drbd里面又是读取

include "drbd.d/global_common.conf";

include "drbd.d/*.res";

这两个文件,我们可以去找到drbd.conf.example 模板直接修改drbd.conf 可以分别去修改这个文件

include "drbd.d/global_common.conf";

include "drbd.d/*.res";

然后在drbd.conf 启用加载这两个文件就可以了。

[root@mysql-a /]#find / -name drbd.conf.example

/usr/local/src/drbd-8.4.4/scripts/drbd.conf.example

[root@mysql-a /]#cp /usr/local/src/drbd-8.4.4/scripts/drbd.conf.example /etc/drbd.conf

cp: overwrite`/etc/drbd.conf'? y

drbd不建议使用模板的drbd.conf 去配置,那样的配置比较混乱,容易出错。

drbd 参数介绍

[root@mysql-a ~]# scp /etc/drbd.d/*  20.0.0.36:/etc/drbd.d/     将修改的drbd.d 下的配置文件拷贝到备节点上启动drbd测试

初始化元数据 两个节点都需要执行  http://drbd.linbit.com/users-guide-8.4/s-first-time-up.html

drbd的配置文件参数

[root@mysql-aetc]# cat /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";

[root@mysql-aetc]# egrep -v "#|^$" /etc/drbd.d/global_common.conf   把带#的都过滤掉

global {

        usage-countno;

}

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

        }

        startup {

               wfc-timeout 120;

               degr-wfc-timeout 120;  

        }

        options {

        }

        disk {

                on-io-error   detach;

            }

        net {

                cram-hmac-alg"sha1";

               shared-secret "allendrbd";

        }

        syncer {

          rate100M;

}

}

 [root@mysql-a etc]# cat/etc/drbd.d/drbd_mysql.res         

resource r0 {

 

        on mysql-a{

               device    /dev/drbd0;

                disk      /dev/sdb1;

               meta-disk internal;

               address   40.0.0.1:7789;

                }

        on mysql-b{

               device    /dev/drbd0;

               disk      /dev/sdb1;

               meta-disk internal;

               address   40.0.0.2:7789;

               }

}

在配置drbd的时候心跳是一个网段,数据同步是一个网段,业务是一个网段

Drbd 开始初始化元数据

[root@mysql-a ~]#drbdadm create-md r0                  

  --==  Thank you for participating in the globalusage survey  ==--

The server's response is:

 

you are the 3978th user to install this version

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.

success

 [root@mysql-b drbd.d]# drbdadmcreate-md r0              

  --==  Thank you for participating in the globalusage survey  ==--

The server's response is:

 

you are the 3979th user to install this version

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.

success

启动drbd 两个节点都启动 ,注意启动a节点的时候再去启动b节点,此时ab两个节点会进行通信

 [root@mysql-a ~]# /etc/init.d/drbd start  也可以使用drbdadm 去启动  参数 [root@mysql-b /]#drbdadm �Chelp 去查看参数

Starting DRBD resources: [

     create res:r0/usr/local/run/drbd: No such file or directory

 

   prepare disk:r0/usr/local/run/drbd: No such file or directory

 

    adjust disk: r0

     adjust net: r0

]

outdated-wfc-timeout has to be shorter thandegr-wfc-timeout

outdated-wfc-timeout implicitly set to degr-wfc-timeout(120s)

..........

***************************************************************

 DRBD's startupscript waits for the peer node(s) to appear.

 - In case thisnode was already a degraded cluster before the

   reboot thetimeout is 120 seconds. [degr-wfc-timeout]

 - If the peer wasavailable before the reboot the timeout will

   expire after 120seconds. [wfc-timeout]

   (These valuesare for resource 'r0'; 0 sec -> wait forever)

 To abort waitingenter 'yes' [  23]:yes

[root@mysql-a ~]#

 [root@mysql-b drbd.d]#/etc/init.d/drbd start

Starting DRBD resources: [

     create res:r0/usr/local/run/drbd: No such file or directory

 

   prepare disk:r0/usr/local/run/drbd: No such file or directory

 

    adjust disk: r0

     adjust net: r0

]

outdated-wfc-timeout has to be shorter thandegr-wfc-timeout

outdated-wfc-timeout implicitly set to degr-wfc-timeout(120s)

..........

***************************************************************

 DRBD's startupscript waits for the peer node(s) to appear.

 - In case thisnode was already a degraded cluster before the

   reboot the timeout is 120 seconds.[degr-wfc-timeout]

 - If the peer wasavailable before the reboot the timeout will

   expire after 120seconds. [wfc-timeout]

   (These valuesare for resource 'r0'; 0 sec -> wait forever)

 To abort waitingenter 'yes' [  11]:

[root@mysql-b drbd.d]#

在任意节点查看节点状态

[root@mysql-a ~]#cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-a, 2015-03-12 23:44:42

 

 1: cs:Connectedro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----

    ns:0 nr:0 dw:0dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20964116

[root@mysql-a ~]#

[[email protected]]# cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build byroot@mysql-b, 2015-03-13 19:58:56

 

 1: cs:Connectedro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----

    ns:0 nr:0 dw:0dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20964116

初始化设备同步,手动设置主备节点

默认是没有主次之分的,需要手动设置

[root@mysql-a ~]# drbdadm primary all  设置主节点

[root@mysql-b drbd.d]# cat /proc/drbd                    

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-b, 2015-03-13 19:58:56

 0: cs:SyncTargetro:Secondary/Secondary ds:Inconsistent/UpToDate C r-----

    ns:0 nr:439296dw:439296 dr:0 al:0 bm:26 lo:1 pe:3 ua:0 ap:0 ep:1 wo:f oos:20524820

       [>....................] sync'ed: 2.2% (20040/20472)M

        finish: 0:08:33speed: 39,936 (39,936) want: 78,120 K/sec

[root@mysql-a drbd.d]# cat /proc/drbd                    

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-a, 2015-03-12 23:44:42

 0: cs:SyncSourcero:Secondary/Secondary ds:UpToDate/Inconsistent C r-----

    ns:831488 nr:0dw:0 dr:831488 al:0 bm:50 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20132628

       [>....................] sync'ed: 4.0% (19660/20472)M

        finish:0:08:28 speed: 39,536 (39,592) K/sec

参数说明我的资源为r0

此时两个节点上都显示的是从,需要手动去配置主 从节点

在主节点上手动设置drbd 主从关系

[root@mysql-a etc]# drbdadm �Chelp  参数

           

如果有以下提示需要执行:

[root@mysql-a ~]# drbdadm primary all   设置主从有提示依次执行以下命令

0: State change failed: (-2) Need access to UpToDate data

Command 'drbdsetup primary 0' terminated with exit code17

[root@mysql-a ~]# drbdadm -- --overwrite-data-of-peerprimary all

[root@mysql-a ~]# drbdadm primary all 

[root@mysql-a ~]# cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-a, 2015-03-17 06:28:45

 0: cs:SyncSourcero:Primary/Secondary ds:UpToDate/Inconsistent C r-----

    ns:4277528 nr:0dw:0 dr:4279960 al:0 bm:261 lo:1 pe:1 ua:3 ap:0 ep:1 wo:f oos:16686868

       [===>................] sync'ed: 20.5% (16292/20472)M   元数据正在同步

        finish:0:06:29 speed: 42,852 (32,400) K/se

[root@mysql-b ~]# cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-b, 2015-03-17 06:29:19

 0: cs:SyncTargetro:Secondary/Primary ds:Inconsistent/UpToDate C r-----

    ns:0 nr:5178368dw:5178368 dr:0 al:0 bm:316 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:15785748

       [===>................] sync'ed: 24.8% (15412/20472)M

        finish:0:06:06 speed: 43,064 (33,624) want: 41,000 K/sec

[root@mysql-a /]# mkfs.ext4 /dev/drbd0   只需要在主节点进行格式化分区

挂载drbd0 到mysql的数据存储位置

[root@mysql-a data]# /etc/init.d/mysql status 

 SUCCESS! MySQLrunning (1308)

[root@mysql-a data]# /etc/init.d/mysql stop

Shutting down MySQL... SUCCESS!

[root@mysql-a data]# ls

auto.cnf ib_logfile0  mysql        mysql-a.pid         test

ibdata1  ib_logfile1  mysql-a.err  performance_schema

[root@mysql-a data]# /etc/init.d/mysql stop

Shutting down MySQL.. SUCCESS!

[root@mysql-a data]# mv * /mnt/

[root@mysql-a /]# mount /dev/drbd0 /data/

[root@mysql-a /]# cd /mnt/

[root@mysql-a mnt]# ls

auto.cnf ibdata1  ib_logfile0  ib_logfile1 mysql  mysql-a.err  performance_schema  test

[root@mysql-a mnt]# mv * /data/

B节点也需要去清空以下mysql的元数据

[root@mysql-a mnt]# /etc/init.d/mysql start

Starting MySQL...... ERROR! The server quit withoutupdating PID file (/data/mysql-a.pid)

[root@mysql-a /]# chown -R mysql. /data/

[root@mysql-a mnt]# /etc/init.d/mysql restart

Shutting down MySQL.. SUCCESS!

Starting MySQL..... SUCCESS!

[root@mysql-a /]# mysql -uroot mysql可以正常登陆,

然后在主节点卸载umount /data

然后在从节点上进行挂载,看数据是否ok。

Drbd 测试

[root@mysql-a ~]# drbdadm secondary r0    将主节点设置为从

[root@mysql-a ~]# cat /proc/drbd           

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-a, 2015-03-17 06:28:45

 0: cs:Connectedro:Secondary/Secondary ds:UpToDate/UpToDate C r-----

    ns:0 nr:28672dw:28672 dr:664 al:0 bm:5 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@mysql-b ~]# drbdadm primary r0

[root@mysql-b ~]# cat /proc/drbd   

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-b, 2015-03-17 06:29:19

 0: cs:Connectedro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:28672 nr:0dw:0 dr:29336 al:0 bm:5 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

手动切换造成drbd 脑裂 处理方法:

处理方法:

第一步在从节点上:

[root@mysql-a /]# drbdadm disconnect r0

r0: Failure: (162) Invalid configuration request

additional info from kernel:

unknown connection

Command 'drbdsetup disconnect ipv4:30.0.0.1:7789ipv4:30.0.0.2:7789' terminated with exit code 10

[root@mysql-a /]# drbdadm secondary r0

[root@mysql-a /]# drbdadm connect  --discard-my-data r0

[root@mysql-a /]# cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-a, 2015-03-17 06:28:45

 0: cs:WFConnectionro:Primary/Unknown ds:UpToDate/Outdated C r-----

    ns:0 nr:0 dw:0dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:668436

查看还是报错

在主节点上面的处理

[root@mysql-b log]# drbdadm connect r0

[root@mysql-b log]# drbdadm role r0

Secondary/Primary

再去1节点查看状态

[root@mysql-a /]# drbdadm role r0

Primary/Secondary

故障解决

[root@mysql-a /]# drbdadm dstate r0   查看硬盘状态正常

UpToDate/UpToDate

Yum安装heartbeat

http://www.linux-ha.org/wiki/Downloads  linux-ha官网的提供的yum源

http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/

但是官网没有heartbeat 

wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm 安装yum源

[root@mysql-a local]# yum install heartbeat* 

[root@mysql-a local]# yum -y install pacemaker*  集群管理器

配置heartbeat

[root@mysql-a /]# cd /usr/share/doc/heartbeat-3.0.4/

[root@mysql-a heartbeat-3.0.4]# ls

apphbd.cf  authkeys AUTHORS  ChangeLog  COPYING COPYING.LGPL  ha.cf haresources  README

[root@mysql-a heartbeat-3.0.4]# cp authkeys ha.cfharesources  /etc/ha.d/   拷贝模板文件到/etc/ha.d/ 目录中

[root@mysql-b ~]# egrep -v "#|^$"  /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility    local0

keepalive 2

deadtime 10

warntime 5

initdead 30

udpport 694

baud    19200

ucast eth1 30.0.0.2

auto_failback off

node    mysql-a

node    mysql-b

ping 30.0.0.10

respawn hacluster /usr/lib64/heartbeat/ipfail

[root@mysql-b ~]# egrep -v "#|^$"  /etc/ha.d/haresources

mysql-a IPaddr::20.0.0.252/8/eth0:1 drbddisk::r0  Filesystem::/dev/drbd0::/data::ext4 mysql

[root@mysql-b ~]# egrep -v "#|^$"  /etc/ha.d/authkeys

auth 2

2 sha1 oldboy!

[root@mysql-b ~]# 

启动heartbeat

在实际操作中遇到drbd脑裂问题处理

[root@mysql-a ~]# netstat �Cltuanp查看心跳ip是否正常

[root@mysql-b ~]# cat /proc/drbd

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

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a buildby root@mysql-b, 2015-03-17 06:29:19

 0: cs:StandAlonero:Primary/Unknown ds:UpToDate/DUnknown  r-----

    ns:0 nr:0dw:256 dr:6889 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:364

解决思路:

 在从节点上

drbdadm secondary r0

drbdadm -- --discard-my-data connect r0

在到主节点上

drbdadm connect r0

解决脑裂

集群测试!

断掉心跳线, 节点关机,vip是否正常切换


你可能感兴趣的:(虚拟机,防火墙,主机)