天天看點

myrocks 之資料字典data dictionary中繼資料詳情rocksdb DDL 實作

title: mysql · myrocks · data dictionary 分析

rocksdb作為mysql的一個新的存儲引擎,在存儲引擎層,會維護自動的中繼資料資訊。在innodb存儲引擎中,我們通過information_schema下的innodb_sys_datafiles,innodb_sys_tables,innodb_sys_indexes等表,

可以窺視innodb的中繼資料資訊。同樣,rocksdb通過information_schema下的rocksdb_index_file_map,rocksdb_ddl,rocksdb_global_info等表可以檢視原資料資訊。

下面我盟來具體看看rocksdb維護了哪些中繼資料資訊,從源碼中看定義了以下類型,這些資料都以kv的形式存儲在名叫__system__系統column family中。

ddl_entry_index_start_number

表和索引之間的映射關系

key: rdb_key_def::ddl_entry_index_start_number(0x1) + dbname.tablename

value: version + {global_index_id}*n_indexes_of_the_table

index_info

索引id和索引屬性的關系

key: rdb_key_def::index_info(0x2) + global_index_id

value: version, index_type, key_value_format_version

index_type:主鍵/二級索引/隐式主鍵

key_value_format_version: 記錄存儲格式的版本

cf_definition

column family屬性

key: rdb_key_def::cf_definition(0x3) + cf_id

value: version, {is_reverse_cf, is_auto_cf}

is_reverse_cf: 是否是reverse column family

is_auto_cf: column family名字是否是$per_index_cf,名字自動由table.indexname組成

binlog_info_index_number

binlog位點及gtid資訊,binlog_commit更新此資訊

key: rdb_key_def::binlog_info_index_number (0x4)

value: version, {binlog_name,binlog_pos,binlog_gtid}

ddl_drop_index_ongoing

等待删除的索引資訊

key: rdb_key_def::ddl_drop_index_ongoing(0x5) + global_index_id

value: version

index_statistics

索引統計資訊

key: rdb_key_def::index_statistics(0x6) + global_index_id

value: version, {materialized propertiescollector::indexstats}

max_index_id

目前的index id,每次建立索引index id都從這個擷取和更新

key: rdb_key_def::current_max_index_id(0x7)

value: version, current max index id

ddl_create_index_ongoing

等待建立的索引資訊

key: rdb_key_def::ddl_create_index_ongoing(0x8) + global_index_id

這裡以建表和删表來舉例

create table

通過以下步驟建表

另外,建索引時,會更新max_index_id資訊,使用單獨的batch寫入,參考(rdb_seq_generator::get_and_update_next_number)

實際資料分布如下圖:

myrocks 之資料字典data dictionary中繼資料詳情rocksdb DDL 實作
中繼資料分布在系統column family __system__中 primary key 分布在column family default中 idx1 分布在column family cf_1中 黃線之間代表資料分布的範圍

drop table

batch->put 将索引加入到待删的kv隊列中

{ddl_drop_index_ongoing(4)+cf_id(0)+index_id(260)} --> {ddl_drop_index_ongoing_version(2)}

{ddl_drop_index_ongoing(4)+cf_id(2)+index_id(261)} --> {ddl_drop_index_ongoing_version(2)}

batch->delete 删除表的映射關系

表和索引的映射關系

背景線程再從待删的kv隊列取出待删的索引,通過 deletefilesinrange, compactrange 删除索引資料。