首先感谢各位博主的文章,小弟我经常逛论坛,却很少自己写文章,对于你们在我技术上的帮助表示深深的感谢。

    这篇博文的价值:在生产系统中,如果服务宕机,造成的损失可能是无法估量的,要保证服务不间断工作,就需要对服务提供冗余。

    由于企业成本的限制,我们有时候可能没有存储,但是我们却想起到双机的效果,小弟建议用mysql+drbd+heartbeat.

    说明:1、mysql是一款开源数据库,能为企业节省一部分资金;

          2、DRBD(Distributed Replicated Block Device)分布式存储块设备。开源软件,号称网络中的RAID.其主要功能如下:当你将数据写到本地DRBD设备上的文件系统时,数据会同时发送到网络上另外一台DRBD设备的主机上。这样本地主机的数据与远程节点的数据可以保证同步。从而保证IO的一致性,所以当本地节点的主机出现故障时,远程节点的主机还会保留一份完全相同的数据,以打到高可用的目的。

          3、heartbeat为我们提供了一套廉价的、可伸缩的高可用集群方案。

          4、企业中我们经常会用到的有heartbeat+挂载存储+服务和heartbeat+drbd+服务的方式。当前存储相对来说价格还是比较高的,下文将针对Heartbeat+drbd+mysql搭建进行详细介绍。

    IP地址规划:主节点:10.10.10.8   备份节点:10.10.10.9  VIP:10.10.10.10

                心跳线: 主:2.2.2.6   备:2.2.2.8

    1.设置主机名:

    主机:

    vi /etc/sysconfig/network

     NETWORKING=yes
     HOSTNAME= ha-zl-mysql01         //主机名(master)

     备机

     vi /etc/sysconfig/network

     NETWORKING=yes

     HOSTNAME=ha-zl-mysql02

     2.配置主机名与IP地址的映射关系:

     vi   /etc/hosts

     10.10.10.8    ha-zl-mysql01

     2.2.2.6       ha-zl-mysql01

     10.10.10.9    ha-zl-mysql02

     2.2.2.8       ha-zl-mysql02

     3.测试双机互通性:

      ping    ha-zl-mysql01

      ping    ha-zl-mysql02

   mysql安装过程:

# 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
# chmod 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

另外一台服务器也坐相应的配置;

 

DRBD的安装和配置:

方法一:yum  install drbd

方法二:源码安装

 

# tar -zxvf drbd-8.3.0.tar.gz
# cd drbd-8.3.0

# ./configure --prefix=/usr/local/drbd --without-utils
# make KDIR=/usr/src/kernels/2.6.18-194.8.1.el5-x86_64/ 

# make install
检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko
加载安装drbd模块
# modprobe drbd
通过lsmod检查是否已经成功
#lsmod |grep drbd
如果有,则表示成功了

  修改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 ha-zl-mysql01{
//ha-zl-mysql01为主服务器的主机名
device   /dev/drbd0;
disk   /dev/sdb1;
address 10.10.10.8:7788;
meta-disk  internal;
 }
 on ha-zl-mysql02{
//ha-zl-mysql02为从服务器的主机名
device /dev/drbd0;
disk   /dev/sdb1;
address 10.10.10.9:7788;
meta-disk internal;
 }
}

(3)主服务器的设置
创建matadata:
# drbdadm create-md all

如果无法新建磁盘 用dd if=/dev/zero bs=1M count=1 of=/dev/sda2 低格硬盘,其中sda2是disk设备分区符


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/
查看一下数据同步过来没 


编译安装heartbeat;

建立ha用到的用户及组

# groupadd haclient

创建haclient组。

# useradd –g haclient hacluster

创建hacluster用户,并把用户归于haclient组。

设置镜像文件为yum

将网络yum源文件改名,不使用网络yum

mv /etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.bak

注:如果要使用网络yum源,可以用163CentOS-Base.repo代替原文件

安装libnet依赖包

上传libnet-1.1.2.1-2.2.el6.rf.i686.rpm/root

cd /root

rpm -ivh libnet-1.1.2.1-2.2.el6.rf.i686.rpm

安装heartbeat需要用到的依赖包

yum -y install glib2-devellibtool-ltdl-devl net-snmp-devel bzip2-devel ncurses-devel openssl-devel libtoollibxml2-devel gettext bison flex zlib-devel mailx which libxslt docbook-dtdsdocbook-style-xsl PyXML shadow-utils opensp autoconf automake gcc make gcc-c++

开始安装heartbeat-2.0.7

上传heartbeat-2.0.7/root

cd /root/heartbeat-2.0.7

赋予操作权限 chmod -R 777 *

配置  ./ConfigureMe configure 如果有错误证明有依赖包没装全

编译与安装 make&&make install

如报

cc1: warnings being treated as errors

pils.c:245: error: initialization fromincompatible pointer type

pils.c:246: error: initialization fromincompatible pointer type

gmake[2]: *** [pils.lo] 错误 1

gmake[2]: Leaving directory`/root/heartbeat-2.0.7/lib/pils'

gmake[1]: *** [all-recursive]错误 1

gmake[1]: Leaving directory`/root/heartbeat-2.0.7/lib'

