mysql+drbd+heartbeat实现高可用性

本文原址:
http://bbs.yahunet.com/thread-1661-1-1.html

转载请注明!

1,什么是DRBD
DRBD(Distributed Replicated Block Device),DRBD 号称是 "网络 RAID",开源软件,由 LINBIT 公司开发。
2,DRBD的主要功能
DRBD 实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核 模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统 时, 数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
3,DRBD的主要应用
如果主服务器宕机,造成的损失是不可估量的。要保证主服务器不间断服务,就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中,heartbeat 为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat + drbd在Linux下创建一个高可用(HA)的集群服务器,在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。
4,DRBD于mysql的关系
MySQL 与 LINBIT 达成了合作关系,大张旗鼓的搞了这个 "12 天 Scale-Out" 活动,也是这个商业合作驱动的吧。DRBD 助力 MySQL, 号称可以得到四个 9 的可靠性,这不低于任何一款商业数据库 软件了。
DRBD 的出现的确对 MySQL 集群的可用性 有很大提高。而且,有独到的特点,非常适合面向互联网的应用。因为是在存储层的数据块同步,很容易的做到应用层的 IO 负载均衡(备机承担一定的读压力),不但支持数据库失败接管,还能做到 IP 失败接管,接管时间小于 30 秒,真是穷人的绝佳集群解决方案。

IP地址说明:
master
192.168.100.20   
slave
192.168.100.21  
VIP 192.168.100.25

1、管理节点mysql安装
修改主机名为manager
# tar -zxvf mysql-5.0.67.tar.gz
# cd mysql-5.0.67
# groupadd mysql
# useradd -g mysql -s /sbin/nologin -M mysql
# ./configure --prefix=/usr/local/mysql --with-charset=gbk --localstatedir=/var/data --with-extra-charset=all --enable-thread-safe-client
# make && make install
# cp support-files/my-large.cnf /etc/my.cnf
# chown -R mysql.mysql /usr/local/mysql/
# /usr/local/mysql/bin/mysql_install_db --user=mysql
# chown -R root.root /usr/local/mysql/
# chown -R mysql.mysql /var/data
启动数据库服务,并添加到自启动
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
# cp support-files/mysql.server   /etc/rc.d/init.d/mysqld
# chm od 755 /etc/rc.d/init.d/mysqld
加入服务队列:
# chkconfig --add mysqld
添加root密码
# /usr/local/mysql/bin/mysqladmin -u root password "123456"

配置 库文件搜索路径
# echo "/usr/local/mysql/lib/mysql">>/etc/ld.so.conf
# ldconfig
# ldconfig -v
添加/usr/local/mysql/bin到环境变量PATH中
#echo "export PATH=$PATH:/usr/local/mysql/bin">>/etc/profile
#source /etc/profile

2、从服务器mysql的安装同上
3、DRBD的安装和设置
(1)安装DRBD(主从服务器安装相同)
# tar -zxvf drbd-8.3.0.tar.gz
# cd drbd-8.3.0
# make KDRI=/usr/src/redhat /
# make install
检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko
加载安装drbd模块
# modprobe drbd
通过lsmod检查是否已经成功
#lsmod |grep drbd
如果有,则表示成功了
(2)更改drbd配置文件(主从服务器相同)
准备drbd要使用的分区 ,该分区最好是干净的分区,我在虚拟机中重新划分了一个分区/dev/sdb1作为drbd使用。
# vi /etc/drbd.conf
resource r0 {
  protocol C;
  startup {
    degr-wfc-timeout 120;
     }
  disk {
    on-io-error   detach;
      }
  net {
  }
  syncer {
    rate 10M;
  }
  on master{
//master为主服务器的主机名
    device     /dev/drbd0;
    disk       /dev/sdb1;
    address    192.168.100.20:7788;
    meta-disk  internal;
  }
  on slave{
//master为从服务器的主机名
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   192.168.100.21:7788;
    meta-disk internal;
  }
}
(3)主服务器的设置
创建matadata:
# drbdadm create-md all
2次输入“yes”
启动drbd:
# /etc/init.d/drbd start
在启动第一个节点上的DRBD服务的时候,他会等待第2个节点的DRBD服务的启动,此时启动第2个节点上的DRBD服务即可。
查看drbd的运行状态
# cat /proc/drbd           
此时可以看到,已经开始同步数据了。设置完之后的第一次同步耗时比较长,因为需要把整个分区的数据全部同步一遍。
设置为主节点:
# drbdadm  primary all
如果不成功使用这个命令
# drbdsetup /dev/drbd0 primary -o
在新设备上面创建文件系统
# mkfs.ext3 /dev/drbd0
挂载文件系统
# mkdir /var/data
# mount /dev/drbd0 /var/data

