MySQL复制与其他技术

时间:2011-10-21 19:50:20

标签: php mysql replication

我很难在一个项目中沿着正确的道路前进。

我是一个预算紧张的单人乐队。 2个专用服务器 MySQL 5 / php5

我正在使用服务器1来消耗来自各种Feed的大量数据。服务器/软件全天候运行,生成一个巨大的数据库。

服务器2 - 持有副本 具有Web前端的数据库

我没有任何MySQL复制经验。我一直在研究,而且我可以告诉奴隶在主人之后立即更新。

我希望有一个非常快速的网站,这就是为什么处理在服务器1上完成,而服务器2只是选择数据。

如果MySQL复制模仿服务器1,那么这肯定会减慢服务器2的速度,并且与预期效果相反。

我认为最适合这种情况的是编写脚本来自动化该过程。

服务器2有2个数据库。一个用于处理的活动。

该脚本确定哪个数据库是活动的,而是使用另一个数据库。

它会丢弃其中的任何表格。 该脚本从服务器1转储数据库。 将其安装在服务器2新清空的数据库上。 该脚本更改网站配置文件以使用新数据库。

这个过程可以一遍又一遍地重复。

虽然数据库安装量很大,但它可以在晚上完成,并且意味着没有停机时间。

这比做MySQL复制更好吗? 我很乐意接受建议。

4 个答案:

答案 0 :(得分:4)

很难相信数据库转储/加载周期比复制更快。特别是基于行(非查询)的复制。如果您在高峰时间不需要复制,则可以滞后(通过在从站上运行SLAVE STOP SQL_THREAD)(当然,您必须有足够的非高峰时间才能赶上)。 (请记住,MySQL有三种复制模式:语句,行和混合。基于语句在从属服务器上执行完全相同的更新负载,基于行只发送更改的行,并且应该在CPU方面相当便宜)

all 你的从属设备足够快以应用更改,并且仍然有足够的I / O带宽和CPU时间来处理SELECT,或者没有多少从设备会有所帮助。它可能的一些其他方法(例如,直接复制数据文件)可能更快,但更脆弱,而且实际上你正在谈论一些相对较小的收益。如果你无法处理更新加载,你选择使用的是shard(拆分,因此每个服务器只负责部分数据)或购买更快的硬件。

但最终,这都是在黑暗中拍摄的。你可以很容易地从复制,到rsync,到涉及drbd的一些疯狂的方案,到任何真正只影响你的数据库层的东西,也许只有数据库本身。您需要实际的基准 - 实际数据 - 来做出这样的决定。我将告诉您,作为一般规则,正确设计的大型OLTP数据库首先会耗尽I / O带宽。

我建议从简单开始。这就是单个数据库服务器或内置复制。请记住,在某些时候可能需要进行分片。

实际上,你可能很早就想回答一个问题:你真的想要使用MySQL吗?考虑一下PostgreSQL。

答案 1 :(得分:0)

大量插入可能肯定会影响前端性能,但您的方案的答案非常具体取决于您的处理引擎如何影响资源。某些设置组合可以在不断插入数据时实现高性能选择。这取决于您的具体工作周期,存储引擎,索引方案等。

首先要彻底了解表格锁定http://dev.mysql.com/doc/refman/5.0/en/table-locking.html这是必须的!

然后,您可以探索INSERT DELAYED http://dev.mysql.com/doc/refman/5.0/en/insert-delayed.html

等功能

优化您的指数(尽可能少)以减少每个插入http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

的影响

由于听起来您的需求是由大量数据增长(插入)驱动的,如果您无法从单个实例获得所需的性能,则复制可能无济于事。在这种情况下,你应该去夜间加载场景。

我们有一个类似的用例,我们每晚进行批量加载,复制仅用于备份/故障转移。

答案 2 :(得分:0)

你说“如果MySQL复制模仿服务器1,那么肯定会减慢服务器2的速度,并且与预期效果相反。”

我认为这不会减慢服务器的速度。你试过它并衡量任何性能差异吗?我真的认为这是最适合你的方式,除非你因为复制而明确衡量了对性能的影响。

答案 3 :(得分:0)

你真的没有提供足够的信息来实现你的目标,但这是我最好的理解:server1正在获取数据(使用带宽)并以某种方式处理它(使用处理能力和I / O) ; server2正在向基于后处理数据的用户提供实时信息。 server2的可用性比server1更重要,server1上的问题不应影响server2的操作。

如果server1正在获取的原始数据与在server2上使用的“已完成”数据之间存在显着差异,可能会在此过程中生成一些临时数据,只需让server1完成其工作,并使用某种类型定期将后处理数据从server1传送到server2的脚本。也许后处理数据小于server1正在处理的原始数据?

如果server1实际上没有做太多处理,只是获取数据并插入到db中,那么复制可能是将数据从#1移动到#2的合理方法。

中间方法只是复制某些后处理表,因此server1可以在mysql的其他表中完成工作,当最终产品插入到复制表中时,它将自动出现在server2上

玩得开心。

相关问题