From:http://docs.linuxtone.org/ebooks/MySQL/Heartbeat+MySQL+DRBD构建高可用MySQL方案.pdf
From:http://bbs.linuxtone.org/forum.php?mod=forumdisplay&fid=24&filter=typeid&typeid=12
服务器搭建环境:
主(mysqlm):192.168.1.110 CentOS 5.5 + Heartbeat + DRBD + Mysql
备(mysqls):192.168.1.111 CentOS 5.5 + Heartbeat + DRBD + Mysql
VIP(虚拟IP):192.168.1.120
DRBD资源目录:/data
一、安装前准备工作。
1、主机和备机定义主机名
# vi /etc/hosts
192.168.1.110 mysqlm
192.168.1.111 mysqls
注:确认主机/etc/sysconfig/network和hostname为mysqlm,备机为mysqls。
2、主机和备机创建相同大小的分区
# fdisk /dev/sdb (过程略...)
# mkfs.ext3 /dev/sdb5
# mkdir /data
3、主机和备机防火墙设置
# iptables -A INPUT -p tcp --dport 7898 -j ACCEPT #在防火墙中添加一个drbd的通信
# iptables -I INPUT 2 -p udp --dport 694 -j ACCEPT #在防火墙中插入一个heartbeat的通信
# iptables-save>/etc/sysconfig/iptables
4、安装前的说明
DRBD资源目录:因为DRBD是以块为单位同步数据,所以需要分别在两台主机上建立一个分区,供DRBD记录信息的数据块。
DRBD脑裂问题:即彼此都认为对方已经死了,然后自己都将角色作为Primary,并积极获取资源。
DRBD资源角色:primary(主节点):可读可写可挂载,secondary(次节点):不可读不可写不可挂载。
DRBD两种模型:Dual-primary,Primary/Secondary。
DRBD复制模型:Protocol A,Protocol B,Protocol C。
Protocol A:异步复制(主节点一旦写入完成,数据发往本地TCP/IP缓存就宣告完成)。
Protocol B:内存同步复制,半同步复制(主节点一旦写入完成,数据发往接收方的内存空间中,就宣告完成)。
Protocol C:同步复制(主节点一旦写入完成,数据发往接收方的磁盘中,就宣告完成)。
DRBD设备进程:drbd0_worker,drbd0_asender,drbd0_receiver。
drbd0_worker是drbd0的主进程,
drbd0_asender是primary上drbd0的数据发送进程,
drbd0_receiver是secondary上drbd0的数据接收进程。
二、安装配置DRBD和Heartbeat
1、主机和备机安装DRBD和Heartbeat
# yum -y install drbd83 kmod-drbd83
# yum -y install heartbeat heartbeat-ldirectord heartbeat-pils heartbeat-stonith
注:如果使用源码安装的话,则使用yum -y install kernel-devel-$(uname -r)语句更新内核。
2、配置DRBD
a)、主机和备机配置
# vi /etc/drbd.conf
# please have a a look at theexample configuration file in
#/usr/share/doc/drbd83/drbd.conf
global { usage-count yes; } #参加DRBD使用者统计,默认为yes。
common {
syncer { rate100M;} #设置主备节点同步时的网络速率最大值,如果是100M网络,就写100M。
}
resource r0 {
protocol C; #使用协议c,表示收到远程主机的写入确认后,则认为写入完成。
startup { degr-wfc-timeout 120;}
disk {
on-io-error detach;
#size 1G; #两台服务器硬盘大小不同,才需要设置drbd的大小
}
net {
cram-hmac-alg sha1; #设置主备机之间通信使用的信息算法。
shared-secret "FooFunFactory";
}
on mysqlm {
device /dev/drbd0; #将使用的分区,该分区映射到 /dev/sdb5
disk /dev/sdb5; #新建的分区
address 192.168.1.110:7898; #指定IP地址和端口号
meta-disk internal; #网络通信属性
}
on mysqls {
device /dev/drbd0;
disk /dev/sdb5;
address 192.168.1.111:7898;
meta-disk internal;
}
}
b)、主机和备机执行
# mkfs.ext3 /dev/sdb5 #使用ext3格式分区格式化/dev/sdb5
# dd if=/dev/zero of=/dev/sdb5 bs=1M count=1;sync
# drbdadm create-md r0 #初始化drbd的metadata,r0是前面定义的resource。
# /etc/init.d/drbd start #启动Master上的drbd时,就去启动backup的drbd,否则Master无法启动。
# ps -aux|grep drbd
注:drbd设备有三个进程:drbd0_worker是drbd0的主进程,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。
# cat /proc/drbd #查看drbd状态,此时结果应为st:Secondary/Secondary,ds: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状态。
c)、测试主从节点切换是否正常
先在主机上执行:
# umount /data
# drbdadm secondary r0 #或者写drbdadm secondary all也可以。
然后在备机上执行:
# drbdadm primary r0
# mount /dev/drbd0 /data
3、主机和备机将Mysql的data文件移至/data目录
# chkconfig mysqld off
# service mysqld stop
#vi /etc/init.d/mysqld
#datadir=
datadir=/data/mysql
======================仅主机执行================
# mkdir /data/mysql
# chown -R mysql:mysql /data/mysql
# cp -rp /usr/local/mysql/data/* /data/mysql
# service mysqld start
==============================================
4、配置Heartbeat
a)、主机和备机配置心跳线连接加密文件authkeys
# vi /etc/ha.d/authkeys
auth 3
#1 crc
#2 sha1 HI!
3 md5 wameidemysql
# chmod 600 /etc/ha.d/authkeys
注:authkeys有三种认证方式:crc,md5,和sha1。如果您的Heartbeat运行于安全网络之上,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但您也希望降低CPU使用,则使用md5。最后,如果您想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。
b)、主机和备机配置监控配置文件ha.cf
# vi /etc/ha.d/ha.cf
debugfile /var/log/ha-debug #打开错误日志报告。
logfile /var/log/ha-log
logfacility local0 #这个是设置heartbeat的日志,这里是用的系统日志。
keepalive 2 #2秒检测一次心跳线连接。
warntime 8 #警告时间(最好在2~10秒之间),可在日志中搜索late heartbeat查看。
deadtime 10 #10秒测试不到主服务器心跳线则宣布节点死亡。
initdead 120 #初始化启动时120秒无连接视为正常,或者指定heartbeat。
udpport 694 #设置使用udp的694端口连接。
ucast eth0 192.168.1.111 #单播方式连接(主从都写对方的 ip 进行连接)。
auto_failback off #自动切换(主服务器恢复后可自动切换回来,建议为off)。
node mysqlm #集群中主机器的主机名,与"uname -n"的输出相同。
node mysqls #集群中备机器的主机名,与"uname -n"的输出相同。
ping 192.168.1.253 #通过ping网关来检测心跳是否正常。
#respawn hacluster/usr/lib/heartbeat/ipfail #监控ipfail(控制ip切换程序)进程是否挂掉,如果挂掉就重启它。
#apiauth ipfail gid=haclient uid=hacluster #控制ip切换的时候所使用的用户。
hopfudge 1
c)、主机和备机配置资源管理文件haresources
# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld
# vi /etc/ha.d/haresources
mysqlm IPaddr::192.168.1.120/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 mysqld
注:mysqlm #预定的主机节点名称,与相应主机$uname -n的结果一致。需保证drbd.conf和ha.cf中节点的名字一致。备机此处写mysqls。
IPaddr::192.168.1.120/24/eth0:0 #设置虚拟IP。
drbddisk::r0 #告诉heartbeat要管理DRBD的资源r0。
Filesystem::/dev/drbd0::/data::ext3 #设定需要挂载的drbd设备采用的文件系统,即执行mount与unmout操作。
mysqld #设定要随heartbeat启动的服务。
d)、设置自动启动服务
# chkconfig --add heartbeat
# chkconfig heartbeat on
# service heartbeat start
三、常见问题处理
1、设置一个节点为主节点
通过cat /prod/drbd查看是否开始复制,以及两节点的状态。此时开始同步两个节点的磁盘,需要一定时间,在同步完成前,请不要重启,否则会重新同步。
同步完成后,如果两个节点都是Secondary/Secondary,并且已经UpToDate/UpToDate状态了,可以挑一个节点设置为主节点,语句为:
# drbdadm primary all
# mount /dev/drbd0 /data
2、DRDB的主从切换:
先在主机上执行:
# umount /data
# drbdadm secondary r0 #或者写drbdadm secondary all也可以。
然后在备机上执行:
# drbdadm primary r0
# mount /dev/drbd0 /data
3、DRDB的节点间连接
# drbdadm connect all
# drbdadm disconnect all
4、DRBD脑裂后的处理:
脑裂后,即两边都显示cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown,则可以按下面的步骤修复:
在从节点如下操作:
# service heartbeat stop
# drbdadm -- --discard-my-data connect r0
在主节点上,通过watch -n 1 cat /proc/drbd查看状态,如果不是cs:Connected状态,需要再手动连接
# drbdadm disconnect r0
# drbdadm connect r0
# drbdadm primary r0
在从节点如下操作:
# service heartbeat start
或者:
在从节点如下操作:
# service heartbeat stop
# service drbd stop
# drbdadm create-md r0
# service drbd start
# service heartbeat start
在主节点如下操作:
# service drbd reload
5、需要注意的几点:
a)、mount drbd设备以前必须把设备切换到primary状态。
b)、两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。
c)、处于secondary状态的服务器上不能加载drbd设备。
d)、主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1
e)、使用DRBD方案的时候建议用使用INNODB存储引擎,据说MyISAM在DRBD上容易造成数据丢失,或表文件损坏,所以此模式下最好用InnoDB,打开Binlog,同时,innodb_flush_log_at_trx_commit=1可以保证数据完整,但会严重影响性能。设置为2的话性能约有10倍提升,不过故障时可能会丢失1秒的数据。
6、centos老是提示:EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
a)、进入单用户模式
b)、mount -o remount,rw /
c)、tune2fs -l /dev/sdb5 | grep ^M
d)、tune2fs -c0 -i0 /dev/sdb5
e)、unmount /dev/sdb5;e2fsck -p /dev/sdb5
7、Heartbeat常见故障解决
a)、heartbeat启动失败 检查配置文件 ha.cf, authkeys 和 haresources; ifconfig 检查网络设备的 ip 是否已配好用。
b)、heartbeat正常启动,但查看启动日志发现检验结果为对方节点dead,首先确保对方节点正常启动heartbeat;其次用ping检查网络是否连接好;然后ping用检测haresources中设定的ip是否存在;最后检查防火墙是否开通heartbeat服务。
c)、heartbeat正常启动,但查看日志发现cannot locate resource script XXX,进入heartbeat配置文件目录etc/ha.d/resource.d/,查看是否存在xxx脚本文件;若不存在,需要建立该脚本文件。一般在相关服务安装后,在系统中会生成相关的脚本文件,可以find命令找到XXX的脚本文件,cp或者ln到etc/ha.d/resource.d/下即可。
d)、heartbeat正常启动,但查看日志发现启动结果both nodes获得权限,即全是主节点,没有备份节点。该问题同2。
e)、heartbeat正常启动,但是没有获得DRBD资源,无法mount首先检查配置文件haresources,drbddisk后面的参数是否为drbd启动的资源;其次,cat /proc/drbd查看DRBD状态,是否已启动,是否有primary节点;第三,检查drbd设备,在Centos中,/dev/drbd有时会消失掉,需要重新mknod。
f)、heartbbeat无法正常启动,错误显示broadcast interface failed需要配置bcast采用的网络接口的IP,可用ifconfig命令配置。
g)、heartbeat 和 DRBD 启动顺序
g1、drbd先启动,heartbeat后启动,这是正常的启动方式;heartbeat主机节点与当前DRBD primary节点不是同一个节点,也就是说,drbd primary节点在heartbeat的备用节点上启动,则当heartbeat主节点启用heartbeat时,首先会将备用节点上的drbd资源降级,将其转变为secondary,然后将主节点的 drbb角色设定为primary,挂载硬盘,切换服务。
g2、drbd在heartbeat主节点上启动,且已建立连接,mount 设备,但heartbeat在主节点上没有启动,在备用节点上启动,则此时heartbeat备用节点将接管drbd资源,首先在主节点上umount设备,使资源降级为 secondary;然后提升备用节点上的drbd资源为primary,mount设备,切换服务。
g3、heartbeat在drbd启动前启动,且已建立连接;然后DRBD启动,建立连接,此时heartbeat无法监测drbd资源,可采取的方案为heartbeat的一个节点上 heartbeat stop或者restart,则heartbeat另一节点会接管资源,实行对DRBD的监测。