亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

我這里將主要列舉一致性Hash算法、Gossip協(xié)議、QuorumNWR算法、PBFT算法、PoW算法、ZAB協(xié)議,Paxos會(huì)分開(kāi)單獨(dú)講。

一致性Hash算法

一致性Hash算法是為了解決Hash算法的遷移成本,以一個(gè)10節(jié)點(diǎn)的集群為例,如果向集群中添加節(jié)點(diǎn)時(shí),如果使用了哈希 算法,需要遷移高達(dá)90.91%的數(shù)據(jù),使用一致哈希的話(huà),只需要遷移 6.48% 的數(shù)據(jù)。

所以使用一致性Hash算法實(shí)現(xiàn)哈希尋址時(shí),可以通過(guò)增加節(jié)點(diǎn)數(shù)降低節(jié)點(diǎn) 宕機(jī)對(duì)整個(gè)集群的影響,以及故障恢復(fù)時(shí)需要遷移的數(shù)據(jù)量。后續(xù)在需要時(shí),你可以通過(guò)增 加節(jié)點(diǎn)數(shù)來(lái)提升系統(tǒng)的容災(zāi)能力和故障恢復(fù)效率。而做數(shù)據(jù)遷移時(shí),只需要遷移部分?jǐn)?shù)據(jù),就能實(shí)現(xiàn)集群的穩(wěn)定。

不帶虛擬節(jié)點(diǎn)的一致性Hash算法

我們都知道普通的Hash算法是通過(guò)取模來(lái)進(jìn)行路由尋址的,同理一致性Hash用了取模運(yùn)算,但與哈希算法不同的是,哈希算法是對(duì)節(jié)點(diǎn)的數(shù)量進(jìn)行取模 運(yùn)算,而一致哈希算法是對(duì) 2^32 進(jìn)行取模運(yùn)算。你可以想象下,一致哈希算法,將整個(gè) 哈希值空間組織成一個(gè)虛擬的圓環(huán),也就是哈希環(huán):

分布式協(xié)議與算法,你了解多少?

 

在一致哈希中,你可以通過(guò)執(zhí)行哈希算法,將節(jié)點(diǎn)映射到哈希環(huán)上,從而每個(gè)節(jié)點(diǎn)就能確定其在哈希環(huán)上的位置了:

分布式協(xié)議與算法,你了解多少?

 

然后當(dāng)要讀取指定key的值的時(shí)候,通過(guò)對(duì)key做一個(gè)hash,并確定此 key 在環(huán)上的位置,從這個(gè)位置沿著哈希環(huán)順時(shí)針“行走”,遇到的第一節(jié)點(diǎn)就是 key 對(duì)應(yīng)的節(jié)點(diǎn)。

分布式協(xié)議與算法,你了解多少?

 

這個(gè)時(shí)候,如果節(jié)點(diǎn)C宕機(jī)了,那么節(jié)點(diǎn)B和節(jié)點(diǎn)A的數(shù)據(jù)實(shí)際上不會(huì)受影響,只有原來(lái)在節(jié)點(diǎn)C的數(shù)據(jù)會(huì)被重新定位到節(jié)點(diǎn)A,從而只要節(jié)點(diǎn)C的數(shù)據(jù)做遷移即可。

如果此時(shí)集群不能滿(mǎn)足業(yè)務(wù)的需求,需要擴(kuò)容一個(gè)節(jié)點(diǎn):

分布式協(xié)議與算法,你了解多少?

 

你可以看到,key-01、key-02 不受影響,只有 key-03 的尋址被重定位到新節(jié)點(diǎn) D。一般 而言,在一致哈希算法中,如果增加一個(gè)節(jié)點(diǎn),受影響的數(shù)據(jù)僅僅是,會(huì)尋址到新節(jié)點(diǎn)和前 一節(jié)點(diǎn)之間的數(shù)據(jù),其它數(shù)據(jù)也不會(huì)受到影響。

實(shí)現(xiàn)代碼如下:

/**
 * 不帶虛擬節(jié)點(diǎn)的一致性Hash算法 
 */
