標籤:

memcached 和 mysql 結合使用的兩種實現選擇?

我們的應用已經決定採用 mysql+memcached 的方式,針對的資料庫版本是 mysql 5.1,目前已經進行了半個月的編碼實現:

1.採用的是 」memcached 和mysql 獨立的實現方式,在編碼層控制讀 memcached,找不到再去資料庫讀,寫資料庫,然後再去更新 memcached,在這個過程發現邏輯複雜度比較高。

2.現在發現 「Using the MySQL memcached User-Defined Functions」 的實現方式,是通過觸發器解決以上複雜邏輯的,從我的感覺上來看,應該是降低了代碼複雜度。

我想諸位老師幫助我從理論上分析一下這兩種方式的利弊,當然最好從實戰角度分析兩者的利弊,或者兩者在使用上有什麼值得注意之處,哪種更好,謝謝。


@盧鈞軼 老弟分析的非常不錯

1.採用的是 」memcached 和mysql 獨立的實現方式,在編碼層控制讀 memcached,找不到再去資料庫讀,寫資料庫,然後再去更新 memcached,在這個過程發現邏輯複雜度比較高。

我非常好奇為啥做這個模塊需要半個月的編碼時間? 難道是做的MySQL同步到MC的做法是通過MySQL的二進位日誌??

不知道你的業務模型,若是修改量非常大的話,數據同步會存在非常大的壓力,不管是先寫資料庫再程序更新MC,還是寫完資料庫再藉助MySQL二進位更新MC,都可能存在嚴重的問題(注意前提:系統寫負載大的情況):

1&>.方式一:有可能導致大量的任務等待,以及資料庫更新速度跟不上的話,就更可怕;

2&>.方式二:因產生大量需要解析和同步的寫事務,導致MC更新延遲而可能影響用戶的數據請求,以及數據同步解析的負載壓力非常大;

推薦做法:系統寫負載大的業務場景

1&>.數據允許存在丟失的風險,則可以考慮先寫MC直接返回給用戶,然後後台程序或隊列的方式非同步更新資料庫,不管是讀數據還是寫數據,都是先訪問MC;

2&>.數據不允許丟失的風險,則先寫資料庫,並且對MC中對應的數據標誌為過期;讀業務優先對MC請求,若是數據不存在,則對資料庫進行操作,並且把數據載入到MC中,定期清理MC過期的數據。

申明:本人以前寫過VC++,但是真不會寫Linux環境下C/C++了,但是做的設計方案,都是讓自己所帶領的C++團隊編碼實現,業務流程是先寫MC,再非同步到資料庫,通過數據中間件控制。


觸發器的開銷其實不低,加一個觸發器的開銷跟一個索引相當,我們當時測試過,單線程情況下(如果是從庫更新MC)大概資料庫響應時間會延長60%。多線程的情況下(主庫更新MC),根據線程數不同而不同,記得300個並發的時候,資料庫的響應時間是之前的300%還多,因此從performace的角度看,不是個好選擇。

另外維護資料庫存儲過程和觸發器的開銷絕對比維護應用程序代碼(java,python....)大的多。


我喜歡在應用層做,沒覺得邏輯複雜在哪裡。

幾個要點

1:memcache和mysql的鏈接時間,如果兩個鏈接同時開啟,先開啟的會影響後開啟的,比如memcache先開啟鏈接,然後開啟mysql,如memcache阻塞,程序未及時釋放,會連帶導致mysql崩潰,這種情況以前遇到過,記住鏈接必須加超時限制,防止連帶阻塞現象。或者,釋放memcache連接後,再開啟mysql鏈接(這樣不利於程序封裝)

2:memcache命中率如不高,不如不用。做memcache應用後,第一件事情是測試命中率情況,不能認為加了緩存就一定可以提高效率。

3:如果數據塊較大,放在memcache中讀取的效率或許不如mysql。

4:隨時監控swap分區佔用情況,確保內存使用合理。

5:memcached適合簡單的key-value查詢,如果涉及結構性內容,或者排名類應用,建議使用redis.


&>&>在編碼層控制讀memcached,找不到再去資料庫讀,寫資料庫,然後再去更新memcached,在這個過程發現邏輯複雜度比較高。

如果你的應用數據的粒度劃分足夠細,並且配合良好的ORM層對象緩存,那麼沒有任何邏輯複雜度,代碼根本不需要涉及這些部分,都是ORM層緩存自動處理掉了。


雖然個人沒用過memcached UDF,但是做過簡單的評估,主要有以下幾點覺得不適用於production。

1. 增加了Memcached和MySQL之間的耦合性。

試想如果UDF指向的memcached掛了,trigger方式調用的UDF是不會接收到報錯返回的,程序段自然也無法做相應處理。

2. 增加了MySQL的伺服器壓力。

MySQL本身就是一個對伺服器性能要求較高的DBMS,原本簡單的App &<--&> Memcached,現在變成了 App &<---&> MySQL &<---&> Memcached ,無形中增加了MySQL不必要的轉發壓力(網路,CPU的損耗)

3. 運維困難。

某台Memcached如需升級,分離式架構只需要修改APP配置文件。而UDF的方案就需要修改相應的trigger,trigger是很難進行版本控制和批量下發管理的,無形中對運維造成了很大的困難


推薦閱讀:

從Mysql邁入資料庫
mysql,zk這些強一致性的軟體為什麼要先寫日誌?
SQL Server 相比 MySQL 有何優勢?

TAG:MySQL |