heartbeat mysql双机互备实现高可用 安装配置

张映 发表于 2012-05-15

分类目录: 服务器相关

标签:, , , , ,

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

六,测试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

2 条评论

  1. halfbloodrock 留言

    以前的解决方法是用的RHEL自带的Cluster Suit套件里的HA配置的mysql ha。相比而言比heartbeat管理要方便很多。

    而且如果从接管主之后,如果不是手动切换的话,主不会自己接管回去。因为如果主自己接管回去会很容易产生脑裂的问题。

  2. 张映 留言

    主的启动后,可以从从的接管过来.auto_failback on这个参数开启就行了.