今天磕磕碰碰的把mysql的主主复制和单点故障搞定了,写下步骤,以及遇到的问题。
mysql主主复制主要通过mysql较低版本来实现(已确认5.5版本貌似不支持…),于是,我重新下载了mysql-5.1.57-linux-i686-glibc23.tar.gz(124M),然后部署配置mysql,具体部署步骤详见《部署Centos5.4服务器–MySql篇》。
ok,如果你的mysql能正常启动了,现在可以进入mysql主主复制的配置阶段了:
一、mysql主主复制
注意:下述配置需同时在两台服务器上配置,不同的地方已经指出。
1、登陆Mysql,在两台服务器上分别创建mysql授权用户:
mysql> grant replication slave,file on *.* to 'root'@'*' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
这里我用,Navicat向两台服务器的测试同步的test数据库添加了一些信息,等配置完毕可以修改或者删除这些信息看是否实现主主同步。
2、停止mysql,修改两台服务器的mysql配置文件:
log-bin=mysql-bin #必须要开启二进制日志
server-id = 1 #另外一台id改成2
binlog-do-db=test #填写需要同步的数据库
binlog-ignore-db=mysql #填写不需要同步的数据库
replicate-do-db=test #填写需要同步的数据库
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
稍后我会附上我整个my.cnf配置文件下载地址。
3、重启mysql,进入mysql配置主主同步:
mysql> stop slave;
mysql> flush tables with read lock\G
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.00001
Position: 106
Binlog_Do_DB: jsdoc
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
change master to master_host='192.168.1.83',master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
###注意这里红色部分,Node2上面运行的应该是Node2-2的信息,反之Node2-2上面运行上述语句,用Node2得出信息(当然File和Postion一样就只需要改改IP了)###
mysql> start slave;
mysql> show processlist\G
###在这里看到回显里面有State: Has sent all binlog to slave; waiting for binlog to be updated,说明主主复制基本OK了。###
mysql> unlock tables;
4、修改test表,测试主主同步是否完成。
如果主主同步没有问题了,就可以进入下一个阶段,通过keepalived实现mysql的单点故障。如果有问题,请仔细查看mysql的错误日志,并自己google下。
二、keelalived实现mysql单点故障
注意:下述配置需同时在两台服务器上配置,不同的地方已经指出。
1、下载keepalived编译安装
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
tar zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure
make&&make install
2、配置keepalived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@ajcheng.com
}
notification_email_from admin@ajcheng.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP
interface eth0
virtual_router_id 61
priority 100 #优先级,另一台改为90
advert_int 1
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication {
auth_type PASS
auth_pass 111
}
virtual_ipaddress {
192.168.1.86
}
}
virtual_server 192.168.1.86 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr #LVS算法
lb_kind DR #LVS模式
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.1.83 3306 {
weight 3
notify_down /usr/local/mysql/bin/mysql.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
vim /usr/local/mysql/bin/mysql.sh
#!/bin/sh
pkill keepalived
service network restart
chmod -R 777 /usr/local/mysql/bin/mysql.sh
chkconfig keepalived on
service keepalived start
service keepalived stauts
ip add
如果在其中一台机子上看到了VIP 192.168.1.86,且在局域网内能ping通,通过Navicat能过连上,说明ok了!
下面是一些遇到的问题:
1、在两台机子上通过ifconfig命令看不到vip
通过ip add命令查看即可
2、只有其中一台机子有VIP,另外一台没有
因为在keepalived配置文件里面的realserver就写了一台机器,貌似是这样吧?
3、tail -f /var/log/message报如下错误:
May 13 15:06:07 Sql-1 Keepalived_vrrp: ip address associated with VRID not present in received packet : 192.168.1.86
May 13 15:06:07 Sql-1 Keepalived_vrrp: one or more VIP associated with VRID mismatch actual MASTER advert
May 13 15:06:07 Sql-1 Keepalived_vrrp: bogus VRRP packet received on eth0 !!!
May 13 15:06:07 Sql-1 Keepalived_vrrp: VRRP_Instance(VI_1) ignoring received advertisment…
因为virtual_router_id冲突了,之前配置Node1和Node1-1服务器(LVS+keepalived)时,keepalived的配置文件用了这个id,只需要把这个id改成其他的就ok!注意:Node2和Node2-2上,这两个virtual_router_id必须一样。
基本上,结束了,写的估计就自己能看懂吧….汗!
--转自