一、背景 当前大多网站采用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%左右的性能,可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行更改。 所需硬件: 安装有双网卡的配置大致相同的服务器或工作机两台 一条交叉网线(用于双机对连的心跳线) 所需软件: Linux HA 软件 heartbeat (只支持两个节点),安装盘里集成的有这个软件的rpm包 软件主页:http://www.linux-ha.org/ Mysql软件 软件主页:http://www.mysql.com/ 安装步骤: 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 #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注释掉即可 #chkconfig --add mysqld #chkconfig --level 2345 mysqld on #ln -s /usr/local/mysql/bin/mysql /sbin/mysql #ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin #mysqladmin –u root password 1q2w3e //设置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 –p1q2w3e 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.0.0.2' 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参数 到此mysql的双机互备已基本完成,在两台服务器的mysql数据库中任意添加数据,都可以同步到对端服务器上 安装配置heartbeat: Heartbeat下载地址如下: http://download.opensuse.org/repositories/server:/ha-clustering:/lha-2.1/CentOS_5/i386/ 下载对应的版本,在此我的系统是centos 5.2 rpm -ivh libnet-1.1.2.1-2.1.i386.rpm rpm -ivh heartbeat-pils-2.1.4-2.1.i386.rpm rpm -ivh --nodeps heartbeat-stonith-2.1.4-2.1.i386.rpm rpm -ivh --nodeps heartbeat-2.1.4-2.1.i386.rpm rpm -ivh --nodeps heartbeat-devel-2.1.4-2.1.i386.rpm rpm -ivh --nodeps heartbeat-ldirectord-2.1.4-2.1.i386.rpm rpm -ivh ipvsadm-1.24-8.1.i386.rpm 配置 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 网关来监测心跳是否正常。 respawn hacluster /usr/lib/heartbeat/ipfail apiauth ipfail gid=root uid=root debugfile /var/log/ha_log/ha-debug.log 设置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的正常运行 |