日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis进阶-分布式存储 Sequential partitioning Hash partitioning

發布時間:2025/3/21 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis进阶-分布式存储 Sequential partitioning Hash partitioning 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 分布式存儲
    • 順序分區 Sequential partitioning
    • 哈希分區 Hash partitioning
      • 方案總覽
      • 節點取余分區 Hashing
      • 一致性哈希分區 Consistent hashing
        • 初始化
        • 節點的擴容與縮容
      • 虛擬哈希分區
      • 虛擬哈希分區 (Version2)
    • 順序分區 VS 哈希分區


分布式存儲

了解Redis集群原理之前我們先來梳理一下分布式存儲的相關知識

拆分在算法中是一個非常重要的思想,當你的數據集巨大時,你可以按照特定的規則將大數據拆分成小數據集,降低因數據量增長過大帶來的問題。

基本方案有兩種:順序分布 & 哈希分布 。 需要根據具體業務選擇分片方式

數據分區雖好 ,但是有沒有哪些棘手的問題要處理呢? 當然有了,比如

  • 自動負載均衡

    分布式存儲系統需要自動識別負載高的節點,當某臺機器的負載高時,自動將其上的部分數據遷移到其他機器。

  • 一致性

    分片后數據可能分布在不同存儲服務器上,無法使用數據庫自帶的單機事務,需通過分布式應用事務一致性模型來解決


順序分區 Sequential partitioning

從名字上也很好理解順序分布的含義, 就是將大表按一定順序劃分為連續的子表,然后將子表按一定策略分配到存儲節點上。

舉個簡單的例子

