AppBoxFuture 七 分布式外來鍵約束

2022-01-11 14:29:11 字數 1627 閱讀 8375

關聯式資料庫與nosql其中的乙個主要區別是具備完整的外來鍵約束,雖說現在一些大廠在設計資料儲存結構時禁止使用外來鍵約束,靠業務邏輯來保證資料完整性,但考慮到是人就會犯錯,為了保證關鍵業務資料的完整性,所以作者還是決定在儲存引擎層面實現外來鍵約束功能。

由於儲存引擎是分布式的,所以引用者與被引用者可能存在不同的節點上(如訂單資料在節點1上,訂單引用的產品資料在節點2上),這樣實現外來鍵約束的方式就會與傳統關聯式資料庫有些不一樣,作者設計了如下圖所示的儲存結構,在rocksdb劃分乙個columnfamily儲存引用索引(記錄誰的某個成員引用了哪個目標),以及儲存被引用者的計數器(記錄哪個分割槽引用了我,被引用了多少次),通過分布式事務保證資料與引用索引及計數器的一致性。

根據上述設計,以下描述的邏輯可以得到保證(為了方便以下訂單指引用者,產品指被引用者):

insert時儲存引擎根據實體模型元資料是否存在entityref成員,是則在同一事務內會向被引用者的分割槽自動傳送addrefcommand,該命令會鎖定並判斷是否存在相應的記錄,如不存在則通知事務回滾。如果是同一事務內insert產品再insert訂單,addrefcommand會檢測同一事務內是否存在被引用者記錄。事務遞交時原子儲存引用索引與引用計數。

delete時儲存引擎先判斷當前記錄所有分割槽的引用計數值是否等於0,不等於0則通知事務回滾。

如果引用的產品變更,則刪除舊引用索引然後新增新引用索引;如果引用的產品設為null或刪除訂單,則刪除引用索引,同時通知產品分割槽更新引用計數。

由於儲存引擎的分布式事務是基於2pl實現的,如果大量不同的事務insert訂單且引用同一產品,會造成這些事務排隊執行,從而導致併發效能不理想。作者做了個簡單優化,允許不同事務的addrefcommand共享鎖定被引用者以提高併發效能。就上述場景作者簡單測試了併發insert帶entityref的效能,單節點debug模式約14000tps(i74c8g虛擬機器),不帶外來鍵引用的併發insert約28000tps。

暫利用初始化時的實體emploee及orgunit來做測試,orgunit.createbyid引用emploee.id。通過ide新建乙個服務模型,然後依次實現以下服務方法儲存發布後將輸入游標定位在需要測試的方法名稱內,點選主選單->service->invoke進行服務方法呼叫測試。

public async tasktest1()

呼叫此方法顯示"insert error: foreignkeyconstraint", 即違反外來鍵約束。

public async tasktest2()

catch (exception ex)";}

return "done.";

}

呼叫此方法返回"done.",此時可開啟emploee及orgunit的模型設計器內的"data"欄驗證插入的資料。

public async taskdelete()

catch(exception ex)";}

return "done.";

}

呼叫此方法返回"done.",此時可開啟emploee及orgunit的模型設計器內的"data"欄驗證資料已被刪除。

Flink Dataset Api(七)分布式快取

flink提供了乙個類似於hadoop的分布式快取,讓並行執行例項的函式可以在本地訪問。這個功能可以被使用來分享外部靜態的資料,例如 機器學習的邏輯回歸模型等!快取的使用流程 使用executionenvironment例項對本地的或者遠端的檔案 例如 hdfs上的檔案 為快取檔案指定乙個名字註冊該...

七分與三分

田力合為男,女子合為好。男人 難人也 女人 亦好人!七畫是 男 三畫是 女 七 加 三 才是十全十美。於是,男人拿走七分權利,女人只有三分的反抗!體力上男人是七,女人是三。但耐力上女人是七,男人是三。所以面對情敵 男人們通常都是短兵相接,武力解決 女人則更喜歡明徵暗鬥的拉鋸戰!男人們聊天,七分談理想...

LeetCode練習《七》 分糖

這道題目起名為分糖不知道合適不合適,distribute candies應該是這個意思吧.如下 given an integer array with even length,where different numbers in this array represent different kind...