public class ConsistentHashingWithoutVirtualNode
{
    /**
     * 待添加入Hash環(huán)的服務(wù)器列表
     */
    private static String[] servers = {"192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111",
            "192.168.0.3:111", "192.168.0.4:111"};

    /**
     * key表示服務(wù)器的hash值,value表示服務(wù)器的名稱(chēng)
     */
    private static SortedMap<Integer, String> sortedMap =
            new TreeMap<Integer, String>();

    /**
     * 程序初始化,將所有的服務(wù)器放入sortedMap中
     */
    static
    {
        for (int i = 0; i < servers.length; i++)
        {
            int hash = getHash(servers[i]);
            System.out.println("[" + servers[i] + "]加入集合中, 其Hash值為" + hash);
            sortedMap.put(hash, servers[i]);
        }
        System.out.println();
    } 

    /**
     * 得到應(yīng)當(dāng)路由到的結(jié)點(diǎn)
     */
    private static String getServer(String node)
    {
        // 得到帶路由的結(jié)點(diǎn)的Hash值
        int hash = getHash(node);
        // 得到大于該Hash值的所有Map
        SortedMap<Integer, String> subMap =
                sortedMap.tailMap(hash);
        // 第一個(gè)Key就是順時(shí)針過(guò)去離node最近的那個(gè)結(jié)點(diǎn)
        Integer i = subMap.firstKey();
        // 返回對(duì)應(yīng)的服務(wù)器名稱(chēng)
        return subMap.get(i);
    }

    public static void main(String[] args)
    {
        String[] nodes = {"127.0.0.1:1111", "221.226.0.1:2222", "10.211.0.1:3333"};
        for (int i = 0; i < nodes.length; i++)
            System.out.println("[" + nodes[i] + "]的hash值為" +
                    getHash(nodes[i]) + ", 被路由到結(jié)點(diǎn)[" + getServer(nodes[i]) + "]");
    }
}

帶虛擬節(jié)點(diǎn)的一致性Hash算法

上面的hash算法可能會(huì)造成數(shù)據(jù)分布不均勻的情況,也就是 說(shuō)大多數(shù)訪(fǎng)問(wèn)請(qǐng)求都會(huì)集中少量幾個(gè)節(jié)點(diǎn)上。所以我們可以通過(guò)虛擬節(jié)點(diǎn)的方式解決數(shù)據(jù)分布不均的情況。

其實(shí),就是對(duì)每一個(gè)服務(wù)器節(jié)點(diǎn)計(jì)算多個(gè)哈希值,在每個(gè)計(jì)算結(jié)果位置上,都放置一個(gè)虛擬 節(jié)點(diǎn),并將虛擬節(jié)點(diǎn)映射到實(shí)際節(jié)點(diǎn)。比如,可以在主機(jī)名的后面增加編號(hào),分別計(jì)算 “Node-A-01”,“Node-A-02”,“Node-B-01”,“Node-B-02”,“Node-C01”,“Node-C-02”的哈希值,于是形成 6 個(gè)虛擬節(jié)點(diǎn):

分布式協(xié)議與算法,你了解多少?

 

增加了節(jié)點(diǎn)后,節(jié)點(diǎn)在哈希環(huán)上的分布就相對(duì)均勻了。這時(shí),如果有訪(fǎng) 問(wèn)請(qǐng)求尋址到“Node-A-01”這個(gè)虛擬節(jié)點(diǎn),將被重定位到節(jié)點(diǎn) A。

具體代碼實(shí)現(xiàn)如下:

/**
 * 帶虛擬節(jié)點(diǎn)的一致性Hash算法
 */
public class ConsistentHashingWithVirtualNode
{
    /**
     * 待添加入Hash環(huán)的服務(wù)器列表
     */
    private static String[] servers = {"192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111",
            "192.168.0.3:111", "192.168.0.4:111"};

    /**
     * 真實(shí)結(jié)點(diǎn)列表,考慮到服務(wù)器上線(xiàn)、下線(xiàn)的場(chǎng)景,即添加、刪除的場(chǎng)景會(huì)比較頻繁,這里使用LinkedList會(huì)更好
     */
    private static List<String> realNodes = new LinkedList<String>();

