先说一下heartbeat的原理,在二台机子上都安装heartbeat,这样heartbeat会相互监听,如果主的挂了,从的会变成主的。如果主的恢复了,在转变过来。主的和从的要实现的高可用程序都要启动。没装成功之前我是这样理解的,heartbeat只要装在一台机器上就行了,由heartbeat来监控二台机器,感觉这样更合理一点,不过这种理解是错误的。
一,服务器说明
mysqlMaster eth0 192.168.1.108
mysqlSlave eth0 192.168.1.106
主和从的heartbeat都启动时会在主服务器上产生一个虚拟IP(virtual IP)192.168.1.111
我在网上找关于heartbeat安装配置的时候,发现全部是双网卡的,没发现一个是单网卡,开始没配置成功的时候,我还以为使用heartbeat必须是双网卡呢,其实不需要的。
二,安装mysql和实现mysql主主同步
mysql安装请参考:linux cmake 安装mysql5.5.11,以及更高版本
mysql主主同步:mysql replication 互为主从的安装及配置,以及数据同步
mysql我安装过好多次,我都记不清了,在arch,centos,ubuntu,rip上面我都装的,博客里单独拿出来写的到是不多,夹杂其他博文里面的比较多,可以搜索一下。
三,安装heartbeat,主从一样
yum install heartbeat
四,heartbeat配置
安装好后是/etc/ha.d/下面是没有配置文件的,你可以从
[root@mysqlMaster ha.d]# cd /usr/share/doc/heartbeat-2.1.4/ [root@mysqlMaster heartbeat-2.1.4]# cp ha.cf authkeys haresources /etc/ha.d/
考过来的这三个文件,其实没有配置什么,基本上都注释掉了,不过可以看参数说明。
1,修改配置文件ha.cf,主从配置差不多
[root@mysqlMaster ha.d]# cat /etc/ha.d/ha.cf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' logfile /var/log/ha-log //设置heartbeat日志存放位置 keepalive 2 //设定心跳(监测)时间时间为2秒 deadtime 30 //设置监测不到,并认定其死机的时间是30 warntime 10 //设置监测到的警告时间为10 udpport 694 //设置heartbeat监听端口 initdead 120 //主机死掉后预留的恢复时间 bcast eth0 //设置heartbeat监听的网卡 ucast eth0 192.168.1.106 //单播,现在是主服务上,在这里填写从服务器IP,如果在从的上面,就填写主的IP baud 19200 //设置串行通讯的波特率 auto_failback on //主服务恢复后从从服务器切换到主服务器 node mysqlMaster //主服务器名,下面会提到如果何设置这个参数 node mysqlSlave //从服务器名,这二个名字必须根uname -n一样,不然报错。 ping 192.168.1.1 //网关 respawn hacluster /usr/lib/heartbeat/ipfail //可选,列出和heartbeat一起启动和关闭的进程 apiauth ipfail gid=haclient uid=hacluster //启动用户和组
2,修改配置authkeys,主从一样
[root@mysqlMaster ha.d]# cat /etc/ha.d/authkeys |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' auth 1 1 crc
authkeys文件用于设定heartbeat的认证方式,共有三种可用的认证方式:crc、md5和sha1,三种认证方式的安全性依次提高,但是占用的系统资源也依次增加。
改好后要加权限
[root@mysqlMaster ha.d]# chmod 600 authkeys
不然启动时会报以下错误
heartbeat: udpport setting must precede media statementsheartbeat[5529]: 2012/05/15_20:09:25 ERROR: Bad permissions on keyfile [/etc/ha.d/authkeys], 600 recommended.
3,修改haresources,主从一样
[root@mysqlMaster ha.d]# cat /etc/ha.d/haresources |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' mysqlMaster IPaddr::192.168.1.111/24/eth0:0 mysqld
说明
1),mysqlMaster这里填写主服务器的名称,这个要根uname -n一样
2),192.168.1.111这个是虚拟IP
3),eth0:0虚拟IP对应的网络接口
4),mysqld是mysql服务商的启动脚本,一般是放在/etc/init.d/下面
四,修改主机名,也就是uname -n
1,修改主服务器的network
[root@mysqlMaster ha.d]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=yes #HOSTNAME=localhost.localdomain //这是以前的,注释掉了 GATEWAY=192.168.1.1 HOSTNAME=mysqlMaster //这是我添加的
2,修改从服务器的network
[root@mysqlSlave ha.d]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=yes #HOSTNAME=localhost.localdomain //这是以前的,注释掉了 GATEWAY=192.168.1.1 HOSTNAME=mysqlSlave //这是我添加的
3,修改/etc/hosts,主从一样
192.168.1.108 mysqlMaster 192.168.1.106 mysqlSlave
添加上面的内容后,然后重启网络/etc/init.d/network restart,就能看到
[root@mysqlMaster ha.d]# uname -n mysqlMaster
五,主和从都启动heartbeat
/etc/init.d/heartbeat start
启动后mysqld也会被heartbeat启动。
[root@mysqlSlave ha.d]# netstat -upnl |grep heart udp 0 0 0.0.0.0:694 0.0.0.0:* 17752/heartbeat: wr udp 0 0 0.0.0.0:694 0.0.0.0:* 17750/heartbeat: wr udp 0 0 0.0.0.0:56652 0.0.0.0:* 17752/heartbeat: wr udp 0 0 0.0.0.0:45286 0.0.0.0:* 17750/heartbeat: wr
694是监听的端口,剩下的二个没弄明白,我猜测是给对方用的,也就是说主的给从的留了二个端口,从的给主的留了二个端口。并且会产生虚拟IP,看下图
六,测试heartbeat
[root@mysqlMaster ha.d]# mysql -utest -p -h 192.168.1.111
连接数据库时用这个虚拟IP来连接,这样给人感觉就像一台服务器一样,这个根mysql proxy的连接池有点像。
把主服务器的heartbeat停止掉后,神奇的事情发生了,虚拟IP从主服务器跑到从服务器去,在从服务器mysql -utest -p -h 192.168.1.111,这样连接可以进去,而主服务器不行了。
我也发现一个问题,就是当我把主服务器的mysql停止掉,heartbeat不停止,发现从服务器并没有接替主服务器。heartbeat只针对到机器,不针对到进程。如果有人知道怎么解决,还请留个言,非常感谢。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/server/1408.html
以前的解决方法是用的RHEL自带的Cluster Suit套件里的HA配置的mysql ha。相比而言比heartbeat管理要方便很多。
而且如果从接管主之后,如果不是手动切换的话,主不会自己接管回去。因为如果主自己接管回去会很容易产生脑裂的问题。
主的启动后,可以从从的接管过来.auto_failback on这个参数开启就行了.