2009-08-17 51 views
3

假設我們有一個局域網絡上的3臺服務器:MySQL的複製速度

APP - PHP應用程序服務器

MASTER - 主MySQL數據庫服務器

SLAVE - 從Mysql數據庫服務器(複製MASTER)

在一個代碼塊(php)APP插入MASTER,檢索last_insert_id,然後使用它來選擇剛從SLAVE插入的數據。

所以現在的問題是,將複製的時候發生了SLAVE有從MASTER的數據?這是否受到MASTERSLAVE上的負載影響?

最後,如果數據有問題,有沒有辦法確保從SLAVE收到最新數據?

回答

5

因爲MySQL的複製時間是不可控變量(甚至在適當的實現,問題可能出現的失速複製,或阻止它),最好不要依賴於數據複製。你可以將問題分爲兩種情況:

1)我是做CUD操作的用戶,我期待R操作後綴來反映我剛剛做出的改變。在這種情況下,您絕對需要將數據從主數據中提取出來,因爲用戶期望他的更改有效。

2)我是一個外部用戶,我不知道,CUD指令發生了,我一般不關心,所以返回陳舊的數據是可以接受的(在實現的99%,否則你可能不會使用PHP *)。

到#1另一種方法是,以通知他的變化傳播用戶,並且是在某些情況下,例如可接受的許多網站會告訴你,x可能需要長達y分鐘才能出現,這就是這種情況。

  • 如果您需要即時更新,您可以嘗試寫入與(可能不可靠)數據庫數據一起輪詢的緩存層。像memcached這樣的東西將是一個優秀的候選人。
0

這取決於SLAVE服務器從MASTER服務器複製數據的速度。

如果它直接與INSERT,UPDATE和DELETE命令捆綁在一起,即當您插入某些內容時,實際上將它插入到兩者上,很可能它們都可用。

如果SLAVE服務器通過每隔多次運行的任務來複制MASTER以從MASTER獲取數據,這比每1次查詢進行2次查詢花費更少,則意味着數據不可用直到任務運行。