    /**
     * 虛擬節(jié)點(diǎn),key表示虛擬節(jié)點(diǎn)的hash值,value表示虛擬節(jié)點(diǎn)的名稱(chēng)
     */
    private static SortedMap<Integer, String> virtualNodes =
            new TreeMap<Integer, String>();

    /**
     * 虛擬節(jié)點(diǎn)的數(shù)目,這里寫(xiě)死,為了演示需要,一個(gè)真實(shí)結(jié)點(diǎn)對(duì)應(yīng)5個(gè)虛擬節(jié)點(diǎn)
     */
    private static final int VIRTUAL_NODES = 5;

    static
    {
        // 先把原始的服務(wù)器添加到真實(shí)結(jié)點(diǎn)列表中
        for (int i = 0; i < servers.length; i++)
            realNodes.add(servers[i]);

        // 再添加虛擬節(jié)點(diǎn),遍歷LinkedList使用foreach循環(huán)效率會(huì)比較高
        for (String str : realNodes)
        {
            for (int i = 0; i < VIRTUAL_NODES; i++)
            {
                String virtualNodeName = str + "&&VN" + String.valueOf(i);
                int hash = getHash(virtualNodeName);
                System.out.println("虛擬節(jié)點(diǎn)[" + virtualNodeName + "]被添加, hash值為" + hash);
                virtualNodes.put(hash, virtualNodeName);
            }
        }
        System.out.println();
    }

    /**
     * 得到應(yīng)當(dāng)路由到的結(jié)點(diǎn)
     */
    private static String getServer(String node)
    {
        // 得到帶路由的結(jié)點(diǎn)的Hash值
        int hash = getHash(node);
        // 得到大于該Hash值的所有Map
        SortedMap<Integer, String> subMap =
                virtualNodes.tailMap(hash);
        // 第一個(gè)Key就是順時(shí)針過(guò)去離node最近的那個(gè)結(jié)點(diǎn)
        Integer i = subMap.firstKey();
        // 返回對(duì)應(yīng)的虛擬節(jié)點(diǎn)名稱(chēng),這里字符串稍微截取一下
        String virtualNode = subMap.get(i);
        return virtualNode.substring(0, virtualNode.indexOf("&&"));
    }

    public static void main(String[] args)
    {
        String[] nodes = {"127.0.0.1:1111", "221.226.0.1:2222", "10.211.0.1:3333"};
        for (int i = 0; i < nodes.length; i++)
            System.out.println("[" + nodes[i] + "]的hash值為" +
                    getHash(nodes[i]) + ", 被路由到結(jié)點(diǎn)[" + getServer(nodes[i]) + "]");
    }
}

Gossip協(xié)議

Gossip 協(xié)議,顧名思義,就像流言蜚語(yǔ)一樣,利用一種隨機(jī)、帶有傳染性的方式,將信息 傳播到整個(gè)網(wǎng)絡(luò)中,并在一定時(shí)間內(nèi),使得系統(tǒng)內(nèi)的所有節(jié)點(diǎn)數(shù)據(jù)一致。Gossip 協(xié)議通過(guò)上面的特性,可以保證系統(tǒng)能在極端情況下(比如集群中只有一個(gè)節(jié)點(diǎn)在運(yùn)行)也能運(yùn)行。

Gossip數(shù)據(jù)傳播方式

Gossip數(shù)據(jù)傳播方式分別有:直接郵寄(Direct Mail)、反熵(Anti-entropy)和謠言傳播 (Rumor mongering)。

直接郵寄(Direct Mail):就是直接發(fā)送更新數(shù)據(jù),當(dāng)數(shù)據(jù)發(fā)送失敗時(shí),將數(shù)據(jù)緩存下來(lái),然后重傳。直接郵寄雖然實(shí)現(xiàn)起來(lái)比較容易,數(shù)據(jù)同步也很及時(shí),但可能會(huì)因?yàn)?緩存隊(duì)列滿(mǎn)了而丟數(shù)據(jù)。也就是說(shuō),只采用直接郵寄是無(wú)法實(shí)現(xiàn)最終一致性的。

