是否有机会在PDO设置中设置SELECT将在SLAVE DB服务器上执行,并且插入&更新& DELETE将在MASTER DB服务器上执行,或者我需要创建PHP处理程序来执行此操作?
情况:
我们有MySQL的 Master - Master 复制。我们将添加两个新服务器,因此它将是 - Master / Slave - Master / Slave 。
我想为 SELECT 查询创建一些处理。我希望在 SLAVE 而不是 MASTER 上执行 SELECT 查询,并且所有 UPADTE& INSERT& DELETE 查询都将在主即可。这有可能通过一些设置吗?
谢谢!
答案 0 :(得分:6)
不,您无法配置PDO或任何PHP的数据库扩展来执行此操作。这只是因为每个PDO(或MySQLi等)实例代表单个服务器的单个连接。
所以是的,你需要一个知道多个连接的处理程序来做到这一点。一些流行的ORM和其他数据库抽象层确实提供了这样的功能。
答案 1 :(得分:1)
我建议你不要这样做。复制是"异步"。也就是说,当你插入Master时,无法保证在你尝试阅读它之前它会到达Slave。甚至不保证它今天会到来!
如果您的用户在博客上发表评论,然后转到显示评论的页面,那么如果评论未显示,则会感到恼火。他们可能会认为评论已丢失,然后重新发布。当用户抱怨双重发布时,这会导致你悲伤。
这被称为"批判性阅读"。这种避免混乱的简单方法是要小心你发送给奴隶的东西 - 也就是什么都不会导致"消失"讯息。
有各种各样的"代理"允许来自您描述的读写分割的包;有些人试图避免使用“批判性阅读”,但我并不信任他们。
Galera集群(参见PXC,MariaDB),同步读取,因此可以避免关键的读取问题。 (但是,您需要应用一个设置。)