一、准备工作
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/