分布式数据:缓存技术
分布式數據:緩存技術
- 前言
- 什么是分布式緩存?
- Redis 分布緩存原理
- Memcached 分布式緩存原理
- 對比分析
- 知識擴展:除了分布式存儲中的緩存,還有計算機體系結構和網絡中的緩存, 它們又分別是什么呢?
- 總結
前言
分布式存儲中“貨架”的關鍵技術——緩存技術。 在計算機領域的各個方面,緩存都非常重要,是提升訪問性能的一個重要技術。
從單個計算機的體系結構來看,內存和處理器速度差異很大,如果不采用緩存技術,處理器的性能會受到很大的限制。 計算機應用如果不采用緩存技術,對于每個請求,應用都要與后臺數據庫做一次交互,而數據庫中的數據存儲在磁盤上,因此每次請求都要和磁盤做交互,而磁盤訪問的性能很低,造成訪問延遲。還有網絡訪問,如果沒有緩存機制,每次訪問主機都要與遠程機器做交互,訪問速度也會很慢。
什么是分布式緩存?
緩存技術其實就像一個水缸,平時它會存儲一定的水,而這些水就來自深井。 如果每次都去深井打水,一方面井口比較小,導致一次能接收的用水請求有限;另一方面, 井比較深,打水的工序比較復雜,導致所需時間比較長。
有了這個水缸,不需要去深井里打水,當水缸里沒水時,水泵會將深井里的水抽到水缸中暫時存儲起來。“緩存技術”存儲了滿足了一定時間內常用的“水量”,以提高用水效率。
在計算機領域,緩存技術一般是指,用一個更快的存儲設備存儲一些經常用到的數據,供用戶快速訪問。用戶不需要每次都與慢設備去做交互,因此可以提高訪問效率。
分布式緩存就是指在分布式環境或系統下,把一些熱門數據存儲到離用戶近、離應用近的位置,并盡量存儲到更快的設備,以減少遠程數據傳輸的延遲,讓用戶和應用可以很快訪問到想要的數據。
分布式數據緩存,屬于計算機應用中的緩存的一種。而計算機應用中的緩存,一般指內存,內存存儲了用戶經常訪問的數據,用戶或應用不再需要到磁盤中去獲取相應的數據,大幅提高訪問速度。
如下圖所示,數據 A 是應用經常訪問的數據,而數據 B 很少被應用訪問,因此當應用訪問數據 A 時,不需要到磁盤,而直接訪問內存即可得到對應的值,速度較快;相反,訪問數據 B 時,由于內存中沒有緩存數據 B,所以應用需要到磁盤中獲取對應的值,速度較慢。
Redis 分布緩存原理
Redis 的全稱是 Remote Dictionary Server(遠程字典服務器)。它是以字典結構將數據存儲在內存中,應用可直接到內存讀寫 Redis 存儲的數據。
Redis 集群是一個典型的去中心化結構,每個節點都負責一部分數據的存儲,每個節點還會進行主備設計來提高 Redis 的可靠性。
Redis 中與緩存關系最緊密的三個特性:支持多數據結構、支持持久化和主備同步。
Redis 支持多數據結構
Redis 是一個基于內存的 key-value 數據庫,為了方便支持多應用的緩存,比如緩存文本類型、數據庫的查詢結果(字段與字段對應的值)等等,支持的數據結構不僅有簡單的 k/ v 類型,還可以支持 List、Set、Hash 等復雜類型的存儲。
以 Hash 這種復雜類型的存儲為例,Redis 將 Hash 視作一個整體當作數據庫的 value(可以是一個對象,比如結構體對象)進行存儲。如果把 Hash 結構的整體看作對象的話,Hash 結構里的 key-value 相當于該對象的屬性名和屬性值。
比如,插入 Hash 數據類型的命令:HMSET test field1 “Hello” field2 “World”中, 如下圖所示,test 為 key 值, field1 “Hello” field2 “World” 為 value 值,如果把整 個 Hash 結構看做對象的話,則 field1、field2 類似于對象中的屬性名,“Hello”“World”類似于對象中的屬性值。
Redis 支持持久化
持久化是指將數據從內存這種易失性存儲設備中寫入磁盤,從而讓數據永久保存。Redis 中存儲的數據雖然是基于內存的,但它也提供了持久化的機制,主要有兩種方式:RDB 和 AOF。
RDB(Redis DataBase),也稱快照方式, Redis 會定時將內存中的數據備份到磁盤中,形成一個快照,比如每天保存一下過去一周的數據。這樣當節點出現故障時,可以根據快照恢復到不同版本的數據。這種方式有一個明顯的缺點,是會造成數據丟失,即當節點出現故障時,新數據可能還未備份到磁盤中。
AOF(Append Only File)的出現主要彌補了 RDB 數據不一致的問題,其思想與數據庫復制技術中 binary log 類似,即記錄下 Redis 中所有的更新操作。
在 Redis 中,提供了三種實現 AOF 的策略:
- AOF_FSYNC_NO (不同步),即不會自動觸發寫操作的同步;
- AOF_FSYNC_EVERYSEC (每秒同步),即每隔一秒都會將寫操作同步到磁盤;
- AOF_FSYNC_ALWAYS (每次寫都同步),即每次發生寫操作會立即同步到磁盤。
Redis 中默認采用 AOF_FSYNC_EVERYSEC(每秒同步)的策略,因為這種策略的性能很不錯,而且一旦出現故障,最多只會丟失一秒的數據。
Redis 支持主備同步
在 Redis 中,采用的是異步復制技術,但 Redis 可以通過配置 min-replicas-to-write 和 min-replicas-max-lag 這兩個參數來有效地保證數據一致性。
比如,設置 min-replicas-to-write=3、min-replicas-max-lag=10,表示當至少有 3 個備數據庫連接主數據庫的延遲時間小于 10s 時,主數據庫才可以執行寫操作。延遲時間是從最后一次收到備數據庫的心跳開始計算,通常每秒發送一次心跳。
除了上面對寫操作的同步,在 Redis 中,還有兩種情況是需要進行數據同步的:
- 初次同步,即備數據庫剛啟動時的數據同步;
- 因網絡故障導致主備數據庫斷開連接,待網絡恢復后的備數據庫的數據同步。
針對這兩種情況,Redis 提供了兩種同步模式,即完整重同步和部分重同步:
完整重同步的流程:
部分重同步:當網絡恢復后,主數據庫將主備數據庫斷開連接之后的一系列寫操作發送給備服務器,備數據庫執行這些寫操作,從而保證數據保持一致。
在這種方式的實現中,主備數據庫會共同維護一個復制偏移量,這樣主數據庫就知道應該將哪些寫操作發給備數據庫,備數據庫同步時也知道應該從哪里繼續執行操作。
如圖所示,主數據庫的復制偏移量為 5000 時,向備數據庫發送了 100 個字節的數據,發送結束后復制偏移量為 5100。 此時主備數據庫連接斷開,備數據庫沒有接收到這 100 個字節的數據,等到備數據庫重新與主數據庫連接上之后,會給主數據庫發送 PSYNC 命令,并帶上自己的復制偏移量 5000,主數據庫接收到信息后,根據接收到的復制偏移量,將 5000 之后的數據發給備數據庫,從而完成數據的部分重同步。
Memcached 分布式緩存原理
Memcached 也是一個基于內存的高性能 key-value 緩存數據庫。 Memcached 比 Redis 問世更早,也有很多公司在使用,比如 Facebook、Vox、 LiveJournal 等。
Redis 的集群結構是每個節點負責一部分哈希槽,且每個節點可以設計主備。與 Redis 不同,Memcached 集群采用一致性哈希的思路,使用的是 Ketama 算法。該算法的主要思想就是,帶虛擬節點的一致性哈希算法。
在實際應用中,每個物理節點對應 100~200 個虛擬節點,才能到達一個較好的存儲均衡。如下圖所示,物理節點 1 對 應兩個虛擬節點 1-1、1-2,物理節點 2 對應三個虛擬節點 2-1、2-2 和 2-3。
采用帶虛擬節點的一致性哈希方法的優點:當添加或移除節點時,不會出現大規模的數據遷移。
對于數據結構的支持,Memcached 僅支持簡單的 k/v 數據類型,如果想要存儲復雜的數據類型,比如 List、Set 和 Hash 等,需要客戶端自己處理,將其轉化為字符串然后進行存儲。缺點是操作不靈活。比如,Memcached 存儲的數組中有一個元素需要修改,則需要將整個數組的數據取出來,修改后再整體寫入到數據庫中 。
對于持久化,Memcached 是不支持的。斷電時 Memcached 中存儲的數據將會全部丟失。因為內存是一種易失性存儲設備,斷電后將不會存儲數據。
在 Memcached 中,服務器和服務器之間沒有任何通信,即自身不支持主備。如果想要實現高可用,需要通過第三方實現。比如,Repcached 實現了 Memcached 的復制功能,支持一主一備,從而使 Memcached 滿足高可用。
對比分析
知識擴展:除了分布式存儲中的緩存,還有計算機體系結構和網絡中的緩存, 它們又分別是什么呢?
計算機體系結構中的緩存,通常是指專用的緩存設備。由于內存和 CPU 訪問速度相差很大,為了提高 CPU 的性能,計算機內部在 CPU 與內存之間設置了相應的緩存。
現在大多數機器分為三級緩存:L1 高級緩存、L2 高級緩存和 L3 高級緩存。訪問速度:L1 高級緩存 > L2 高級緩存 > L3 高級緩存 > 內存。其中,L1 高級緩存的訪問速度, 幾乎和 CPU 中寄存器的訪問速度一樣快。 有了這三級緩存,很多數據不需要到內存中讀取,而直接讀取這三級緩存中的數據即可,縮短了數據訪問的時間,使得計算機運行速度變得更快。
網絡訪問中的緩存,通常是指本地的“磁盤”。通過網絡訪問數據時,需要與遠程服務器交互來進行傳輸,而網絡間數據傳輸以及遠程服務器對請求的響應,會耗費很多時間。如果本機器的磁盤可以對經常訪問的遠程內容進行存儲,就不用每次都與遠程服務器交互, 而減少網絡數據傳輸與服務器響應的延遲,極大地提高性能。
總結
總結
以上是生活随笔為你收集整理的分布式数据:缓存技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PMP读书笔记(第8章)
- 下一篇: 命令行分析java线程CPU占用