摘要:對于的連接數,并沒有隨著節點的增多,而降低。比如,,這個,在用分布式算法求其節點時,應該以來計算,而不是以來計算。永久數據被踢現象網上有人反饋為數據丟失,明明設為永久有效,卻莫名其妙的丟失了。
簡介
Memcached是一個開源、免費、高性能的分布式對象緩存系統,通過減少對數據庫的讀取以提高Web應用的性能;Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用 C 寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。當某個服務器停止運行或崩潰了,所有存放在該服務器上的鍵/值對都將丟失。
Memcached的服務器端沒有提供分布式功能,各個Memcached應用不會互相通信以共享信息。想要實現分布式通過,可以多搭建幾個Memcached應用,通過算法實現此效果;
Memcached里有兩個重要概念:
slab:為了防止內存碎片化,Memcached服務器端會預先將數據空間劃分為一系列slab;舉個例子,現在有一個100立方米的房間,為了合理規劃這個房間放置東西,會在這個房間里放置 30 個 1 立方米的盒子、20 個 1.25 立方米的盒子、15 個 1.5 立方米的盒子...這些盒子就是slab;
LRU:最近最少使用算法;當同一個slat的格子滿了,這時需要新加一個值時,不會考慮將這個新數據放到比當前slat更大的空閑slat,而是使用LRU移除舊數據,放入這個新數據;
部署Memcached能夠在大多數 Linux 和 類 BSD 系統上運行;官方沒有給出Windows上安裝Memcached的支持;
對于Debian / Ubuntu系統:
apt-get install memcached
對于Redhat / Fedora / CentOs系統:
yum install memcached
通過memcached -h查看幫助,同時也算是測試是否安裝成功;
如果遇到錯誤,可參考官方上的FAQ;
啟動一個Memcached應用,常見的啟動方式是這樣的:
開啟一個memcached應用作守護進程,TCP連接,端口號是 11211;-u參數是運行Memcached應用的用戶(這個參數也只有 root用戶才能使用);
memcached -u root -p 11211 -d -vvv
其他常見的參數也有
-m
-l
-c
-f
Memcached客戶端與服務器端的通信比較簡單,使用的基于文本的協議,而不是二進制協議;因此可以通過telnet進行交互;
telnet [host] [port]
按下Ctrl + ],并回車,即可回顯;
Storage命令set
存儲數據。如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。詳細命令指南可參考菜鳥教程 - Memcached set 命令;
add
只有在set的key不存在的情況下,才會存儲數據;詳細命令指南可參考菜鳥教程 - Memcached add 命令;
replace
只有在set的key存在的情況下,才會替換數據;詳細命令指南可參考菜鳥教程 - Memcached replace 命令;
append
向已存在的元素值后追加數據;詳細命令指南可參考菜鳥教程 - Memcached append 命令;
prepend
向已存在的元素值的頭部追加數據;詳細命令指南可參考菜鳥教程 - Memcached prepend 命令;
cas
命令用于執行一個"檢查并設置"的操作。它僅在當前客戶端最后一次取值后,該key 對應的值沒有被其他客戶端修改的情況下,才能夠將值寫入。檢查是通過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個唯一的 64 位值。詳細命令指南可參考菜鳥教程 - Memcached cas 命令;
get
根據元素的鍵名獲取值;詳細命令指南可參考菜鳥教程 - Memcached get 命令;
gets
獲取帶有CAS令牌的數據值;詳細命令指南可參考菜鳥教程 - Memcached gets 命令;
delete
刪除已存在的元素;詳細命令指南可參考菜鳥教程 - Memcached delete 命令;
incr/decr
對于已存在的鍵值進行自增或自減操作;詳細命令指南可參考菜鳥教程 - Memcached incr/decr 命令;
stats
查看memcached所有的統計信息;詳細命令指南可參考菜鳥教程 - Memcached stats 命令;
stats items
顯示各個slab中item的數目和存儲時長等其它信息;詳細命令指南可參考菜鳥教程 - Memcached stats items 命令;
stats slabs
顯示各個slab的信息,包括chunk的大小、數目、使用情況等。詳細命令指南可參考菜鳥教程 - Memcached stats slabs 命令;
stats sizes
用于顯示所有item的大小和個數。該信息返回兩列,第一列是 item 的大小,第二列是 item 的個數。詳細命令指南可參考菜鳥教程 - Memcached stats sizes 命令;
flush_all
清除所有緩存數據;詳細命令指南可參考菜鳥教程 - Memcached flush_all 命令;
根據服務器節點數的余數來進行分散,就是通過hash函數求得的Key的整數哈希值再除以服務器節點數并取余數來選擇服務器。這種算法取余計算簡單,分散效果好,但是缺點是如果某一臺機器宕機,那么應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的服務器從算法從去除,此時候會有 (N-1) / N 的服務器的緩存數據需要重新進行計算;如果新增一臺機器,會有N / (N+1)的服務器的緩存數據需要進行重新計算。對于系統而言,這通常是不可接受的顛簸(因為這意味著大量緩存的失效或者數據需要轉移)。
【本段內容摘自大臉貓的博客】
一致性哈希表現為一個封閉的圓環,圓環上的點分別代表0 ~ 2^32。各個memcached節點根據hash算法,分別占據圓環上的一個點,當某key進行存儲操作,會針對key進行hash操作,hash后也是圓環上的一個點,那么這個key將被存儲在順時針方向的第一個節點上。
如上圖:分配不均的節點,此時key將會被存儲到節點C上。
此時,我們新增節點D,如下圖。受影響的部分只有節點A~節點D中間的部分,這邊分數據不會再映射到節點B上,而是映射到新增節點D上。減掉一個節點同理,只影響順時針后面一個節點。
優點:動態的增刪節點,服務器down機,影響的只是順時針的下一個節點
缺點:當服務器進行hash后值較為接近會導致在圓環上分布不均勻,進而導致key的分布、服務器的壓力不均勻。若中間某一權重較大的serverdown機,命中率下降明顯;
在一致性哈希算法的基礎上引入虛擬節點
引入虛擬節點的思想,解決一致性hash算法分布不均導致負載不均的問題。一個真實節點對應若干個虛擬節點,當key被映射到虛擬節點上時,則被認為映射到虛擬節點所對應的真實節點上。
優點:引入虛擬節點的思想,每個物理節點對應圓環上若干個虛擬節點(比如200~300個),當keyhash到虛擬節點,就會存儲到實際的物理節點上,有效的實現了負載均衡;
【本段內容摘自魚我所欲也的“memcached學習 - 分布式算法”文章】
工作中常見的問題 緩存雪崩現象緩存雪崩一般是由某個緩存節點失效,導致其他節點的緩存命中率下降,緩存中缺失的數據去數據庫查詢,短時間內,造成數據庫服務器崩潰;
重啟DB,短期又被壓垮,但緩存數據也多一些;DB反復多次啟動多次,緩存重建完畢,DB才穩定運行;或者,是由于緩存周期性的失效,比如每 6 小時失效一次,那么每 6 小時,將有一個請求“峰值”,嚴重者甚至會令DB崩潰;
緩存的無底洞現象(multiget-hole)該問題由 facebook 的工作人員提出的, facebook 在 2010 年左右,memcached節點就已經達3000 個.緩存數千 G 內容。
他們發現了一個問題,memcached 連接頻率,效率下降了,于是加 memcached 節點,添加了后,發現因為連接頻率導致的問題,仍然存在,并沒有好轉,稱之為“無底洞現象”。
問題分析以用戶為例: user-133-age, user-133-name,user-133-height .....N 個 key,當服務器增多,133 號用戶的信息,也被散落在更多的節點,所以,同樣是訪問個人主頁,得到相同的個人信息, 節點越多,要連接的節點也越多。
對于 memcached 的連接數,并沒有隨著節點的增多,而降低。 于是問題出現。
multiget-hole 解決方案把某一組key,按其共同前綴,來分布。比如 user-133-age, user-133-name,user-133-height 這 3 個 key,在用分布式算法求其節點時,應該以 ‘user-133’來計算,而不是以 user-133-age/name/height 來計算。
這樣,3 個關于個人信息的 key,都落在同 1 個節點上,訪問個人主頁時,只需要連接 1 個節點。
永久數據被踢現象網上有人反饋為"memcached 數據丟失",明明設為永久有效,卻莫名其妙的丟失了。
分析原因:
如果 slab 里的很多 chunk,已經過期,但過期后沒有被 get 過, 系統不知他們已經過期。
永久數據很久沒 get 了, 不活躍, 如果新增 item,則永久數據被踢了。
當然,如果那些非永久數據被 get,也會被標識為 expire,從而不會再踢掉永久數據;
解決方案:永久數據和非永久數據分開放;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61715.html
摘要:常規的知識點整理將持續更新不僅僅做緩存使用,某種場景下可以當做數據庫使用,替換,因為是可以持久化的,所以可以直接和進行交互而則不能當數據庫使用,只能作緩存使用,不能替換。的實際處理速度完全依靠主進程的執行效率。 redis 常規的知識點整理---將持續更新... 1.redis 不僅僅做緩存使用,某種場景下可以當做數據庫使用,替換 mysql,因為 Redis 是可以持久化的,所以可以...
摘要:收到后則會調用指令一個子進程來持久化存儲的數據,在的持久化的這個短短期間內,的指令則存儲到內存中。經過官網的測試性能結果達到的。 HotFrameLearning Redis_01_簡介 - 一、大致介紹 1、介紹Redis之前,我有一堆的疑問,Redis是什么?有什么用?它能干什么?有什么特性?能解決我們日常的哪些問題? 為什么要用Redis?Redis好在哪里?除了Redis...
前言 在若干次前的一場面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關的問題:你覺得什么是后端? 送命題。當時腦瓦特了,答曰:邏輯處理和數據增刪改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 當場被懟得體無完膚,羞愧難當。事后再反思這問題,結合資料總結了一下。發現自己學過的Re...
閱讀 3218·2021-11-08 13:21
閱讀 1200·2021-08-12 13:28
閱讀 1410·2019-08-30 14:23
閱讀 1931·2019-08-30 11:09
閱讀 847·2019-08-29 13:22
閱讀 2691·2019-08-29 13:12
閱讀 2553·2019-08-26 17:04
閱讀 2260·2019-08-26 13:22