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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大数据日知录(一)数据分片与路由

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据日知录(一)数据分片与路由 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 概念
    ????目前主流的大數(shù)據(jù)存儲(chǔ)與計(jì)算系統(tǒng)通常采用橫向擴(kuò)展(Scale Out)的方式支持系統(tǒng)可擴(kuò)展性,即通過增加機(jī)器數(shù)目來獲得水平擴(kuò)展能力。對(duì)于待存儲(chǔ)處理的海量數(shù)據(jù),需要通過數(shù)據(jù)分片(Shard/partition)來將數(shù)據(jù)進(jìn)行切分并分配到各個(gè)機(jī)器中去,數(shù)據(jù)分片后如何找到某條記錄的存儲(chǔ)位置就成為必然要解決的問題,這一般被稱為數(shù)據(jù)路由(Data Routing)。數(shù)據(jù)分片和數(shù)據(jù)路由的抽象模型如下圖所示:

  • 哈希分片(Hash Partition)
    最為常見的3種哈希分片方式分別為:Round Robin、虛擬桶和一致性哈希方法。

    • Round Robin
      ????Round Robin就是常用的哈希取模法,利用哈希函數(shù)將數(shù)據(jù)映射到編號(hào)從0到k-1的物理機(jī)上。
      H(key)=hash(key) mod K
      這種分片方式的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,缺點(diǎn)是缺乏靈活性,無法進(jìn)行橫向擴(kuò)展。
    • 虛擬桶(Virtual Buckets)
      ????虛擬桶機(jī)制將所有記錄首先通過哈希函數(shù)映射到虛擬桶,記錄和虛擬桶是多對(duì)一的關(guān)系,第二層映射是虛擬桶和物理機(jī)之間的映射,也是多對(duì)一的關(guān)系,其具體實(shí)現(xiàn)方式是通過查表來實(shí)現(xiàn)的,以Membase為例,虛擬桶運(yùn)行機(jī)制如下圖所示:
    • 與Round Robin相比,虛擬桶將原先由記錄直接到物理機(jī)的單層映射解耦成兩級(jí)映射,大大加強(qiáng)了系統(tǒng)擴(kuò)展的靈活性,當(dāng)加入新機(jī)器時(shí),將某些虛擬桶從原先分配的機(jī)器重新分配給新機(jī)器,只需要修改partition-machine映射表中受影響的個(gè)別條目就能實(shí)現(xiàn)擴(kuò)展,具有較強(qiáng)的靈活性。
    • 一致性哈希(Consistent Hashing)
      ????一致性哈希算法被廣泛的應(yīng)用于分布式系統(tǒng)架構(gòu)中,一致性哈希算法將哈希數(shù)值空間按照大小組成一個(gè)首尾相接的環(huán)狀序列。對(duì)于不同物理機(jī)根據(jù)其IP和端口號(hào)經(jīng)過哈希函數(shù)映射到哈希空間內(nèi),這樣不同的機(jī)器就構(gòu)成了環(huán)狀序列中的不同節(jié)點(diǎn),而每個(gè)節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)落在一段有序哈希空間中的數(shù)據(jù)。如下圖是一個(gè)哈希空間為32(m=5,2^5=32)的一致性哈希算法示意圖,例如N14節(jié)點(diǎn)就存儲(chǔ)6 < Hash(key) < 14的數(shù)據(jù)。同時(shí),每個(gè)節(jié)點(diǎn)記錄環(huán)中的前趨節(jié)點(diǎn)和后繼節(jié)點(diǎn)地址位置,使之成為一個(gè)真正的有向環(huán)。
  • (1)路由問題
    ????通過以上方式就可以將海量數(shù)據(jù)分不到集群中的不同節(jié)點(diǎn)中,實(shí)現(xiàn)數(shù)據(jù)分片功能。那么如何根據(jù)key和哈希函數(shù)H來定位到記錄內(nèi)容呢?
    ????一種直觀的解決辦法就是沿著有向環(huán)順序查找,如果H(key)在本節(jié)點(diǎn)管理范圍內(nèi)就返回結(jié)果,如果不在則將其交給后繼節(jié)點(diǎn)繼續(xù)查找,這樣最多遍歷所有節(jié)點(diǎn)就可以給出結(jié)果。
    ????很明顯以上方法是一個(gè)低效的查找方式,為例加快查找速度,可以為每個(gè)節(jié)點(diǎn)配置路由表。路由表存儲(chǔ)m條路由信息(m為哈希空間的二進(jìn)制數(shù)值比特位長度,即哈希空間長度=2^m),其中第i項(xiàng)存儲(chǔ)距離當(dāng)前節(jié)點(diǎn)距離為2^i的數(shù)據(jù)節(jié)點(diǎn)。如N14的節(jié)點(diǎn)路由表如下所示:

    距離1(2^0)2(2^1)4(2^2)8(2^3)16(2^4)
    機(jī)器節(jié)點(diǎn)N20N20N20N25N5


    算法:假設(shè)當(dāng)前執(zhí)行操作的節(jié)點(diǎn)為Nc,其初始值為Ni,Nc的后繼節(jié)點(diǎn)為Ns,重復(fù)執(zhí)行下列步驟。
    步驟1,判斷是否c < j <= s,如果為真,則結(jié)束查找,說明key如果存在,則在Nc的后繼節(jié)點(diǎn)Ns上,Ns返回結(jié)果。
    步驟2,否則,Nc查找路由表,找到小于j的最大編號(hào)節(jié)點(diǎn)Nh(如果所有路由項(xiàng)都大于j,則選擇第m-1項(xiàng)作為Nh),Nc向Nh發(fā)送消息,由Nh代為查找,Nh此時(shí)作為新的Nc繼續(xù)按照步驟1,步驟2遞歸進(jìn)行查找。
    此算法的時(shí)間復(fù)雜度為O(logn),類似于二分查找。

    下圖為N14節(jié)點(diǎn)接收到H(key)=27時(shí)的查找過程:


    (2)加入新節(jié)點(diǎn)
    ????如果P2P網(wǎng)絡(luò)加入一個(gè)新節(jié)點(diǎn)Nnew,首先Nnew能夠和任意節(jié)點(diǎn)Nx進(jìn)行通信,通過Nx按照“路由算法”查詢Nnew的對(duì)應(yīng)哈希值H(Nnew)=new,找到Nnew的后繼節(jié)點(diǎn)Ns,假設(shè)Ns的前趨節(jié)點(diǎn)為Np,那么需要做兩件事將Nnew加入網(wǎng)絡(luò):
    一. 改變Np、Nnew和Ns的前趨后繼節(jié)點(diǎn)記錄,以體現(xiàn)新的網(wǎng)絡(luò)架構(gòu)。
    二. 數(shù)據(jù)的重新分片與分布,將Ns節(jié)點(diǎn)中存儲(chǔ)的應(yīng)該由Nnew承載的數(shù)據(jù)(Ns節(jié)點(diǎn)上哈希值小于等于new的記錄)遷移到Nnew節(jié)點(diǎn)上。
    ????在非并發(fā)環(huán)境中以上事務(wù)較易完成,但是在并發(fā)環(huán)境中,可能Np和Ns之間同時(shí)有多個(gè)節(jié)點(diǎn)加入,為了避免出現(xiàn)問題,需按照以下兩個(gè)步驟完成:
    一. 將Nnew的后繼節(jié)點(diǎn)設(shè)置為null。
    二. 這一步并非為新加入節(jié)點(diǎn)設(shè)立的,而是所有節(jié)點(diǎn)周期性自動(dòng)完成,穩(wěn)定性檢測(cè)。
    • 穩(wěn)定性檢測(cè)

    算法:
    步驟1,假設(shè)Ns為Nc的后繼節(jié)點(diǎn),Nc向Ns詢問其前趨節(jié)點(diǎn)Np,Ns向Ns答復(fù),一般情況下,如果Np=Nc則轉(zhuǎn)入第4步。
    步驟2,如果Np介于Nc和Ns之間,Nc記錄下Np為其后繼節(jié)點(diǎn)。
    步驟3,令Nx是Nc的后繼節(jié)點(diǎn),其可能是Ns或者Np,這取決于步驟2的判斷結(jié)果。如果Nx的前趨節(jié)點(diǎn)為空或者Nc位于Nx和它的前趨節(jié)點(diǎn)之間,那么Nc給Nx發(fā)消息告訴Nx,Nc就是Nx的前趨節(jié)點(diǎn),Nx將其前趨節(jié)點(diǎn)設(shè)置為Nc。
    步驟4,Nx將其部分?jǐn)?shù)據(jù)遷移到Nc上,即將Nx上哈希值小于等于c的記錄遷移到Nc上。

    示例,將N8加入上述網(wǎng)絡(luò)
    1.根據(jù)步驟一,將N8的后繼節(jié)點(diǎn)設(shè)為N14,前趨節(jié)點(diǎn)置為null,如下圖所示:


    2.N8進(jìn)行穩(wěn)定性檢測(cè),步驟1中,N8發(fā)現(xiàn)N14的前趨節(jié)點(diǎn)不是自己,進(jìn)入步驟2,由于N5沒有介于N8和N14之間,所以直接進(jìn)入步驟3,因?yàn)镹8位于N5和N14之間,所以N8向N14發(fā)消息,告知N14的前趨節(jié)點(diǎn)改為N8,N14的前趨指向N8,如下圖所示:

    3.進(jìn)入步驟4,N14將部分?jǐn)?shù)據(jù)遷移到N8。

    一段時(shí)間后,N5開始進(jìn)行穩(wěn)定性檢測(cè),經(jīng)過步驟N5被告知,N14的前趨節(jié)點(diǎn)是N8而不是自己,所以進(jìn)入步驟2,由于N8介于N5和N14之間,所以N5將后繼節(jié)點(diǎn)改為N8,如下圖所示:


    進(jìn)入步驟3,由于N8的前趨節(jié)點(diǎn)為空,所以N5通知N8其前趨節(jié)點(diǎn)為N5,所以N8將前趨節(jié)點(diǎn)置為N5,如下圖所示:

    進(jìn)入步驟4,N8沒有需要向N5遷移的數(shù)據(jù),結(jié)束。
    這樣,N8節(jié)點(diǎn)就順利的加入了網(wǎng)絡(luò)。

    (3)當(dāng)前節(jié)點(diǎn)離開網(wǎng)絡(luò)
    ????當(dāng)前節(jié)點(diǎn)離開網(wǎng)絡(luò)有兩種方式:正常離開和異常離開。正常離開的節(jié)點(diǎn)在離開前可以做些準(zhǔn)備工作,包括通知相應(yīng)節(jié)點(diǎn)修改前趨后繼以及將持有數(shù)據(jù)遷移到相應(yīng)機(jī)器上。異常離開通常是由于機(jī)器故障導(dǎo)致,為避免數(shù)據(jù)丟失,可以采用將數(shù)據(jù)備份的方式解決。
    關(guān)于路由表失效問題,可以通過對(duì)每個(gè)節(jié)點(diǎn)定期檢查路由表的方式解決。
    (4)虛擬節(jié)點(diǎn)
    ????上述一致性哈希算法存在兩個(gè)問題,一個(gè)是數(shù)據(jù)映射是隨機(jī)的,可能導(dǎo)致集群的負(fù)載不均衡,另一個(gè)是集群中的節(jié)點(diǎn)存在性能上的差異,可能會(huì)導(dǎo)致低性能節(jié)點(diǎn)高負(fù)載的情況,而且新節(jié)點(diǎn)加入時(shí)只能緩解其后繼一個(gè)節(jié)點(diǎn)的容量飽和問題,不能有效的緩解集群中其他節(jié)點(diǎn)的容量飽和問題。針對(duì)以上問題,引入“虛擬節(jié)點(diǎn)”的概念,即將一臺(tái)物理機(jī)器虛擬成若干個(gè)虛擬節(jié)點(diǎn),分別映射到一致性哈希環(huán)的不同位置。這樣就解決了上述問題。

    3 . 范圍分片(Range Partition)
    ????范圍分片首先將所有記錄主鍵進(jìn)行排序,然后在排好序的主鍵空間里將記錄劃分成數(shù)據(jù)分片,每個(gè)數(shù)據(jù)分片存儲(chǔ)有序的主鍵空間片段內(nèi)的所有記錄。保持一個(gè)數(shù)據(jù)分片的映射表,表中每一項(xiàng)記在數(shù)據(jù)分片的最小主鍵及其對(duì)應(yīng)的物理機(jī)地址,在對(duì)記錄進(jìn)行增刪改時(shí),查找映射表找到其對(duì)應(yīng)的物理機(jī),置于分片數(shù)據(jù)在物理機(jī)的管理方式往往采用LSM樹(Log Structured Merge Trees),這是一種高效的數(shù)據(jù)索引結(jié)構(gòu)。范圍分片的模型如下圖所示:

    總結(jié)

    以上是生活随笔為你收集整理的大数据日知录(一)数据分片与路由的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。