一、MMDB簡介
MMDB(MaxMind Database) 是MaxMind推出的一個資料存盤和檢索的資料庫格式,用于旗下針對IP檢索和存盤的Geo產品, IP格式由二進制位元陣列組成,很容易想到每個位元對應二叉樹一個節點,可以說二叉樹檢索特別適合于IP格式, MMDB的構造程序正是把一顆資料位于葉子節點的二叉樹進行序列化, 序列化后是位元組陣列,和其他檢索格式都是反序列化為結構化的記憶體形式不同,MMDB檢索時把整個mmdb檔案加載為一個位元組陣列即可, 檢索程序在位元組陣列上操作,由于每個節點大小固定,通過簡單記憶體計算即可完成節點定位,不需要額外生成其他中間結構,可以說非常簡潔和高效,Maxmind的GeoIP產品用于檢索以下網段的geo資訊,其中最左一列是網段,第二列是geoname_id,根據網段找到geoname_id,再根據geoname_id找到下圖的資料,


二、構造程序
構造程序是生成一顆二叉檢索樹的程序, 假設只存盤一個網段“110”的資料,則可以得到二叉樹為:
只有葉子節點會存盤指向資料的參考,
三、MMDB總體格式
二叉樹經過序列化會得到一個位元組陣列,資料格式如下圖: 
四、節點序列說明
節點序列等于一個節點陣列,每個節點由兩個記錄組成,分別對應二叉樹的左孩子和右孩子,
在IP檢索中,位元0對應第一個記錄,位元1對應第二個記錄,

如上圖所示,包含3個節點,第一個節點的兩個記錄為3和1,第二個節點為3和2,第三個節點為19和3,
當記錄數等于節點數3時,表示沒找到資料,當記錄數大于節點數3時,則為資料節點的記錄值,
資料偏移量的計算公式:資料偏移量 = 記錄值 - 節點個數 - 16(分隔符的長度),第三個節點記錄19表示資料偏移量為0,19-3(節點數)-16,
五、檢索演算法
在一個總節點數為3的mmdb資料庫上,網段“110”的檢索程序

六、資料段說明

七、實驗例子
1、構造一個網段為“192.2.10.0/3”,對應二進制網路“110”的節點,資料為{"iso":156,"country_name":"China"},生成的節點序列為:


可以看到“110”網段根據二叉樹檢索演算法得到資料段的偏移量19,則資料段偏移量為19-3(節點數)-16=0,
2、再加入一個網段為“64.2.10.0/3”,對應二進制網路“010”的節點,資料為{"iso":826,"country_name":"England"},生成的節點序列為:


八、總結
1、生成程序使用二叉樹,
2、存盤和檢索都是序列化位元組陣列格式,
3、MMDB是記憶體資料庫 ,
參考鏈接
MaxMind DB File Format Specification
Enriching MMDB files with your own data using go
Building your own MMDB database for fun and profit
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543866.html
標籤:其他