make: *** [all-recursive] 错误 1

则将/root/heartbeat-2.0.7/lib/pils里的makefile中的所有-Werror删除

如报

cc1: warnings being treated as errors

client_lib.c:1850: error: 'display_orderQ'defined but not used

gmake[2]: *** [client_lib.lo]错误 1

gmake[2]: Leaving directory`/root/heartbeat-2.0.7/lib/hbclient'

gmake[1]: *** [all-recursive]错误 1

gmake[1]: Leaving directory`/root/heartbeat-2.0.7/lib'

make: *** [all-recursive] 错误 1

则将/root/heartbeat-2.0.7/lib/hbclient里的makefile中的所有-Werror删除

如报

cc1: warnings being treated as errors

stonith_signal.h:34: error:'stonith_signal_set_simple_handler' defined but not used

gmake[4]: *** [apcmaster.lo]错误 1

gmake[4]: Leaving directory`/root/heartbeat-2.0.7/lib/plugins/stonith'

gmake[3]: *** [all-recursive]错误 1

gmake[3]: Leaving directory`/root/heartbeat-2.0.7/lib/plugins/stonith'

gmake[2]: *** [all-recursive]错误 1

gmake[2]: Leaving directory`/root/heartbeat-2.0.7/lib/plugins'

gmake[1]: *** [all-recursive]错误 1

gmake[1]: Leaving directory`/root/heartbeat-2.0.7/lib'

make: *** [all-recursive] 错误 1

则将/root/heartbeat-2.0.7/lib/plugins/stonith里的makefile中的所有-Werror删除

如报

cc1: warnings being treated as errors

conf_lex.c:1195: 错误:‘input’定义后未使用

gmake[2]: *** [recoverymgrd-conf_lex.o]错误 1

gmake[2]: Leaving directory`/root/heartbeat-2.0.7/telecom/recoverymgrd'

gmake[1]: *** [all-recursive]错误 1

gmake[1]: Leaving directory `/root/heartbeat-2.0.7/telecom'

make: *** [all-recursive] 错误 1

则将/root/heartbeat-2.0.7/telecom/recoverymgrd里的makefile中的所有-Werror删除

如报

chown hacluster/var/lib/heartbeat/cores/hacluster

chown: 无效的用户:"hacluster"

gmake[2]: [install-exec-local]错误 1 (忽略)

chmod 700/var/lib/heartbeat/cores/hacluster

gmake[2]: Nothing to be done for`install-data-am'.

gmake[2]: Leaving directory`/root/heartbeat-2.0.7'

gmake[1]: Leaving directory`/root/heartbeat-2.0.7'

则证明没添加用户及组,按照上面的添加用户及组后再编译安装。

结束后出现

chown hacluster /var/lib/heartbeat/cores/hacluster

chmod 700/var/lib/heartbeat/cores/hacluster

gmake[2]: Nothing to be done for`install-data-am'.

gmake[2]: Leaving directory`/root/heartbeat-2.0.7'

gmake[1]: Leaving directory`/root/heartbeat-2.0.7'

则证明安装成功

注意我在这次编译安装过程中发现一问题,请有志之士进行说明,如果上传的heartbeat包不在/root这个目录下面进行编译安装的话,会出错。原因未知。。。。。。。。


(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、测试

 

编译成功后,会在给定目录下生成如下文件夹:

bin     etc      include    lib64    sbin  share var 

其中etc下面有如下文件:

ha.d     init.d      等文件夹

cd  ha.d 下面有如下文件夹:

authkeys  配置认证用

chmod 600  authkeys

cat  authkeys 

auth 1

1    crc

 

cat  ha.cf 

debugfile /var/log/ha-debug
logfile /var/log/ha-log
keepalive 3
warntime 6
deadtime 10
initdead 120
udpport  694
bcast em3 
auto_failback off
node   dm2node1.server 
node   node2dm12.bf
ping  130.87.7.1
respawn root /usr/local/dm2/lib64/heartbeat/ipfail
apiauth ipfail gid=root uid=root

将自定义脚本放在:resouce.d目录下面

这里以我自己写的MYSQL 启动脚本为例进行说明:

[root@node2dm12 resource.d]# pwd 
/usr/local/dm2/etc/ha.d/resource.d

cat    MYSQL

#!/bin/bash
case "$1" in 
     start)
     su  - dm55 -c  "/app1/dm55/bin/dpstart"
     su  - dm55 -c  "/app1/dm55/web/tomcat-5.5.28/bin/startup.sh"
    ;;
     stop)
   ps -ef |grep -v grep |grep mysql|awk '{print $2}'|xargs kill -9
   su  - dm55   -c  "/app1/dm55/bin/dpshut"
   su  - dm55   -c  "/app1/dm55/web/tomcat-5.5.28/bin/shutdown.sh"
      ;;
    *)
     echo "Usage:$0{start|stop}"
     exit 1
    esac

 

vi  haresources将双机资源放入进去即可。

dm2node1.server IPaddr::130.87.7.110/24/bond0:1 Filesystem::/dev/jiesuan/dm55::/app1::ext4 MYsql