本文已经过时了.最新的同步办法请参考:
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] 下面加入此行
虾爷神勇!
@Copterfly 一般一般世界第三