如何使用Heartbeat,组建一个高可用性的mysql集群

  转了好多次帖子,其实就是为了使用heartbeat来搭建mysql集群,网上很多都是用make来生成RPM来安装,我也找了很多资料,mysql 自带的cluster用户不满意,只能再次vmware虚拟机尝试下,这里要感谢博客:http://kerry.blog.51cto.com/172631/110206/ ,很多是根据里面的经验来实现的,只是部分还是解决不出需要其他方法。

  

一、背景
当前大多网站采用Linux MYSQLAPACHE+PHP这种经典配置,如何防止单点失败造成的整个网站的不可用是网站管理者必须要考虑的问题,其中数据库的高可用性(Database server’s high availability)是重中之重。
对于数据库的高可用性,各商业软件的厂商都有各自的解决方案,比如Oracle OPS serverIBM DB2 (share-nothing architecture)。最近MYSQL AB也发布了MYSQL cluster 软件,使用与IBM DB2类似的技术。
MySQL cluster可能会是日后最理想的方案,但是从资源、可集成度方面考虑,给出一个简单实用的方案借鉴。本文介绍的是性价比比较高的一种使用Heartbeat 2.0配置Linux高可用性集群,同时使用Heartbeat也可以实现简单的web集群。
 
二、实现原理
通过Linux HA 软件 heartbeat 实现IP的自动漂移,即当一台服务器宕机后,浮动IP(整个cluster的对外IP )自动漂移到另外一台服务器。
通过Mysql自身的replication 实现不同机器上多个数据库的同步整体性能此方案将会降低MYSQL 1%左右的性能,可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行更改。
所需硬件:
安装有双网卡的配置大致相同的服务器或工作机两台 一条交叉网线(用于双机对连的心跳线)
  我这里是根据http://distfiles.macports.org/mysql5/找的mysql-5.5.29.tar.gz来搭建mysql

所需软件:
Linux HA 软件 heartbeat (只支持两个节点),安装盘里集成的有这个软件的rpm

我这里是通过yum 安装还有epel来安装heartbeat的,具体请看下面步骤:
1、安装MYSQL
#cd /opt
#useradd mysql -d /usr/local/mysql -s /sbin/nologin
#tar -zxvf mysql-5.1.29-rc.tar.gz
#cd mysql-5.1.29-rc
# ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=gbk --with-collation=gbk_chinese_ci --with-extra-charsets=all --with-pthread --enable-thread-safe-client --enable-assembler --without-isam --without-innodb --without-ndb-debug --with-mysqli

这个如果没有装gcc编译器,需要执行
yum groupinstall "Development Tools"
接下如果缺少 ncurses 安装包

 

解决办法:

下载安装相应软件包

一、如果你的系统是RedHat系列:

yum list|grep ncurses

yum -y install ncurses-devel

yum install ncurses-devel




#make && make install
#/usr/local/mysql/bin/mysql_install_db        //初始化数据库
#chown -R mysql.mysql /usr/local/mysql/     //设置目录宿主
#cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf   //复制配置文件
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld    //设置启动文件 
#chmod 700 /etc/rc.d/init.d/mysqld                         
#/usr/local/mysql/bin/mysqld_safe --user=mysql &         
#/etc/rc.d/init.d/mysqld start
在启动mysql时报错
查看日志发现以下错误:
/etc/my.cnf 文件中的 skip-federated 注释掉,然后执行/usr/local/mysql/bin/mysql_install_db--user=mysql就可以了
如果上面的版本还不行,可以看看my.cnf是否有问题,可以通过查看日志来得到问题原因:
http://zhidao.baidu.com/link?url=nXPsnqxsE2OTnMhTEbUX9NlE1LSiqcmJ09pEm2hKsLwrOCnvII4aEFelqGnoiLYbi2iU6tRBQFsSjzK2b6JMa_
#chkconfig --add mysqld
#chkconfig --level 2345 mysqld on
设置软连接,如果要删除直接ln -C
#ln -s /usr/local/mysql/bin/mysql /sbin/mysql
#ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin
#mysqladmin –u root password Password01!//设置root 密码
#配置库文件搜索路径
#echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf
#ldconfig
#添加/usr/local/mysql/bin到环境变量PATH
#export PATH=$PATH:/usr/local/mysql/bin
mysqlB也按以上的方式进行安装
2mysqlA设置
设置同步数据库:
   在这里我就用test数据库来做测试,在test数据库里新建一个data表,并添加一些数据,具体操作如下:
