2016-11-11 66 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將選擇正確的服務器 –