最近一個日常實例在做DDL過程中,直接把數(shù)據(jù)庫給干趴下了,問題還是比較嚴重的,于是趕緊排查問題,擼了下crash堆棧和alert日志,發(fā)現(xiàn)是在去除唯一約束的場景下,MyRocks存在一個嚴重的bug,于是緊急向官方提了一個bug。其實問題比較隱蔽,因為直接一條DDL語句,數(shù)據(jù)庫是不會掛了,而是在特定情況下,并且對同一個索引操作多次才會發(fā)生,因此排查問題也費了一些時間,具體bug排查和復現(xiàn)過程不在此展開,有興趣的童鞋可以直接看bug鏈接:https://github.com/facebook/mysql-5.6/issues/602。借著排查問題的機會,我梳理了MyRocks DDL的工作流程,下文主要包括3方面內(nèi)容:MyRocks數(shù)據(jù)字典,DDL操作除了修改數(shù)據(jù)本身,很重要的一個工作是維護數(shù)據(jù)字典,第二部分是MyRocks DDL的流程,主要圍繞增加/刪除索引的場景展開,最后一部分是分析DDL異常處理邏輯。
數(shù)據(jù)字典
所謂數(shù)據(jù)字典,就是存儲引擎元數(shù)據(jù)的地方。數(shù)據(jù)字典可以從兩個維度來看,從用戶角度來看,數(shù)據(jù)字典就是information_schema表中的
RocksDB相關的表,主要包括ROCKSDB_DDL,ROCKSDB_INDEX_FILE_MAP等。而從RockDB內(nèi)部實現(xiàn)角度來看,所有元數(shù)據(jù)都以KV對的方式存儲在system column family中。我們看到的information_schema中表的信息,其實都是通過system column family中的元數(shù)據(jù)構造出來的,同時在mysqld啟動時,也會構造一份元數(shù)據(jù)存儲在內(nèi)存中,方便快速檢索查詢。下面我會列出RocksDB數(shù)據(jù)字典的幾種類型,并列出每種類型KV對的形式。
// Data dictionary types