一、阐述

1DRBD

DistributedReplicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。

数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。

 

工作原理:

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。

drbd+heartbeat实现mysql主备并自动切换_mysql

 

2Heartbeat

Heartbeat 项目是Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。

 

工作原理:

heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。

 

drbd+heartbeat实现mysql主备并自动切换_mysql_02

 

3MySQL

MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabase Management System:关系数据库管理系统)应用软件之一。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。具体详情访问官方网站http://www.mysql.com/

 

 

二、安装部署

1、规划

database1192.168.1.167

database2192.168.1.168

VIP  192.168.1.171

 

2、修改主机名和域名解析

# sshroot@192.168.1.167

# vim/etc/hosts

192.168.1.167database1

192.168.1.168database2

[root@database1~]# vim /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=database1

 

# sshroot@192.168.1.168

# vim/etc/hosts

192.168.1.167database1

192.168.1.168database2

#hostname database2

[root@database2~]# vim /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=database2

 

3、安装DRBD

[root@database1~]# cd /usr/local/src/

[root@database1src]# tar xf drbd-heartbeat-8.4.4-2.el6.tar.gz

[root@database1src]# rpm -ivh drbd-*.rpm

 

[root@database2~]# cd /usr/local/src/

[root@database2src]# tar xf drbd-heartbeat-8.4.4-2.el6.tar.gz

[root@database2src]# rpm -ivh drbd-*.rpm

 

# 加载drbd模块,查看模块情况

[root@database1src]# modprobe drbd

[root@database1src]# lsmod | grep drbd

drbd                  337142 0

libcrc32c               1246  1 drbd

 

[root@database2src]# modprobe drbd

[root@database2src]# lsmod | grep drbd

drbd                  337142  0

libcrc32c               1246  1 drbd

 

# 查看第二块磁盘名称,这里是/dev/sdb

[root@database1src]#fdisk –l

……

[root@database2src]#fdisk –l

……

 

# 分区

[root@database1src]# parted /dev/sdb

(parted)mklabel gpt

(parted)p

(parted)mkpart

Partitionname?  []? database

Filesystem type?  [ext2]?

Start?0

End? 100%

Ignore/Cancel?I

(parted)p

(parted)q

# database2如上操作

 

[root@database1src]# vim /etc/drbd.d/database.res

resourcedb {

       protocol C;

       startup {

               wfc-timeout 0;

               degr-wfc-timeout 120;

       }

       disk {

               on-io-error detach;

       }

       net {

               after-sb-0pridiscard-zero-changes;

               after-sb-1pri discard-secondary;

               after-sb-2pri disconnect;

               max-buffers 2048;

               ko-count 4;

       }

       syncer {

               rate 100M;

       }

       on database1 {

               device /dev/drbd0;

               disk /dev/sdb1;

               address 192.168.1.167:7801;

               meta-disk internal;

                       }

       on database2 {

               device /dev/drbd0;

               disk /dev/sdb1;

               address 192.168.1.168:7801;

               meta-disk internal;

       }

}

 

[root@database1src]# scp -r /etc/drbd.d database2:/etc/

 

# 初始化DRBD分区

[root@database1src]# drbdadm create-md db

 

[root@database2src]# drbdadm create-md db

 

# 启动DRBD服务,两边一起启动

[root@database1src]# /etc/init.d/drbd start

 

[root@database2src]# /etc/init.d/drbd start

 

[root@database1src]# service drbd status

drbddriver loaded OK; device status:

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

GIT-hash:599f286440bd633d15d5ff985204aff4bccffadd build by root@Database2, 2013-11-2914:02:29

m:res  cs        ro                   ds                         p  mounted fstype

0:db   Connected Secondary/Secondary Inconsistent/Inconsistent  C

 

#设置database1为主节点

[root@database1src]# drbdadm -- --overwrite-data-of-peer primary all

[root@database1src]# drbdadm primary db

 

# 数据正在同步

[root@database1src]# service drbd status

drbddriver loaded OK; device status:

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

GIT-hash:599f286440bd633d15d5ff985204aff4bccffadd build by root@Database2, 2013-11-2914:02:29

m:res  cs         ro                 ds                     p  mounted fstype

0:db   SyncSource Primary/Secondary UpToDate/Inconsistent  C

...    sync'ed:   7.8%               (4724/5116)M

 

等待同步完成后…

# 格式化并挂载drbd分区/dev/drbd0

