一、背景
当前大多网站采用
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
包
软件主页:
[url]http://www.linux-ha.org/[/url]
Mysql
软件
软件主页:
[url]http://www.mysql.com/[/url]
安装步骤:
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 �Cu 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 �Cu root �Cp1q2w3e
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 [email protected] 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 [email protected]:/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 [email protected] 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
下载地址如下
:
[url]http://download.opensuse.org/repositories/server:/ha-clustering:/lha-2.1/CentOS_5/i386/[/url]
下载对应的版本
,
在此我的系统是
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 �Cm
执行后进行监测:
[root@mysqlA opt]#ipvsadm �Clist
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
的正常运行