2016-11-11 65 views
12

是否有任何机会在PDO设置中设置SELECT将在SLAVE DB服务器上执行并插入&更新& DELETE将在MASTER DB服务器上执行,或者我需要创建PHP处理函数要做到这一点?PDO SELECT从SLAVE和插入MASTER

现状:

我们有 - 为MySQL主复制。我们将增加两个新的服务器,所以这将是 - / - /

我想创建一些处理选择查询。我想在SLAVE,而不是MASTER和所有UPADTE & INSERT &执行SELECT查询 DELETE查询将在MASTER执行。这是可能的一些设置?

谢谢!

+1

如果您使用Doctrine DBAL,您可以轻松完成此操作http://www.doctrine-project.org/api/dbal/2.5/class-Doctrine.DBAL .Connections.MasterSlaveConnection.html,但是如果你有一些包装类与你自己的数据库交互,那么你必须编写自己的代码来处理它。 –

+2

使用MySQL本地驱动程序可以执行此操作:http://php.net/manual/en/mysqlnd-ms.rwsplit。php – Chris

+0

感谢您提出这个问题及其非常有用的@Abhik + chris – Karthi

回答

5

不,您不能配置PDO或任何PHP的数据库扩展来执行此操作。这很简单,因为每个PDO(或MySQLi等)实例代表单个连接到单个服务器。

所以是的,你需要一个处理程序知道有多个连接来做到这一点。一些流行的ORM和其他数据库抽象层确实提供了这样的功能。

0

即使可以,我也建议不要这样做。复制是“异步”的。也就是说,当你插入到Master中时,在你尝试读取它之前,不能保证它会到达Slave。甚至不保证它会在今天到达!

如果用户在博客上发布评论,然后转到显示评论的页面,如果评论未显示,他们将会感到恼火。他们可能会认为该评论已丢失,然后重新发布。这会导致当用户抱怨重复发帖时感到悲伤。

这被称为“关键阅读”。这种避免混乱的简单方法是小心发送给奴隶的东西 - 即不会导致“消失”帖子的东西。

有各种各样的“代理”包允许从您描述的读写拆分;有些人试图避免“批判性阅读”,但我不相信他们。

一个Galera集群(见PXC,MariaDB),同步读取,所以它可以避免严重的读取问题。 (但是,您需要应用一个设置。)

+0

里克詹姆斯 - 它是最好的解决方案。您也可以使用MaxScale(也适用于MAriaDB Galera群集)来选择正确的服务器。这也包括故障转移。我投票 –

+0

3y3skill3r - 您也可以在使用PDO的服务器上安装MaxScale,MaxScale将选择正确的服务器 –