Heartbeat+drbd 双机热备+mysql

1.  heartbeat

用于搭建双机热备环境,可以通过专门的心跳线来连接双机,也可以通过普通的网线来连接。

下载地址http://www.linux-ha.org/

2.  drbd

通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

下载地址http://www.drbd.org/

 

heartbeat可以独立完成双机热备功能

drbd用于镜像主备机之间的数据,不需要可不安装

 

Heartbeat安装

本文中使用yum服务自动安装heartbeat全部程序

版本为heartbeat-2.1.3-3.x86_64

注:所有节点都要安装,并且配置一样

 

.安装heartbeat

  1.首先,我安装这个软件的时候用的搜狐的yum源;只需要执行以下两步,就会自动给你安

装一个可用的yum

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

  # rpm -ivh epel-release-6-7.noarch.rpm

   这时,在我们的/etc/yum.repos.d里面就会多出两个yum

  2.安装好yum源,之后,我们就可以用yum安装heartbeat了,一键搞定的

   # yum install heartbeat* -y

  3.下面,我们就要找到heartbeat的配置文件,但是,我们的配置目录中是找不到它的配

置文件的,这时候,我们可以先进入配置文件目录

   # cd /etc/ha.d/

   这样进去之后,会发现README.config这个配置文件,我们进去看一下

   # vim README.config

   有一段内容如下:

   If you installed heartbeat using rpm packages then

this command will show you where they are on your system:

                rpm -q heartbeat -d

   这段是告诉我们要rpm -q heartbeat -d这个命令来找到配置文件

   # rpm -qd heartbeat

    执行完这个命令之后,我们可以看到如下内容:

/usr/share/doc/heartbeat-3.0.4/AUTHORS

/usr/share/doc/heartbeat-3.0.4/COPYING

/usr/share/doc/heartbeat-3.0.4/COPYING.LGPL

/usr/share/doc/heartbeat-3.0.4/ChangeLog

/usr/share/doc/heartbeat-3.0.4/README

/usr/share/doc/heartbeat-3.0.4/apphbd.cf

/usr/share/doc/heartbeat-3.0.4/authkeys

/usr/share/doc/heartbeat-3.0.4/ha.cf

/usr/share/doc/heartbeat-3.0.4/haresources

/usr/share/man/man1/cl_status.1.gz

/usr/share/man/man1/hb_addnode.1.gz

/usr/share/man/man1/hb_delnode.1.gz

/usr/share/man/man1/hb_standby.1.gz

/usr/share/man/man1/hb_takeover.1.gz

/usr/share/man/man5/authkeys.5.gz

/usr/share/man/man5/ha.cf.5.gz

/usr/share/man/man8/apphbd.8.gz

/usr/share/man/man8/heartbeat.8.gz

   这时候,我们只需要将 ha.cf haresourcesauthkeys这三个配置文件cp/etc/ha.d/

目录下就好了

   # cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/

   # cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/

   # cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/

   到此,所有的配置文件都全了,开始修改配置吧!

 

authkeys 双机互联验证配置文件

haresources 集群资源配置文件

 

ha.cf 主配置文件

#vi /etc/ha.d/ha.cf

logfile /var/log/ha-log #File to write other messages to

logfacility local0 #这个是设置heartbeat的日志,这里是用的系统日志

 

##设定心跳(监测)时间时间为2

keepalive 2 #多长时间检测一次

warntime 5 #连续多长时间联系不上后开始警告提示

deadtime 20 #连续多长时间联系不上后认为对方宕机(单位是妙)

initdead 120 #这里主要是给重启后预留的一段忽略时间段(比如:重启后启动网络等,如果在网络还没有通,keepalive检测肯定通不过,但这时候并不能切换)

 

#采用eth1udp广播用来发送心跳信息(eth1为网卡名,可以在ifconfig看到)

#bcast eth1

 

