2017-03-10 79 views
0

我使用的是閱讀和我的Laravel 5.2的應用程序編寫的MySQL連接設置不寫連接:Laravel閱讀並同步

'mysql' => [ 
    'write' => ['host' => env('DB_HOST_WRITE', 'localhost'),], 
    'read' => ['host' => env('DB_HOST_READ', 'localhost'),], 
    'driver' => 'mysql', 
    'port' => env('DB_PORT', '3306'), 
    'database' => env('DB_DATABASE', 'forge'), 
    'username' => env('DB_USERNAME', 'forge'), 
    'password' => env('DB_PASSWORD', ''), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
    'engine' => null 
] 

該網站在多個服務器上運行,使用負載平衡器。

現在,在該應用程序中,存在一個接一個地執行讀取和寫入操作的情況,例如,

  1. 插入新記錄到數據庫中
  2. 選擇一些新插入的記錄

與當前連接的設置,可能發生的是選擇將返回任何結果,即使插入記錄正確。

這可能是什麼原因?

+0

好吧,你使用多少個數據庫節點,哪種算法或者使用同步軟件.. 數據庫同步可能不是因爲網絡延遲,處理延遲或故意的是立竿見影的。 –

+0

我們有2個節點。至於軟件,我們使用亞馬遜極光。我如何確保我們有穩定的同步? – lesssugar

+0

那麼,我不是Aurora專家,但根據他們的網站有大約100毫秒的延遲複製.. 試圖插入插入和選擇操作之間的延遲約200毫秒,看看是否可以解決它.. 然後你必須在Aurora本身深入挖掘 –

回答

2

這不是Laravel的特定問題。這被稱爲主從複製滯後。

有多種防禦技術,但只有一個技術,「治癒」的問題

首先治癒:避免讀寫連擊

插入之後不要立即執行select操作(讀寫組合)。這聽起來很瘋狂,但如果你能避免它,那就避免它!

如果你不能做到這一點,但你可以找出其中的讀寫連擊會在你的代碼發生,只要用主的讀取和寫入OPS

防治技術(如果治癒是不可能的)

  1. 開啓從屬slave compressed protocol
  2. 禁用二進制日誌
  3. 優化MySQL的查詢(例如添加索引等)
  4. 其他方式:insert和select查詢之間手動睡眠,包裹在一個事務中都插入和選擇
+0

將master用於兩者是唯一的方法。對奴隸進行輪詢會導致讀取流量超過其值,並且依賴於預防技術可能會導致更多問題,因爲讀取副本不會總是足夠快,有時甚至是不足。如果完成了多步驟的數據庫工作,調試問題將會非常可怕。 –

2

在Laravel 5.5我已經做了(再次將使用主連接,而奴隸是免費進行) PR爲此引入了「粘性」選項。它意味着您的應用程序將盡可能使用「讀取」連接,但如果您執行「寫入」,則同一請求週期中的任何後續「讀取」也將來自寫入連接。

這確保了數據的完整性。

https://github.com/laravel/framework/pull/20445

+0

看起來很有希望。我們會在升級到5.5後立即對其進行測試。感謝寶貴的公關並在此告訴我們。 – lesssugar

+2

謝謝。這是一個配置選項,而不是默認的原因是,如果你做一個小的「寫」,然後是一個很長的大型「讀」,那麼這就是巧妙的。這意味着您的寫入數據庫中會有大量讀取。這是一個平衡的行爲 - 在大多數情況下應該可以。但請注意它。 – Laurence

+0

這是一個奇妙的想法。 –