转了好多次帖子,其实就是为了使用heartbeat来搭建mysql集群,网上很多都是用make来生成RPM来安装,我也找了很多资料,mysql 自带的cluster用户不满意,只能再次vmware虚拟机尝试下,这里要感谢博客:http://kerry.blog.51cto.com/172631/110206/ ,很多是根据里面的经验来实现的,只是部分还是解决不出需要其他方法。
一、背景
当前大多网站采用Linux +MYSQL+APACHE+PHP这种经典配置,如何防止单点失败造成的整个网站的不可用是网站管理者必须要考虑的问题,其中数据库的高可用性(Database server’s high availability)是重中之重。
对于数据库的高可用性,各商业软件的厂商都有各自的解决方案,比如Oracle OPS server和IBM 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
我这里是通过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也按以上的方式进行安装
2、mysqlA设置
设置同步数据库:
在这里我就用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 statusG;
如果出现以错误:
解决办法:在/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;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
具体参考http://blog.csdn.net/orichisonic/article/details/47311391
到此mysql的双机互备已基本完成,在两台服务器的mysql数据库中任意添加数据,都可以同步到对端服务器上
安装配置heartbeat:
Heartbeat下载地址如下:
这里是用:
- yum install PyXML cluster-glue cluster-glue-libs resource-agents
- wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm
- wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm
- rpm -ivh heartbeat-*
配置 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的正常运行