反熵(Anti-entropy):反熵指的是集群中的節(jié)點(diǎn),每隔段時(shí)間就隨機(jī)選擇某個(gè)其他節(jié)點(diǎn),然后通過(guò)互相交換自己的 所有數(shù)據(jù)來(lái)消除兩者之間的差異,實(shí)現(xiàn)數(shù)據(jù)的最終一致性。

在實(shí)現(xiàn)反熵的時(shí)候,主要有推、拉和推拉三種方式。推方式,就是將自己的所有副本數(shù)據(jù),推給對(duì)方,修復(fù)對(duì)方副本中的熵,拉方式,就是拉取對(duì)方的所有副本數(shù)據(jù),修復(fù)自己副本中的熵。

謠言傳播 (Rumor mongering):指的是當(dāng)一個(gè)節(jié)點(diǎn)有了新數(shù)據(jù)后,這個(gè)節(jié)點(diǎn)變成活躍狀態(tài),并周期性地聯(lián)系其他節(jié)點(diǎn)向其發(fā)送新數(shù)據(jù),直到所有的節(jié)點(diǎn)都存儲(chǔ)了該新數(shù)據(jù)。由于謠言傳播非常具有傳染性,它適合動(dòng)態(tài)變化的分布式系統(tǒng)

分布式協(xié)議與算法,你了解多少?

 

Quorum NWR算法

Quorum NWR 中有三個(gè)要素,N、W、R。

N 表示副本數(shù),又叫做復(fù)制因子(Replication Factor)。也就是說(shuō),N 表示集群中同一份 數(shù)據(jù)有多少個(gè)副本,就像下圖的樣子:

分布式協(xié)議與算法,你了解多少?

 

在這個(gè)三節(jié)點(diǎn)的集群中,DATA-1 有 2 個(gè)副本,DATA-2 有 3 個(gè)副 本,DATA-3 有 1 個(gè)副本。也就是說(shuō),副本數(shù)可以不等于節(jié)點(diǎn)數(shù),不同的數(shù)據(jù)可以有不同 的副本數(shù)。

W,又稱(chēng)寫(xiě)一致性級(jí)別(Write Consistency Level),表示成功完成 W 個(gè)副本更新。

R,又稱(chēng)讀一致性級(jí)別(Read Consistency Level),表示讀取一個(gè)數(shù)據(jù)對(duì)象時(shí)需要讀 R 個(gè)副本。

通過(guò) Quorum NWR,你可以自定義一致性級(jí)別,通過(guò)臨時(shí)調(diào)整寫(xiě)入或者查詢(xún)的方式,當(dāng) W + R > N 時(shí),就可以實(shí)現(xiàn)強(qiáng)一致性了。

所以假如要讀取節(jié)點(diǎn)B,我們?cè)偌僭O(shè)W(2) + R(2) > N(3)這個(gè)公式,也就是當(dāng)寫(xiě)兩個(gè)節(jié)點(diǎn),讀的時(shí)候也同時(shí)讀取兩個(gè)節(jié)點(diǎn),那么讀取數(shù)據(jù)的時(shí)候肯定是讀取返回給客戶(hù)端肯定是最新的那份數(shù)據(jù)。

關(guān)于 NWR 需要你注意的是,N、W、R 值的不同組合,會(huì)產(chǎn)生不同的一致性效 果,具體來(lái)說(shuō),有這么兩種效果:

當(dāng) W + R > N 的時(shí)候,對(duì)于客戶(hù)端來(lái)講,整個(gè)系統(tǒng)能保證強(qiáng)一致性,一定能返回更新后的那份數(shù)據(jù)。當(dāng) W + R < N 的時(shí)候,對(duì)于客戶(hù)端來(lái)講,整個(gè)系統(tǒng)只能保證最終一致性,可能會(huì)返回舊數(shù)據(jù)。

PBFT算法

PBFT 算法非常實(shí)用,是一種能在實(shí)際場(chǎng)景中落地的拜占庭容錯(cuò)算法。

我們從一個(gè)例子入手,看看PBFT 算法的具體實(shí)現(xiàn):

