我正在考虑设置我们的 mysql db 的复制,以便能够在我们每个分支机构中拥有本地从属服务器,同时在主办公室拥有主服务器,以(显著)提高我们分支机构的应用程序性能。
数据库本身并不是那么大(<1gb)但我想知道;考虑到每分钟最多 200-300 条记录更新:复制速度有多快?(假设,首先,一个 5mb 通用 dsl 连接,必要时可以更快 - 试图将成本保持在尽可能低的水平,但钱可以花得更多)
整个表是否分批复制?复制是否按需进行,因为表中的每条记录都会更新(从文档中,我认为它是可配置的)?
笔记:
- 我正在考虑设置 1 个主服务器,2 个从服务器(目前为 2 个分支机构),如文档中所述这里但它是一款应用程序,而不是网页客户端
- 主服务器上完成的任何更新都需要在 10 分钟内复制到其他从服务器上。
- 所有这些都假设我可以让我们的 ORM(DevExpress XPO)满意从从属设备读取并写入主设备的概念。
答案1
MySQL 复制尽可能接近实时,因为受到磁盘和网络 I/O 的限制。从服务器打开一个与主服务器相连的套接字,该套接字保持打开状态。当主服务器上发生事务时,它会记录在二进制日志中,并在从服务器上重播。如果主服务器和从服务器之间的套接字中断,则在下次成功连接时为从服务器重播二进制日志。
多主复制做同样的事情,但是是两个方向的。
一些基本计算将帮助您更好地确定您的带宽需求。
Average transaction size * number of slaves * updates/minute = bandwidth needed
希望这可以帮助。
答案2
MySQL 中的复制可以非常快速地将数据传送到从服务器(比UPDATE
在主服务器上运行要快,然后切换到另一个窗口在SELECT
从服务器上运行要快,如果(并且仅当)网络连接全部正常且一切运行正常时。任何 DSL 级连接对于常规小查询的一般情况来说都应该没问题,但大型插入/更新查询可能需要一点时间来复制,并且在发生复制故障时重新同步(不幸的是,MySQL 很容易出现这种情况)将需要一段时间(再次从主服务器复制整个数据库)。有一些技巧可以限制重新同步对主服务器的影响,例如将 MySQL 放在 LVM 上,这样您就可以非常快速地锁定/快照并将快照内容 rsync 到从服务器,但最终重新同步会很糟糕。
答案3
从属端的复制由两个独立的线程处理。
- 连接到主服务器的日志读取器进程接收每个数据修改语句,并将其写入中继日志。
- SQL 写入器进程从中继日志中获取新项目,在从属数据库上提交语句,然后将从属指针移到该语句之后,以指示已收到查询。
复制延迟受 IO 限制,首先是从属数据库上的 IO 应用来自中继日志的事务(可能涉及复杂的 SQL 查询),其次是主服务器上的 IO 读取其 binlog 并将其传输到每个从属服务器。
MySQL 复制增加了读取查询能力,但是才不是提高查询写入性能,该性能取决于 IO 刷新到主服务器和从服务器上的 binlog 的速度