首先感谢各位博主的文章,小弟我经常逛论坛,却很少自己写文章,对于你们在我技术上的帮助表示深深的感谢。
这篇博文的价值:在生产系统中,如果服务宕机,造成的损失可能是无法估量的,要保证服务不间断工作,就需要对服务提供冗余。
由于企业成本的限制,我们有时候可能没有存储,但是我们却想起到双机的效果,小弟建议用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 �Cg haclient hacluster
创建hacluster用户,并把用户归于haclient组。
设置镜像文件为yum源
将网络yum源文件改名,不使用网络yum源
mv /etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.bak
注:如果要使用网络yum源,可以用163的CentOS-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