Redis基於Proxy以及客戶端的數據分片和Redis-Cluster分片

 1、先談單節點的 Redis 存在的問題

  1. 單點故障
  2. 數據容量問題
  3. 鏈接數、請求壓力問題

主從+哨兵架構,解決了單點問題和請求壓力問題,可是數據容量仍然是 1:1 的克隆數據,數據容量問題依舊存在,數據並無分攤到各個節點。mysql

2、如何解決單點數據容量問題

A:基於客戶端的方案

1.業務拆分數據

從業務的角度不一樣的模塊按約定好的邏輯落入不一樣的Redis 節點。面試

好比:評論業務用一個redis階段,商品信息業務用另一個節點,購物車用另一個節點。redis

2.經過Hash算法路由

  • 2.1 Modula:將hash(ID)%redis節點數

弊端:redis節點數改變的話,數據就分配規則就被打破了。算法

  • 2.2 Random:隨機分配

使用場景:消息隊列。sql

數據隨機的落入到不一樣的節點,對於客戶端而言無所謂數據落在那一臺節點,只須要知道key就能拿到數據。數據庫

  • 2.3 Ketama:一致性Hash算法將數據分攤到不一樣的節點。

規劃一個虛擬的環形節點,將節點和數據參與位置分配算法。設計模式

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=優勢:增長節點能夠分擔其餘節點的壓力,不會形成全局洗牌,本來的數據還在最初規劃出的物理節點中。緩存

一致性Hash缺點:多線程

  • 擊穿的風險,本來數據是在a節點的,可是增長了節點致使後續的數據源從節點e獲取,可是e又沒有獲取到數據,從而將請求打入到了數據庫,從而可能致使擊穿緩存拖垮數據的風險。

方案:當在計算出的離最近節點沒有獲取到的數據,嘗試從離計算值最近的2個物理節點去去獲取數據。架構

  • 數據傾斜 -> 緩存雪崩

假設:咱們剛上線的時候Redis節點只有兩臺,而個人的數據的key是多是基於某一個基準在往上作增加,那麼就會致使數據大概傾斜的落在某一個節點,最極端的可能致使全部的請求都打在了這一個節點,從而拖垮此節點,從而引起緩存雪崩

方案:上述問題的關鍵點在於物理節點少,數據落點非黑即白,那麼可否增長邏輯上的節點?只有兩臺物理節點,可是還有不一樣的端口啊,ok,那就在每一個IP以後再添加隨機的數字去生成邏輯節點。

B:安排專人去充當數據路由的的角色

上述的解決方案中,咱們把數據路由的邏輯架在了客戶端,可是對於客戶端而言,鏈接能夠當作是幾類數據直接懟在了服務端。這對於服務端而言鏈接的開銷也是不小的。革命還沒有成功,還需努力

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

基於客戶端路由

租客誰都找房東去房東帶看房子怎麼能受得了對吧,那就找中介

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

基於代理路由

那麼此時只要關注的就是這個中介proxy代理的性能。 那麼是否有已經造好的Proxy輪子?

 

C.Redis的Cluster

咱們前面說的經過hash取模計算數據所屬節點的方案中,缺陷在於增減節點須要對全部的數據rehash,再根據rehash的結果遷移數據。那麼是否可以將數據預先規劃? 假設最初節點只有兩個,要預先規劃數據所屬節點,先將數據預先規劃爲10槽位(slots),在Redis Cluster裏實際上是分配了16384個slots,後續增長節點則直接從2個節點各自分一段範圍的數據過來,雨露均沾嘛。而後分到的數據進行rehash,再數據遷移到新的節點。

這樣子的話,只要增長了節點。數據仍是存在高頻的rehash呀?並且假如要對兩個相同類型的數據進行求交併補運算的話,redis也沒辦法作。比如兩個物理庫的mysql數據沒辦法inner join。

對數據加標籤(hash tag)而不是單純的直接經過hash(key),Redis不想被吐槽它不行呀。這個鍋得用戶本身背,你想要對這部分的數據作運算,作事務處理那麼你就應該儘量的將數據劃分到一個物理機上。你本身給數據加tag,從而對同一個tag作hash運算的時候能保證在一個物理機上。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=每一個節點存一份數據-節點映射關係表,好比redis1節點存放的是0,1,2的hash值對應的數據,redis1爲5,6,7,此時用戶請求獲取key1,其hash值爲3。

  1. 此時將請求路由到了redis2/redis1節點,而這2個節點又不存儲該數據。
  2. 在redis2裏獲取到了key1的值hash值爲3,拿了到映射表的關係,哦,數據在redis3,通知客戶端去redis3獲取。
  3. 客戶端去redis3獲取數據。

一直想整理出一份完美的面試寶典,可是時間上一直騰不開,這套一千多道面試題寶典,結合今年金三銀四各類大廠面試題,以及 GitHub 上 star 數超 30K+ 的文檔整理出來的,我上傳之後,毫無心外的短短半個小時點贊量就達到了 13k,說實話仍是有點難以想象的。

一千道互聯網 Java 工程師面試題

內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技術棧(485頁)

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java核心知識點合集(283頁)》

內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java中高級核心知識點合集(524頁)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java高級架構知識點整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk= watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 因爲篇幅限制,詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!

須要的小夥伴,能夠一鍵三連,下方獲取免費領取方式!

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

 

相關文章
相關標籤/搜索