Mysql数据库主主同步.

本文已经过时了.最新的同步办法请参考:

http://yjyj.net/learn/centos/1756.html

不知道为啥总是碰到纠结的客户,这次的也一样.

因为客户产品比较敏感的原因,站点无法托管在国内的接入商,于是选择了美国的Fremont.以及香港的两个机房.介于he.net线路的抽风频率以及傻逼联通的出口限制,还有来自客户竞争对手的流量攻击,所以必须要对两台vps进行负载均衡.

于是蛋疼的虾爷从第一天早上11点开始到第二天早上9点就奋斗于mysql数据库主主同步的傻逼玩意儿上了.

记录一下所有的操作,为了下一次蛋疼:

暂定Fremont的ip为:us 香港机的ip为:hk

0.配置两台vps系统为centos5.6,同时安装lnmpa 0.7,这里要感谢军哥写出牛逼的脚本哈.

1). 准备好需要进行同步的数据库: oyeoye

2). 为mysql准备用于远程同步链接的 id: databackup , pass:databackup

首先进行us机配置:

a). 登入mysql管理 : # mysql -uroot -p123456.

添加一个拥有远程访问权限的帐号:
grant replication slave on *.* to 'databackup'@hk'' identified by 'databackup';

flush privileges;

b). 修改 /etc/my.cnf 配置文件,为其添加以下内容:

log-bin=mysql-bin
server-id=1 #设置一个id
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=qbsdatabase #需要进行同步的数据库
binlog_ignore_db=mysql #不需要同步的数据库.如果有多个数据库,则一行一个
master-host = hk # 这里填写第二台机的ip
master-user = databackup # 远程管理帐号
master-password = databackup # 远程管理密码
master-port = 3306

c). 重启mysql服务器并获取二进制位置:

# /etc/init.d/mysql restart
mysql > show master status;

得到类似下面的:

+------+---------+------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------+---------+------+
| mysql-bin.000001 | 105 | databackup | mysql |
+------+---------+------+
1 row in set (0.00 sec)

d). 执行如下:

mysql > change master to
master_host='HK', #填入HK机的ip
master_user='databackup',
master_password='databackup',
master_port=3306,
master_log_file='mysql-bin.000001', #填入刚刚得到的file值
master_log_pos=105; #填入刚刚得到的position值

进行HK机配置:

a). 登入mysql管理 : # mysql -uroot -p123456.

添加一个拥有远程访问权限的帐号:
grant replication slave on *.* to 'databackup'@'us' identified by 'databackup';

flush privileges;

b). 修改 /etc/my.cnf 配置文件,为其添加以下内容:

server-id = 2
log-bin=mysql-bin
binlog_ignore_db=mysql
master-host = US
master-user = databackup
master-password = databackup
master-port = 3306

c). 重启mysql服务器并获取二进制位置:

# /etc/init.d/mysql restart
mysql > show master status;

得到类似下面的:

+------+---------+------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------+---------+------+
| mysql-bin.000021 | 108 | databackup | mysql |
+------+---------+------+
1 row in set (0.00 sec)

d). 执行如下:

mysql > change master to
master_host='US', #填入US机的ip
master_user='databackup',
master_password='databackup',
master_port=3306,
master_log_file='mysql-bin.000021', #填入刚刚得到的file值
master_log_pos=108; #填入刚刚得到的position值

3). 重启两台vps的Mysql服务:

# /etc/init.d/mysql restart

输入
mysql > show slave status\G 查看当前同步信息,如果出现:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

则同步正常.

虾爷比较囧,在查看状态的时候出现了n中错误提示,这里给出一些解决办法:

0.提示server_id相同错误:

用如下命令查看:
mysql> show variables like 'server_id';

发现,mysql并没有从my.cnf文件中更新server_id,既然这样就只能手动修改了
复制代码 代码如下:

mysql> set global server_id=2; #此处的数值和my.cnf里设置的一样就行
mysql> slave start;

如此执行后,同步恢复了正常。

1. Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '%-test-' for key 'PRIMARY'' on query. Default database: 'mysql'. Query: 'INSERT INTO db SELECT * FROM tmp_db WHERE @had_db_table=0'
1 row in set (0.00 sec)

提示主键重复.虾爷观察了下,发现这个是 mysql里面的内容,这里不属于我们需要同步的数据,所以干脆不鸟他,直接在my.cnf设定忽略错误:

於 /etc/my.cnf 加入:
slave-skip-errors=all # 於 [mysqld] 下面加入此行
再 restart mysql 即可

仅忽略某個錯誤編號

若只要排除 Duplicate entry (Last_Errno: 1062), 可以單獨指定 Error No, 多個寫法如下:

-slave-skip-errors=1062,1053
-slave-skip-errors=all
詳細可見: Replication Slave Options and Variables
於 my.cnf 設定忽略

vim /etc/my.cnf
slave-skip-errors=1062 # 於 [mysqld] 下面加入此行

评论 (2)
  1. 沙发
    Copterfly 2011-09-02 04:33

    虾爷神勇!