本公開涉及網(wǎng)絡(luò)技術(shù),特別涉及一種信息變更監(jiān)控方法和裝置。
背景技術(shù):
很多互聯(lián)網(wǎng)系統(tǒng)都使用分布式架構(gòu)設(shè)計(jì),系統(tǒng)中包括很多分布式節(jié)點(diǎn),這些節(jié)點(diǎn)可以分散地配置在不同的設(shè)備上。各分布式節(jié)點(diǎn)上可以配置有系統(tǒng)運(yùn)行環(huán)境相關(guān)的信息或者業(yè)務(wù)相關(guān)信息,例如,業(yè)務(wù)配置文件、操作系統(tǒng)配置文件等。對(duì)于穩(wěn)定性要求比較高的應(yīng)用場(chǎng)景,各分布式節(jié)點(diǎn)上的配置信息也需要保持一定的穩(wěn)定性,如果節(jié)點(diǎn)配置發(fā)生人為或其他因素導(dǎo)致的變更,將可能導(dǎo)致系統(tǒng)運(yùn)行錯(cuò)誤。
相關(guān)技術(shù)中,可以通過一個(gè)中心化的管控節(jié)點(diǎn),用于監(jiān)控各分布式節(jié)點(diǎn)上發(fā)生的配置變更。監(jiān)控過程中,管控節(jié)點(diǎn)可以通過監(jiān)聽端口的方式等待節(jié)點(diǎn)的通知。如果節(jié)點(diǎn)發(fā)現(xiàn)自己發(fā)生信息變更,可以通知至管控節(jié)點(diǎn),由管控節(jié)點(diǎn)記錄并存儲(chǔ)節(jié)點(diǎn)發(fā)生的變更內(nèi)容。但是,當(dāng)前的變更監(jiān)控方案,當(dāng)管控節(jié)點(diǎn)故障時(shí),將導(dǎo)致整個(gè)監(jiān)控?zé)o法運(yùn)行。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本公開提供一種信息變更監(jiān)控方法和裝置,以提高監(jiān)控變更的可靠性。
具體地,本公開是通過如下技術(shù)方案實(shí)現(xiàn)的:
第一方面,提供一種信息變更監(jiān)控方法,所述方法包括:
創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊,所述新區(qū)塊用于記錄節(jié)點(diǎn)上發(fā)生的節(jié)點(diǎn)變更信息,所述新區(qū)塊包括區(qū)塊頭和區(qū)塊主體,所述區(qū)塊頭包括所述區(qū)塊鏈中與新區(qū)塊連接的上一區(qū)塊的頭哈希值,所述區(qū)塊主體包括變更時(shí)間和變更內(nèi)容;
將所述新區(qū)塊的節(jié)點(diǎn)變更信息,同步至分布式系統(tǒng)中的其他分布式節(jié)點(diǎn),以使得所述其他分布式節(jié)點(diǎn)更新所述區(qū)塊鏈。
第二方面,提供一種信息變更監(jiān)控裝置,所述裝置包括:
區(qū)塊更新模塊,用于創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊,所述新區(qū)塊用于記錄本節(jié)點(diǎn)上發(fā)生的節(jié)點(diǎn)變更信息,所述新區(qū)塊包括區(qū)塊頭和區(qū)塊主體,所述區(qū)塊頭包括所述區(qū)塊鏈中與新區(qū)塊連接的上一區(qū)塊的頭哈希值,所述區(qū)塊主體包括變更時(shí)間和變更內(nèi)容;
區(qū)塊同步模塊,用于將所述新區(qū)塊的節(jié)點(diǎn)變更信息,同步至分布式系統(tǒng)中的其他分布式節(jié)點(diǎn),以使得所述其他分布式節(jié)點(diǎn)更新所述區(qū)塊鏈。
本公開的信息變更監(jiān)控方法和裝置,通過在發(fā)生信息變更時(shí),將變更對(duì)應(yīng)的區(qū)塊發(fā)送至其他分布式節(jié)點(diǎn)存儲(chǔ),使得即使某個(gè)節(jié)點(diǎn)故障,也不會(huì)影響變更內(nèi)容的存儲(chǔ),其他節(jié)點(diǎn)上仍然存儲(chǔ)有同樣的變更內(nèi)容,從而提高了信息存儲(chǔ)的可靠性;并且,本例子將各次變更采用了區(qū)塊鏈的形式進(jìn)行存儲(chǔ),這種存儲(chǔ)方式不僅將各次變更對(duì)應(yīng)一個(gè)區(qū)塊記錄,而且還依據(jù)變更時(shí)間順序來將各個(gè)區(qū)塊銜接,使得變更可回溯,更方便進(jìn)行問題的排查分析,提高了監(jiān)控分析的效率。
附圖說明
圖1是本公開實(shí)施例提供的一種分布式系統(tǒng)的架構(gòu)示意圖;
圖2是本公開實(shí)施例提供的一種信息變更監(jiān)控方法的流程圖;
圖3是本公開實(shí)施例提供的一種區(qū)塊鏈形式示意圖;
圖4是本公開實(shí)施例提供的一種區(qū)塊鏈形式示意圖;
圖5是本公開實(shí)施例提供的一種信息變更監(jiān)控方法的流程圖;
圖6是本公開實(shí)施例提供的一種同步區(qū)塊的流程圖;
圖7是本公開實(shí)施例提供的一種區(qū)塊鏈形式示意圖;
圖8是本公開實(shí)施例提供的一種信息變更監(jiān)控方法的流程圖;
圖9是本公開實(shí)施例提供的一種區(qū)塊鏈形式示意圖;
圖10是本公開實(shí)施例提供的一種信息變更監(jiān)控裝置的結(jié)構(gòu)示意圖;
圖11是本公開實(shí)施例提供的一種信息變更監(jiān)控裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
圖1示例了一個(gè)分布式系統(tǒng),很多互聯(lián)網(wǎng)產(chǎn)品都使用分布式架構(gòu)設(shè)計(jì),例如,一個(gè)互聯(lián)網(wǎng)應(yīng)用,該應(yīng)用的運(yùn)行需要多個(gè)模塊的配合,該多個(gè)模塊可以分散部署在圖1所示的多個(gè)分布式節(jié)點(diǎn)上,例如,分布式節(jié)點(diǎn)11至分布式節(jié)點(diǎn)14上均部署有該應(yīng)用,不同節(jié)點(diǎn)上可以部署該應(yīng)用的不同模塊或者相同模塊。圖1僅示例了部分節(jié)點(diǎn),實(shí)際實(shí)施中的節(jié)點(diǎn)數(shù)量可以更多。
節(jié)點(diǎn)上可以部署該應(yīng)用運(yùn)行的相關(guān)信息,例如,與應(yīng)用運(yùn)行環(huán)境相關(guān)的操作系統(tǒng)配置文件,也可以是業(yè)務(wù)相關(guān)信息比如業(yè)務(wù)配置文件等。為了保障應(yīng)用運(yùn)行的可靠性,通常分布式節(jié)點(diǎn)上的節(jié)點(diǎn)信息需要保持一定的穩(wěn)定性,不能隨意變更。對(duì)節(jié)點(diǎn)信息的變更進(jìn)行監(jiān)控也非常重要,尤其對(duì)于上述圖1示例的分布式系統(tǒng)中的信息變更監(jiān)控,分布式系統(tǒng)中包含數(shù)量較多的分布式節(jié)點(diǎn),對(duì)這些節(jié)點(diǎn)進(jìn)行統(tǒng)一的變更監(jiān)控是一項(xiàng)重要的內(nèi)容,監(jiān)控變更可以使得運(yùn)行故障出現(xiàn)時(shí)有記錄可以查詢,方便快速排查解決問題。本公開提供的一種信息變更監(jiān)控方法,將用于對(duì)上述分布式系統(tǒng)中的各個(gè)分布式節(jié)點(diǎn)上的信息變更進(jìn)行監(jiān)控記錄,所監(jiān)控的信息變更不做限制,例如可以用于監(jiān)控節(jié)點(diǎn)上的運(yùn)行環(huán)境配置信息的變更。
本公開的方法中,分布式系統(tǒng)中的各個(gè)分布式節(jié)點(diǎn),可以執(zhí)行相同的信息變更監(jiān)控方法,例如,可以將信息變更監(jiān)控裝置部署在一個(gè)分布式節(jié)點(diǎn)上,該節(jié)點(diǎn)就可以執(zhí)行本公開的監(jiān)控方法。如下以其中一個(gè)分布式節(jié)點(diǎn)為例,來描述本公開的信息變更監(jiān)控方法。結(jié)合圖2所示,該方法可以包括:
在步驟201中,創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊,所述新區(qū)塊用于記錄本節(jié)點(diǎn)上發(fā)生的節(jié)點(diǎn)變更信息。
其中,所要監(jiān)控的內(nèi)容可以是預(yù)設(shè)的,可以根據(jù)需求自定義實(shí)現(xiàn),比如,可以監(jiān)控配置信息的變更:業(yè)務(wù)配置文件、操作系統(tǒng)配置文件、特定指令是否被執(zhí)行等。根據(jù)預(yù)設(shè)的監(jiān)控內(nèi)容,監(jiān)控本節(jié)點(diǎn)上的該監(jiān)控內(nèi)容是否發(fā)生變更。
本例子中,區(qū)塊可以是一個(gè)信息集,用于記錄本次變更相關(guān)的信息。一個(gè)區(qū)塊中的信息可以包括區(qū)塊頭和區(qū)塊主體,其中,區(qū)塊頭中可以包括區(qū)塊鏈中與新區(qū)塊連接的上一區(qū)塊的頭哈希值,區(qū)塊鏈中的各個(gè)區(qū)塊之間以頭哈希值進(jìn)行聯(lián)系,所述區(qū)塊主體包括變更時(shí)間和變更內(nèi)容。
例如,如下示例一個(gè)區(qū)塊中可以包括的部分信息:
區(qū)塊生成時(shí)間戳:1471787968010
變更時(shí)間戳:1471787967226
變更內(nèi)容key:file/etc/hosts
變更內(nèi)容value:-202.101.2.3www.sample.com
其中,變更內(nèi)容key和value,可以根據(jù)需求自定義格式規(guī)范,如上述例子中的file/etc/hosts與value的內(nèi)容。
此外,區(qū)塊中還可以包括擴(kuò)展字段,用于未來擴(kuò)展使用。區(qū)塊內(nèi)的各個(gè)字段可以設(shè)置字段內(nèi)容長(zhǎng)度上限,如,數(shù)據(jù)長(zhǎng)度默認(rèn)不大于2kb,以節(jié)省存儲(chǔ)空間。
本例子中,可以將區(qū)塊中的變更時(shí)間和變更內(nèi)容(當(dāng)存在擴(kuò)展字段時(shí),也包括擴(kuò)展字段),稱為區(qū)塊信息。
在一個(gè)例子中,執(zhí)行本流程的監(jiān)控方法的分布式節(jié)點(diǎn),可以在確定本節(jié)點(diǎn)上發(fā)生信息變更時(shí),創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊。并且創(chuàng)建的新區(qū)塊的區(qū)塊主體中可以包括本次變更的變更時(shí)間和變更內(nèi)容。在另一個(gè)例子中,執(zhí)行本流程的監(jiān)控方法的分布式節(jié)點(diǎn),也可以每隔一個(gè)固定的時(shí)間段,創(chuàng)建一個(gè)新區(qū)塊,該新區(qū)塊中可以記錄創(chuàng)建新區(qū)塊的當(dāng)前時(shí)間之前的一個(gè)所述時(shí)間段內(nèi)所發(fā)生的所有變更記錄。在如下的例子中,是以確定本節(jié)點(diǎn)上發(fā)生信息變更時(shí)記錄包含本次變更信息的區(qū)塊為例進(jìn)行描述。
例如,結(jié)合圖3的示例,在本例子的分布式節(jié)點(diǎn)上,每一次變更都對(duì)應(yīng)記錄一個(gè)區(qū)塊,那么多次變更之后,節(jié)點(diǎn)上將記錄“區(qū)塊鏈”(blockchain)的形式。區(qū)塊鏈?zhǔn)怯啥鄠€(gè)區(qū)塊有序銜接起來的結(jié)構(gòu)。在所述區(qū)塊鏈中,各個(gè)區(qū)塊可以依據(jù)變更時(shí)間的順序依次相連。
如圖3所示,以三個(gè)區(qū)塊構(gòu)成的區(qū)塊鏈為例,區(qū)塊c是區(qū)塊b的“上一區(qū)塊”,區(qū)塊b是區(qū)塊a的“上一區(qū)塊”。根據(jù)變更時(shí)間,區(qū)塊c是最早發(fā)生的變更,區(qū)塊a是最近發(fā)生的變更,區(qū)塊鏈中的各區(qū)塊之間的順序反應(yīng)這些區(qū)塊對(duì)應(yīng)變更的發(fā)生時(shí)間順序。
本例子中,在將本區(qū)塊加入本節(jié)點(diǎn)上的區(qū)塊鏈時(shí),可以將本次變更的區(qū)塊加在區(qū)塊鏈的最后一個(gè),表示這是最新發(fā)生的信息變更。區(qū)塊鏈在分布式節(jié)點(diǎn)上可以存儲(chǔ)在flatfile或者一個(gè)數(shù)據(jù)庫(kù)文件(如googleleveldb等)中。
在步驟202中,將所述新區(qū)塊的節(jié)點(diǎn)變更信息,同步至分布式系統(tǒng)中的其他分布式節(jié)點(diǎn),以使得所述其他分布式節(jié)點(diǎn)更新所述區(qū)塊鏈。
本節(jié)點(diǎn)還可以將本次變更生成的區(qū)塊,同步至分布式系統(tǒng)中的其他分布式節(jié)點(diǎn),例如,圖1所示的分布式節(jié)點(diǎn)11發(fā)生信息變更時(shí),可以將變更對(duì)應(yīng)的區(qū)塊通過組播或廣播的方式,同步至分布式節(jié)點(diǎn)12、分布式節(jié)點(diǎn)13和分布式節(jié)點(diǎn)14,以使得這些節(jié)點(diǎn)上也存儲(chǔ)該區(qū)塊。
本例子中,分布式系統(tǒng)中的各個(gè)分布式節(jié)點(diǎn)都可以執(zhí)行圖2所示的流程方法,當(dāng)然,參與監(jiān)控的節(jié)點(diǎn)可以是該系統(tǒng)中的全部節(jié)點(diǎn)或者部分節(jié)點(diǎn)。例如,圖1所示的四個(gè)節(jié)點(diǎn)中,可以全部參與監(jiān)控,也可以部分節(jié)點(diǎn)參與監(jiān)控,只要參與了監(jiān)控,該分布式節(jié)點(diǎn)就可以執(zhí)行圖2的流程。
此外,當(dāng)本節(jié)點(diǎn)將區(qū)塊同步至其他節(jié)點(diǎn)時(shí),該其他的分布式節(jié)點(diǎn)在接收到區(qū)塊后,可以將該區(qū)塊加入到自己存儲(chǔ)的區(qū)塊鏈中。比如,分布式節(jié)點(diǎn)11上的變更對(duì)應(yīng)的區(qū)塊,在發(fā)送至分布式節(jié)點(diǎn)12后,該分布式節(jié)點(diǎn)12可以將該區(qū)塊也加入在其本節(jié)點(diǎn)的區(qū)塊鏈的末尾。
本例子中,當(dāng)分布式系統(tǒng)中的其中一個(gè)節(jié)點(diǎn)上發(fā)生信息變更時(shí),該節(jié)點(diǎn)上對(duì)應(yīng)本次變更的區(qū)塊也將同步至其他分布式節(jié)點(diǎn),這樣形成一種分布式存儲(chǔ),系統(tǒng)中的每個(gè)節(jié)點(diǎn)上都存儲(chǔ)有相同的區(qū)塊鏈,并且該區(qū)塊鏈中包括的各個(gè)區(qū)塊是該系統(tǒng)中的各個(gè)節(jié)點(diǎn)上的變更。
舉例來說:圖3所示的區(qū)塊鏈中,假設(shè)區(qū)塊a是分布式節(jié)點(diǎn)11上的變更,區(qū)塊b是分布式節(jié)點(diǎn)12上的變更,區(qū)塊c是分布式節(jié)點(diǎn)13上的變更。如果圖1中的四個(gè)分布式節(jié)點(diǎn)均參與了監(jiān)控,那么這四個(gè)節(jié)點(diǎn)上都存儲(chǔ)有圖3所示的區(qū)塊鏈。例如,這個(gè)區(qū)塊鏈中包括的各個(gè)變更區(qū)塊,可以是某個(gè)互聯(lián)網(wǎng)產(chǎn)品對(duì)應(yīng)的各次配置變更,而且該互聯(lián)網(wǎng)產(chǎn)品采用了分布式架構(gòu),這些變更分別是各個(gè)分布式節(jié)點(diǎn)上發(fā)生的變更。
本例子的信息變更監(jiān)控方法,通過在發(fā)生信息變更時(shí),將變更對(duì)應(yīng)的區(qū)塊發(fā)送至其他分布式節(jié)點(diǎn)存儲(chǔ),使得即使某個(gè)節(jié)點(diǎn)故障,也不會(huì)影響變更內(nèi)容的存儲(chǔ),其他節(jié)點(diǎn)上仍然存儲(chǔ)有同樣的變更內(nèi)容,從而提高了信息存儲(chǔ)的可靠性;并且,本例子將各次變更采用了區(qū)塊鏈的形式進(jìn)行存儲(chǔ),這種存儲(chǔ)方式不僅將各次變更對(duì)應(yīng)一個(gè)區(qū)塊記錄,而且還依據(jù)變更時(shí)間順序來將各個(gè)區(qū)塊銜接,使得變更可回溯,更方便進(jìn)行問題的排查分析,提高了監(jiān)控分析的效率。
在另一個(gè)例子中,本公開的監(jiān)控方法中,利用區(qū)塊鏈中根據(jù)區(qū)塊信息生成的哈希值,還可以防止變更內(nèi)容被惡意篡改,保證變更內(nèi)容的正確存儲(chǔ)。如圖4所示,示例了區(qū)塊鏈中的其中三個(gè)區(qū)塊。以區(qū)塊32為例,可以根據(jù)區(qū)塊32中的區(qū)塊信息(例如,可以包括:變更時(shí)間戳、變更內(nèi)容key、變更內(nèi)容value、擴(kuò)展字段)進(jìn)行哈希,生成一個(gè)哈希值,即區(qū)塊32中的頭哈希值:cb4e5208b4cd87268b208e49452ed6e89a68e0b8。同理,可以根據(jù)區(qū)塊33和區(qū)塊34中的區(qū)塊信息,生成對(duì)應(yīng)的頭哈希值。
區(qū)塊鏈中的各個(gè)區(qū)塊之間的銜接,可以通過哈希值實(shí)現(xiàn),例如,可以將區(qū)塊鏈中的上一區(qū)塊的哈希值,設(shè)置在本次變更的區(qū)塊中。仍結(jié)合圖4示例,在區(qū)塊33中,還包括一項(xiàng)“上一區(qū)塊的頭哈希值”,該哈希值即區(qū)塊32中的頭哈希值。通過該“上一區(qū)塊的頭哈希值”可以實(shí)現(xiàn)區(qū)塊之間的相鄰追溯,比如,在區(qū)塊鏈中的區(qū)塊34的上一區(qū)塊,可以通過區(qū)塊34中包含的“上一區(qū)塊的頭哈希值”,找到該哈希值對(duì)應(yīng)的區(qū)塊33。
哈希值的設(shè)置可以防止變更內(nèi)容被篡改,如圖5所示的流程,該流程可以示例如何檢測(cè)篡改區(qū)塊信息:
在步驟501中,獲取對(duì)區(qū)塊鏈中的某一個(gè)區(qū)塊的區(qū)塊信息,進(jìn)行修改后的更新信息。
例如,以某個(gè)分布式節(jié)點(diǎn)來說,假設(shè)區(qū)塊鏈中的某一個(gè)區(qū)塊的區(qū)塊信息被惡意修改,比如將變更內(nèi)容value更改,那么節(jié)點(diǎn)可以接收到修改后的區(qū)塊信息,可以稱為更新信息,該更新信息中的變更內(nèi)容value發(fā)生變化,其他信息未變。
在步驟502中,根據(jù)更新信息進(jìn)行哈希,得到對(duì)應(yīng)本區(qū)塊的新哈希值。
例如,可以根據(jù)更新信息中的變更時(shí)間戳、變更內(nèi)容key、變更內(nèi)容value和擴(kuò)展字段,進(jìn)行哈希得到新哈希值。
在步驟503中,將新哈希值與區(qū)塊鏈中的下一區(qū)塊中的“上一區(qū)塊頭哈希值”進(jìn)行比較,若兩者不同,則確定發(fā)生信息篡改。
本步驟中,所述的“下一區(qū)塊”即指向當(dāng)前被修改區(qū)塊的區(qū)塊,比如,如果當(dāng)前被修改的區(qū)塊是圖4中的區(qū)塊33,則“下一區(qū)塊”即區(qū)塊鏈中的區(qū)塊34。根據(jù)區(qū)塊33中修改后的更新信息,得到新的哈希值,也就是區(qū)塊33中的頭哈希值被更新。本步驟可以將該區(qū)塊33中的新的頭哈希值,與區(qū)塊34中包括的“上一區(qū)塊頭哈希值”比較,判斷兩者是否相同。并且,由于區(qū)塊33的信息被修改后,頭哈希相對(duì)于之前也會(huì)不同,則本步驟的判斷結(jié)果為兩者不同。此時(shí),節(jié)點(diǎn)可以確認(rèn)區(qū)塊信息是在被篡改。
在步驟504中,拒絕對(duì)區(qū)塊信息的修改。
當(dāng)確認(rèn)區(qū)塊信息被篡改后,分布式節(jié)點(diǎn)可以拒絕對(duì)信息的修改,比如,上述例子中,可以拒絕對(duì)區(qū)塊33中信息的修改,仍然保持最初變更時(shí)生成的信息。
本實(shí)施例中,分布式節(jié)點(diǎn)可以通過執(zhí)行該方法,避免存儲(chǔ)的區(qū)塊信息被隨意篡改;只要區(qū)塊鏈中的區(qū)塊信息被修改,節(jié)點(diǎn)就可以通過比對(duì)區(qū)塊的頭哈希與其下一區(qū)塊中存儲(chǔ)的對(duì)應(yīng)哈希,確定信息是被篡改,從而拒絕該修改,這樣就可以保證區(qū)塊鏈中的區(qū)塊信息,都是在節(jié)點(diǎn)檢測(cè)到發(fā)生信息變更時(shí)自動(dòng)生成的,而不是人為篡改的,提高了信息變更存儲(chǔ)的可靠性。
在又一個(gè)例子中,區(qū)塊信息中的哈希值,還可以應(yīng)用于節(jié)點(diǎn)接收到其他節(jié)點(diǎn)同步的區(qū)塊信息時(shí),結(jié)合圖6所示,該圖6示例了節(jié)點(diǎn)接收同步區(qū)塊的處理。
在步驟601中,接收分布式系統(tǒng)中的其他分布式節(jié)點(diǎn)發(fā)送的區(qū)塊。
例如,假設(shè)圖1中的分布式節(jié)點(diǎn)11將其本節(jié)點(diǎn)的區(qū)塊同步至分布式節(jié)點(diǎn)12,那么分布式節(jié)點(diǎn)12將接收到該同步的區(qū)塊。本例子中,所同步的區(qū)塊可以包括變更時(shí)間戳、變更內(nèi)容key、變更內(nèi)容value、擴(kuò)展字段、頭哈希、區(qū)塊生成時(shí)間戳等信息,即分布式節(jié)點(diǎn)11可以將所生成區(qū)塊中的內(nèi)容都發(fā)送至節(jié)點(diǎn)12。
在步驟602中,根據(jù)區(qū)塊中的區(qū)塊信息進(jìn)行哈希。
例如,結(jié)合圖4的示例,假設(shè)分布式節(jié)點(diǎn)12接收到的區(qū)塊是區(qū)塊34,那么分布式節(jié)點(diǎn)12可以根據(jù)區(qū)塊34中的變更時(shí)間戳、變更內(nèi)容key、變更內(nèi)容value、擴(kuò)展字段,生成對(duì)應(yīng)的哈希值。
在步驟603中,將計(jì)算的哈希值與區(qū)塊中包括的哈希值進(jìn)行比較,并確定兩者一致。
本步驟中,分布式節(jié)點(diǎn)12可以將步驟602中生成的哈希值,與區(qū)塊34中的頭哈希值進(jìn)行比較,判斷兩者是否相同;本例子中,各個(gè)分布式節(jié)點(diǎn)采用相同的哈希算法。如果不同,表明可能在區(qū)塊信息發(fā)送的過程中被篡改,則分布式節(jié)點(diǎn)12可以采取相應(yīng)的措施,比如可以拒絕將該區(qū)塊加入到本節(jié)點(diǎn)的區(qū)塊鏈,并可以通知分布式節(jié)點(diǎn)11或者其他預(yù)設(shè)的告警設(shè)備。如果計(jì)算的哈希值與區(qū)塊34中的頭哈希值相同,則可以確定區(qū)塊信息正確,繼續(xù)執(zhí)行604。
在步驟604中,將同步的區(qū)塊加入到本節(jié)點(diǎn)的區(qū)塊鏈中。
例如,可以參見圖4的示例,分布式節(jié)點(diǎn)12在確定區(qū)塊34數(shù)據(jù)正確后,可以根據(jù)變更時(shí)間戳,依據(jù)時(shí)間先后順序,將區(qū)塊34加在區(qū)塊鏈中,并位于區(qū)塊33的后邊,區(qū)塊34中的上一區(qū)塊頭哈希即區(qū)塊33的頭哈希值。
本例子的方法,分布式節(jié)點(diǎn)在接收到其他節(jié)點(diǎn)同步的區(qū)塊時(shí),可以將該區(qū)塊加入到本節(jié)點(diǎn)的區(qū)塊鏈中,實(shí)現(xiàn)對(duì)本節(jié)點(diǎn)區(qū)塊鏈的更新。分布式系統(tǒng)中的各個(gè)分布式節(jié)點(diǎn),不僅能自己存儲(chǔ)區(qū)塊鏈,而且還可以通過向其他節(jié)點(diǎn)同步,使得其他節(jié)點(diǎn)也存儲(chǔ)同樣的區(qū)塊鏈,從而使得該區(qū)塊鏈在系統(tǒng)中形成分布式存儲(chǔ),分布式系統(tǒng)內(nèi)的變更內(nèi)容可以被多個(gè)分布式節(jié)點(diǎn)共同維護(hù),不會(huì)因?yàn)槟骋粋€(gè)節(jié)點(diǎn)的退出而影響對(duì)系統(tǒng)信息的存儲(chǔ)。
在又一個(gè)例子中,一個(gè)分布式節(jié)點(diǎn)在接收到其他節(jié)點(diǎn)同步的區(qū)塊時(shí),可能發(fā)生如下的場(chǎng)景:在同一極短的時(shí)間內(nèi),多個(gè)節(jié)點(diǎn)同時(shí)發(fā)生變更,由此導(dǎo)致這多個(gè)節(jié)點(diǎn)生成的對(duì)應(yīng)變更的各個(gè)區(qū)塊,指向同樣的上一個(gè)區(qū)塊。如果廣播或組播到分布式網(wǎng)絡(luò)中,接收到這些區(qū)塊的某個(gè)分布式節(jié)點(diǎn)就會(huì)發(fā)現(xiàn),其接收到了至少兩個(gè)指向同一區(qū)塊的同步區(qū)塊。如圖7所示例,新生成的區(qū)塊是區(qū)塊34,不過圖7中的兩個(gè)區(qū)塊34可以分別由不同的節(jié)點(diǎn)創(chuàng)建,只是這兩個(gè)節(jié)點(diǎn)幾乎同時(shí)發(fā)生信息變更,才導(dǎo)致出現(xiàn)兩個(gè)區(qū)塊34。
接收到上述兩個(gè)區(qū)塊34的分布式節(jié)點(diǎn),可以執(zhí)行圖8示例的方法進(jìn)行處理:
在步驟801中,確定接收到至少兩個(gè)同步的區(qū)塊,且該至少兩個(gè)區(qū)塊中的“上一區(qū)塊頭哈希值”相同。
例如,結(jié)合圖7所示,圖7中的兩個(gè)區(qū)塊34中的“上一區(qū)塊頭哈希值”相同,即這兩個(gè)區(qū)塊34都指向相同的上一區(qū)塊。
在步驟802中,根據(jù)所述至少兩個(gè)區(qū)塊中的變更時(shí)間,進(jìn)行時(shí)間排序。
本步驟中,節(jié)點(diǎn)可以根據(jù)兩個(gè)區(qū)塊34中的變更時(shí)間戳進(jìn)行排序,通過排序可以知道哪個(gè)區(qū)塊在時(shí)間上先發(fā)生變更,哪個(gè)在時(shí)間上后發(fā)生變更。比如,圖7中的兩個(gè)區(qū)塊34,經(jīng)過時(shí)間排序可以得到,變更時(shí)間戳為1471787967378的區(qū)塊34先更新,而變更時(shí)間戳為1471787967226的區(qū)塊34后更新。
在步驟803中,將時(shí)間較早的區(qū)塊,先加入到本節(jié)點(diǎn)的區(qū)塊鏈中。
結(jié)合圖9所示,可以將變更時(shí)間戳為1471787967378的區(qū)塊34,先加入到本節(jié)點(diǎn)的區(qū)塊鏈中。在加入?yún)^(qū)塊鏈時(shí),該區(qū)塊34中的信息不變。
在步驟804中,將時(shí)間較晚的區(qū)塊,后加入到區(qū)塊鏈中,并且更改區(qū)塊中的“上一區(qū)塊頭哈希值”為其所連接的區(qū)塊鏈中的上一區(qū)塊的頭哈希。
其中,變更時(shí)間戳為1471787967226的區(qū)塊34,后加入?yún)^(qū)塊鏈,如圖9所示,該區(qū)塊34要加入在變更時(shí)間戳為1471787967378的區(qū)塊34的后面,并且可以將塊標(biāo)識(shí)34修改為35,成為區(qū)塊35。此外,由于其指向的上一區(qū)塊也發(fā)生了變更,需要將區(qū)塊35中的“上一區(qū)塊頭哈希值”由原來的區(qū)塊33的頭哈希,更改為圖9中的區(qū)塊34的頭哈希值,其他信息不變。
在極小的概率下可能發(fā)生變更時(shí)間戳相同的情況,此時(shí),可以分別根據(jù)各個(gè)區(qū)塊中的區(qū)塊信息進(jìn)行哈希,依據(jù)哈希值由小到大的順序,將哈希值較小的區(qū)塊先加入到區(qū)塊鏈中,哈希值較大的區(qū)塊后加入到區(qū)塊鏈中。
本例子的方法,即使在較短時(shí)間內(nèi)多個(gè)節(jié)點(diǎn)發(fā)生了變更,也能夠保證區(qū)塊鏈被正確的更新,保障區(qū)塊鏈中信息的準(zhǔn)確性,使得區(qū)塊鏈中的信息能夠按照區(qū)塊信息的更新先后順序進(jìn)行排序銜接。
此外,上述的幾個(gè)方法實(shí)施例描述了在分布式系統(tǒng)中,各個(gè)分布式節(jié)點(diǎn)之間如何實(shí)現(xiàn)對(duì)系統(tǒng)內(nèi)的信息變更的分布式存儲(chǔ),且保障存儲(chǔ)信息的可靠準(zhǔn)確。當(dāng)一個(gè)節(jié)點(diǎn)新加入該分布式系統(tǒng)時(shí),可以由分布式系統(tǒng)的一個(gè)其他分布式節(jié)點(diǎn)上,同步區(qū)塊鏈即可。比如,若某分布式節(jié)點(diǎn)新加入,可以為該節(jié)點(diǎn)配置一個(gè)分布式系統(tǒng)中已有的節(jié)點(diǎn)進(jìn)行同步,新節(jié)點(diǎn)從已有節(jié)點(diǎn)上同步現(xiàn)有的區(qū)塊鏈數(shù)據(jù)(例如,可以基于p2p的方式下載數(shù)據(jù),如bt下載)。并且,該新節(jié)點(diǎn)可以加入廣播或組播網(wǎng)絡(luò),開啟變更監(jiān)控,則可以執(zhí)行上述的信息變更監(jiān)控方法。
本公開的信息變更監(jiān)控方法,可以被應(yīng)用于各類分布式系統(tǒng)場(chǎng)景中,比如,可以應(yīng)用于線上、預(yù)發(fā)布等具有高變更風(fēng)險(xiǎn)的場(chǎng)景對(duì)信息變更進(jìn)行監(jiān)控。在本方法中,可以由分布式系統(tǒng)的各個(gè)分布式節(jié)點(diǎn)保存統(tǒng)一的區(qū)塊鏈,信息變更的數(shù)據(jù)可以被去中心化地記錄在很多節(jié)點(diǎn)中,由多個(gè)節(jié)點(diǎn)共同維護(hù),不因?yàn)槟骋还?jié)點(diǎn)退出而影響對(duì)信息變革的存儲(chǔ)。一旦某一節(jié)點(diǎn)發(fā)現(xiàn)信息變更,可以將生成的對(duì)應(yīng)變更的區(qū)塊廣播或組播到參與監(jiān)控的各個(gè)節(jié)點(diǎn),各節(jié)點(diǎn)共同將該變更同步更新到區(qū)塊鏈中,不需要人工進(jìn)行干預(yù),分布式自治。所有變更記錄基于變更時(shí)間,使用區(qū)塊鏈的結(jié)構(gòu)進(jìn)行保存,使得變更歷史可回溯,方便進(jìn)行問題排查分析。并且區(qū)塊鏈還使用哈希算法,保證變更數(shù)據(jù)無法篡改,一旦篡改區(qū)塊鏈數(shù)據(jù),由于哈希值會(huì)變化,通過簡(jiǎn)單的哈希匹配即可發(fā)現(xiàn),使得信息存儲(chǔ)更加可靠。
為了實(shí)現(xiàn)上述的信息變更監(jiān)控方法,本公開還提供了一種信息變更監(jiān)控裝置,如圖10所示,該裝置可以包括:
區(qū)塊更新模塊1001,用于創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊,所述新區(qū)塊用于記錄本節(jié)點(diǎn)上發(fā)生的節(jié)點(diǎn)變更信息,所述新區(qū)塊包括區(qū)塊頭和區(qū)塊主體,所述區(qū)塊頭包括所述區(qū)塊鏈中與新區(qū)塊連接的上一區(qū)塊的頭哈希值,所述區(qū)塊主體包括變更時(shí)間和變更內(nèi)容;
區(qū)塊同步模塊1002,用于將所述新區(qū)塊的節(jié)點(diǎn)變更信息,同步至分布式系統(tǒng)中的其他分布式節(jié)點(diǎn),以使得所述其他分布式節(jié)點(diǎn)更新所述區(qū)塊鏈。
在一個(gè)例子中,區(qū)塊更新模塊1001,在用于創(chuàng)建區(qū)塊鏈中的一個(gè)新區(qū)塊時(shí),包括:在確定本節(jié)點(diǎn)上發(fā)生信息變更時(shí),創(chuàng)建所述新區(qū)塊;且所述區(qū)塊主體中包括本次變更的變更時(shí)間和變更內(nèi)容。
在一個(gè)例子中,如圖11所示,該裝置還可以包括:區(qū)塊接收模塊1003。
區(qū)塊接收模塊1003,用于接收分布式系統(tǒng)中的其他分布式節(jié)點(diǎn)發(fā)送的區(qū)塊;
區(qū)塊更新模塊1001,還用于根據(jù)所述區(qū)塊接收模塊接收的區(qū)塊中的區(qū)塊信息進(jìn)行哈希,并與所述區(qū)塊中包括的哈希值進(jìn)行比較,若一致,則將所述區(qū)塊加入到本節(jié)點(diǎn)的區(qū)塊鏈中。
在一個(gè)例子中,區(qū)塊更新模塊1001,還用于:若接收到至少兩個(gè)區(qū)塊,所述至少兩個(gè)區(qū)塊分別由不同的其他分布式節(jié)點(diǎn)發(fā)送,且對(duì)應(yīng)的上一區(qū)塊相同;則根據(jù)所述至少兩個(gè)區(qū)塊中的變更時(shí)間排序,依據(jù)所述排序?qū)⑺鲋辽賰蓚€(gè)區(qū)塊加入本節(jié)點(diǎn)的區(qū)塊鏈。
在一個(gè)例子中,區(qū)塊更新模塊1001,還用于:若接收到的至少兩個(gè)區(qū)塊,所述至少兩個(gè)區(qū)塊分別由不同的其他分布式節(jié)點(diǎn)發(fā)送,且對(duì)應(yīng)的上一區(qū)塊相同;并且如果所述至少兩個(gè)區(qū)塊中的變更時(shí)間也相同,則分別根據(jù)各個(gè)區(qū)塊中的區(qū)塊信息進(jìn)行哈希,依據(jù)哈希值由小到大的順序,將對(duì)應(yīng)區(qū)塊先后加入本節(jié)點(diǎn)的區(qū)塊鏈。
上述實(shí)施例闡明的裝置或模塊,具體可以由計(jì)算機(jī)芯片或?qū)嶓w實(shí)現(xiàn),或者由具有某種功能的產(chǎn)品來實(shí)現(xiàn)。一種典型的實(shí)現(xiàn)設(shè)備為計(jì)算機(jī),計(jì)算機(jī)的具體形式可以是個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、蜂窩電話、相機(jī)電話、智能電話、個(gè)人數(shù)字助理、媒體播放器、導(dǎo)航設(shè)備、電子郵件收發(fā)設(shè)備、游戲控制臺(tái)、平板計(jì)算機(jī)、可穿戴設(shè)備或者這些設(shè)備中的任意幾種設(shè)備的組合。
為了描述的方便,描述以上裝置時(shí)以功能分為各種模塊分別描述。當(dāng)然,在實(shí)施本公開時(shí)可以把各模塊的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。
以上所述僅為本公開的較佳實(shí)施例而已,并不用以限制本公開,凡在本公開的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本公開保護(hù)的范圍之內(nèi)。