假設(shè)蘇秦再一次帶隊(duì)抗秦,這一天,蘇秦和 4 個(gè)國(guó)家的 4 位將軍趙、魏、韓、楚商量軍機(jī)要事,結(jié)果剛商量完沒(méi)多久蘇秦就接到了情報(bào),情報(bào)上寫(xiě)道:聯(lián)軍中可能存在一個(gè)叛徒。這 時(shí),蘇秦要如何下發(fā)作戰(zhàn)指令,保證忠將們正確、一致地執(zhí)行下發(fā)的作戰(zhàn)指令,而不是被叛徒干擾呢?

需要注意的是,所有的消息都是簽名消息,也就是說(shuō),消息發(fā)送者的身份和消息內(nèi)容都是 無(wú)法偽造和篡改的(比如,楚無(wú)法偽造一個(gè)假裝來(lái)自趙的消息)。

首先,蘇秦聯(lián)系趙,向趙發(fā)送包含作戰(zhàn)指令“進(jìn)攻”的請(qǐng)求(就像下圖的樣子)。

分布式協(xié)議與算法,你了解多少?

 

當(dāng)趙接收到蘇秦的請(qǐng)求之后,會(huì)執(zhí)行三階段協(xié)議(Three-phase protocol)。

趙將進(jìn)入預(yù)準(zhǔn)備(Pre-prepare)階段,構(gòu)造包含作戰(zhàn)指令的預(yù)準(zhǔn)備消息,并廣播給其他 將軍(魏、韓、楚)。

分布式協(xié)議與算法,你了解多少?

 

因?yàn)槲骸㈨n、楚,收到消息后,不能確認(rèn)自己接收到指令和其他人接收到的指令是相同的。所以需要進(jìn)入下一個(gè)階段。

接收到預(yù)準(zhǔn)備消息之后,魏、韓、楚將進(jìn)入準(zhǔn)備(Prepare)階段,并分別廣播包含作戰(zhàn) 指令的準(zhǔn)備消息給其他將軍。

比如,魏廣播準(zhǔn)備消息給趙、韓、楚(如圖所示)。為了 方便演示,我們假設(shè)叛徒楚想通過(guò)不發(fā)送消息,來(lái)干擾共識(shí)協(xié)商(你能看到,圖中的楚 是沒(méi)有發(fā)送消息的)。

分布式協(xié)議與算法,你了解多少?

 

因?yàn)槲翰荒艽_認(rèn)趙、韓、楚是否收到了 2f(這里的 2f 包括自己,其中 f 為叛徒數(shù),在我的演示中是 1) 個(gè)一致的包含作戰(zhàn)指令的準(zhǔn)備消 息。所以需要進(jìn)入下一個(gè)階段Commit。

進(jìn)入提交階段后,各將軍分別廣播提交消息給其他將軍,也就是告訴其他將軍,我已經(jīng)準(zhǔn)備好了,可以執(zhí)行指令了。

分布式協(xié)議與算法,你了解多少?

 

最后,當(dāng)某個(gè)將軍收到 2f + 1 個(gè)驗(yàn)證通過(guò)的提交消息后,大部分的將軍們已經(jīng)達(dá)成共識(shí),這時(shí)可以執(zhí)行作戰(zhàn)指 令了,那么該將軍將執(zhí)行蘇秦的作戰(zhàn)指令,執(zhí)行完畢后發(fā)送執(zhí)行成功的消息給蘇秦。

分布式協(xié)議與算法,你了解多少?

 

最后,當(dāng)蘇秦收到 f+1 個(gè)相同的響應(yīng)(Reply)消息時(shí),說(shuō)明各位將軍們已經(jīng)就作戰(zhàn)指令達(dá) 成了共識(shí),并執(zhí)行了作戰(zhàn)指令。

在上面的這個(gè)例子中:

可以將趙、魏、韓、楚理解為分布式系統(tǒng)的四個(gè)節(jié)點(diǎn),其中趙是主節(jié)點(diǎn)(Primary node),魏、韓、楚是從節(jié)點(diǎn)(Secondary node);