在主节点上写入数据
然后,我们把primary降级成secondary,把secondary提升成primary:
# umount /var/data
# drbdadm secondary all
从节点
把primary降级前,一定要先umount设备才行。然后提升secondary:
# drbdadm primary all
# mount /dev/drbd0 /var/data/
查看一下数据同步过来没

4、安装配置heartbeat(主从服务器的安装和配置相同):
(1)先安装libnet
# tar -zxvf libnet.tar.gz
# cd libnet
# ./configure
# make
# make install
(2)安装heartbeat
# groupadd haclient
# useradd -g haclient hacluster
# tar -jxvf Heartbeat-STABLE-2-1-STABLE-2.1.4.tar.bz2
# cd Heartbeat-STABLE-2-1-STABLE-2.1.4
# ./ConfigureMe configure --disable-swig --disable-snmp-subagent
# make
# make install
# cp doc/ha.cf /etc/ha.d/
# cp doc/haresources /etc/ha.d/
# cp doc/authkeys /etc/ha.d/
(3)Authkeys配置
# chmod 600 authkeys  主节点和从节点间数据校验用的
# vi /etc/ha.d/authkeys
把 #auth 1
   #1 crc
   #2 sha1 HI!
   #3 md5 Hello!
改成:
   auth 3
   #1 crc
   #2 sha1 HI!
   3 md5 Hello!
(4)资源文件haresources配置
# vi /etc/ha.d/haresources
在配置文件中添加如下一行
master drbddisk Filesystem::/dev/drbd0::/var/data::ext3  mysqld 192.168.100.25
上面资源组中的各项含义如下:
master            当前primary节点名(uname -n)
drbddisk          告诉heartbeat要管理drbd的资源
Filesystem        这里是告诉heartbeat需要管理文件系统资源,其实实际上就是执行mount/umount命令,后面的“::”符号之后是跟的 Filesystem的参数设备名和mount点)
mysqld            告诉需要管理mysql
192.168.100.25    这里是让heartbeat帮你管理一个service ip,会跟着主节点一起漂移
(5)ha.cf配置
# vi /etc/ha.d/ha.cf
#debugfile /var/log/ha-debug的注释去掉
#keepalive 2    去注释
#deadtime 15    去注释
#warntime 10    去注释把10改成5
#initdead 120   去注释
#udpport 694    去注释
#bcast eth0    #Linux   去注释
#watchdog /dev/watchdog  去注释也可以不打开
#node den3    把den3改成master  这里要注要它是主节点名称下面的是副节点名称,一定要与uname -n一致.
#node dathy   把dathy改成slave
#ping_group group1 10.10.10.254 10.10.10.253 去注释改:ping_group group1 192.168.100.20  192.168.10.21
#respawn hacluster /usr/lib/heartbeat/ipfail 去注释
#apiauth ipfail gid=haclient uid=hacluster 去注释
#hopfudge 1 去注释  它就是集群中活跃节点的数量
(6)启动heartbeat
# /etc/init.d/heartbeat start
# echo "/etc/init.d/heartbeat start">>/etc/rc.local
# ps -ef | grep heartbeat查看一下

5、测试
可以拔掉主节点服务器的网线,看看有什么情况发生,测试是否正常?
然后再把网线插回去,MySQL服务能否自动切换回来?