優點呢?

  • 可順序讀
  • 缺點呢?

  • 數據可能分布不均勻
  • 數據量大的時候,為了性能 ,需要使用索引來記錄子表信息

  • 哈希分區 Hash partitioning

    方案總覽

    節點取余分區 Hashing

    通過數據的某個特征計算哈希值,并將哈希值與集群中的服務器建立映射關系,從而將不同數據分布到不同服務器上。

    hash(object) % N

    舉個例子:

    假設這個時候我要添加一個節點 ,我們拿 1-10 來說,來計算下從3個節點到4個節點的遷移率

    先 1 % 3 , 2 % 3 … 10 % 3 , 算出來 在哪個分區,如下圖左側 (0 ,1 ,2 三個分區)

    重新對4進行 1 %4 , 2 % 4 … 10 % 4, 計算后 ,如右側

    比對一下, 只有 1 (分區0) 和 2 (分區1) 這兩個值 還在原來的分區里 ,其余8個數字 都遷移到了其他的分區中。

    解釋下遷移率 是指: 你的這個緩存區域中已經沒有數據了,需要DB查詢,回寫到緩存,80%的數據都要這樣重新構建…


    咋解決呢?

    稍微挫一點的方案 翻倍擴容 ,遷移率可以降低到 50%

    我們還是那1-10 這10個數字,3個分區變6個分區來計算下遷移率

    原來1 % 3 , 2 % 3 … 10 % 3 , 算出來 在哪個分區
    翻倍擴容 重新對6進行 1 %6 , 2 % 6 … 10 % 6, 計算

    建議: 看場景,如果你的業務對緩存依賴沒這沒強,查不到從DB查就是,并發也不高,也不是不可以,畢竟這個最簡單。

    當然了,最好不用,太古老


    一致性哈希分區 Consistent hashing

    剛才根據節點數量來分區的方式,缺點也看到了,遷移率太高。 剛才的翻倍擴容的方案也差強人意,有沒有更好的呢? 那就是 Consistent hashing

    我們使用 哈希環來解決 slot 數發生變化時,盡量減少數據的移動。

    一致性哈希算法在1997年由麻省理工學院的Karger等人在解決分布式Cache中提出的.

    初始化

    • 首先求出節點 的哈希值 (比如可以選擇服務器的ip或主機名作為關鍵字進行哈希),并將其配置到0~2^32的環上
    • 然后采用同樣的方法求出存儲數據的鍵的哈希值,并映射到相同的環上
    • 緊接著從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。
    • 如果超過2^32仍然找不到服務器,就會保存到第一個節點上

    節點的擴容與縮容

    節點取余的算法當節點動態的調整大大的影響緩存的命中率,但Consistent Hashing中,只有在環上增加服務器的地點逆時針方向的第一個節點上的鍵會受到影響

    舉個例子: 假設我們要在node1 和 node2 之間 增加一個 node5節點,看看哪些數據會受到影響?

    增加node5 后

    是不是 右上方的 兩條數據 你下次再查找的時候 ,你會去node5找 (因為這兩條數據的下一個節點是node5 ,已經不是node2了),找不到,失效了,會重新從數據源獲取,重新構建。

    仍然存在小規模的失效,但比第一種hash算法,如果節點很多,這種影響的數據范圍降低了很多。

    總結下 :

  • 客戶端分片: hash + 順時針(優化取余)
  • 節點伸縮:只影響鄰近節點,但是還有數據遷移
  • 翻倍伸縮: 保證最小遷移數據和負債均衡 , 這個其實還是有可能數據分部不均勻,比如你4個節點,大部分的key做hash以后,有可能集中在node1 和 nod2上,node3 和 node4 只有少量的數據,所以還是建議翻倍擴容。 這個就是我們常說的: 服務節點少時數據傾斜的問題
  • 綜上所述,一致性哈希算法對于節點的增減都只需重定位環空間中的一小部分數據,具有較好的容錯性和可擴展性。

    另外,一致性哈希算法在服務節點太少時,容易因為節點分部不均勻而造成數據傾斜問題


    虛擬哈希分區

    為了解決一致性hash在節點數量比較少的情況下出現數據傾斜問題,一致性哈希算法引入了虛擬節點機制,即對每一個服務節點計算多個哈希,每個計算結果位置都放置一個此服務節點,稱為虛擬節點。

    如何搞這些虛擬節點呢? 可以在服務器ip或主機名的后面增加編號來實現。例如上面的情況,可以為每臺服務器計算三個虛擬節點,于是可以分別計算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六個虛擬節點:

    同時數據定位算法不變,只是多了一步虛擬節點到實際節點的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三個虛擬節點的數據均定位到Node A上。

    這樣就解決了服務節點少時數據傾斜的問題。在實際應用中,通常將虛擬節點數設置為32甚至更大,因此即使很少的服務節點也能做到相對均勻的數據分布。

    import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet;public class ConsistentHash<T> {private final int numberOfReplicas;// 節點的復制因子,實際節點個數 * numberOfReplicas =// 虛擬節點個數private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();// 存儲虛擬節點的hash值到真實節點的映射public ConsistentHash( int numberOfReplicas,Collection<T> nodes) {this.numberOfReplicas = numberOfReplicas;for (T node : nodes){add(node);}}public void add(T node) {for (int i = 0; i < numberOfReplicas; i++){// 對于一個實際機器節點 node, 對應 numberOfReplicas 個虛擬節點/** 不同的虛擬節點(i不同)有不同的hash值,但都對應同一個實際機器node* 虛擬node一般是均衡分布在環上的,數據存儲在順時針方向的虛擬node上*/String nodestr =node.toString() + i;int hashcode =nodestr.hashCode();System.out.println("hashcode:"+hashcode);circle.put(hashcode, node);}}public void remove(T node) {for (int i = 0; i < numberOfReplicas; i++)circle.remove((node.toString() + i).hashCode());}/** 獲得一個最近的順時針節點,根據給定的key 取Hash* 然后再取得順時針方向上最近的一個虛擬節點對應的實際節點* 再從實際節點中取得 數據*/public T get(Object key) {if (circle.isEmpty())return null;int hash = key.hashCode();// node 用String來表示,獲得node在哈希環中的hashCodeSystem.out.println("hashcode----->:"+hash);if (!circle.containsKey(hash)) {//數據映射在兩臺虛擬機器所在環之間,就需要按順時針方向尋找機器SortedMap<Integer, T> tailMap = circle.tailMap(hash);hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();}return circle.get(hash);}public long getSize() {return circle.size();}/** 查看表示整個哈希環中各個虛擬節點位置*/public void testBalance(){Set<Integer> sets = circle.keySet();//獲得TreeMap中所有的KeySortedSet<Integer> sortedSets= new TreeSet<Integer>(sets);//將獲得的Key集合排序for(Integer hashCode : sortedSets){System.out.println(hashCode);}System.out.println("----each location 's distance are follows: ----");/** 查看相鄰兩個hashCode的差值*/Iterator<Integer> it = sortedSets.iterator();Iterator<Integer> it2 = sortedSets.iterator();if(it2.hasNext())it2.next();long keyPre, keyAfter;while(it.hasNext() && it2.hasNext()){keyPre = it.next();keyAfter = it2.next();System.out.println(keyAfter - keyPre);}}public static void main(String[] args) {Set<String> nodes = new HashSet<String>();nodes.add("A");nodes.add("B");nodes.add("C");ConsistentHash<String> consistentHash = new ConsistentHash<String>(2, nodes);consistentHash.add("D");System.out.println("hash circle size: " + consistentHash.getSize());System.out.println("location of each node are follows: ");consistentHash.testBalance();String node =consistentHash.get("apple");System.out.println("node----------->:"+node);}}

    虛擬哈希分區 (Version2)

    剛才虛節點這種靠數量取勝的策略增加了存儲這些虛節點信息所需要的空間

    在Redis Cluster中使用了一種比較特殊的方法來解決分布不均的問題,改進了這些數據分布的算法,將環上的空間均勻的映射到一個線性空間,這樣,就保證分布的均勻性。


    順序分區 VS 哈希分區


    總結

    以上是生活随笔為你收集整理的Redis进阶-分布式存储 Sequential partitioning Hash partitioning的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品sm调教免费专区 | 911国产视频 | 久久国产精品国产精品 | 国产3p精品一区 | 国产精品久久久久久久av | 99视频在线精品 | 免费草逼网站 | 在线免费一区 | 中日黄色片 | 可以看的毛片 | 香蕉茄子视频 | 亚洲天堂网络 | 青青草原亚洲 | 精品国产乱码久久久久久久 | 中文字幕乱码人妻无码久久 | 国产av无码专区亚洲av毛网站 | 欧美黑人又粗又大又爽免费 | 国产一区二区伦理 | 夜夜夜久久久 | a√在线观看 | 久久成人精品 | 91免费网站入口 | 国产性爱精品视频 | 天堂综合网 | 日本va欧美va欧美va精品 | 欧美性xxxxxxxxx| 日本aⅴ视频 | 国产精品国产三级国产专播品爱网 | 色漫在线观看 | 懂色一区二区 | 毛片大全免费 | 老鸭窝久久 | 国产精品美女av | 女人张开双腿让男人捅 | 久久久久免费观看 | 天堂网在线观看视频 | 成人手机视频在线观看 | 亚洲午夜18毛片在线看 | 亚洲色图综合网 | 午夜极品| 美女被叉叉的影院 | 51人人看 | 国产精品美女久久 | 一区二区三区视频播放 | caoporen超碰 | 超碰精品在线 | 亚洲在线资源 | 国产伦精品一区二区三区视频女 | 免费性网站 | 日韩成人免费 | 午夜aa | 色噜噜在线播放 | 日韩午夜av| 婷婷综合影院 | 精品免费国产 | 天天毛片 | 在线观看www.| 久久久免费电影 | jizz黄色片 | 女警白嫩翘臀呻吟迎合 | 亚洲在线视频观看 | 美日韩黄色片 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 亚洲第一页中文字幕 | 久久久久97 | 动漫美女揉胸 | 成人看的毛片 | 亚洲激情在线播放 | 91麻豆精品在线 | 五月激情四射网 | 欧美a视频在线观看 | 久久久久久久久影院 | 日韩二区视频 | 色版视频 | 亚洲区一区二区 | 欧美一级二级在线观看 | 久久伊人久久 | 内地级a艳片高清免费播放 91在线精品一区二区 | 美丽的姑娘观看在线播放 | 国产色中色| 青青草一区二区三区 | 91亚洲国产成人精品一区 | 一区二区三区四区日韩 | 国内毛片毛片毛片毛片 | 国产精品激情偷乱一区二区∴ | 娇妻被老王脔到高潮失禁视频 | 91精品中文字幕 | 欧美激情视频在线观看 | 韩毛片 | 88国产精品视频一区二区三区 | a级黄色片免费看 | 日韩在线欧美 | 免费在线一区二区三区 | 最新中文字幕一区 | 8050午夜一级毛片久久亚洲欧 | 国产主播毛片 | 国产精久久久久 | 久久午夜夜伦鲁鲁一区二区 | 一区二区三区啪啪啪 |