Themis是宜信公司DBA團隊開發的一款數據庫審覈產品,可幫助DBA、開發人員快速發現數據庫質量問題,提高工做效率。其名稱源自希臘神話中的正義與法律女神。項目取此名稱,寓意此平臺對數據庫質量公平判斷,明察秋毫。html
此平臺可實現對Oracle、MySQL數據庫進行多維度(對象結構、SQL文本、執行計劃及執行特徵)的審覈,用以評估對象結構設計質量及SQL運行效率。可幫助DBA及開發人員,快速發現定位問題;並提供部分輔助診斷能力,提高優化工做效率。所有操做都可經過WEB界面進行,簡單便捷。此外,爲了更好知足個性化需求,平臺還提供了擴展能力,用戶可根據須要自行擴展。python
Themis,是希臘正義與法律女神,以頭腦清晰見稱。項目採用此名稱,寓意着平臺可對數據庫質量公平判斷,明察秋毫之意。mysql
整個平臺的基本實現原理很簡單,就是將咱們的審覈對象(目前支持四種),經過規則集進行篩選。符合規則的審覈對象,都是疑似有問題的。平臺會將這些問題及關聯信息提供出來,供人工甄別使用。因而可知,平臺的功能強大與否,主要取決於規則集的豐富程度。平臺也提供了部分擴展能力,方便擴展規則集。git
圖中的方框部分,爲平臺的主要模塊。底色不一樣的模塊,表示當前的進度狀態不一樣。虛線表明數據流,實線表明控制流。其核心爲這幾個模塊:github
本項目中會使用到mysql,mongo和redis,python支持2.六、2.7,暫不支持python3。web
mysql用來存儲pt-query-digest抓取的mysql的慢查詢,mongo存儲咱們的規則、oracle的採集結果、執行job,解析結果集等,redis做爲任務調度celery的隊列。redis
在mysql的數據採集部分咱們使用的是pt-query-digest工具。sql
爲了減小後面對supervisord.conf配置文件的修改,咱們建議使用統一的用戶進行安裝mongodb
adduser themis-test
su - themis-test
後面的操做除了virtualenv安裝須要切換到root用戶,其餘的都默認在themis-test用戶下安裝數據庫
因爲在審覈過程當中須要鏈接oracle數據庫,所以須要先安裝cx_Oracle的依賴,參考:http://www.jianshu.com/p/pKz5K7
首先安裝virtualenv,參考連接:https://pypi.python.org/simple/virtualenv/,建議安裝13.0.3或更新版本
若是聯網不方便,或者在公司內網,能夠從https://pan.baidu.com/s/1o7AIWlG下載壓縮包,提取碼:3sy3
壓縮包裏包括全部須要用到的依賴包
tar -zxvf virtualenv-13.0.3.tar.gz cd virtualenv-13.1.0 python setup.py install
關於virtualenv的使用請參考:https://virtualenv.pypa.io/en/stable/
首先初始化虛擬環境
virtualenv python-project --python=python2.7 source /home/themis-test/python-project/bin/activate
解釋一下上面的命令:virtualenv的第二個參數python-project是咱們創建的虛擬環境的名稱,這個名稱咱們雖然能夠隨便定義,可是後面supervisor的配置中使用了此名稱,建議使用默認的,你們若是對python比較熟悉,能夠隨意定義。後面咱們指定了python的版本,--python能夠不加,默認會使用系統自帶的python版本構建虛擬環境,當有多個版本的python時,可使用此命令指定版本。
下面使用source初始化虛擬環境,之後安裝的包依賴等都會被裝到/home/themis-test/python-project/home/themis-test/python2.7/lib/python2.7/site-packages這裏。
若是能夠聯網,進入源代碼目錄使用以下命令
pip install -r requirement.txt
單獨安裝Pyh,下載地址:https://github.com/hanxiaomax/pyh
unzip pyh-master.zip cd pyh-master python setup.py install
若是在局域網環境不方便聯網請利用的上面網盤裏提供的壓縮包
pip install --no-index -f file:///home/themis-test/software -r requirement.txt
file:///home/themis-test/software是壓縮包解壓的位置
下面以配置文件settings.py爲例子說明須要的一些依賴
# # set oracle ipaddress, port, sid, account, password # ipaddres : port -> key ORACLE_ACCOUNT = { # oracle "127.0.0.1:1521": ["cedb", "system", "password"] } # set mysql ipaddress, port, account, password MYSQL_ACCOUNT = { "127.0.0.1:3307": ["mysql", "user", "password"] } # pt-query save data for mysql account, password PT_QUERY_USER = "user" PT_QUERY_PORT = 3306 PT_QUERY_SERVER = "127.0.0.1" PT_QUERY_PASSWD = "password" PT_QUERY_DB = "slow_query_log" # celery setting REDIS_BROKER = 'redis://:password@127.0.0.1:6379/0' # REDIS_BROKER = 'redis://:@127.0.0.1:6379/0' REDIS_BACKEND = 'redis://:password@127.0.0.1:6379/0' # REDIS_BACKEND = 'redis://:@127.0.0.1:6379/0' CELERY_CONF = { "CELERYD_POOL_RESTARTS": True } # mongo server settings MONGO_SERVER = "127.0.0.1" MONGO_PORT = 27017 # MONGO_USER = "sqlreview" MONGO_USER = "sqlreview" # MONGO_PASSWORD = "" MONGO_PASSWORD = "sqlreview" MONGO_DB = "sqlreview" # server port setting SERVER_PORT = 7000 # capture time setting CAPTURE_OBJ_HOUR = "18" CAPTURE_OBJ_MINUTE = 15 CAPTURE_OTHER_HOUR = "18" CAPTURE_OTHER_MINUTE = 30
ORACLE_ACCOUNT和MYSQL_ACCOUNT是咱們須要審覈的目標機器的賬號和密碼,主要是在數據採集部分和對象類審覈以及mysql的執行計劃類審覈部分會用到,所以該賬號因該具備較高的權限,爲了安全在生產環境應該設置專有的賬號並設置專有的權限,或者加上一些ip的限制等。
PT_QUERY_USER、PT_QUERY_PORT、PT_QUERY_SERVER、PT_QUERY_PASSWD、PT_QUERY_DB是咱們pt-query-digest工具解析目標機器的慢sql後須要存儲到的mysql數據庫的一些配置。
REDIS_BROKER、REDIS_BACKEND、CELERY_CONF是任務調度工具celery的配置選項。
MONGO_SERVER、MONGO_PORT、MONGO_USER、MONGO_PASSWORD、MONGO_DB是須要存儲結果集的mongo的配置選項。
SERVER_PORT是web管理端監聽的端口,不要使用9000和5555端口,這兩個被分配給了文件下載服務器和flower管理工具。
CAPTURE_OBJ_HOUR、CAPTURE_OBJ_MINUTE、CAPTURE_OTHER_HOUR、CAPTURE_OTHER_MINUTE是針對oracle的數據採集模塊須要設置的採集時間,根據本身的實際狀況設置不一樣的時間便可,避開業務高峯期。
請按照相關說明配置該文件
進入源代碼目錄,使用以下命令進行規則初始化
mongoimport -h 127.0.0.1 --port 27017 -u sqlreview -p password -d sqlreview -c rule --file script/rule.json
數據採集分爲oracle部分和mysql部分,oracle部分使用的是本身開發的一些腳本,mysql使用的是pt-query-digest工具。
數據採集的頻率默認是一天一次,能夠根據本身的須要進行修改。
oracle部分依賴於celery的任務調度,會用supervisor託管,pt-query-digest能夠加到crontab裏。
手動採集oracle obj信息
配置data/capture_obj.json文件
{ "module": "capture", "type": "OBJ", "db_type": "O", "db_server": "127.0.0.1", "db_port": 1521, "capture_date": "2017-02-28" }
只須要配置db_server和dbport選項,oracle的端口要求是1521,capture_date指定採集數據的日期,如今只支持按天採集
執行命令
python command.py -m capture_obj -c data/capture_obj.json
手動採集oracle other信息,包括plan、stat、text信息。
配置data/capture_other.json文件。
{ "module": "capture", "type": "OTHER", "db_type": "O", "db_server": "127.0.0.1", "db_port": 1521, "capture_date": "2017-02-28" }
配置方式同上面的obj
執行命令
python command.py -m capture_obj -c data/capture_obj.json
手動採集數據通常用於初次採集,後面通常都會經過自動採集完成。
配置settings.py文件裏的ORACLE_ACCOUNT,該帳號須要具備查詢全部表的權限,即select any table。
ORACLE_ACCOUNT = { # oracle "127.0.0.1:1521": ["cedb", "system", "password"] }
配置調度時間
# capture time setting CAPTURE_OBJ_HOUR = "18" CAPTURE_OBJ_MINUTE = 15 CAPTURE_OTHER_HOUR = "18" CAPTURE_OTHER_MINUTE = 30
若是不對oracle數據庫審覈,能夠不用配置
本平臺採用第二種方案
從 https://www.percona.com/get/pt-query-digest 下載並安裝pt-query-digest,若是缺乏依賴使用yum安裝。
使用scirpt/pt_query_digest.sql初始化表結構,不要使用默認的表結構。
在目標機器上配置好script/pt-query-digest.sh腳本:
pt-query-digest --user=root --password=password --review h=127.0.0.1,D=slow_query_log,t=global_query_review --history h=127.0.0.1,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}='127.0.0.1:3306' and \$event->{client}=\$event->{ip}" slow.log
$event->{hostname}='127.0.0.1:3306' 爲被蒐集慢日誌的機器的ip地址和端口號。
主要是配置存儲解析結果的mysql機器的賬號,密碼,機器ip,端口號,以及慢日誌的位置等。
運行pt-query-digest.sh腳本開始蒐集mysql慢查詢數據,後面能夠將其加入定時任務,按固定時間段蒐集。
規則解析分爲四塊:對象類規則解析、文本類規則解析、執行計劃類規則解析、統計信息類規則解析。每一個模塊均可以使用手動或自動的方式進行。
配置data/analysis_o_obj.json文件
{ "module": "analysis", "type": "OBJ", "db_server": "127.0.0.1", "db_port": 1521, "username": "schema", "db_type": "O", "rule_type": "OBJ", "rule_status": "ON", "create_user": "system", "task_ip": "127.0.0.1", "task_port": 1521 }
配置db_server、db_port、username、create_user、task_ip選項,其餘的保持默認便可,username是須要審覈的目標對象的名字。
python command.py -m analysis_o_obj -c data/analysis_o_obj.json
使用上面的命令開始採集obj數據
配置data/analysis_m_obj.json文件
{ "module": "mysql", "type": "OBJ", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_type": "OBJ", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "task_port": 3306 }
配置db_server、db_port、username、create_user、task_ip、db_port選項,其餘的保持默認便可。
運行命令:
python command.py -m analysis_m_obj -c data/analysis_m_obj.json
oracle和mysql對象類規則是不須要依賴於採集的數據的,它是直接鏈接到數據庫裏進行查詢的,因爲有的庫較大可能時間會比較久,建議在業務低峯期進行。
配置data/analysis_o_text.json文件
{ "module": "analysis", "type": "TEXT", "username": "schema", "create_user": "SYSTEM", "db_type": "O", "sid": "cedb", "rule_type": "TEXT", "rule_status": "ON", "hostname": "127.0.0.1", "task_ip": "127.0.0.1", "task_port": 1521, "startdate": "2017-02-23", "stopdate": "2017-02-23" }
配置sid、username、create_user、task_ip、hostname、startdate、stopdate選項,因爲數據是按天採集的,所以暫時只支持startdate和stopdate保持一致,hostname和task_ip能夠保持一致,其餘的保持默認便可。
執行下面的命令便可以進行規則解析:
python command.py -m analysis_o_plan -c data/analysis_o_plan.json
配置data/oracle_m_text.json文件
"module": "analysis", "type": "TEXT", "hostname_max": "127.0.0.1:3306", "username": "schema", "create_user": "mysqluser", "db_type": "mysql", "rule_type": "TEXT", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
配置username、create_user、taskip、taskport、hostname、hostname_max、startdate、stopdate選項,hostname和task_ip能夠保持一致,其餘的保持默認便可。
運行下面的命令便可以進行規則解析:
python command.py -m analysis_m_text -c data/analysis_m_text.json
上面兩步中的username爲須要審覈的對象。
配置data/analysis_o_plan.json文件
{ "module": "analysis", "type": "SQLPLAN", "capture_date": "2017-02-23", "username": "schema", "create_user": "SYSTEM", "sid": "cedb", "db_type": "O", "rule_type": "SQLPLAN", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 1521 }
主要是對capture_date,username, create_user, sid,db_type,rule_type,task_ip,task_port參數進行配置,type分爲SQLPLAN,SQLSTAT,TEXT,OBJ四種類型,rule_type的類型同SQLPLAN,只不過一個是表明模塊的類型,一個表明規則的類型,db_type分爲"O"和「mysql」兩種類型,分別表明oracle和mysql,capture_date爲咱們欠扁配置的數據的抓取日期。
python command.py -m analysis -c data/analysis_o_plan.json
運行上面的命令便可生成解析結果。
配置data/analysis_m_plan.json文件
{ "module": "analysis", "type": "SQLPLAN", "hostname_max": "127.0.0.1:3306", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "rule_type": "SQLPLAN", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
type類型的含義同上面oracle,hostname_max爲mysql的ip:端口號的形式,每個hostname_max表明一個mysql實例,startdate和stopdate須要加上時、分、秒,這一點同oracle不大同樣。
python command.py -m analysis -c data/analysis_m_plan.json
而後運行上面的命令進行mysql的plan的規則解析。
配置data/analysis_o_stat.json文件
{ "module": "analysis", "type": "SQLSTAT", "capture_date": "2017-02-23", "username": "schema", "create_user": "SYSTEM", "sid": "cedb", "db_type": "O", "rule_type": "SQLSTAT", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 1521 }
配置sid、username、create_user、task_ip、capture_date選項,其餘保持默認便可。
運行命令:
python command.py -m analysis_o_stat -c data/analysis_o_stat.json
進行數據採集。
配置文件data/analysis_m_text.json
{ "module": "analysis", "type": "SQLSTAT", "hostname_max": "127.0.0.1:3306", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "rule_type": "SQLSTAT", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
配置username、create_user、task_ip、task_port、hostname、hostname_max、startdate、stopdate選項,hostname和task_ip能夠保持一致,其餘的保持默認便可。
運行命令:
python command.py -m analysis_m_text -c data/analysis_m_text.json
進行數據採集。
上面介紹的手動規則解析都是能夠進行測試,或者在一些特殊狀況下使用,大部分狀況咱們會使用自動規則解析。
自動規則解析咱們使用celery來完成,關於celery 的使用,請參考http://docs.celeryproject.org/en/master/getting-started/first-steps-with-celery.html。
下面是經常使用的一些關於celery的命令:
開啓規則解析 celery -A task_other worker -E -Q sqlreview_analysis -l info 開啓任務導出 celery -A task_exports worker -E -l info 開啓obj信息抓取 celery -A task_capture worker -E -Q sqlreview_obj -l debug -B -n celery-capture-obj 開啓flower celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/ 開啓plan、stat、text抓取 celery -A task_capture worker -E -Q sqlreview_other -l info -B -n celery-capture-other
最後咱們會將規則解析都加入到supervisor託管,而後經過web界面生成任務,而後用celery進行調度,經過flower查看任務執行狀態。
關於具體使用請參考supervisor的配置。
配置data/export.json文件
{ "module": "export", "type": "export", "task_uuid": "08d03ec6-f80a-11e6-adbc-005056a30561", "file_id": "08d03ec6-f80a-11e6-adbc-005056a30561" }
配置task_uuid和file_id選項,這是任務的惟一標誌,能夠經過從mongo中sqlreview庫中job集合查看,而後運行:
python command.py -m export -c data/export.json
進行手動任務導出,會生成離線的html壓縮包,保存在task_export/downloads下,能夠直接解壓,而後經過瀏覽器打開查看報告。
經過在celery配合supervisor託管來實現,具體可參考supervisor的配置。
執行以下命令
python command.py -m web -c data/web.json
訪問 http://127.0.0.1:7000 便可打開管理端
;web管理端開啓 [program:themis-web] command=/home/themis-test/python-project/bin/python command.py -m web -c data/web.json autostart=true redirect_stderr=true stdout_logfile=tmp/themis_web.log loglevel=info ;開啓文件下載服務器 [program:themis-download] command=/home/themis-test/python-project/bin/python task_export/file_download.py autostart=true redirect_stderr=true stdout_logfile=tmp/themis_download.log loglevel=info ;開啓任務導出模塊 [program:themis-export] command=/home/themis-test/python-project/bin/celery -A task_exports worker -E -l info autostart=true redirect_stderr=true stdout_logfile=tmp/themis_export.log loglevel=info ;開啓規則解析模塊 [program:themis-analysis] command=/home/themis-test/python-project/bin/celery -A task_other worker -E -Q sqlreview_analysis -l info autostart=true redirect_stderr=true stdout_logfile=tmp/themis_analysis.log loglevel=info ;開啓obj信息抓取模塊 [program:themis-capture-obj] command=/home/themis-test/python-project/bin/celery -A task_capture worker -E -Q sqlreview_obj -l debug -B -n celery-capture-obj autostart=true redirect_stderr=true stdout_logfile=tmp/themis_capture_obj.log loglevel=info ;開啓plan、stat、text信息抓取模塊 [program:themis-capture-other] command=/home/themis-test/python-project/bin/celery -A task_capture worker -E -Q sqlreview_other -l info -B -n celery-capture-other autostart=true redirect_stderr=true stdout_logfile=tmp/themis_capture_other.log loglevel=info ;celery的任務管理模塊,去掉前邊的";"便可開啓,須要配置redis的鏈接方式 ;[program:themis-flower] ;command=/home/themis-test/python-project/bin/celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0 ;autostart=true ;redirect_stderr=true ;stdout_logfile=tmp/themis_flower.log ;loglevel=info
注意:若是前邊創建的用戶不一樣或者使用了不一樣的目錄,須要將這個文件裏的/home/themis-test/python-project/替換爲本身的路徑。
開啓supervisor supervisord -c script/supervisord.conf 重載supervisor supervisorctl -u sqlreview -p sqlreview.themis reload 進入supervisor管理控制檯,這裏的-u,-p表明supervisorctl的用戶名和密碼,在supervisord.conf中配置 supervisorctl -u username -p password
參考:http://www.supervisord.org/
平臺的核心就是規則。規則是一組過濾條件的定義及實現。規則集的豐富程度,表明了平臺的能力。平臺也提供了擴展能力,用戶可自行定義規則。 從分類來看,規則可大體分爲幾類。
規則能夠包含參數。例如:執行計劃規則中,有個是大表掃描。這裏就須要經過參數來限定大表的定義,可經過物理大小來指定。
規則權重及扣分,最終會累積爲一個總的扣分,平臺會按百分制進行折算。經過這種方式,可起到必定的量化做用。
文件位置:capture/sql.py webui/utils/fprivdbuserlist.py
有些狀況下須要安裝python-devel,centos安裝 yum install python-devel
mysqldb安裝問題參考:http://blog.csdn.net/wklken/article/details/7271019
程序中間出了差錯能夠經過開啓flower來查看,或者經過手工執行的方式進行查看代碼。
flower的開啓能夠經過在supervisor中配置或者
;celery的任務管理模塊,去掉前邊的";"便可開啓,須要配置redis的鏈接方式 ;[program:themis-flower] ;command=/home/themis-test/python-project/bin/celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0 ;autostart=true ;redirect_stderr=true ;stdout_logfile=tmp/themis_flower.log ;loglevel=info
也能夠手工開啓:
celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0
不過都須要配置redis認證選項。
有問題能夠直接在 https://github.com/CreditEaseDBA/Themis/issues 提出。
來源:宜信技術學院