將蘇秦理解為業(yè)務(wù),也就是客戶(hù)端;

將消息理解為網(wǎng)絡(luò)消息;

將作戰(zhàn)指令“進(jìn)攻”,理解成客戶(hù)端提議的值,也就是希望被各節(jié)點(diǎn)達(dá)成共識(shí),并提交 給狀態(tài)機(jī)的值。

最終的共識(shí)是否達(dá)成,客戶(hù)端是會(huì)做判斷的,如果客戶(hù)端在指定時(shí)間內(nèi)未 收到請(qǐng)求對(duì)應(yīng)的 f + 1 相同響應(yīng),就認(rèn)為集群出故障了,共識(shí)未達(dá)成,客戶(hù)端會(huì)重新發(fā)送請(qǐng) 求。

PBFT 算法通過(guò)視圖變更(View Change)的方式,來(lái)處理主節(jié)點(diǎn)作 惡,當(dāng)發(fā)現(xiàn)主節(jié)點(diǎn)在作惡時(shí),會(huì)以“輪流上崗”方式,推舉新的主節(jié)點(diǎn)。感興趣的可以自己去查閱。

相比 Raft 算法完全不適應(yīng)有人作惡的場(chǎng)景,PBFT 算法能容忍 (n 1)/3 個(gè)惡意節(jié)點(diǎn) (也可以是故障節(jié)點(diǎn))。另外,相比 PoW 算法,PBFT 的優(yōu)點(diǎn)是不消耗算 力。PBFT 算法是O(n ^ 2) 的消息復(fù)雜度的算法,所以以及隨著消息數(shù) 的增加,網(wǎng)絡(luò)時(shí)延對(duì)系統(tǒng)運(yùn)行的影響也會(huì)越大,這些都限制了運(yùn)行 PBFT 算法的分布式系統(tǒng) 的規(guī)模,也決定了 PBFT 算法適用于中小型分布式系統(tǒng)。

PoW算法

工作量證明 (Proof Of Work,簡(jiǎn)稱(chēng) PoW),就是一份證明,用 來(lái)確認(rèn)你做過(guò)一定量的工作。具體來(lái)說(shuō)就是,客戶(hù)端需要做一定難度的工作才能得出一個(gè)結(jié)果,驗(yàn) 證方卻很容易通過(guò)結(jié)果來(lái)檢查出客戶(hù)端是不是做了相應(yīng)的工作。

具體的工作量證明過(guò)程,就像下圖中的樣子:

分布式協(xié)議與算法,你了解多少?

 

所以工作量證明通常用于區(qū)塊鏈中,區(qū)塊鏈通過(guò)工作量證明(Proof of Work)增加了壞人作惡的成本,以此防止壞 人作惡。

工作量證明

哈希函數(shù)(Hash Function),也叫散列函數(shù)。就是說(shuō),你輸入一個(gè)任意長(zhǎng)度的字符串,哈 希函數(shù)會(huì)計(jì)算出一個(gè)長(zhǎng)度相同的哈希值。

在了解了什么是哈希函數(shù)之后,那么如何通過(guò)哈希函數(shù)進(jìn)行哈希運(yùn)算,從而證明工作量呢?

例如,我們可以給出一個(gè)工作量的要求:基于一個(gè)基本的字符串,你可以在這個(gè)字 符串后面添加一個(gè)整數(shù)值,然后對(duì)變更后(添加整數(shù)值) 的字符串進(jìn)行 SHA256 哈希運(yùn) 算,如果運(yùn)算后得到的哈希值(16 進(jìn)制形式)是以"0000"開(kāi)頭的,就驗(yàn)證通過(guò)。

為了達(dá)到 這個(gè)工作量證明的目標(biāo),我們需要不停地遞增整數(shù)值,一個(gè)一個(gè)試,對(duì)得到的新字符串進(jìn)行 SHA256 哈希運(yùn)算。

通過(guò)這個(gè)示例你可以看到,工作量證明是通過(guò)執(zhí)行哈希運(yùn)算,經(jīng)過(guò)一段時(shí)間的計(jì)算后,得到 符合條件的哈希值。也就是說(shuō),可以通過(guò)這個(gè)哈希值,來(lái)證明我們的工作量。

