一、準備工作
1、操作系統:Ubuntu Linux 16.04+ (64-bit)
二、客戶端運行原理
客戶端由一個驅動程序和一個控制器組成。驅動程序控制客戶端的所有控制流,控制器收集DBMS旋鈕和度量數據。
1、步驟一:驅動程序首先清除緩存並重新啓動數據庫。它還檢查磁盤使用量是否超過最大使用量(由用戶定義的閾值)。如果是這樣,驅動程序將丟棄實驗數據庫並重新加載基準,以確保有足夠的空間進行實驗,並且控制器可以收集DBMS旋鈕和度量數據(DBMS knobs and metrics data)。
2、步驟二:然後驅動程序將oltpbenchmark作爲後臺作業運行。oltpbenchmark是關係數據庫的基準套件。當基準準備開始測量時,驅動程序向控制器發送一個信號,開始實驗並等待基準完成。實驗觀察時間的長度在基準配置文件中定義.。
3、步驟三:控制器在觀察前首先收集knobs and metrics data。然後等待直到驅動程序發送另一個信號。
4、步驟四:OLTPbenchmark完成測量後,驅動程序向控制器發送終止信號。在接收到信號後,控制器再次收集度量數據。控制器將所有收集的旋鈕和度量數據以及元數據摘要(即數據庫名稱和版本、觀察長度、開始/結束時間、工作負荷名稱)格式化爲JSON文件,並將這些文件發送回驅動程序。
5、步驟五:驅動程序將控制器收集的所有DBMS數據上載到服務器。驅動程序將從服務器接收一個唯一的令牌,並使用該令牌定期檢查服務器是否已完成推薦的新配置。
6、步驟六:如果服務器已成功生成下一個配置,驅動程序將從服務器查詢新配置並將其安裝到數據庫。
三、配置項
客戶端文件構成如下:
.
├── controller
│ ├── build.gradle
│ ├── config
│ │ ├── sample_mysql_config.json //mysql連接的基本信息
│ │ ├── sample_postgres_config.json //postgres連接的基本信息
│ │ └── sample_saphana_config.json //saphana連接的基本信息
│ ├── gradle
│ │ └── wrapper
│ │ └── gradle-wrapper.properties //gradle基本信息
│ ├── log4j.properties
│ ├── README.md
│ ├── sample_output
│ │ ├── mysql
│ │ │ ├── knobs.json
│ │ │ ├── metrics_after.json
│ │ │ ├── metrics_before.json
│ │ │ └── summary.json
│ │ ├── postgres
│ │ │ ├── knobs.json
│ │ │ ├── metrics_after.json
│ │ │ ├── metrics_before.json
│ │ │ └── summary.json
│ │ └── saphana
│ │ ├── knobs.json
│ │ ├── metrics_after.json
│ │ ├── metrics_before.json
│ │ └── summary.json
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── controller //信息收集器
│ │ ├── collectors
│ │ │ ├── DBCollector.java //重載DBParameterCollector裏邊的方法
│ │ │ ├── DBParameterCollector.java //DBParameterCollector接口
│ │ │ ├── MySQLCollector.java //收集mysql參數信息並存儲到mysql中
│ │ │ ├── PostgresCollector.java //收集postgres參數信息並存儲到mysql中
│ │ │ └── SAPHanaCollector.java //收集SAPHana參數信息並存儲到mysql
│ │ ├── ControllerConfiguration.java
│ │ ├── json_validation_schema
│ │ │ ├── config_schema.json
│ │ │ ├── schema.json
│ │ │ └── summary_schema.json
│ │ ├── Main.java
│ │ ├── ResultUploader.java
│ │ ├── types
│ │ │ ├── DatabaseType.java
│ │ │ └── JSONSchemaType.java
│ │ └── util
│ │ ├── ClassUtil.java
│ │ ├── CollectionUtil.java
│ │ ├── FileUtil.java
│ │ ├── json
│ │ │ ├── JSONArray.java
│ │ │ ├── JSONException.java
│ │ │ ├── JSONObject.java
│ │ │ ├── JSONStringer.java
│ │ │ ├── JSONString.java
│ │ │ ├── JSONTokener.java
│ │ │ ├── JSONWriter.java
│ │ │ └── Test.java
│ │ ├── JSONSerializable.java
│ │ ├── JSONUtil.java
│ │ └── ValidationUtils.java
│ └── test
│ └── java
│ └── com
│ └── controller
│ └── collectors
│ ├── AbstractJSONValidationTestCase.java
│ ├── TestInvalidJSON.java
│ ├── TestMySQLJSON.java
│ └── TestPostgresJSON.java
└── driver
├── driver_config.json
├── fabfile.py
├── knobs
│ └── postgres-96.json
├── LatencyUDF.py
├── lhs.py
├── lhs.sh
├── PostgresConf.py
└── upload_batch.py
1、控制器配置
示例配置文件位於otertune/client/controller/config/目錄下。需要更新文件中的信息。目前,不需要關心控制器配置文件中的upload_code和upload_url,因爲驅動程序將處理上傳結果到服務器。在驅動程序配置文件中進行設置,要指定控制器配置的路徑,可能需要更改驅動程序配置中的controller_config。
1)mysql信息(sample_mysql_config.json)如下:
{
"database_type" : "mysql",
"database_url" : "jdbc:mysql://localhost:3306/mysqldb",
"username" : "MY_DATABASE_USERNAME",
"password" : "MY_DATABASE_PASSWORD",
"upload_code" : "DEPRECATED",
"upload_url" : "DEPRECATED",
"workload_name" : "workload_name"
}
2)postgres配置信息(sample_postgres_config.json)如下:
{
"database_type" : "postgres",
"database_url" : "jdbc:postgresql://localhost:5432/postgres",
"username" : "MY_DATABASE_USERNAME",
"password" : "MY_DATABASE_PASSWORD",
"upload_code" : "DEPRECATED",
"upload_url" : "DEPRECATED",
"workload_name" : "workload_name"
}
2、驅動程序配置
驅動程序配置文件位於ottertune/client/driver/driver_config.json。它包括數據庫信息、OLTPBENCH信息和控制器信息。upload_url是ottertune服務器網站的url,upload_code在服務器網站的每個會話中都是唯一的。可以設置save_path爲每個試驗循環保存目標DBMS的收集信息。
{
"database_type" : "postgres",
"database_name" : "tpcc",
"database_disk": "/dev/xvda1",
"database_conf": "/etc/postgresql/9.6/main/postgresql.conf",
"database_save_path": "/home/ubuntu/ottertune",
"username" : "bohan",
"password" : "bohan",
"oltpbench_home": "/home/ubuntu/oltpbench",
"oltpbench_config": "/home/ubuntu/oltpbench/config/tpcc_config_postgres.xml",
"oltpbench_workload": "tpcc",
"oltpbench_log" : "/home/ubuntu/ottertune/client/driver/oltp.log",
"controller_config": "/home/ubuntu/ottertune/client/controller/config/sample_postgres_config.json",
"controller_log" : "/home/ubuntu/ottertune/client/driver/controller.log",
"save_path": "/home/ubuntu/results",
"upload_url" : "http://127.0.0.1:8000",
"upload_code" : "I5I10PXK3PK27FM86YYS",
"lhs_knob_path" : "/home/ubuntu/ottertune/client/driver/knobs/postgres-96.json",
"lhs_save_path" : "/home/ubuntu/ottertune/client/driver/configs"
}
3、OLTP-Bench 配置
目前,我們使用oltpbench在觀察期間運行工作負載(默認爲5分鐘)。您可以更改OLTP-Bench配置以更新工作負荷信息。路徑可以在驅動程序配置的oltpbench_config中指定。注意,如果在OLTP-Bench配置中增加了scale_factor
or terminal
,那麼還應該增加數據庫配置中的最大連接數。
可以按照如下說明構建OLTP工作臺並加載數據庫。
ant
./oltpbenchmark -b tpcc -c config/tpcc_config_postgres.xml --create=true --load=true
注:上面的命令運行ant時報錯Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar
原因:java的默認jre選擇錯誤
解決辦法:root@instance-ehcsziev:/home/tangqing/oltpbench# sudo update-alternatives --config java
輸入數字選擇:2,修改java默認的jre
繼續執行:ant
繼續執行:
ant
./oltpbenchmark -b tpcc -c config/tpcc_config_postgres.xml --create=true --load=true
三、運行
在設置了上述三種配置之後,您可以在上面的描述中運行循環。在每個循環中,它收集目標DBMS信息,上傳到服務器,獲取新的推薦配置,安裝配置並重新啓動DBMS。用戶可以繼續運行循環,直到對推薦的配置滿意爲止。函數在驅動程序文件otertune/client/driver/fabfile.py中定義。
fab loop運行一個單循環。fab run_loops:max_iter=10運行10個循環。您可以設置最大迭代次數來更改最大迭代次數。
四、參考資料
1、安裝參考:https://github.com/cmu-db/ottertune/wiki/client-side
2、關於OtterTune,請參閱相關或的
代碼:https://github.com/cmu-db/ottertune
論文:http://db.cs.cmu.edu/papers/2017/tuning-sigmod2017.pdf
官網:http://ottertune.cs.cmu.edu/