一種分布式數(shù)據(jù)庫主鍵生成的方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別是涉及一種分布式數(shù)據(jù)庫主鍵生成的方法和系統(tǒng)。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展,越來越多的應(yīng)用系統(tǒng)部署朝著大規(guī)模、分布式、多機協(xié)同的方向發(fā)展。同時,所有項目中的數(shù)據(jù)庫都需要選擇一種主鍵生成的策略,用來完成唯一主鍵的生成工作。通常,數(shù)據(jù)庫主鍵生成分為單機生成和分布式生成兩種。單機生成是指在單臺機器上生成主鍵,所有請求順序執(zhí)行,典型的方式是數(shù)據(jù)庫自增ID。分布式生成則是指在多臺機器上來生成主鍵。
[0003]其中分布式生成主鍵的通常做法,一種是利用特殊的規(guī)則在不同的機器上生成互不重復(fù)的ID,典型的方式是生成GUID或者包括地域、機房、機器信息在內(nèi)的自定義編碼;還有一種是通過一個集中式鎖的管理來實現(xiàn)分布式主鍵生成的唯一性,典型的方式是通過關(guān)系數(shù)據(jù)庫鎖或者可以加鎖的內(nèi)存緩存。
[0004]關(guān)于第一種方法,雖然在特殊規(guī)則下可以生成不重復(fù)的ID編碼,但由于編碼本身的無規(guī)律性,這種編碼會明顯降低數(shù)據(jù)庫主鍵索引的性能,同時因為字段通常比較長,需要占用更多的存儲空間,如GUID是32個十六進制字符。
[0005]關(guān)于第二種方法,雖然采用集中式的鎖可以繼續(xù)使用自增ID這種有益于索引和存儲的方式,但集中式的鎖會是整個系統(tǒng)的瓶頸,因為每次生成主鍵都需要對鎖資源進行鎖定互斥處理,需要協(xié)同的機器越多,對集中式鎖的訪問沖突就會越劇烈,降低了整體分布式環(huán)境的處理能力,也限制了多級協(xié)同的規(guī)模。
[0006]同時,一旦集中式的鎖出現(xiàn)故障,整個主鍵生成也將完全中斷。因此如何解決分布式主鍵生成中集中式鎖的缺陷就顯得很有意義。
[0007]數(shù)據(jù)庫中的每張數(shù)據(jù)表都有一個主鍵字段來唯一標(biāo)識一條記錄,主鍵也會默認(rèn)加入到索引中以提高數(shù)據(jù)庫操作的效率。主鍵生成策略的首要一點是保證生成記錄的唯一性,一般對于單個數(shù)據(jù)庫實例的主鍵通常會按照某個ID自增完成,但在業(yè)務(wù)規(guī)模越來越大的情況下,單個數(shù)據(jù)庫實例會由于滿足不了需求而按照一定規(guī)則拆分成多個分布式的數(shù)據(jù)庫實例,如果按照普通的自增是無法保證在分布式環(huán)境中的主鍵唯一性,在這種情況下就需要在分布式的環(huán)境中生成唯一的數(shù)據(jù)庫主鍵,同時還要最大化的提高主鍵生成效率。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的在于:針對現(xiàn)有技術(shù)中存在的上述技術(shù)問題,提供了一種分布式數(shù)據(jù)庫主鍵生成的方法,并且提供了基于該方法保證分布式主鍵唯一性生成的系統(tǒng)。
[0009]本發(fā)明是通過以下技術(shù)方案實現(xiàn)的:一種分布式數(shù)據(jù)庫主鍵生成的方法,在多機分布式環(huán)境中,保證各個節(jié)點都是對等的情況下,各個節(jié)點通過自動協(xié)商來決定主鍵生成。
[0010]進一步,所述的各節(jié)點協(xié)商確定主鍵生成是基于一致性算法下。[0011 ] 一種分布式數(shù)據(jù)庫主鍵生成的系統(tǒng),系統(tǒng)流程步驟如下:
(1)任意節(jié)點在正常運行中;
(2)某節(jié)點收到主鍵生成請求;
(3)該節(jié)點啟動主鍵預(yù)生成,生成一個唯一標(biāo)識;具體地如下:
如果某個節(jié)點收到某個主鍵的生成請求,則該節(jié)點先會根據(jù)主鍵標(biāo)識和按照預(yù)定規(guī)則(如自增)生成的新主鍵ID值計算出一個在所有工作節(jié)點中對當(dāng)前這個主鍵生成請求的唯一標(biāo)識,然后以一個全局唯一且遞增的編號向其他工作節(jié)點發(fā)出執(zhí)行這個請求的提案,這個全局唯一且遞增的編號可以由當(dāng)前的時間戳加上工作節(jié)點IP組成,提案中的唯一標(biāo)識代表請求本身。
[0012]其他節(jié)點在收到這個提案后,首先檢查關(guān)于這個主鍵生成請求有沒有已收到其他的提案,如果已收到關(guān)于這個生成請求的提案,接下來需要比較已收到的提案號和剛收到的這個提案號的大小。
[0013]如果已收到的提案號大于這個提案號,則直接拒絕當(dāng)前提案。
[0014]如果已收到的提案號小于這個提案號,則同意該提案,但同時需要告知發(fā)起提案的節(jié)點本節(jié)點之前已經(jīng)收到過其他節(jié)點關(guān)于這個請求的提案。
[0015]如果沒有收到其他提案,則直接同意這個提案。
[0016](4)該節(jié)點將步驟(3)生成的一個唯一標(biāo)識與其他節(jié)點協(xié)商確定是否可以生成該節(jié)點;協(xié)商如下:
如果同意提案的節(jié)點數(shù)超過半數(shù),且都是簡單同意,則該節(jié)點再次向其他節(jié)點發(fā)起執(zhí)行這個請求提案的提交。
[0017]如果同意提案的節(jié)點數(shù)超過半數(shù),但有節(jié)點反饋在本提案之前已收到過其他關(guān)于這個請求的更小提案號,則該節(jié)點需要提交具備更小編號的其他節(jié)點關(guān)于這個請求執(zhí)行的提案。
[0018]其他節(jié)點在收到新提交的提案后,按照與步驟(3)相同的規(guī)則進行判斷處理。
[0019]最終,發(fā)起提案的節(jié)點在指定時間內(nèi)收到其他節(jié)點的反饋后:
如果同意提交提案的節(jié)點數(shù)超過半數(shù),說明提案已通過,再根據(jù)提案內(nèi)容決定請求是在哪個節(jié)點運行。如果是在本機執(zhí)行,則接下來就執(zhí)行該主鍵生成;如果是在其他節(jié)點運行,則接下來由其他節(jié)點執(zhí)行該主鍵生成。
[0020]如果同意提交提案的節(jié)點數(shù)沒有超過半數(shù),則該次提案失敗,本節(jié)點不執(zhí)行該次請求。
[0021](5)生成主鍵。
[0022]進一步,所述的該節(jié)點為收到主鍵生成請求的節(jié)點。
[0023]進一步,所述步驟(3)的主鍵預(yù)生成為根據(jù)主鍵的標(biāo)識和期望生成的主鍵ID來生成一個唯一標(biāo)識,所述的唯一標(biāo)識會在步驟(4)中使用。
[0024]進一步,所述的步驟(4)中的協(xié)商包括:若大多數(shù)節(jié)點同意執(zhí)行,則進入步驟(5);若大多數(shù)節(jié)點不同意執(zhí)行,則返回到步驟(I)。
[0025]進一步,所述的任意節(jié)點為多個對等的工作節(jié)點;每個工作節(jié)點都負(fù)責(zé)處理主鍵的生成;所述的每個工作節(jié)點都會隨機收到對某個主鍵的生成請求。
[0026]綜上所述,由于采用了上述技術(shù)方案,本發(fā)明的有益效果是:本發(fā)明通過引入分布式環(huán)境中的多個對等節(jié)點間自動協(xié)商來決定分布式主鍵生成,能夠有效的以節(jié)點協(xié)商方式解決因為集中式鎖故障導(dǎo)致的分布式主鍵生成的整體癱瘓問題,使得分布式系統(tǒng)可以完