區(qū)塊鏈如何實(shí)現(xiàn) PoW 算法的?

首先看看什么是區(qū)塊鏈:

區(qū)塊鏈的區(qū)塊,是由區(qū)塊頭、區(qū)塊體 2 部分組成的:

  • 區(qū)塊頭(Block Head):區(qū)塊頭主要由上一個(gè)區(qū)塊的哈希值、區(qū)塊體的哈希值、4 字節(jié) 的隨機(jī)數(shù)(nonce)等組成的。
  • 區(qū)塊體(Block Body):區(qū)塊包含的交易數(shù)據(jù),其中的第一筆交易是 Coinbase 交易, 這是一筆激勵(lì)礦工的特殊交易。

在區(qū)塊鏈中,擁有 80 字節(jié)固定長(zhǎng)度的區(qū)塊頭,就是用于區(qū)塊鏈工作量證明的哈希運(yùn)算中輸 入字符串,而且通過(guò)雙重 SHA256 哈希運(yùn)算(也就是對(duì) SHA256 哈希運(yùn)算的結(jié)果,再執(zhí)行 一次哈希運(yùn)算),計(jì)算出的哈希值,只有小于目標(biāo)值(target),才是有效的,否則哈希值 是無(wú)效的,必須重算。

所以,在區(qū)塊鏈中是通過(guò)對(duì)區(qū)塊頭執(zhí)行 SHA256 哈希運(yùn)算,得到小于目標(biāo) 值的哈希值,來(lái)證明自己的工作量的。

計(jì)算出符合條件的哈希值后,礦工就會(huì)把這個(gè)信息廣播給集群中所有其他節(jié)點(diǎn),其他節(jié)點(diǎn)驗(yàn) 證通過(guò)后,會(huì)將這個(gè)區(qū)塊加入到自己的區(qū)塊鏈中,最終形成一串區(qū)塊鏈,就像下圖的樣子:

分布式協(xié)議與算法,你了解多少?

 

所以,就是攻擊者掌握了較多的算力,能挖掘一條比原鏈更長(zhǎng)的攻擊鏈,并將攻擊鏈 向全網(wǎng)廣播,這時(shí)呢,按照約定,節(jié)點(diǎn)將接受更長(zhǎng)的鏈,也就是攻擊鏈,丟棄原鏈。就像下 圖的樣子:

分布式協(xié)議與算法,你了解多少?

 

ZAB協(xié)議

Zab協(xié)議 的全稱(chēng)是 Zookeeper Atomic Broadcast (Zookeeper原子廣播)。Zookeeper 是通過(guò) Zab 協(xié)議來(lái)保證分布式事務(wù)的最終一致性。ZAB 協(xié)議的最核心設(shè)計(jì)目標(biāo)就是如何實(shí)現(xiàn)操作的順序性。

由于ZAB不基于狀態(tài)機(jī),而是基于主備模式的 原子廣播協(xié)議(Atomic Broadcast),最終實(shí)現(xiàn)了操作的順序性。

主要有以下幾點(diǎn)原因?qū)е铝薢AB實(shí)現(xiàn)了操作的順序性:

首先,ZAB 實(shí)現(xiàn)了主備模式,也就是所有的數(shù)據(jù)都以主節(jié)點(diǎn)為準(zhǔn):

分布式協(xié)議與算法,你了解多少?

 

其次,ZAB 實(shí)現(xiàn)了 FIFO 隊(duì)列,保證消息處理的順序性。

最后,ZAB 還實(shí)現(xiàn)了當(dāng)主節(jié)點(diǎn)崩潰后,只有日志最完備的節(jié)點(diǎn)才能當(dāng)選主節(jié)點(diǎn),因?yàn)槿罩?最完備的節(jié)點(diǎn)包含了所有已經(jīng)提交的日志,所以這樣就能保證提交的日志不會(huì)再改變。

作者丨luozhiyun

來(lái)源:https://www.luozhiyun.com/archives/304

分享到:
標(biāo)簽:分布式 協(xié)議
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定