欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis數(shù)據(jù)庫分布式設計方案介紹

 更新時間:2022年01月25日 11:15:57   作者:z_xiaoluan  
大家好,本篇文章主要講的是Redis數(shù)據(jù)庫分布式設計方案介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

問題:1-2億數(shù)據(jù)需要緩存,如何設計?

1 哈希取余分區(qū)

2億條記錄就是2億個k,v,假設有3臺機器構成一個集群,用戶每次讀寫操作都是根據(jù)公:hash(key) % N個機器臺數(shù),計算出哈希值,并用來決定數(shù)據(jù)映射到哪一個節(jié)點上。取數(shù)據(jù)的時候只需要個根據(jù)公式在相應的機器,用key就可以取到value。

優(yōu)點:  簡單粗暴,直接有效,只需要預估好數(shù)據(jù)規(guī)劃好節(jié)點,例如3臺、8臺、10臺,就能保證一段時間的數(shù)據(jù)支撐。使用Hash算法讓固定的一部分請求落到同一臺服務器上,這樣每臺服務器固定處理一部分請求(并維護這些請求的信息),起到負載均衡+分而治之的作用。

缺點:原來規(guī)劃好的節(jié)點,進行擴容或者縮容就比較麻煩了,不管擴縮,每次數(shù)據(jù)變動導致節(jié)點有變動,映射關系需要重新進行計算,在服務器個數(shù)固定不變時沒有問題,如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發(fā)生變化:Hash(key)/3會變成Hash(key) /?。此時地址經(jīng)過取余運算的結果將發(fā)生很大變化,根據(jù)公式獲取的服務器也會變得不可控。某個redis機器宕機了,由于臺數(shù)數(shù)量變化,會導致hash取余全部數(shù)據(jù)重新洗牌。

2 一致性哈希算法分區(qū)

提出一致性Hash解決方案,目的是當服務器個數(shù)發(fā)生變動時,盡量減少影響客戶端到服務器的映射關系。

2.1 一致性哈希環(huán)

        一致性哈希算法必然有個hash函數(shù)并按照算法產(chǎn)生hash值,這個算法的所有可能哈希值會構成一個全量集,這個集合可以成為一個hash空間[0,2^32-1],這個是一個線性空間,但是在算法中,我們通過適當?shù)倪壿嬁刂茖⑺孜蚕噙B(0 = 2^32),這樣讓它邏輯上形成了一個環(huán)形空間。

        它也是按照使用取模的方法,前面筆記介紹的節(jié)點取模法是對節(jié)點(服務器)的數(shù)量進行取模。而一致性Hash算法是對2^32取模,簡單來說, 一致性Hash算法將整個哈希值空間組織成一個虛擬的圓環(huán) ,如假設某哈希函數(shù)H的值空間為0-2^32-1(即哈希值是一個32位無符號整形),整個哈希環(huán)如下圖:整個空間 按順時針方向組織 ,圓環(huán)的正上方的點代表0,0點右側的第一個點代表1,以此類推,2、3、4、……直到2^32-1,也就是說0點左側的第一個點代表2^32-1, 0和2^32-1在零點中方向重合,我們把這個由2^32個點組成的圓環(huán)稱為Hash環(huán)。

2.2 節(jié)點映射

 將集群中各個IP節(jié)點映射到環(huán)上的某一個位置。

   將各個服務器使用Hash進行一個哈希,具體可以選擇服務器的IP或主機名作為關鍵字進行哈希,這樣每臺機器就能確定其在哈希環(huán)上的位置。假如4個節(jié)點NodeA、B、C、D,經(jīng)過IP地址的 哈希函數(shù) 計算(hash(ip)),使用IP地址哈希后在環(huán)空間的位置如下:

2.3 落鍵規(guī)則

        當我們需要存儲一個kv鍵值對時,首先計算key的hash值,hash(key),將這個key使用相同的函數(shù)Hash計算出哈希值并確定此數(shù)據(jù)在環(huán)上的位置, 從此位置沿環(huán)順時針行走 ,第一臺遇到的服務器就是其應該定位到的服務器,并將該鍵值對存儲在該節(jié)點上。

        如我們有Object A、Object B、Object C、Object D四個數(shù)據(jù)對象,經(jīng)過哈希計算后,在環(huán)空間上的位置如下:根據(jù)一致性Hash算法,數(shù)據(jù)A會被定為到Node A上,B被定為到Node B上,C被定為到Node C上,D被定為到Node D上。

 2.4 優(yōu)缺點

優(yōu)點:容錯性和擴展性

