縱向就是增加記憶體,磁碟. 簡單暴力.但是存在一些問題
1.如果用rdb持久化,那麼記憶體也會需要很多,fork時阻塞時間也會變長
2.記憶體擴充套件受限.擴充套件1t記憶體,不太現實
因此redis3.0 推出了集群模式
1.將資料分配在16384個槽裡.資料通過 hash+取模,計算出key應該存放在哪個槽裡.
2.集群中每個例項都分配一部分槽,這個既可以平均分配,也可以手動指定,但是,每個槽必須都得分配完,不然無法工作.
1.那麼問題來了,槽和例項的資訊存在**?每個節點都有嗎?客戶端也有嗎?
確實都有
客戶端儲存對映資訊.在獲取資料時,根據key計算出slot,根據對映資訊得到例項.
當redis集群擴縮容時,必然會遷移slot資料,此時使用重定向來解決訪問異常問題.
2.那擴縮容後,對映資訊都是怎麼同步的呢?
redis在啟動的時候,會啟動兩個埠,2379 ,12379. 乙個用來接收client請求,乙個用來集群間的通訊. 通訊協議就是gossip協議.
其實元資料的儲存可以有兩種方式,集中式和分布式.
集中式:
例如storm元資料儲存在zk中,並通過leader來進行操作,優點是便於管理,缺點是單點壓力大.
gossip:
謠言演算法,就是1傳2,2傳4.跟大媽一樣.
具體可以參考
老師最後提了乙個問題
redis cluster不採用把key直接對映到例項的方式,而採用雜湊槽的方式k神的回答--->參考:原因:1、整個集群儲存key的數量是無法預估的,key的數量非常多時,直接記錄每個key對應的例項對映關係,這個對映表會非常龐大,這個對映表無論是儲存在服務端還是客戶端都占用了非常大的記憶體空間。
2、redis cluster採用無中心化的模式(無proxy,客戶端與服務端直連),客戶端在某個節點訪問乙個key,如果這個key不在這個節點上,這個節點需要有糾正客戶端路由到正確節點的能力(moved響應),這就需要節點之間互相交換路由表,每個節點擁有整個集群完整的路由關係。如果儲存的都是key與例項的對應關係,節點之間交換資訊也會變得非常龐大,消耗過多的網路資源,而且就算交換完成,相當於每個節點都需要額外儲存其他節點的路由表,記憶體占用過大造成資源浪費。 現在每個節點只要快取 例項和槽的對映就行, 不用快取 例項和key的對映.明顯不是乙個重量級的資料
3、當集群在擴容、縮容、資料均衡時,節點之間會發生資料遷移,遷移時需要修改每個key的對映關係,維護成本高。
4、而在中間增加一層雜湊槽,可以把資料和節點解耦,key通過hash計算,只需要關心對映到了哪個雜湊槽,然後再通過雜湊槽和節點的對映表找到節點,相當於消耗了很少的cpu資源,不但讓資料分布更均勻,還可以讓這個對映表變得很小,利於客戶端和服務端儲存,節點之間交換資訊時也變得輕量。
客戶端還要儲存呢,如果對映錶太大,就gg了
5、當集群在擴容、縮容、資料均衡時,節點之間的操作例如資料遷移,都以雜湊槽為基本單位進行操作,簡化了節點擴容、縮容的難度,便於集群的維護和管理
Redis Cluster模式介紹與部署
一 資料分布 redis cluster採用雜湊分割槽規則 離散度好 資料分布業務無關 無法順序訪問 1.節點取餘分割槽 hask key n,n為節點數量 優點 簡單,常用於資料庫分庫分表 缺點 節點數量變化導致資料重新遷移 2.一致性雜湊分割槽 每個節點分配乙個token,構成乙個雜湊環,根據雜...
Android Activity 啟動模式詳解
最近有群裡的朋友問我 activity的四種啟動模式分別是什麼意思?當初因為專案比較忙,草草的解釋了下,api文件中說的也只是一般,在這裡就小記一下吧,以便有更多的朋友對activity啟動模式了解深刻一點。度娘的時候 就可以找得到不需要在 問人了。如果不了解的話,簡單的幾句也說不清晰。activi...
CygWin安裝RedisCluster指南
安裝前確認磁碟有6g以上的磁碟容量,安裝時雙擊setup x86 64.exe,基本按照預設設定安裝就行,也可自己指定安裝路徑等,3 deps hiredis net.c中注釋掉 並在 include sds.h 之後追加 ifdef cygwin define tcp keepcnt 8 defi...