本文是《緩存在分佈式系統中的應用》第三篇文章。html
上次主要給你們分享了,緩存在分佈式系統中的應用,主要從不一樣的場景,介紹了CDN,反向代理,分佈式緩存,本地緩存的常規架構和基本原理。linux
由於時間關於,原計劃分享《緩存常見問題》的內容,沒有講。本次主要針對緩存的常見個問題,作一個介紹。主要有如下議題:算法
緩存是在數據持久化以前的一個節點,主要是將熱點數據放到離用戶最近或訪問速度更快的介質中,加快數據的訪問,減少響應時間。數據庫
由於緩存屬於持久化數據的一個副本,所以不可避免的會出現數據不一致問題。致使髒讀或讀不到數據的狀況。數據不一致,通常是由於網絡不穩定或節點故障致使。根據數據的操做順序,主要有如下幾種狀況。後端
(1)先寫緩存,再寫數據庫緩存
以下圖:服務器
假如緩存寫成功,但寫數據庫失敗或響應延遲,則下次讀取(併發讀)緩存時,就出現髒讀;網絡
(2)先寫數據庫,再寫緩存架構
以下圖:併發
假如寫數據庫成功,但寫緩存失敗,則下次讀取(併發讀)緩存時,則讀不到數據;
(3)緩存異步刷新
指數據庫操做和寫緩存不在一個操做步驟中,好比在分佈式場景下,沒法作到同時寫緩存或須要異步刷新(補救措施)時候。
此種狀況,主要考慮數據寫入和緩存刷新的時效性。好比多久內刷新緩存,不影響用戶對數據的訪問。
第一個場景:
這個寫緩存的方式,自己就是錯誤的,須要改成先寫持久化介質,再寫緩存的方式。
第二個場景:
(1)根據寫入緩存的響應來進行判斷,若是緩存寫入失敗,則回滾數據庫操做;此種方法增長了程序的複雜度,不建議採用;
(2)緩存使用時,假如讀緩存失敗,先讀數據庫,再回寫緩存的方式實現。
第三個場景:
(1)首先肯定,哪些數據適合此類場景;
(2)根據經驗值肯定合理的數據不一致時間,用戶數據刷新的時間間隔;
(1)超時:設置合理的超時時間;
(2)刷新:定時刷新必定範圍內(根據時間,版本號)的數據;
以上是簡化數據讀寫場景,實際中會分爲:
(1)緩存與數據庫之間的一致性;
(2)多級緩存以前的一致性;
(3)緩存副本以前的一致性。
業界有兩種理論,第一套緩存就是緩存,臨時存儲數據的,不須要高可用。第二種緩存逐步演化爲重要的存儲介質,須要作高可用。
本人的見解是,緩存是否高可用,須要根據實際的場景而定。臨界點是是否對後端的數據庫形成影響。
具體的決策依據須要根據,集羣的規模(數據,緩存),成本(服務器,運維),系統性能(併發量,吞吐量,響應時間)等方面綜合評價。
緩存的高可用,通常經過分佈式和複製實現。分佈式實現數據的海量緩存,複製實現緩存數據節點的高可用。架構圖以下:
其中,分佈式採用一致性Hash算法,複製採用異步複製。
(1)複製雙寫:緩存節點的複製,由異步改成雙寫,只有兩份都寫成功,纔算成功。
(2)虛擬層:一致性Hash存在,假如其中一個HASH環不可用,數據會寫入臨近的環,當HASH可用時,數據又寫入正常的HASH環,會致使數據偏移問題。這種狀況,能夠考慮在HASH環前面加一個虛擬層實現。
(3)多級緩存:好比一級使用本地緩存,二級採用分佈式Cahce,三級採用分佈式Cache+本地持久化;
方式不少,須要根據業務場景靈活選擇。
雪崩是指當大量緩存失效時,致使大量的請求訪問數據庫,致使數據庫服務器,沒法抗住請求或掛掉的狀況。
解決方法:
(1)合理規劃緩存的失效時間;
(2)合理評估數據庫的負載壓力;
(3)對數據庫進行過載保護或應用層限流;
(4)多級緩存設計,緩存高可用;
緩存通常是Key,value方式存在,當某一個Key不存在時會查詢數據庫,假如這個Key,一直不存在,則會頻繁的請求數據庫,對數據庫形成訪問壓力。
解決方法:
(1)對結果爲空的數據也進行緩存,當此key有數據後,清理緩存;
(2)必定不存在的key,採用布隆過濾器,創建一個大的Bitmap中,查詢時經過該bitmap過濾;
如下是本次分享參考的資料和推薦你們參考的資料。
MemCache超詳細解讀:http://www.mamicode.com/info-detail-1120932.html
緩存與數據庫一致性保證:http://www.36dsj.com/archives/43950
HASH環和虛擬節點:http://www.111cn.net/sys/linux/58748.htm
讓memcached分佈式:http://blog.csdn.net/cutesource/article/details/5848253
以上是本週的分享,主要講解了緩存常見的問題,包括數據一致性,緩存高可用,緩存雪崩,緩存穿透等知識。
咱們的分享只是介紹一下知識結構,但願能夠起到一個拋磚引玉的做用。由於,每一個知識點都有一些細化的地方,須要學習的知識點不少,須要你們不斷深刻學習。也歡迎你們把好的內容,即時的分享到羣內(知識連接或參加周知識分享,參加周知識分享的同窗能夠直接聯繫我哈~~)
下次分享《分佈式系統服務化架構(一)》,2016年6月26日。
本次是分享規則調整後的第一次,歡迎你們積極提出問題。