Centos 5.2+MYSQL+heartbeat双机互备

一、背景
当前大多网站采用 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 的正常运行

你可能感兴趣的:(linux,mysql,数据库,centos,集群)