1、DRBD:
DistributedReplicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。
工作原理:
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。
2、Heartbeat:
Heartbeat 项目是Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。
工作原理:
heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。
3、MySQL:
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,提供源码和支持。