MySQL 复制 - 为复制引入新的 Slave

use*_*621 7 mysql replication

我最近担任了一个系统管理员职位,负责管理一组 20 台(左右)服务器。我之前没有处理过的一件事(除了在测试情况下)是向 MySQL 复制场引入一个新的从属服务器。

基本上复制设置如下:

MS -> SL1 -> SL2 (backup)
|                     SL3 (reporting)
SB2                   SL4 (loadbalanced web slave)
                      SL5 (loadbalanced web slave)
                      SL6 (loadbalanced web slave)
                      SL7 (loadbalanced web slave)
Run Code Online (Sandbox Code Playgroud)

但基本上它是一个有两个读从站的主站,(一个纯粹用于备份),一个主读从站(主站正在等待,如果你愿意的话),后面有 6 个从站,用于额外的备份,4 个负载均衡的网络读取从站和用于报告的服务器。

我在网上做了很多阅读,并假设向环境中添加一个新的奴隶(来自 SL1),将是:

  • 登录 SL2:
    • STOP SLAVE;
    • FLUSH TABLES WITH READ LOCK;
    • (复制mysql目录到新服务器)
    • 完成后,UNLOCK TABLES;然后START SLAVE;(到目前为止一切正常,SL2 重新上线并赶上)
    • 确保新服务器上的 db 结构正确,并且 master.info 指向正确的位置(正确指向 SL1)
    • 在新服务器上启动 MySQL,检查 Slave SQL 和 I/O 是否正在运行(是的,这很好)

但是,一段时间后,我从二进制日志中收到重复的键插入错误:

110122 17:01:25 [ERROR] Slave SQL: Error 'Duplicate entry '2011-01-22 17:00:01' for key 'PRIMARY'' on query. Default database: 'thelm_soft'. Query: 'INSERT INTO  thm_member_views  (   member_view_ts, logged_in_members, non_members ) VALUES ( now(), '27037', '132834' )', Error_code: 1062
110122 17:01:25 [Warning] Slave: Duplicate entry '2011-01-22 17:00:01' for key 'PRIMARY' Error_code: 1062
Run Code Online (Sandbox Code Playgroud)

这是否与now()正在查询的事实有关,如果该表上的插入足够频繁,常识告诉我会导致问题吗??!?!还是我的复制过程出错了,即从错误的日志位置开始?

Mat*_*aly 5

这是否与 now() 正在查询的事实有关,如果该表上的插入足够频繁,常识告诉我会导致问题吗??!?!

是的,我相信这是造成您错误的原因。你介绍新奴隶的方法似乎是正确的。在我看来,用 DATETIME 字段定义一个表作为主键是很奇怪的。正如您非常正确地指出的那样,从站从主站获取复制的查询,他们将在查询中使用 now() 关键字,这将从本地服务器获取时间戳。

实际上,该表应该为 PK 定义一些其他数据类型(例如 INT 或 BIGINT),这些数据类型可以保证是唯一的,这与使用 now() 插入的时间戳不同。