小米開源的自研智慧SQL優化與改寫工具SOAR使用指南
本文簡述了SOAR的下載安裝和使用方法,並介紹了SOAR的基礎設定和應用的四個場景。
在10月20日的開源先鋒日(OSCAR)上,小米開源了自研的SOAR(SQL Optimizer And Rewriter)。這是一款智慧SQL優化和改寫工具,開發人員可以直接通過此工具快速的對自己的SQL進行質量檢查,生成評估報告,防止將問題SQL帶到線上從而導致服務質量下降。它不僅能夠儘可能地提高線上程式碼質量,還能避免一些由於人為疏漏而帶來的隱患。
下載安裝
SOAR使用Go語言編寫,天然具備作業系統跨平臺屬性,您可以在Github上的Release版本按照對應作業系統直接下載編譯好的二進位制檔案使用。如果您是資深定製使用者也可以
二進位制安裝
原始碼安裝
使用指南
快速上手
安裝完成之後無需進行任何配置,只需要執行下面這條命令,就可以立刻生成一份Markdown格式的SQL評審報告,根據報告中的建議對SQL進行修改。
使用配置
SOAR提供了豐富的配置引數,可以根據不同的使用場景指定不同的配置項來定製私有的評審建議。不過您也無須擔心這些配置會對使用帶來困擾,大部分配置選項是為有特殊需求使用者準備的,即使不做任何配置也能夠體驗到SOAR的基礎的功能。
SOAR的配置檔案為YAML[1]格式,在一般情況下只需要配置online-dsn, test-dsn, log-output等少數幾個引數,您就可以體驗到SOAR提供的絕大部分的功能了。
下面我將介紹一下SOAR中常用的一些基礎配置。
配置環境
由於很多的功能需要資料庫的元資料來進行輔助判斷,所以當不指定資料庫環境的時候,很多功能將會採取降級的策略,所以我們強烈建議您在配置檔案中指定相關資料庫環境。為了保護線上資料庫的安全,我們將資料庫環境區分為線上和測試兩種環境,但是這並不意味著您一定需要兩個資料庫環境,但至少建議您指定一個測試環境。
這裡需要注意的是,因為我們會在測試環境中做一些風險相對較高的操作,為了防止使用者由於配置疏忽導致線上資料受損,我們添加了allow-online-as-test引數來保證您確實是希望將線上環境做為測試環境來使用。所以當您指定的兩個整合環境相同時,請指定allow-online-as-test為true,否則SOAR將不會進行評審。
輸出格式
SOAR自身支援了非常豐富的輸出格式,除了預設的Markdown格式以外,SOAR還支援以 HTML或JSON的格式進行輸出。
SOAR自帶的一些工具也會以report-type的形式提供。比如SQL重寫,EXPLAIN分析,SQL 指紋,SQL美化等15種輸出格式,每一種report-type都對應著不同的功能。你可以通過如下命令檢視SOAR支援的輸出型別。
獲取幫助
除了上述提到的這些功能,SOAR還提供了很多其他的配置項,由於篇幅所限,具體詳情您可以到SOAR專案文件中檢視。使用上如果碰到疑問,可以到這裡[2]提交Issue,或在Gitter[3]中聯絡我們。
場景介紹
場景 | 線上環境 | 測試環境 | 應用型別 |
場景一 | 有 | 有 | 日常優化,完整的建議,推薦 |
場景二 | 無 | 有 | 新申請資源,環境初始化測試 |
場景三 | 無 | 無 | 盲測,試用,無EXPLAN和索引建議 |
場景四 | 有 | 無 | 用線上環境當測試環境,不推薦 |
場景一
這個場景是我們日常工作中最常見的場景,它主要應用於線上服務日常建立表或表結構表更。
SOAR對SQL進行分析時,會先從SQL語句中獲取基本資訊,然後將所有涉及到的庫表結構元資料從線上環境中獲取,並同步到測試環境中進行更進一步的分析。在這個場景下,SOAR能提供最全面的功能支援。不僅能夠輸出110多項SQL檢查,還能夠對涉及到的庫表進行索引分析,而且還可以輸出EXPLAIN、PROFILE等資訊來輔助DBA或開發者進行效能調優和問題定位。SQL改寫也會依賴元資料的支援,在此場景下的功能是支援的最全面的。
場景二
這個場景適用於首次申請資料庫資源的情況,此時還沒有已經存在的線上環境與之相對應。
在這個場景下,SQL檔案主要包含的是建庫建表語句,SOAR會根據DDL生成相應的測試環境,並從該環境中獲取元資料進行優化分析。
場景三
在這一場景下由於沒有配置線上環境和測試環境依賴,缺少很多分析時必要的元資料,且無法獲取EXPLAIN等資訊,在這種情況下SOAR將會進行功能降級,只給予部分不依賴資料庫環境才能給出的建議(絕大部分的啟發式建議和小部分SQL改寫)。
雖然在這個場景下服務的功能並不全面,但執行速度也是最快的,這種場景依然能提供110多種啟發式建議,特別適合於對SQL本身的檢測,比如作為一個本地化的SQL Linter IDE外掛。
場景四
這一場景其實與場景二是一樣的,在這一場景下只配置了線上環境,且開啟了允許線上環境作為測試環境。那麼在不指定測試環境的情況下SOAR將會把測試環境也指向線上環境。
SOAR在進行評審時,為了保證多個客戶端能夠同時在一個環境內進行評審,會在測試環境中生成一個臨時資料庫,評審正常結束後再將該臨時資料庫刪除。所以我們非常不建議將線上資料庫環境做為測試環境,防止在某些未知的極端條件下對資料庫產生嚴重影響。
參考
[1]https://en.wikipedia.org/wiki/YAML
[2]https://github.com/XiaoMi/soar/issues
[3]https://gitter.im/xiaomi-dba/soar
本文首發於公眾號“小米運維”,點選檢視原文。