#采用网卡eth1udp单播来通知心跳,IP为对方IP,建议采用单播。当一个网段有多台这样cluster话,则一定要采用单播,否则每组cluster都会看到对方的节点,从而报错。(eth1为网卡名,可以在ifconfig看到)

ucast eth1 192.168.1.231

 

##使用udp端口694 进行心跳监测

udpport 694

auto_failback off #恢复正常后是否需要再自动切换回来,一般都设为off

##节点1,必须要与 uname -n 指令得到的结果一致。(填写机器名,可能需要在/etc/hosts中设置)

node alsme_probe3

##节点2(填写机器名,可能需要在/etc/hosts中设置)

node alssme_probe4

 

# #默认heartbeat并不检测除本身之外的其他任何服务,也不检测网络状况。

# #所以当网络中断时,并不会进行Load BalancerBackup之间的切换。

# #可以通过ipfail插件,设置'ping nodes'来解决这一问题。详细说明参考hearbeat文档。

##通过ping 网关来监测心跳是否正常

ping 192.168.1.1

hopfudge 1

deadping 5

#指定和heartbeat一起启动、关闭的进程

respawn hacluster /usr/local/lib64/heartbeat/ipfail

#系统权限设置(可以不改)

#apiauth ipfail gid=haclient uid=hacluster

 

authkeys 双机互联验证配置文件

#可以根据实际需要更改,配置文件中有详细说明

#vi / etc/ha.d/authkeys

auth 1

1 crc

#注意authkeys的权限一定要是600.

#chmod 600 / etc/ha.d/authkeys

 

haresources集群资源配置文件

#vi /etc/ha.d/haresources

server1 IPaddr::192.168.10.3/24/eth1   #这里的ip是我们再ha.cf里定义的主节点ip

在这里,我这里写的比较简单,下面会讲的比较详细的

server1:是我的主服务器上的hostname显示的主机名字

IPaddr::192.168.10.3/24/eth1   #设置虚拟IP

 

启动和关闭heartbeat的方法

#heartbeat配置成系统服务

#chkconfig --add heartbeat

#启动

#service heartbeat start

#关闭

#service heartbeat stop

 

查看heartbeat状态

#service heartbeat status

heartbeat OK [pid 13763 et al] is running on alsme_probe3 [alsme_probe3]...

 

 

二.drbd安装

本文中使用yum服务自动安装drbd全部程序

版本为drbd83-8.3.8-1.x86_64

注:所有节点都要安装,并且配置一样

 

  1.安装yum

    # wget http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

    # rpm -ivh elrepo-release-6-4.el6.elrepo.noarch.rpm

 

    修改yum源的配置文件

    # vi /etc/yum.repos.d/elrepo.repo

    将第8行的enable=1改成enable=0

[elrepo]

name=ELRepo.org Community Enterprise Linux Repository - el6

baseurl=http://elrepo.org/linux/elrepo/el6/$basearch/

mirrorlist=http://elrepo.org/mirrors-elrepo.el6

enabled=0         --->就是修改这个地方

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org

protect=0

    到这里,安装drbdyum源已经安装好了,可以一键安装了

 

2.开始安装drbd及依赖的软件

 # yum --enablerepo=elrepo install drbd83-utils kmod-drbd83 -y

到这里drbd就安装完了

 

3.drbd.conf主配置文件

#vi /etc/drbd.conf

 

global {

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

}

common {

syncer { rate 100M; }      #设备主备节点同步时的网络速度最大值,我这里是100M

 startup {

    degr-wfc-timeout 120;      #同步超时时间

    wfc-timeout 120;

 }

}

#资源配置

