先说一下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启动成功
六,测试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