對於高併發流量大的web站點,單點的數據庫每每很難支持,通常是使用主從複製,再加上mysql proxy實現複製均衡,讀寫分離等功能等。可是主從複製會有延遲,大網站是如何解決這些問題的呢?轉載自PHP老楊文章。mysql
1.優酷的經驗linux
數據庫採用水平的擴展,主從複製,隨着從庫的增多,複製延遲愈來愈厲害,最終沒法忍受。最終仍是採用了平行的數據庫,至關於集羣吧,把一組用戶的相關的數據和表放到一組的數據庫上。使用SSD來優化mysql的I/O,性能明顯提升,採用數據庫分片的技術,拋棄了原來主從延遲的問題,按照userid進行分片,這樣的話就必須有一個全局的表來管理用戶和shard的關係,根據userid能夠獲得shardid,而後根據shardid去制定的分片查詢數據,可是若是網站的用戶過多,此表也可能會成爲瓶頸,由於查詢會很是的頻繁,能夠考慮使用memcache,等方案。web
具體的用戶分片的方案是userid通常是用戶註冊的時候自動生成的,而後看有幾臺web服務器,假若有M臺,用userid % M即可以分配一臺DB服務器,而後再繼續的對應數據庫表等,求餘數的方案來進行。sql
2.facebook的經驗數據庫
採用大量的MySQL服務器加memcache服務器。服務器
用戶發起更新操做,改名‘a'->'b'---->主數據庫寫入b,刪除主端memcahce的名字值-->遠程的memcache並不刪除,主從複製更新從庫,而後更新memcache,這樣的方案仍然會有數據延遲的問題,我以爲能夠這樣,當主服務器有數據更新的時候,當即更新從服務器中的memcache的數據,這樣的話延遲就很是少了。併發
對於比較重要而寫必須實時的數據,好比用戶更換密碼,更新操做寫入主庫,而後用新密碼登陸(從庫讀),會形成密碼不一致的狀況,致使短期內登陸錯誤,因此這種須要實時讀取的數據最好從主庫直接讀取,避免從庫數據滯後,還好須要實時讀取的狀況並非不少。高併發