resource db {

protocol C;      #使用协议c,表示收到远程主机的写入确认后,则认为写入完成

disk {

on-io-error detach;

#size 1G; #两台服务器硬盘大小不同,才需要设置drbd的大小

}

 

net {

cram-hmac-alg sha1; #设置主备机之间通信使用的信息算法。

shared-secret "FooFunFactory";

}

 

#节点1

 on server1 {

 device /dev/drbd0;        #将使用的分区,该分区映射到 /dev/sdb5

#块文件

 disk /dev/sda5;

 address 192.168.5.200:7791;        #指定IP地址和端口号

 meta-disk internal;               #网络通信属性

 }

#节点2

 on server2 {

 device /dev/drbd0;

#块文件

 disk /dev/sda5;

 address 192.168.5.199:7791;

 meta-disk internal;

 }

}

 

:配置中同一资源在各个节点块文件(例如disk /dev/sda5)大小需要完全一样。

 

# mkfs.ext4 /dev/sdb5 #使用ext4格式分区格式化/dev/sdb5

# dd if=/dev/zero of=/dev/sdb5 bs=1M count=1;sync

# drbdadm create-md db #初始化drbdmetadatadb是前面定义的resource

# /etc/init.d/drbd start #启动Master上的drbd时,就去启动backupdrbd,否则Master无法启动。

# ps -aux|grep drbd

注:drbd设备有三个进程:drbd0_workerdrbd0的主进程,drbd0_asenderprimarydrbd0的数据发送进程,drbd0_receiversecondarydrbd0的数据接收进程。

# cat /proc/drbd #查看drbd状态,此时结果应为st:Secondary/Secondaryds:Inconsistent/Inconsistent

======================仅主机执行=============================================

# drbdsetup /dev/drbd0 primary -o #设置主节点,仅第一次使用drbdsetup,以后则用drbdadm

# cat /proc/drbd #查看drbd状态,此时结果应为st:Primary/Secondary ds:UpToDate/Inconsistent

# mkfs.ext3 /dev/drbd0

# mount /dev/drbd0 /data

# watch -n 1 cat /proc/drbd

=============================================================================

注:/proc/drbd中显示了drbd当前的状态,第一行的st表示两台主机的状态,主机表示为Primary,备机表示为Secondary

ds是磁盘状态,实时表示为UpToDate,不一致表示为Inconsistent状态。

 

 

 

启动和关闭drbd的方法

#drbd配置成系统服务

#chkconfig --add drbd

#启动服务

#service drbd start

#关闭服务

#service drbd stop

#节点设置为primary

#drbdadm primary all        #这个命令每次重启drbd的时候,都要执行的

#节点设置为secondary

#drbdadm secondary all

 

启动之后可以挂载drbd分区(例如device /dev/drbd0

第一次启动需要格式化drbd分区,使用命令

mkfs.ext3 /dev/drbd0

使用mount命令挂载

该分区可以用于存放数据库的数据文件或其他需要同步文件。

 

split brain的处理

split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbdprimary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。这种情况会造成各个节点中的数据不一致,恢复正常状态需要节点中选出主机,其他节点从主机重新更新数据。

 

从机上执行

drbdadm secondary resource db

drbdadm -- --discard-my-data connect resource db

主机执行

drbdadm connect resource db

注:这里的主机是要保留数据的节点,从机是不需要保留数据的节点。

 

三.整合heartbeatdrbd

1.为了让heartbeat启动mysql,需要如下的做法:

# ln -s /etc/init.d/mysql /etc/ha.d/resource.d/mysqld

这一步就是让mysql的启动脚本放到heartbeat调用的脚本目录中

 

2.整合,其实就是修改haresources集群资源配置文件,主要修改我上面加的那句

server1 IPaddr::192.168.10.3/24/eth1 drbddisk::db Filesystem::/dev/drbd0::/data::ext4 mysqld

 

解释:

server1:是我的主服务器上的hostname显示的主机名字

IPaddr::192.168.10.3/24/eth1   #设置虚拟IP

drbddisk::db #告诉heartbeat要管理DRBD的资源db

Filesystem::/dev/drbd0::/data::ext3 #设定需要挂载的drbd设备采用的文件系统,即执行mountunmout操作。

mysqld #设定要随heartbeat启动的服务。