本發(fā)明涉及數(shù)據(jù)分布式存儲(chǔ)領(lǐng)域,具體而言,涉及一種數(shù)據(jù)操作請(qǐng)求的處理方法及系統(tǒng)。
背景技術(shù):
目前,在分布式存儲(chǔ)領(lǐng)域中,為了能夠?qū)崿F(xiàn)高可用性和高可靠性,針對(duì)一份數(shù)據(jù)通常需要存儲(chǔ)多個(gè)備份,而且這些備份還需要分布在不同機(jī)房,不同主機(jī),不同磁盤的數(shù)據(jù)節(jié)點(diǎn)上,由此,在其中一個(gè)備份出現(xiàn)故障的情況下,并不會(huì)影響其他備份提供正常服務(wù)。因此,數(shù)據(jù)備份如何存儲(chǔ)到不同的數(shù)據(jù)節(jié)點(diǎn)上,以及每當(dāng)數(shù)據(jù)修改后數(shù)據(jù)節(jié)點(diǎn)上多個(gè)備份如何保持?jǐn)?shù)據(jù)同步,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)一致性,是分布式存儲(chǔ)中亟待解決的重要問題。
相關(guān)技術(shù)中所提供的主從模型通常是以主機(jī)為單位進(jìn)行同步,并遵循主從模型,即存在一個(gè)主數(shù)據(jù)節(jié)點(diǎn)以及一個(gè)或多個(gè)從數(shù)據(jù)節(jié)點(diǎn),數(shù)據(jù)寫入操作與數(shù)據(jù)修改操作都在這個(gè)主數(shù)據(jù)節(jié)點(diǎn)上進(jìn)行,然后由主數(shù)據(jù)節(jié)點(diǎn)將寫入或修改的數(shù)據(jù)發(fā)送至從數(shù)據(jù)節(jié)點(diǎn)。
然而,這種同步方式存在以下技術(shù)缺陷:
(1)同步粒度較粗,同步并發(fā)度較低,以主機(jī)為單位進(jìn)行數(shù)據(jù)同步式效率低,缺乏靈活性。在需要更新的數(shù)據(jù)量較大的情況下,數(shù)據(jù)同步通常是按照預(yù)設(shè)隊(duì)列順序依次發(fā)送至各個(gè)從數(shù)據(jù)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)備份,同步速度較慢,全部從數(shù)據(jù)節(jié)點(diǎn)同步數(shù)據(jù)完畢需要等待較長(zhǎng)時(shí)間;另外,如果特定記錄或者某段數(shù)據(jù)發(fā)生異常,那么可能需要遍歷全部從數(shù)據(jù)節(jié)點(diǎn)才能夠查找到這些記錄或數(shù)據(jù),進(jìn)而有可能導(dǎo)致后續(xù)同步更新的數(shù)據(jù)需要重新同步。
(2)從數(shù)據(jù)節(jié)點(diǎn)僅能執(zhí)行同步操作,而不能執(zhí)行修改和讀寫操作,從數(shù)據(jù)節(jié)點(diǎn)同步或者恢復(fù)數(shù)據(jù)只能從主數(shù)據(jù)節(jié)點(diǎn)中獲取,因此,沒有充分利用其它從數(shù)據(jù)節(jié)點(diǎn)。由于主從模型過分依賴主數(shù)據(jù)節(jié)點(diǎn),特別是在高峰訪問期間,數(shù)據(jù)處理壓力完全落在主數(shù)據(jù)節(jié)點(diǎn)上,故而易造成主數(shù)據(jù)節(jié)點(diǎn)達(dá)到性能瓶頸,負(fù)載不均勻,水平拓展性差。
(3)當(dāng)主數(shù)據(jù)節(jié)點(diǎn)進(jìn)行一系列的數(shù)據(jù)寫入、刪除、更新操作時(shí),由于數(shù)據(jù)組織以主數(shù)據(jù)節(jié)點(diǎn)粒度為單位,而且從數(shù)據(jù)節(jié)點(diǎn)都僅能與主數(shù)據(jù)節(jié)點(diǎn)進(jìn)行通信,寫入、刪除、更新等事件發(fā)生通常僅能通過串行方式通知從數(shù)據(jù)節(jié)點(diǎn),由此易造成從數(shù)據(jù)節(jié)點(diǎn)感知數(shù)據(jù)寫入、刪除、更新事件速度慢,進(jìn)而造成數(shù)據(jù)同步延時(shí)高。
綜合整個(gè)集群的數(shù)據(jù)同步過程會(huì)發(fā)現(xiàn)相關(guān)技術(shù)中提供的主從模型整體同步效率低下,可拓展性不高,組織數(shù)據(jù)不靈活,而且在高并發(fā)訪問量下,容易達(dá)到性能瓶頸,吞吐量低。
針對(duì)上述的問題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種數(shù)據(jù)操作請(qǐng)求的處理方法及系統(tǒng),以至少解決相關(guān)技術(shù)中所提供的數(shù)據(jù)分布式存儲(chǔ)方式同步效率低下,可拓展性不高,組織數(shù)據(jù)不靈活,而且在高并發(fā)訪問量下,容易達(dá)到性能瓶頸,吞吐量低的技術(shù)問題。
根據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供了一種數(shù)據(jù)操作請(qǐng)求的處理方法,包括:
接入層代理獲取數(shù)據(jù)操作請(qǐng)求,其中,數(shù)據(jù)操作請(qǐng)求中攜帶有桶標(biāo)識(shí)信息和文件標(biāo)識(shí)信息;接入層代理根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn);接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn),其中,文件標(biāo)識(shí)信息用于在第一數(shù)據(jù)節(jié)點(diǎn)上與桶標(biāo)識(shí)信息對(duì)應(yīng)的第一桶獲取待操作的數(shù)據(jù)存儲(chǔ)位置。
可選地,接入層代理根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn)包括:接入層代理根據(jù)桶標(biāo)識(shí)信息從中心數(shù)據(jù)庫(kù)中查找到與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)數(shù)據(jù)節(jié)點(diǎn),其中,中心數(shù)據(jù)庫(kù)為數(shù)據(jù)節(jié)點(diǎn)集群中各個(gè)數(shù)據(jù)節(jié)點(diǎn)共享的存儲(chǔ)空間,且中心數(shù)據(jù)庫(kù)用于記錄與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在數(shù)據(jù)節(jié)點(diǎn)集群中的分布位置;接入層代理從多個(gè)數(shù)據(jù)節(jié)點(diǎn)中隨機(jī)選取第一數(shù)據(jù)節(jié)點(diǎn)。
可選地,在接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn)之后,還包括:第一數(shù)據(jù)節(jié)點(diǎn)根據(jù)桶標(biāo)識(shí)信息查找到位于第一數(shù)據(jù)節(jié)點(diǎn)上的第一桶;第一桶利用文件標(biāo)識(shí)信息訪問與第一數(shù)據(jù)節(jié)點(diǎn)相關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù),獲取待操作的數(shù)據(jù)存儲(chǔ)位置;第一桶對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作。
可選地,在接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn)之后,還包括:第一數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)操作記錄日志;第一數(shù)據(jù)節(jié)點(diǎn)將在數(shù)據(jù)操作記錄日志存儲(chǔ)在與桶標(biāo)識(shí)信息對(duì)應(yīng)的文件中,其中,數(shù)據(jù)操作記錄日志與先前創(chuàng)建的數(shù)據(jù)操作記錄日志按照時(shí)間先后順序存放。
可選地,在第一桶對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作之后,還包括:多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)向第一數(shù)據(jù)節(jié)點(diǎn)發(fā)送日志獲取請(qǐng)求,其中,日志獲取請(qǐng)求用于獲取數(shù)據(jù)操作記錄日志,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)是桶標(biāo)識(shí)信息對(duì)應(yīng)的除第一桶之外的其他桶所在的數(shù)據(jù)節(jié)點(diǎn);多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)上的其他桶在獲取到數(shù)據(jù)操作記錄日志后,根據(jù)數(shù)據(jù)操作記錄日志執(zhí)行數(shù)據(jù)同步操作。
可選地,在接入層代理獲取數(shù)據(jù)操作請(qǐng)求之前,還包括:接入層代理根據(jù)數(shù)據(jù)備份需求確定待創(chuàng)建的桶的數(shù)量并根據(jù)待創(chuàng)建的桶的數(shù)量確定待選用的數(shù)據(jù)節(jié)點(diǎn)的數(shù)量;接入層代理在每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建一個(gè)或多個(gè)桶;接入層代理將每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)所創(chuàng)建的一個(gè)或多個(gè)桶的標(biāo)識(shí)信息記錄至關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù)中并將與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在多個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上的分布信息注冊(cè)至中心數(shù)據(jù)庫(kù);接入層代理在與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶之間開啟數(shù)據(jù)同步功能。
根據(jù)本發(fā)明實(shí)施例的另一方面,還提供了一種數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng),該系統(tǒng)包括:接入層代理;接入層代理包括:獲取模塊,用于獲取數(shù)據(jù)操作請(qǐng)求,其中,數(shù)據(jù)操作請(qǐng)求中攜帶有桶標(biāo)識(shí)信息和文件標(biāo)識(shí)信息;選取模塊,用于根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn);發(fā)送模塊,用于將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn),其中,文件標(biāo)識(shí)信息用于在第一數(shù)據(jù)節(jié)點(diǎn)上與桶標(biāo)識(shí)信息對(duì)應(yīng)的第一桶獲取待操作的數(shù)據(jù)存儲(chǔ)位置。
可選地,選取模塊包括:查找單元,用于根據(jù)桶標(biāo)識(shí)信息從中心數(shù)據(jù)庫(kù)中查找到與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)數(shù)據(jù)節(jié)點(diǎn),其中,中心數(shù)據(jù)庫(kù)為數(shù)據(jù)節(jié)點(diǎn)集群中各個(gè)數(shù)據(jù)節(jié)點(diǎn)共享的存儲(chǔ)空間,且中心數(shù)據(jù)庫(kù)用于記錄與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在數(shù)據(jù)節(jié)點(diǎn)集群中的分布位置;選取單元,用于從多個(gè)數(shù)據(jù)節(jié)點(diǎn)中隨機(jī)選取第一數(shù)據(jù)節(jié)點(diǎn)。
可選地,上述系統(tǒng)還包括:數(shù)據(jù)節(jié)點(diǎn)集群,數(shù)據(jù)節(jié)點(diǎn)集群包括:第一數(shù)據(jù)節(jié)點(diǎn);第一數(shù)據(jù)節(jié)點(diǎn)包括:查找模塊,用于根據(jù)桶標(biāo)識(shí)信息查找到位于第一數(shù)據(jù)節(jié)點(diǎn)上的第一桶;獲取模塊,用于利用文件標(biāo)識(shí)信息訪問與第一數(shù)據(jù)節(jié)點(diǎn)相關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù),獲取待操作的數(shù)據(jù)存儲(chǔ)位置;執(zhí)行模塊,用于對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作。
可選地,第一數(shù)據(jù)節(jié)點(diǎn)還包括:第一創(chuàng)建模塊,用于創(chuàng)建與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)操作記錄日志;記錄模塊,用于將在數(shù)據(jù)操作記錄日志存儲(chǔ)在與桶標(biāo)識(shí)信息對(duì)應(yīng)的文件中,其中,數(shù)據(jù)操作記錄日志與先前創(chuàng)建的數(shù)據(jù)操作記錄日志按照時(shí)間先后順序存放。
可選地,數(shù)據(jù)節(jié)點(diǎn)集群還包括:多個(gè)第二數(shù)據(jù)節(jié)點(diǎn);每個(gè)第二數(shù)據(jù)節(jié)點(diǎn)均包括:請(qǐng)求模塊,用于向第一數(shù)據(jù)節(jié)點(diǎn)發(fā)送日志獲取請(qǐng)求,其中,日志獲取請(qǐng)求用于獲取數(shù)據(jù)操作記錄日志,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)是桶標(biāo)識(shí)信息對(duì)應(yīng)的除第一桶之外的其他桶所在的數(shù)據(jù)節(jié)點(diǎn);同步模塊,用于在獲取到數(shù)據(jù)操作記錄日志后,根據(jù)數(shù)據(jù)操作記錄日志執(zhí)行數(shù)據(jù)同步操作。
可選地,接入層代理還包括:確定模塊,用于根據(jù)數(shù)據(jù)備份需求確定待創(chuàng)建的桶的數(shù)量并根據(jù)待創(chuàng)建的桶的數(shù)量確定待選用的數(shù)據(jù)節(jié)點(diǎn)的數(shù)量;第二創(chuàng)建模塊,用于在每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建一個(gè)或多個(gè)桶;處理模塊,用于將每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)所創(chuàng)建的一個(gè)或多個(gè)桶的標(biāo)識(shí)信息記錄至關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù)中并將與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在多個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上的分布信息注冊(cè)至中心數(shù)據(jù)庫(kù);啟動(dòng)模塊,用于在與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶之間開啟數(shù)據(jù)同步功能。
在本發(fā)明實(shí)施例中,采用完全對(duì)稱的集群架構(gòu),去中心化設(shè)計(jì),將數(shù)據(jù)節(jié)點(diǎn)細(xì)化成多個(gè)桶,并以桶為單位進(jìn)行分布式數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)同步,從而增強(qiáng)了數(shù)據(jù)同步的并發(fā)度、數(shù)據(jù)組織的靈活性;同時(shí)采用完全對(duì)稱的集群架構(gòu),每個(gè)桶都可以同時(shí)對(duì)數(shù)據(jù)執(zhí)行相關(guān)操作,而且每個(gè)桶還可以從其他桶獲取備份數(shù)據(jù),由此分擔(dān)了整個(gè)系統(tǒng)的壓力,提高系統(tǒng)的容納能力和水平拓展能力,進(jìn)而解決了相關(guān)技術(shù)中所提供的數(shù)據(jù)分布式存儲(chǔ)方式同步效率低下,可拓展性不高,組織數(shù)據(jù)不靈活,而且在高并發(fā)訪問量下,容易達(dá)到性能瓶頸,吞吐量低的技術(shù)問題。
附圖說明
此處所說明的附圖用來提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理方法的流程圖;
圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)寫入過程的流程圖;
圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)操作記錄日志格式的示意圖;
圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例的伙伴桶之間執(zhí)行數(shù)據(jù)同步過程的流程圖;
圖5是根據(jù)本發(fā)明優(yōu)選實(shí)施例的桶創(chuàng)建過程的流程圖;
圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的伙伴桶相互連接的拓?fù)浣Y(jié)構(gòu)示意圖;
圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng)的結(jié)構(gòu)框圖;
圖8是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng)的結(jié)構(gòu)框圖;
圖9是根據(jù)本發(fā)明優(yōu)選實(shí)施例的分布式存儲(chǔ)中多副本同步的集群架構(gòu)圖。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。
需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語(yǔ)“第一”、“第二”等是用于區(qū)別類似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實(shí)施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語(yǔ)“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
根據(jù)本發(fā)明實(shí)施例,提供了一種數(shù)據(jù)操作請(qǐng)求的處理方法的實(shí)施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理方法的流程圖,如圖1所示,該方法包括如下步驟:
步驟S102,接入層代理獲取數(shù)據(jù)操作請(qǐng)求,其中,數(shù)據(jù)操作請(qǐng)求中攜帶有桶標(biāo)識(shí)信息和文件標(biāo)識(shí)信息;
步驟S104,接入層代理根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn);
步驟S106,接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn),其中,文件標(biāo)識(shí)信息用于在第一數(shù)據(jù)節(jié)點(diǎn)上與桶標(biāo)識(shí)信息對(duì)應(yīng)的第一桶獲取待操作的數(shù)據(jù)存儲(chǔ)位置。
通過上述步驟,采用去中心化的設(shè)計(jì),將數(shù)據(jù)節(jié)點(diǎn)細(xì)化成桶(BUCKET,其為組織數(shù)據(jù)的邏輯單位),用桶組織數(shù)據(jù),桶跟備份桶的標(biāo)識(shí)符完全一致,結(jié)成伙伴桶(即備份桶),伙伴桶之間相互建立連接,時(shí)刻保持通信;一份數(shù)據(jù)指定寫入某個(gè)桶,那么系統(tǒng)就知道這份數(shù)據(jù)屬于哪個(gè)數(shù)據(jù)節(jié)點(diǎn),從而建立和這個(gè)數(shù)據(jù)節(jié)點(diǎn)的通信;數(shù)據(jù)寫入后這個(gè)桶的伙伴桶也能迅速?gòu)南嗷ブg得到消息,從而請(qǐng)求數(shù)據(jù)同步。
可選地,在步驟S104中,接入層代理根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn)可以包括以下執(zhí)行步驟:
步驟S1041,接入層代理根據(jù)桶標(biāo)識(shí)信息從中心數(shù)據(jù)庫(kù)(例如:中心REDIS數(shù)據(jù)庫(kù),其為集群數(shù)據(jù)節(jié)點(diǎn)內(nèi)所有數(shù)據(jù)節(jié)點(diǎn)共享的數(shù)據(jù)庫(kù);REDIS是一個(gè)KEY-VALUE形式存儲(chǔ)的內(nèi)存數(shù)據(jù)庫(kù),內(nèi)存數(shù)據(jù)可以持久化到磁盤中)中查找到與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)數(shù)據(jù)節(jié)點(diǎn),其中,中心數(shù)據(jù)庫(kù)為數(shù)據(jù)節(jié)點(diǎn)集群中各個(gè)數(shù)據(jù)節(jié)點(diǎn)共享的存儲(chǔ)空間,且中心數(shù)據(jù)庫(kù)用于記錄與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在數(shù)據(jù)節(jié)點(diǎn)集群中的分布位置;
步驟S1042,接入層代理從多個(gè)數(shù)據(jù)節(jié)點(diǎn)中隨機(jī)選取第一數(shù)據(jù)節(jié)點(diǎn)。
在優(yōu)選實(shí)施例中,可以在集群架構(gòu)中部署一個(gè)接入層代理和一個(gè)中心REDIS數(shù)據(jù)庫(kù)。另外,為了能夠更加清楚地解釋本發(fā)明,該優(yōu)選實(shí)施例以數(shù)據(jù)節(jié)點(diǎn)集群使用三臺(tái)主機(jī)(三個(gè)數(shù)據(jù)節(jié)點(diǎn))為例加以說明。每臺(tái)主機(jī)上部署一個(gè)數(shù)據(jù)節(jié)點(diǎn)實(shí)例(當(dāng)然也可以部署多個(gè)數(shù)據(jù)節(jié)點(diǎn)實(shí)例)和一個(gè)本地的REDIS數(shù)據(jù)庫(kù),其中,這三臺(tái)主機(jī)可以分布在不同的機(jī)架或者機(jī)房,以提高其可用性。
假設(shè)一個(gè)桶標(biāo)識(shí)信息對(duì)應(yīng)三個(gè)桶,這三個(gè)桶分別位于一個(gè)數(shù)據(jù)節(jié)點(diǎn)上,那么接入層代理便可以從上述三臺(tái)主機(jī)中任選一臺(tái)主機(jī)。
可選地,在步驟S106,接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn)之后,還可以包括以下執(zhí)行步驟:
步驟S107,第一數(shù)據(jù)節(jié)點(diǎn)根據(jù)桶標(biāo)識(shí)信息查找到位于第一數(shù)據(jù)節(jié)點(diǎn)上的第一桶;
步驟S108,第一桶利用文件標(biāo)識(shí)信息訪問與第一數(shù)據(jù)節(jié)點(diǎn)相關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù)(例如:本地REDIS數(shù)據(jù)庫(kù),其為集群數(shù)據(jù)節(jié)點(diǎn)內(nèi)每個(gè)數(shù)據(jù)節(jié)點(diǎn)分別搭建的本地?cái)?shù)據(jù)庫(kù),僅供該數(shù)據(jù)節(jié)點(diǎn)自身訪問),獲取待操作的數(shù)據(jù)存儲(chǔ)位置;
步驟S109,第一桶對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作。
在優(yōu)選實(shí)施例中,沒有主從數(shù)據(jù)節(jié)點(diǎn)的概念,每個(gè)數(shù)據(jù)節(jié)點(diǎn)都可以成為主節(jié)點(diǎn),都可以對(duì)數(shù)據(jù)執(zhí)行相應(yīng)操作(例如:讀取、寫入、刪除),數(shù)據(jù)節(jié)點(diǎn)上每個(gè)桶都相互連接處于同一備份的桶成為伙伴桶,無論哪個(gè)桶獲得數(shù)據(jù),伙伴桶都能快速的從更新桶或者已經(jīng)更新好伙伴桶中獲取數(shù)據(jù)進(jìn)行同步,其優(yōu)勢(shì)在于:增加了系統(tǒng)并發(fā)度,提高獲取數(shù)據(jù)更新事件的感知敏感度,加快同步數(shù)據(jù)的傳輸速率,以更小的粒度進(jìn)行同步,同時(shí)增強(qiáng)讀取更新數(shù)據(jù)的靈活性。
可選地,在步驟S106,接入層代理將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn)之后,還可以包括以下執(zhí)行步驟:
步驟S110,第一數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)操作記錄日志(binlog);
步驟S111,第一數(shù)據(jù)節(jié)點(diǎn)將在數(shù)據(jù)操作記錄日志存儲(chǔ)在與桶標(biāo)識(shí)信息對(duì)應(yīng)的文件中,其中,數(shù)據(jù)操作記錄日志與先前創(chuàng)建的數(shù)據(jù)操作記錄日志按照時(shí)間先后順序存放。
在本發(fā)明實(shí)施例提供的對(duì)稱型的集群架構(gòu)中設(shè)計(jì)了一種精簡(jiǎn)的binlog日志格式,用于協(xié)商數(shù)據(jù)節(jié)點(diǎn)之間的數(shù)據(jù)同步。每個(gè)數(shù)據(jù)節(jié)點(diǎn)下創(chuàng)建多個(gè)桶,以桶為粒度進(jìn)行同步,桶的數(shù)據(jù)備份到伙伴桶中,即桶與伙伴桶進(jìn)行數(shù)據(jù)同步。通過采用binlog日志格式,有利于減少通信的開銷,減少binlog的占用空間,并且能準(zhǔn)確定位數(shù)據(jù)節(jié)點(diǎn)和桶的同步位置,保證數(shù)據(jù)可靠性,能充分利用資源,提高系統(tǒng)的并發(fā)度,減少數(shù)據(jù)的讀寫延時(shí),提高整個(gè)集群的吞吐量。
作為本發(fā)明的一個(gè)優(yōu)選實(shí)施例,圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)寫入過程的流程圖。如圖2所示,該流程可以包括以下處理步驟:
步驟S202:接入層代理接收到來自于用戶的數(shù)據(jù)寫入請(qǐng)求,其中,所述數(shù)據(jù)寫入請(qǐng)求中攜帶有bucket_id;
步驟S204:接入層代理根據(jù)bucket_id訪問中心REDIS數(shù)據(jù)庫(kù),得到bucket所在的數(shù)據(jù)節(jié)點(diǎn)列表nodes;
步驟S206:接入層代理從nodes列表中隨機(jī)選擇其中一個(gè)node并讀取node服務(wù)信息;
步驟S208:接入層代理根據(jù)選取的node服務(wù)信息進(jìn)行連接,請(qǐng)求數(shù)據(jù)寫入服務(wù);
步驟S210:數(shù)據(jù)節(jié)點(diǎn)接收來自于接入層代理的數(shù)據(jù)寫入請(qǐng)求,構(gòu)建一條數(shù)據(jù)寫入記錄binlog。
圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)操作記錄日志格式的示意圖。如圖3所示,數(shù)據(jù)操作記錄日志可以包括但不限于:數(shù)據(jù)節(jié)點(diǎn)編號(hào)(node_id),操作碼(op_code),文件的id編號(hào)(file_id),數(shù)據(jù)寫入的時(shí)間(timestamp,其單位為毫秒)。
在該優(yōu)選實(shí)施例中,主要定義了以下2種opcode:
0:更新文件內(nèi)容;
1:刪除文件內(nèi)容;
node_id和opcode合并成一個(gè)整型(int),即combine=node_id*0x100+opcode,因此,binlog的結(jié)構(gòu)即為combine|file_id|timestamp總共16個(gè)字節(jié),由此可見,一條數(shù)據(jù)操作記錄日志需要的存儲(chǔ)空間非常少。
步驟S212:數(shù)據(jù)節(jié)點(diǎn)將binlog寫入到bucket_id為目錄下的文件中,按照序號(hào)N(N為整數(shù),從0開始起算)命名文件,當(dāng)一個(gè)文件上的binlog的存儲(chǔ)量累積達(dá)到預(yù)設(shè)閾值(例如:100M),則需要?jiǎng)?chuàng)建一個(gè)新的文件來繼續(xù)寫入后續(xù)生成的binlog,其新文件可以命名為N+1;
步驟S214:在數(shù)據(jù)節(jié)點(diǎn)成功保存上述文件后,可以將更新消息推送到其他數(shù)據(jù)節(jié)點(diǎn)的伙伴桶中;例如:接入層代理將數(shù)據(jù)寫入BUCKET_A,選擇的數(shù)據(jù)節(jié)點(diǎn)為node_1,那么數(shù)據(jù)成功寫入完畢后,node_1可以通知BUCKET_A的伙伴桶,然后,由伙伴桶對(duì)寫入BUCKET_A的數(shù)據(jù)進(jìn)行同步;
在數(shù)據(jù)寫入的過程中,接入層代理可以選取任意一個(gè)伙伴桶執(zhí)行寫入操作,其操作十分靈活;另外,數(shù)據(jù)寫入事件采用binlog進(jìn)行記錄,由于binlog格式非常精簡(jiǎn),因此,便于存儲(chǔ)和傳輸。
可選地,在步驟S109,第一桶對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作之后,還可以包括以下執(zhí)行步驟:
步驟S112,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)向第一數(shù)據(jù)節(jié)點(diǎn)發(fā)送日志獲取請(qǐng)求,其中,日志獲取請(qǐng)求用于獲取數(shù)據(jù)操作記錄日志,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)是桶標(biāo)識(shí)信息對(duì)應(yīng)的除第一桶之外的其他桶所在的數(shù)據(jù)節(jié)點(diǎn);
步驟S113,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)上的其他桶在獲取到數(shù)據(jù)操作記錄日志后,根據(jù)數(shù)據(jù)操作記錄日志執(zhí)行數(shù)據(jù)同步操作。
當(dāng)對(duì)與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶的其中一個(gè)桶執(zhí)行數(shù)據(jù)操作時(shí),以桶為單位構(gòu)造一條操作日志binlog寫入到磁盤,伙伴桶之間相互請(qǐng)求binlog,并根據(jù)binlog進(jìn)行事件回放以完成數(shù)據(jù)同步。如果任意一個(gè)桶中的數(shù)據(jù)發(fā)生異常并不會(huì)影響到其他桶中的數(shù)據(jù),并且在分布式存儲(chǔ)過程中,還可以隨時(shí)加入一個(gè)新桶與舊桶成為伙伴,新桶會(huì)從伙伴桶中請(qǐng)求binlog進(jìn)行數(shù)據(jù)同步。整個(gè)架構(gòu)是完全對(duì)稱的,無論從數(shù)據(jù)節(jié)點(diǎn)還是桶單位角度,都可以進(jìn)行數(shù)據(jù)操作,由此平衡了整個(gè)系統(tǒng)的數(shù)據(jù)處理壓力。
圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例的伙伴桶之間執(zhí)行數(shù)據(jù)同步過程的流程圖。如圖4所示,該流程可以包括以下處理步驟:
步驟S402:桶可以存在以下兩種方式獲取伙伴桶發(fā)生的更新事件,其一是伙伴桶推送給自身的更新消息,表明伙伴桶存在新的binlog需要讀?。黄涠亲陨矶〞r(shí)主動(dòng)訪問伙伴桶的binlog;
步驟S404:本地桶在接收到伙伴桶推送的更新消息或者本地桶定時(shí)訪問伙伴桶的binlog確定需要執(zhí)行更新操作時(shí),本地桶會(huì)向伙伴桶發(fā)起讀取binlog的請(qǐng)求;本地桶查詢本地的REDIS數(shù)據(jù)庫(kù),獲取上一次已經(jīng)從伙伴桶讀取的binlog條數(shù)的偏移量offset,那么此次向伙伴桶請(qǐng)求offset+1開始的新binlog;
步驟S406:本地桶封裝offset變量,向伙伴桶發(fā)送獲取binlog的請(qǐng)求;
步驟S408:伙伴桶接收到請(qǐng)求桶(即上述本地桶)發(fā)送的獲取binlog的請(qǐng)求;
步驟S410:伙伴桶根據(jù)請(qǐng)求的偏移量offset,讀取日志文件從開始偏移量到末尾的binlog;
步驟S412:伙伴桶將讀取到的binlog進(jìn)行封裝,發(fā)給至請(qǐng)求桶;
步驟S414:本地桶在接收到封裝的binlog后,根據(jù)binlog的格式解析出全部binlog;
步驟S416:本地桶逐一解析binlog中,得到opcode,在該優(yōu)選實(shí)施例中,操作碼主要有兩種操作:更新文件內(nèi)容、刪除文件內(nèi)容;如果是刪除文件內(nèi)容,直接轉(zhuǎn)到步驟S424;如果是更新文件內(nèi)容,直接轉(zhuǎn)到步驟S418;
步驟S418:本地桶根據(jù)opcode構(gòu)建數(shù)據(jù)更新請(qǐng)求,并發(fā)送至伙伴桶;
步驟S420:伙伴桶根據(jù)數(shù)據(jù)更新請(qǐng)求返回待更新數(shù)據(jù);
步驟S422:本地桶在接收到待更新數(shù)據(jù)后執(zhí)行數(shù)據(jù)同步;
步驟S424:如果opcode是刪除文件內(nèi)容,本地桶將執(zhí)行刪除文件內(nèi)容操作;
步驟S426:在處理完畢binlog之后,記錄已經(jīng)從這個(gè)伙伴桶讀取binlog的偏移量offset,以便在下次構(gòu)建獲取binlog請(qǐng)求時(shí)從offset+1開始繼續(xù)讀取。
通過上述流程伙伴桶之間同步數(shù)據(jù)是非常靈活和高效的,任意一個(gè)桶更新,伙伴桶都能夠快速感知到事件發(fā)生,并請(qǐng)求binlog進(jìn)行事件回放,從而實(shí)現(xiàn)自動(dòng)化管理;另外,使用偏移量記錄同步進(jìn)度,既簡(jiǎn)單準(zhǔn)確,同時(shí)又能夠確保靈活地選擇需要備份的數(shù)據(jù)內(nèi)容。
可選地,在步驟S102,接入層代理獲取數(shù)據(jù)操作請(qǐng)求之前,還可以包括以下執(zhí)行步驟:
步驟S114,接入層代理根據(jù)數(shù)據(jù)備份需求確定待創(chuàng)建的桶的數(shù)量并根據(jù)待創(chuàng)建的桶的數(shù)量確定待選用的數(shù)據(jù)節(jié)點(diǎn)的數(shù)量;
步驟S115,接入層代理在每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建一個(gè)或多個(gè)桶;
步驟S116,接入層代理將每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)所創(chuàng)建的一個(gè)或多個(gè)桶的標(biāo)識(shí)信息記錄至關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù)中并將與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在多個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上的分布信息注冊(cè)至中心數(shù)據(jù)庫(kù);
步驟S117,接入層代理在與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶之間開啟數(shù)據(jù)同步功能。
作為本發(fā)明的另一個(gè)優(yōu)選實(shí)施例,圖5是根據(jù)本發(fā)明優(yōu)選實(shí)施例的桶創(chuàng)建過程的流程圖。如圖5所示,可以將數(shù)據(jù)節(jié)點(diǎn)劃分為多個(gè)桶(BUCKET),由BUCKET組織數(shù)據(jù)、備份數(shù)據(jù)以及同步數(shù)據(jù)。在數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建完畢多個(gè)桶后,便可以分配給用戶進(jìn)行數(shù)據(jù)寫入操作。該流程可以包括以下處理步驟:
步驟S502:根據(jù)用戶的需求確定數(shù)據(jù)副本數(shù)量,其中,副本數(shù)量決定同一個(gè)桶的伙伴個(gè)數(shù),這些伙伴桶的ID以及保存的數(shù)據(jù)都是一致的;例如:假設(shè)副本數(shù)量為3,那么同一個(gè)桶便有3個(gè)伙伴桶;
步驟S504:選擇需要?jiǎng)?chuàng)建桶的數(shù)據(jù)節(jié)點(diǎn),需要?jiǎng)?chuàng)建多少個(gè)伙伴桶,就需要選擇多少個(gè)數(shù)據(jù)節(jié)點(diǎn),而選擇數(shù)據(jù)節(jié)點(diǎn)也即選擇物理主機(jī);在選擇過程中,可以根據(jù)地域隔離性盡量選擇位于不同地域、不同機(jī)架上的主機(jī),其優(yōu)勢(shì)在于:如果其中一個(gè)地方的機(jī)房或者一個(gè)機(jī)架上發(fā)生故障,其他的副本并不會(huì)因此而受到影響;
步驟S506:在選取數(shù)據(jù)節(jié)點(diǎn)后,需要在相應(yīng)的數(shù)據(jù)節(jié)點(diǎn)上分別創(chuàng)建一個(gè)線程程序服務(wù)對(duì)象,這個(gè)對(duì)象即稱為桶的實(shí)例;并將桶的信息寫入到本地的REDIS數(shù)據(jù)中;例如:創(chuàng)建的桶的名字為BUCKET_A,選取的數(shù)據(jù)節(jié)點(diǎn)為:node_1、node_2、node_3,則需要在這3個(gè)數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建BUCKET_A;
步驟S508:在全部數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建完畢桶的實(shí)例之后,將桶所在數(shù)據(jù)節(jié)點(diǎn)注冊(cè)到中心的REDIS數(shù)據(jù)庫(kù),即在REDIS中創(chuàng)建以BUCKET_A為KEY,數(shù)據(jù)節(jié)點(diǎn)node_1、node_2、node_3列表為VALUE的鍵值對(duì);
步驟S510:在全部數(shù)據(jù)節(jié)點(diǎn)向中心的REDIS數(shù)據(jù)庫(kù)注冊(cè)完畢之后,各數(shù)據(jù)節(jié)點(diǎn)為桶實(shí)例開啟一個(gè)線程,并分配一個(gè)通信端口監(jiān)聽來自伙伴桶的連接;
步驟S512:各數(shù)據(jù)節(jié)點(diǎn)根據(jù)本地的REDIS數(shù)據(jù)庫(kù)保存的桶標(biāo)識(shí)信息,向中心的REDIS數(shù)據(jù)庫(kù)讀取伙伴桶,從而獲得伙伴桶的數(shù)據(jù)節(jié)點(diǎn)信息,比如:BUCKET_A,伙伴桶所在的位置是數(shù)據(jù)節(jié)點(diǎn)node_1、node_2、node_3;
步驟S514:各個(gè)數(shù)據(jù)節(jié)點(diǎn)為桶的實(shí)例開啟一個(gè)線程,分別向伙伴桶的通信監(jiān)聽端口發(fā)送連接請(qǐng)求;圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的伙伴桶相互連接的拓?fù)浣Y(jié)構(gòu)示意圖。如圖6所示,伙伴桶BUCKET_A_1、BUCKET_A_2和BUCKET_A_3進(jìn)行相互連接,BUCKET_B_1和BUCKET_C_2進(jìn)行相互連接,BUCKET_C_1和BUCKET_C_2進(jìn)行相互連接以及BUCKET_D_1和BUCKET_D_2進(jìn)行相互連接,分別開啟同步功能。
在上述優(yōu)選實(shí)施例中,通過將數(shù)據(jù)節(jié)點(diǎn)細(xì)化為桶進(jìn)行管理可以增加同步的并發(fā)度,伙伴桶相互連接可以提高桶更新的時(shí)間的感知靈敏度,同時(shí),從選擇隔離地域的數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建桶還可以提高數(shù)據(jù)的可靠性和可用性,以及操作的靈活性。
根據(jù)本發(fā)明實(shí)施例,還提供了一種數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng)的實(shí)施例。圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng)的結(jié)構(gòu)框圖。如圖7所示,該系統(tǒng)可以包括:接入層代理10;接入層代理10可以包括:獲取模塊100,用于獲取數(shù)據(jù)操作請(qǐng)求,其中,數(shù)據(jù)操作請(qǐng)求中攜帶有桶標(biāo)識(shí)信息和文件標(biāo)識(shí)信息;選取模塊102,用于根據(jù)桶標(biāo)識(shí)信息選取第一數(shù)據(jù)節(jié)點(diǎn);發(fā)送模塊104,用于將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)至第一數(shù)據(jù)節(jié)點(diǎn),其中,文件標(biāo)識(shí)信息用于在第一數(shù)據(jù)節(jié)點(diǎn)上與桶標(biāo)識(shí)信息對(duì)應(yīng)的第一桶獲取待操作的數(shù)據(jù)存儲(chǔ)位置。
可選地,選取模塊102可以包括:查找單元(圖中未示出),用于根據(jù)桶標(biāo)識(shí)信息從中心數(shù)據(jù)庫(kù)中查找到與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)數(shù)據(jù)節(jié)點(diǎn),其中,中心數(shù)據(jù)庫(kù)為數(shù)據(jù)節(jié)點(diǎn)集群中各個(gè)數(shù)據(jù)節(jié)點(diǎn)共享的存儲(chǔ)空間,且中心數(shù)據(jù)庫(kù)用于記錄與桶標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在數(shù)據(jù)節(jié)點(diǎn)集群中的分布位置;選取單元(圖中未示出),用于從多個(gè)數(shù)據(jù)節(jié)點(diǎn)中隨機(jī)選取第一數(shù)據(jù)節(jié)點(diǎn)。
可選地,圖8是根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)操作請(qǐng)求的處理系統(tǒng)的結(jié)構(gòu)框圖。如圖8所示,上述系統(tǒng)還可以包括:數(shù)據(jù)節(jié)點(diǎn)集群20,數(shù)據(jù)節(jié)點(diǎn)集群20包括:第一數(shù)據(jù)節(jié)點(diǎn);第一數(shù)據(jù)節(jié)點(diǎn)可以包括:查找模塊200,用于根據(jù)桶標(biāo)識(shí)信息查找到位于第一數(shù)據(jù)節(jié)點(diǎn)上的第一桶;獲取模塊202,用于利用文件標(biāo)識(shí)信息訪問與第一數(shù)據(jù)節(jié)點(diǎn)相關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù),獲取待操作的數(shù)據(jù)存儲(chǔ)位置;執(zhí)行模塊204,用于對(duì)存儲(chǔ)在待操作的數(shù)據(jù)存儲(chǔ)位置上的數(shù)據(jù)執(zhí)行與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的操作。
可選地,如圖8所示,第一數(shù)據(jù)節(jié)點(diǎn)還可以包括:第一創(chuàng)建模塊206,用于創(chuàng)建與數(shù)據(jù)操作請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)操作記錄日志;記錄模塊208,用于將在數(shù)據(jù)操作記錄日志存儲(chǔ)在與桶標(biāo)識(shí)信息對(duì)應(yīng)的文件中,其中,數(shù)據(jù)操作記錄日志與先前創(chuàng)建的數(shù)據(jù)操作記錄日志按照時(shí)間先后順序存放。
可選地,如圖8所示,數(shù)據(jù)節(jié)點(diǎn)集群20還可以包括:多個(gè)第二數(shù)據(jù)節(jié)點(diǎn);每個(gè)第二數(shù)據(jù)節(jié)點(diǎn)均包括:請(qǐng)求模塊210,用于向第一數(shù)據(jù)節(jié)點(diǎn)發(fā)送日志獲取請(qǐng)求,其中,日志獲取請(qǐng)求用于獲取數(shù)據(jù)操作記錄日志,多個(gè)第二數(shù)據(jù)節(jié)點(diǎn)是桶標(biāo)識(shí)信息對(duì)應(yīng)的除第一桶之外的其他桶所在的數(shù)據(jù)節(jié)點(diǎn);同步模塊212,用于在獲取到數(shù)據(jù)操作記錄日志后,根據(jù)數(shù)據(jù)操作記錄日志執(zhí)行數(shù)據(jù)同步操作。
可選地,如圖8所示,接入層代理10還可以包括:確定模塊106,用于根據(jù)數(shù)據(jù)備份需求確定待創(chuàng)建的桶的數(shù)量并根據(jù)待創(chuàng)建的桶的數(shù)量確定待選用的數(shù)據(jù)節(jié)點(diǎn)的數(shù)量;第二創(chuàng)建模塊108,用于在每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建一個(gè)或多個(gè)桶;處理模塊110,用于將每個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)所創(chuàng)建的一個(gè)或多個(gè)桶的標(biāo)識(shí)信息記錄至關(guān)聯(lián)的本地?cái)?shù)據(jù)庫(kù)中并將與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶在多個(gè)待選用的數(shù)據(jù)節(jié)點(diǎn)上的分布信息注冊(cè)至中心數(shù)據(jù)庫(kù);啟動(dòng)模塊112,用于在與每個(gè)桶的標(biāo)識(shí)信息對(duì)應(yīng)的多個(gè)桶之間開啟數(shù)據(jù)同步功能。
下面將結(jié)合圖9所示的優(yōu)選實(shí)施方式對(duì)上述優(yōu)選實(shí)施過程作進(jìn)一步地描述。
圖9是根據(jù)本發(fā)明優(yōu)選實(shí)施例的分布式存儲(chǔ)中多副本同步的集群架構(gòu)圖。如圖9所示,集群架構(gòu)可以分為以下三個(gè)部分:接入層代理、中心REDIS數(shù)據(jù)庫(kù)和數(shù)據(jù)節(jié)點(diǎn)集群。下面將分別對(duì)每個(gè)部分的功能做進(jìn)一步地闡述。
接入層代理負(fù)責(zé)處理用戶寫入、讀取、刪除數(shù)據(jù)等操作請(qǐng)求,并將操作請(qǐng)求轉(zhuǎn)發(fā)至數(shù)據(jù)節(jié)點(diǎn)集群,然后再將數(shù)據(jù)節(jié)點(diǎn)集群的處理結(jié)果返回給用戶。
中心REDIS數(shù)據(jù)庫(kù)負(fù)責(zé)存儲(chǔ)伙伴桶相互間的存儲(chǔ)位置關(guān)系,即伙伴桶各自位于哪些數(shù)據(jù)節(jié)點(diǎn)上。
數(shù)據(jù)節(jié)點(diǎn)集群由多個(gè)主機(jī)組成,每個(gè)主機(jī)由本地的REDIS數(shù)據(jù)庫(kù)(其負(fù)責(zé)存儲(chǔ)文件標(biāo)識(shí)信息(file_id),物理磁盤的位置以及binlog位移信息)和數(shù)據(jù)節(jié)點(diǎn)進(jìn)程組成,負(fù)責(zé)將數(shù)據(jù)持久化到物理磁盤以及將數(shù)據(jù)從物理磁盤中讀取出來。
用戶在執(zhí)行讀取/寫入數(shù)據(jù)操作時(shí),會(huì)指定桶標(biāo)識(shí)信息(bucket_id)和文件標(biāo)識(shí)信息(file_id)。首先,接入層代理需要將bucket_id和file_id解析出來,并根據(jù)bucket_id查找中心REDIS數(shù)據(jù)庫(kù),得到伙伴桶的位置信息。其次,接入層代理從這些存儲(chǔ)位置中隨機(jī)選擇一個(gè),即對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)。然后,接入層代理與該數(shù)據(jù)節(jié)點(diǎn)進(jìn)行通信交互,并將數(shù)據(jù)操作請(qǐng)求轉(zhuǎn)發(fā)給該數(shù)據(jù)節(jié)點(diǎn)。數(shù)據(jù)節(jié)點(diǎn)根據(jù)bucket_id查找到該數(shù)據(jù)節(jié)點(diǎn)上對(duì)應(yīng)的桶,以使該桶能夠根據(jù)file_id信息訪問本地的REDIS數(shù)據(jù)庫(kù),得到數(shù)據(jù)對(duì)應(yīng)的物理磁盤位置,從而進(jìn)行數(shù)據(jù)的讀取/寫入。在數(shù)據(jù)節(jié)點(diǎn)對(duì)數(shù)據(jù)操作請(qǐng)求處理完畢后還會(huì)將處理結(jié)果返回至接入層代理,并進(jìn)一步由接入層代理將處理結(jié)果轉(zhuǎn)發(fā)給用戶。
通過采用完全對(duì)稱的系統(tǒng)架構(gòu),一方面可以使得系統(tǒng)可以無限地橫向拓展,增強(qiáng)系統(tǒng)的可拓展性和系統(tǒng)的容納能力,另一方面也使得整個(gè)系統(tǒng)壓力分布平均,充分利用整個(gè)系統(tǒng)的資源。而且,將數(shù)據(jù)節(jié)點(diǎn)細(xì)化為桶管理,用桶組織數(shù)據(jù),增大了數(shù)據(jù)節(jié)點(diǎn)之間的同步并發(fā)度,降低數(shù)據(jù)損壞的范圍,便于執(zhí)行數(shù)據(jù)的查找和恢復(fù)。另外,通過備份桶之間形成相互連接的伙伴桶,增強(qiáng)了伙伴桶之間的數(shù)據(jù)更新事件的感知速度;對(duì)稱的結(jié)構(gòu)也同樣使得伙伴桶分擔(dān)的壓力平均,備份桶可以根據(jù)需求隨時(shí)靈活的加入進(jìn)來。進(jìn)一步地,通過采用精簡(jiǎn)的數(shù)據(jù)操作記錄日志格式設(shè)計(jì),能夠減少存儲(chǔ)空間的消耗和傳輸帶寬的開銷;伙伴桶之間通過binlog進(jìn)行協(xié)商通信,既能夠確保數(shù)據(jù)一致性,又能夠避免無效的數(shù)據(jù)傳輸。
綜上所述,本發(fā)明實(shí)施例所提供的上述集群架構(gòu)能夠充分利用整個(gè)系統(tǒng)的資源,提高系統(tǒng)的并發(fā)度,減少數(shù)據(jù)的讀寫延時(shí),增強(qiáng)組織數(shù)據(jù)的靈活性,降低同步通信的開銷低,提升數(shù)據(jù)同步的效率以及整個(gè)集群性能、可靠性和吞吐量。
上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
在本發(fā)明的上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實(shí)現(xiàn)。其中,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、移動(dòng)硬盤、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。