#mysql –u root –pPassword01!
mysql>  create table data(name VARCHAR(20), address VARCHAR(50), phone VARCHAR(20));
mysql>insert into data(name,address,phone) values('jhone','beijing','138000000');
mysql>select * from data;
设置数据库同步帐户:
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'backup'@'10.10.10.205' IDENTIFIED BY 'qawsed';
(授与从10.0.0.2主机上登录用户backup数据复制权限,4.02版本以前用:GRANT FILE ON *.* TO backup@10.0.0.2 IDENTIFIED BY 'qawsed';)
mysql>flush privileges;

修改配置文件:
停止mysql服务
[root@mysqlA opt]#service mysqld stop
建立用于更新日志的目录,并给于mysql的权限
[root@mysqlA opt]# mkdir /var/log/mysql
[root@mysqlA opt]# chown mysql.mysql /var/log/mysql/
更改Mysql配置文件/etc/my.cnf
[root@mysqlA opt]# vi /etc/my.cnf
server-id=1                 //服务器ID
log-bin=mysql-bin
log-bin=/var/log/mysql/updatelog   //启用更新日志
binlog-do-db=test       //表示需要备份的数据库是test这个数据库
replicate-same-server-id
master-host=10.0.0.2      //指定主服务器IP
master-user=backup       //指定在主服务器上可以同步的帐号
master-password=qawsed //指定帐号对应的密码
master-connect-retry=60  //断点重试间隔为60
replicate-do-db=test      //表示同步test数据库
binlog-ignore-db=mysql   //不同步mysql数据库
test进行备份
[root@mysqlA opt]# service mysqld start    //先启动mysql
[root@mysqlA opt]# /usr/local/mysql/bin/mysqldump -h localhost -u root -p1q2w3e test >test.sql
[root@mysqlA opt]#scp test.sql root@10.0.0.2:/opt     // (将test.sql复制到mysqlB/opt目录下)
至此mysqlA服务器上有关mysql的设置已完成,下一步开始配置mysqlB
设置mysqlB
设置数据库同步帐户:
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'backup'@'10.0.0.1' IDENTIFIED BY 'qawsed';
(授与从10.0.0.1主机上登录用户backup数据复制权限,4.02版本以前用:GRANT FILE ON *.* TO backup@10.0.0.1 IDENTIFIED BY 'qawsed';)
mysql>flush privileges;
修改配置文件:
停止mysql服务
[root@mysqlA opt]#service mysqld stop
建立用于更新日志的目录,并给于mysql的权限
[root@mysqlA opt]# mkdir /var/log/mysql
[root@mysqlA opt]# chown mysql.mysql /var/log/mysql/
更改Mysql配置文件/etc/my.cnf
[root@mysqlA opt]# vi /etc/my.cnf
server-id=2                 //服务器ID
log-bin=mysql-bin
log-bin=/var/log/mysql/updatelog   //启用更新日志
binlog-do-db=test       //表示需要备份的数据库是test这个数据库
replicate-same-server-id
master-host=10.0.0.1      //指定主服务器IP
master-user=backup       //指定在主服务器上可以同步的帐号
master-password=qawsed //指定帐号对应的密码
master-connect-retry=60  //断点重试间隔为60
replicate-do-db=test      //表示同步test数据库
binlog-ignore-db=mysql   //不同步mysql数据库
 
还原从mysqlA备份过的test.sql
#service mysqld start
# mysql -u root -p1q2w3e test <test.sql
重启两边的mysql服务
查询配置
Show Slave status:此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.
Mysql中可通过以下命令来查看主从状态
show master status 查看master状态
show slave status 查看slave状态
show processlist G 查看当前进程
stop slave 暂时停止slave进程
start slave 开始slave进程
primary服务器上 MySQL命令符下输入:
mysql>show master status;
mysql>show slave status\G;
如果出现以错误:
解决办法:在/etc/my.cnf [mysqld]下面加上replicate-same-server-id参数
这里如果是Slave_IO_Running:No Slave_SQL_Running:YES还有可能是IPTABLES没有设置对,可以用下面命令:

在vmvare里面配了两台mysql,发现用mysql连不上mysql服务器,用telnet登录mysql的3306端口,发现居然是no route to host;