[root@database1src]# mkfs.ext4 /dev/drbd0

[root@database1src]# mount /dev/drbd0 /mnt

 

# drbd服务开机自启动

[root@database1~]# chkconfig drbd on

[root@database2~]# chkconfig drbd on

 

4、迁移MySQL

# 默认已经安装了mysql-service,设置mysql的启动状态为关闭,即不自动启动

[root@database1src]# chkconfig mysql off

[root@database2src]# chkconfig mysql off

 

# 迁移mysql数据库

[root@database1src]# cp -r /var/lib/mysql/* /mnt

[root@database1src]#umount /mnt

 

#将/dev/drbd0挂载到原来的mysql数据目录

[root@database1src]#mount /dev/drbd0 /var/lib/mysql

 

# 修改挂载后目录的属主属组,启动mysql

[root@database1lib]#chown –R mysql.mysql mysql

[root@database1src]#/etc/init.d/mysql start

 

5、安装Heartbeat

[root@database1~]# tar fxvz heartbeat-3.0.4.el6.tar.gz

[root@database1~]# rpm -ivh *.rpm

[root@database2~]# tar fxvz heartbeat-3.0.4.el6.tar.gz

[root@database2~]# rpm -ivh *.rpm

[root@database1~]#cp /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 /etc/ha.d/

 

# 注意ucast后面跟的心跳地址是对方的,需要更新的内核支持。换成bcast

[root@database1~]# grep -vE '^$|^#' /etc/ha.d/ha.cf

logfile/var/log/ha-log

logfacilitylocal0

keepalive2

deadtime15

bcast   eth0            # Linux

respawnroot /usr/lib64/heartbeat/ipfail

apiauthipfail gid=root uid=root

auto_failbackoff

nodedatabase1

nodedatabase2

 

# 注意bcast后面跟的心跳地址是对方的

[root@database2~]# grep -vE '^$|^#' /etc/ha.d/ha.cf

logfile/var/log/ha-log

logfacilitylocal0

keepalive2

deadtime15

bcast   eth0            # Linux

respawnroot /usr/lib64/heartbeat/ipfail

apiauthipfail gid=root uid=root

auto_failbackoff

nodedatabase1

nodedatabase2

 

# 编辑验证文件

[root@database1~]# vim /etc/ha.d/authkeys

auth 1

1 crc

[root@database1~]# chmod 600 /etc/ha.d/authkeys

 

[root@database2~]# vim /etc/ha.d/authkeys

auth 1

1 crc

[root@database2~]# chmod 600 /etc/ha.d/authkeys

 

# 编辑集群资源文件

[root@database1~]# vim /etc/ha.d/haresources

# 这个文件两个机器是一样的,除了主机名部分

[root@database1~]# grep -vE '^$|^#' /etc/ha.d/haresources

database1192.168.1.171/24/eth0 drbddisk::db Filesystem::/dev/drbd0::/var/lib/mysql::ext4mysql

[root@database2~]# grep -vE '^$|^#' /etc/ha.d/haresources

database2192.168.1.171/24/eth0 drbddisk::db Filesystem::/dev/drbd0::/var/lib/mysql::ext4mysql

 

# 设置heartbeat自启动

[root@database1~]# chkconfig heartbeat on

[root@database2~]# chkconfig heartbeat on

 

#启动heartbeat

[root@database1~]#/etc/init.d/heartbeat start

[root@database2~]#/etc/init.d/heartbeat start

 

# 重启任一一台主机mysql将会漂移到新的IP之上

 

# 删除/var/lib/heartbeat/下文件,新版本的heartbeat为集群环境提供了一些功能。

# 如果不删除会在关闭heartbeat服务时hanged,无法关闭

[root@database1~]# rm -rf /var/lib/heartbeat/*

[root@database2~]# rm -rf /var/lib/heartbeat/*

 

ERROR:should_drop_message: attempted replay attack [test8]? [gen = 1213729710, curgen= 1213729711]

 

可能原因:ha和ha2的uuid改变引起,可能ha2是通过VMware克隆复制方式产生的或hostname设置在安装heartbeat之后

解决方案:让uuid重新生成,可以先卸载heartbeat,删除/var/lib/heartbeat目录(uuid文件就在这个目录下,该目录在卸载时不被删除,需手动删除,如果不手动删除,重新安装还会使用原来uuid)。


交流群:374506612,提供源码和支持。