容錯性:

        假設Node C宕機,可以看到此時對象A、B、D不會受到影響,只有C對象被重定位到Node D。一般的,在一致性Hash算法中,如果一臺服務器不可用,則 受影響的數(shù)據(jù)僅僅是此服務器到其環(huán)空間中前一臺服務器(即沿著逆時針方向行走遇到的第一臺服務器)之間數(shù)據(jù) ,其它不會受到影響。簡單說,就是C掛了,受到影響的只是B、C之間的數(shù)據(jù),并且這些數(shù)據(jù)會轉移到D進行存儲。

 缺點:數(shù)據(jù)傾斜(節(jié)點少不宜)

        一致性Hash算法在服務 節(jié)點太少時 ,容易因為節(jié)點分布不均勻而造成 數(shù)據(jù)傾斜 (被緩存的對象大部分集中緩存在某一臺服務器上)問題,

例如系統(tǒng)中只有兩臺服務器:

3 哈希槽計算

為了解決一致性哈希算法的傾斜問題

解決均勻分配的問題, 在數(shù)據(jù)和節(jié)點之間又加入了一層,把這層稱為哈希槽(slot),用于管理數(shù)據(jù)和節(jié)點之間的關系 ,現(xiàn)在就相當于節(jié)點上放的是槽,槽里放的是數(shù)據(jù)。

槽解決的是粒度問題,相當于把粒度變大了,這樣便于數(shù)據(jù)移動。

哈希解決的是映射問題,使用key的哈希值來計算所在的槽,便于數(shù)據(jù)分配。

一個集群只能有16384個槽,編號0-16383(0-2^14-1)。這些槽會分配給集群中的所有主節(jié)點,分配策略沒有要求。可以指定哪些編號的槽分配給哪個主節(jié)點。集群會記錄節(jié)點和槽的對應關系。解決了節(jié)點和槽的關系后,接下來就需要對key求哈希值,然后對16384取余,余數(shù)是幾key就落入對應的槽里。slot = CRC16(key) % 16384。以槽為單位移動數(shù)據(jù),因為槽的數(shù)目是固定的,處理起來比較容易,這樣數(shù)據(jù)移動問題就解決了。

        Redis 集群中內(nèi)置了 16384 個哈希槽,redis 會根據(jù)節(jié)點數(shù)量大致均等的將哈希槽映射到不同的節(jié)點。當需要在 Redis 集群中放置一個 key-value時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數(shù),這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,也就是映射到某個節(jié)點上。如下代碼,key之A 、B在Node2, key之C落在Node3上

總結

到此這篇關于Redis數(shù)據(jù)庫分布式設計方案介紹的文章就介紹到這了,更多相關Redis分布式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文快速搞懂Redis的幾種數(shù)據(jù)類型方式

    一文快速搞懂Redis的幾種數(shù)據(jù)類型方式

    這篇文章主要介紹了一文快速搞懂Redis的幾種數(shù)據(jù)類型方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 百行代碼實現(xiàn)基于Redis的可靠延遲隊列

    百行代碼實現(xiàn)基于Redis的可靠延遲隊列

    本文主要介紹了百行代碼實現(xiàn)基于Redis的可靠延遲隊列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • redis數(shù)據(jù)結構之intset的實例詳解

    redis數(shù)據(jù)結構之intset的實例詳解

    這篇文章主要介紹了redis數(shù)據(jù)結構之intset的實例詳解的相關資料, intset也即整數(shù)集合,當集合保存的值數(shù)量不多時,redis使用intset作為其底層數(shù)據(jù)保存結構,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 解決Redis連接無法正常釋放的問題

    解決Redis連接無法正常釋放的問題

    這篇文章主要介紹了解決Redis連接無法正常釋放的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Redis的持久化詳解

    Redis的持久化詳解

    Redis是一個基于內(nèi)存的數(shù)據(jù)庫,它的數(shù)據(jù)是存放在內(nèi)存中,內(nèi)存有個問題就是關閉服務或者斷電會丟失,Redis的數(shù)據(jù)也支持寫到硬盤中,這個過程就叫做持久化,文中有詳細的圖介紹,需要的朋友可以參考下
    2023-06-06
  • ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)

    ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)

    這篇文章主要介紹了ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式),需要的朋友可以參考下
    2018-03-03
  • 聊一聊Redis與MySQL雙寫一致性如何保證

    聊一聊Redis與MySQL雙寫一致性如何保證

    一致性就是數(shù)據(jù)保持一致,在分布式系統(tǒng)中,可以理解為多個節(jié)點中數(shù)據(jù)的值是一致的。本文給大家分享Redis與MySQL雙寫一致性該如何保證,感興趣的朋友一起看看吧
    2021-06-06
  • redis中opsForList().range()的使用方法詳解

    redis中opsForList().range()的使用方法詳解

    這篇文章主要給大家介紹了關于redis中opsForList().range()的使用方法,文中通過實例代碼以及圖文介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • redis單節(jié)點安裝與配置方式

    redis單節(jié)點安裝與配置方式

    這篇文章主要介紹了redis單節(jié)點安裝與配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • redis中hash表內(nèi)容刪除的方法代碼

    redis中hash表內(nèi)容刪除的方法代碼

    在本篇文章里小編給各位整理了關于redis中hash表內(nèi)容怎么刪除的方法以及技巧代碼,需要的朋友們分享下。
    2019-07-07

最新評論