[zhoulei@localhost ~]$ telnet 192.168.2.48 3306
Trying 192.168.2.48...
telnet: connect to address 192.168.2.48: No route to host
telnet: Unable to connect to remote host: No route to host

觉得甚是差异,估计是虚拟机装了有问题,就把虚拟机中的防火墙给清了一下,发现可行。

[zhoulei@localhost ~]$ sudo iptables -F

因为如果安装telnet命令,telnet对方的3362会报 No route to host
这里如果是Slave_IO_Running:YES Slave_SQL_Running:NO可以用下面命令:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
具体参考http://blog.csdn.net/orichisonic/article/details/47311391
到此mysql的双机互备已基本完成,在两台服务器的mysql数据库中任意添加数据,都可以同步到对端服务器上

安装配置heartbeat:
Heartbeat下载地址如下:
这里是用:
  1. yum install PyXML cluster-glue cluster-glue-libs resource-agents 
然后
  1. wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm  
  2. wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm  
  3. rpm -ivh heartbeat-* 
因为原来的教程是centos 5.3下的heartbeat2以上的版本

配置 HA的各配置文件:
复制配置文件
[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/authkeys /etc/ha.d/
[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/haresources /etc/ha.d/
[root@mysqlA opt]# cp /usr/share/doc/packages/heartbeat/ha.cf /etc/ha.d/
配置心跳的加密方式:authkeys
[root@mysqlA opt]#vi /etc/ha.d/authkeys
#如果使用双机对联线(双绞线),可以配置如下:
auth 1
1 crc
#存盘退出,然后
[root@mysqlA opt]#chmod 600 authkeys
 
配置心跳的监控:haresources
[root@mysqlA opt]#vi /etc/ha.d/haresources
#各主机这部分应完全相同。
mysqlA IPaddr::192.168.8.155 ipvsadm mysqld
[root@mysqlA opt]# mkdir -p /var/log/ha_log
[root@mysqlA opt]#chmod 777 /var/log/ha_log/
 
配置心跳的配置文件:ha.cf
[root@mysqlA opt]#vi /etc/ha.d/ha.cf
logfile /var/log/ha_log/ha-log.log   ## ha的日志文件记录位置。如没有该目录,则需要手动添加
bcast eth1     ##使用eht1做心跳监测
keepalive 2    ##设定心跳(监测)时间时间为2
warntime 10
deadtime 30
initdead 120
hopfudge 1
udpport 694    ##使用udp端口694 进行心跳监测
auto_failback on
node mysqlA  ##节点1,必须要与 uname -n 指令得到的结果一致。
node mysqlB  ##节点2
ping 192.168.8.100   ##通过ping 网关来监测心跳是否正常。

 
设置ipvsadm的巡回监测
[root@mysqlA opt]#ipvsadm -A -t 192.168.8.155:3306 -s rr
[root@mysqlA opt]#ipvsadm -a -t 192.168.8.155:3306 -r 192.168.8.151:3306 -m
[root@mysqlA opt]#ipvsadm -a -t 192.168.8.155:3306 -r 192.168.8.152:3306 –m
 
执行后进行监测:
[root@mysqlA opt]#ipvsadm –list
 
 
HA服务的启动、关闭以及测试
启动HA: service heartbeat start
关闭HA; service heartbeat stop
进行监控: service heartbeat status
防火墙设置
heartbeat 默认使用udp 694端口进行心跳监测。 如果系统有使用iptables 做防火墙,应记住把这个端口打开。
iptables -I INPUT -p udp --dport 694 -j ACCEPT
 
到此mysql双机互备已基本完成,不管哪一台服务器菪机都不会影响mysql的正常运行




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Re: MySQL 高可用工具 heartbeat 实战部署详解 ===============================================# heartbeat作用(无缝漂移):  通过heartbeat,可以将资源(ip以及程序服务[例如:httpd或mysqld服务]等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,即高可用HA 资源的内容包括:ip地址和服务(例如:httpd或mysqld服务) # HeartBeat的工作原理:        a) heartbeat的主备模式(第1种模式)(推荐方式:本章演示重点) 通过修改heartbeat配置文件,可以指定那一台heartbeat服务器作为主服务器,则另一台将自动成为热备服务器然后在热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳消息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用(HA)的目的。           b) heartbeat主主模式(第2种模式)(不推荐) 两台服务器互为主备,这是他们之间还会互相发送报文来告诉对方自己的当前的状态,如果在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者是已经宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者是服务,继续为用户提供服务。      

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值