This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new b7111e5 Revert : revert the sysbench doc for previous version (#13004)
b7111e5 is described below
commit b7111e57a8a6e18ce19c00e1e5f7e59f3d6d48fa
Author: 孙念君 Sun Nianjun <[email protected]>
AuthorDate: Tue Oct 12 20:36:28 2021 +0800
Revert : revert the sysbench doc for previous version (#13004)
---
.../test-engine/performance-test-sysbench.cn.md | 1566 ++++++++++++++++++--
.../test-engine/performance-test-sysbench.en.md | 1564 +++++++++++++++++--
2 files changed, 2802 insertions(+), 328 deletions(-)
diff --git
a/docs/document/content/features/test-engine/performance-test-sysbench.cn.md
b/docs/document/content/features/test-engine/performance-test-sysbench.cn.md
index 7e903ab..1e3ff77 100644
--- a/docs/document/content/features/test-engine/performance-test-sysbench.cn.md
+++ b/docs/document/content/features/test-engine/performance-test-sysbench.cn.md
@@ -4,104 +4,490 @@ title = "性能测试(sysbench)"
weight = 5
+++
-## 目标
+## 环境
-本文旨在测试 ShardingSphere-JDBC 及 ShardingSphere-Proxy 在分片场景下与 MySQL、PostgreSQL
的性能对比
+#### 推荐硬件环境
-## 环境
+```
+CPU: 32 Cores
+RAM: 128 GB
+NIC: 10Gb Ethernet
+```
+
+至少需要5台机器:
+
+```
+Jenkins * 1: ${host-jenkins}
+Sysbench * 1: ${host-sysbench}
+ShardingSphere-Proxy * 1: ${host-proxy}
+MySQL Server * 2: ${host-mysql-1}, ${host-mysql-2}
+```
+
+可以适当降低Jenkins和Sysbench机器的硬件标准
+
+#### 软件环境
+
+```
+Jenins: 最新版本
+Sysbench: 1.0.20
+ShardingSphere-Proxy: master分支代码打包
+MySQL Server: 5.7.28
+```
+
+## 测试方案
+
+根据以上的硬件环境,配置参数如下,参数应根据硬件环境改变而调整
+
+#### ShardingSphere-Proxy配置
+
+```
+Proxy运行在${host-proxy}机器
+版本包括:Master分支版本、4.1.1版本、3.0.0版本
+场景包括:config-sharding、config-replica-query、config-sharding-replica-query、config-encrypt
+配置文件详细内容:见附录1
+```
+
+#### MySQL Server配置
+
+两个MySQL实例分别运行在${host-mysql-1}和${host-mysql-2}机器
+```
+需要提前在两个实例上创建sbtest数据库
+设置参数max_prepared_stmt_count = 500000
+设置参数max_connections = 2000
+```
+
+#### Jenkins配置
+
+创建6个Jenkins任务,每个任务依次调用下一个任务:(运行在${host-jenkins}机器)
+
+```
+1. sysbench_install: 拉取最新代码,打包Proxy压缩包
+```
-### 软件版本
+以下任务通过Jenkins slave运行在单独的Sysbench发压机器:(运行在${host-sysbench}机器)
+```
+2. sysbench_sharding:
+ a. 远程部署各版本Proxy的分片场景
+ b. 执行Sysbench命令压测Proxy
+ c. 执行Sysbench命令压测MySQL Server
+ d. 保存Sysbench压测结果
+ e. 使用画图脚本生成性能曲线和表格(画图脚本见附录2)
+3. sysbench_master_slave:
+ a. 远程部署各版本Proxy的读写分离场景
+ b. 执行Sysbench命令压测Proxy
+ c. 执行Sysbench命令压测MySQL Server
+ d. 保存Sysbench压测结果
+ e. 使用画图脚本生成性能曲线和表格
+4. sysbench_sharding_master_slave:
+ a. 远程部署各版本Proxy的分片+读写分离场景
+ b. 执行Sysbench命令压测Proxy
+ c. 执行Sysbench命令压测MySQL Server
+ d. 保存Sysbench压测结果
+ e. 使用画图脚本生成性能曲线和表格
+5. sysbench_encrypt:
+ a. 远程部署各版本Proxy的加密场景
+ b. 执行Sysbench命令压测Proxy
+ c. 执行Sysbench命令压测MySQL Server
+ d. 保存Sysbench压测结果
+ e. 使用画图脚本生成性能曲线和表格
+6. sysbench_result_aggregation:
+ a. 重新对所有任务的压测结果执行画图脚本
+ python3 plot_graph.py sharding
+ python3 plot_graph.py ms
+ python3 plot_graph.py sharding_ms
+ python3 plot_graph.py encrypt
+ b. 使用Jenkins的Publish HTML reports插件将所有图片整合到一个HTML页面中
+```
+
+## 测试过程
+
+以sysbench_sharding为例(其他场景类似)
+
+#### 进入sysbench压测结果目录
+
+```bash
+cd /home/jenkins/sysbench_res/sharding
+```
+
+#### 创建本次构建的文件夹
+
+```bash
+mkdir $BUILD_NUMBER
+```
+
+#### 取最后14次构建,保存到隐藏文件中
+
+```bash
+ls -v | tail -n14 > .build_number.txt
+```
+
+#### 部署及压测
+
+步骤1 执行远程部署脚本,部署Proxy到${host-proxy}
+
+./deploy_sharding.sh
+
+```bash
+#!/bin/sh
-| 名称 | 版本 |
-| ------------------ | ------- |
-| CentOS | 7.3.1 |
-| MySQL | 5.7 |
-| PostgreSQL | 10.0 |
-| ShardingSphere-JDBC | 5.0.0-RC1 |
-| ShardingSphere-Proxy | 5.0.0-RC1 |
+rm -fr apache-shardingsphere-*-shardingsphere-proxy-bin
+tar zxvf apache-shardingsphere-*-shardingsphere-proxy-bin.tar.gz
-### 硬件配置
+sh stop_proxy.sh
+
+cp -f prepared_conf/mysql-connector-java-5.1.47.jar
apache-shardingsphere-*-shardingsphere-proxy-bin/lib
+cp -f prepared_conf/start.sh
apache-shardingsphere-*-shardingsphere-proxy-bin/bin
+cp -f prepared_conf/config-sharding.yaml prepared_conf/server.yaml
apache-shardingsphere-*-shardingsphere-proxy-bin/conf
+
+./apache-shardingsphere-*-shardingsphere-proxy-bin/bin/start.sh
+
+sleep 30
+```
+
+步骤2 执行sysbench脚本
+
+```bash
+# master
-| **名称** | **配置** | **作用**
|
-| ----------------- | ------- |
------------------------------------------- |
-| Sysbench | 32C 64G | 发压机,通过 sysbench 对响应数据库进行测试,单独安装 |
-| ShardingSphere-Proxy | 32C 64G | 5.0.0-RC1 版本的 ShardingSphere-Proxy,单独部署 |
-| MySQL | 32C 64G | 要测试的 MySQL,与 PostgreSQL 安装在同一台机器 |
-| PostgreSQL | 32C 64G | 要测试的 PostgreSQL,与 MySQL 安装在同一台机器 |
+cd /home/jenkins/sysbench_res/sharding
+cd $BUILD_NUMBER
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off prepare
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_read_only.master.txt
+sysbench oltp_point_select --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_point_select.master.txt
+sysbench oltp_read_write --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_read_write.master.txt
+sysbench oltp_write_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_write_only.master.txt
+sysbench oltp_update_index --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_update_index.master.txt
+sysbench oltp_update_non_index --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_update_non_index.master.txt
+sysbench oltp_delete --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_delete.master.txt
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
+```
+
+4.1.1、3.0.0、直连MySQL这三个场景,重复上面步骤1和步骤2
+
+#### 执行停止Proxy脚本
+
+./stop_proxy.sh
+
+```bash
+#!/bin/sh
+
+./3.0.0_sharding-proxy/bin/stop.sh
+./4.1.1_apache-shardingsphere-4.1.1-sharding-proxy-bin/bin/stop.sh
+./apache-shardingsphere-*-shardingsphere-proxy-bin/bin/stop.sh
+```
+
+#### 生成压测曲线图片
+
+```bash
+# Generate graph
+
+cd /home/jenkins/sysbench_res/
+python3 plot_graph.py sharding
+```
+
+#### 利用Jenkins的 Publish HTML reports插件 将图片发布到页面里
+
+```
+HTML directory to archive: /home/jenkins/sysbench_res/graph/
+Index page[s]: 01_sharding.html
+Report title: HTML Report
+```
+
+## sysbench测试用例分析
+
+#### oltp_point_select
+
+```
+Prepare Statement (ID = 1): SELECT c FROM sbtest1 WHERE id=?
+Execute Statement: ID = 1
+```
+
+#### oltp_read_only
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): SELECT c FROM sbtest1 WHERE id=?
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 1
+```
+
+#### oltp_write_only
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): UPDATE sbtest1 SET k=k+1 WHERE id=?
+Prepare Statement (ID = 3): UPDATE sbtest6 SET c=? WHERE id=?
+Prepare Statement (ID = 4): DELETE FROM sbtest1 WHERE id=?
+Prepare Statement (ID = 5): INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?,
?, ?)
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 3
+Execute Statement: ID = 4
+Execute Statement: ID = 5
+Execute Statement: ID = 1
+```
+
+#### oltp_read_write
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): SELECT c FROM sbtest1 WHERE id=?
+Prepare Statement (ID = 3): UPDATE sbtest3 SET k=k+1 WHERE id=?
+Prepare Statement (ID = 4): UPDATE sbtest10 SET c=? WHERE id=?
+Prepare Statement (ID = 5): DELETE FROM sbtest8 WHERE id=?
+Prepare Statement (ID = 6): INSERT INTO sbtest8 (id, k, c, pad) VALUES (?, ?,
?, ?)
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 3
+Execute Statement: ID = 4
+Execute Statement: ID = 5
+Execute Statement: ID = 6
+Execute Statement: ID = 1
+```
+
+#### oltp_update_index
+
+```
+Prepare Statement (ID = 1): UPDATE sbtest1 SET k=k+1 WHERE id=?
+
+Execute Statement: ID = 1
+```
+
+#### oltp_update_non_index
+
+```
+Prepare Statement (ID = 1): UPDATE sbtest1 SET c=? WHERE id=?
+
+Execute Statement: ID = 1
+```
+
+#### oltp_delete
+
+```
+Prepare Statement (ID = 1): DELETE FROM sbtest1 WHERE id=?
+
+Execute Statement: ID = 1
+```
-## 性能测试
+## 附录1
-准备好相关配置留作测试之用(以下配置以 MySQL 为例)
+#### Master branch version
-### ShardingSphere-Proxy 分片
+server.yaml
```yaml
-schemaName: sharding_db
+users:
+ - root@%:root
+ - sharding@:sharding
+
+props:
+ max-connections-size-per-query: 10
+ kernel-executor-size: 128 # Infinite by default.
+ proxy-frontend-flush-threshold: 128 # The default value is 128.
+ proxy-opentracing-enabled: false
+ proxy-hint-enabled: false
+ sql-show: false
+ check-table-metadata-enabled: false
+ lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock
+```
+
+config-sharding.yaml
+
+```yaml
+
+schemaName: sbtest
dataSources:
ds_0:
- url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
- maxPoolSize: 50
- minPoolSize: 1
+ maxPoolSize: 256
+ minPoolSize: 256
ds_1:
- url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
- maxPoolSize: 50
- minPoolSize: 1
+ maxPoolSize: 256
+ minPoolSize: 256
rules:
- !SHARDING
tables:
- t_order:
- actualDataNodes: ds_${0..1}.t_order_${0..1}
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_1
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_2
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_3
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_4
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_5
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
tableStrategy:
standard:
- shardingColumn: order_id
- shardingAlgorithmName: t_order_inline
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_6
keyGenerateStrategy:
- column: order_id
+ column: id
keyGeneratorName: snowflake
- t_order_item:
- actualDataNodes: ds_${0..1}.t_order_item_${0..1}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
tableStrategy:
standard:
- shardingColumn: order_id
- shardingAlgorithmName: t_order_item_inline
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_7
keyGenerateStrategy:
- column: order_item_id
+ column: id
keyGeneratorName: snowflake
- bindingTables:
- - t_order,t_order_item
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_8
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_9
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_10
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+
defaultDatabaseStrategy:
standard:
- shardingColumn: user_id
+ shardingColumn: id
shardingAlgorithmName: database_inline
- defaultTableStrategy:
- none:
shardingAlgorithms:
database_inline:
type: INLINE
props:
- algorithm-expression: ds_${user_id % 2}
- t_order_inline:
+ algorithm-expression: ds_${id % 2}
+ table_inline_1:
type: INLINE
props:
- algorithm-expression: t_order_${order_id % 2}
- t_order_item_inline:
+ algorithm-expression: sbtest1_${id % 100}
+ table_inline_2:
type: INLINE
props:
- algorithm-expression: t_order_item_${order_id % 2}
-
+ algorithm-expression: sbtest2_${id % 100}
+ table_inline_3:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest3_${id % 100}
+ table_inline_4:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest4_${id % 100}
+ table_inline_5:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest5_${id % 100}
+ table_inline_6:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest6_${id % 100}
+ table_inline_7:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest7_${id % 100}
+ table_inline_8:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest8_${id % 100}
+ table_inline_9:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest9_${id % 100}
+ table_inline_10:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest10_${id % 100}
keyGenerators:
snowflake:
type: SNOWFLAKE
@@ -109,155 +495,1007 @@ rules:
worker-id: 123
```
-### ShardingSphere-JDBC 分片
+config-replica-query.yaml
```yaml
-mode:
- type: Standalone
- repository:
- type: File
- overwrite: true
+schemaName: sbtest
dataSources:
ds_0:
- dataSourceClassName: com.zaxxer.hikari.HikariDataSource
- driverClassName: com.mysql.jdbc.Driver
- jdbcUrl:
jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
- ds_1:
- dataSourceClassName: com.zaxxer.hikari.HikariDataSource
- driverClassName: com.mysql.jdbc.Driver
- jdbcUrl:
jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 128
+ minPoolSize: 128
+
+rules:
+- !READWRITE_SPLITTING
+ dataSources:
+ pr_ds:
+ primaryDataSourceName: ds_0
+ replicaDataSourceNames:
+ - ds_0
+ - ds_0
+```
+
+config-sharding-replica-query.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
rules:
- !SHARDING
tables:
- t_order:
- actualDataNodes: ds_${0..1}.t_order
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_1
keyGenerateStrategy:
- column: order_id
+ column: id
keyGeneratorName: snowflake
- t_order_item:
- actualDataNodes: ds_${0..1}.t_order_item
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_2
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_3
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_4
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_5
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_6
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_7
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_8
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_9
keyGenerateStrategy:
- column: order_item_id
+ column: id
keyGeneratorName: snowflake
- bindingTables:
- - t_order,t_order_item
- broadcastTables:
- - t_address
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_10
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+
defaultDatabaseStrategy:
standard:
- shardingColumn: user_id
+ shardingColumn: id
shardingAlgorithmName: database_inline
- defaultTableStrategy:
- none:
-
+
shardingAlgorithms:
database_inline:
type: INLINE
props:
- algorithm-expression: ds_${user_id % 2}
-
+ algorithm-expression: ds_${id % 2}
+ table_inline_1:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest1_${id % 100}
+ table_inline_2:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest2_${id % 100}
+ table_inline_3:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest3_${id % 100}
+ table_inline_4:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest4_${id % 100}
+ table_inline_5:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest5_${id % 100}
+ table_inline_6:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest6_${id % 100}
+ table_inline_7:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest7_${id % 100}
+ table_inline_8:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest8_${id % 100}
+ table_inline_9:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest9_${id % 100}
+ table_inline_10:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest10_${id % 100}
keyGenerators:
snowflake:
type: SNOWFLAKE
props:
- worker-id: 123
+ worker-id: 123
+
+- !READWRITE_SPLITTING
+ dataSources:
+ ds_0:
+ primaryDataSourceName: primary_ds_0
+ replicaDataSourceNames:
+ - primary_ds_0
+ - primary_ds_0
+ ds_1:
+ name: ds_1
+ primaryDataSourceName: primary_ds_1
+ replicaDataSourceNames:
+ - primary_ds_1
+ - primary_ds_1
+```
+
+config-encrypt.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
+
+rules:
+- !ENCRYPT
+ encryptors:
+ md5_encryptor:
+ type: MD5
+ tables:
+ sbtest1:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest2:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest3:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest4:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest5:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest6:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest7:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest8:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest9:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest10:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+```
+
+#### 4.1.1 version
+
+server.yaml
+
+```yaml
+authentication:
+ users:
+ root:
+ password: root
+ sharding:
+ password: sharding
+ authorizedSchemas: sharding_db
props:
- sql-show: false
+ max.connections.size.per.query: 10
+ acceptor.size: 256 # The default value is available processors count * 2.
+ executor.size: 128 # Infinite by default.
+ proxy.frontend.flush.threshold: 128 # The default value is 128.
+ # LOCAL: Proxy will run with LOCAL transaction.
+ # XA: Proxy will run with XA transaction.
+ # BASE: Proxy will run with B.A.S.E transaction.
+ proxy.transaction.type: LOCAL
+ proxy.opentracing.enabled: false
+ proxy.hint.enabled: false
+ query.with.cipher.column: true
+ sql.show: false
+ allow.range.query.with.inline.sharding: false
+```
+
+config-sharding.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
```
-[](https://shardingsphere.apache.org/document/current/img/stress-test/sysbench_test_process.jpg)
+config-master_slave.yaml
-Sysbench 是一款基于 LuaJIT 的可编写脚本的多线程基准测试工具。它最常用于数据库基准测试。
-Sysbench 自带的脚本,包含了很多常见的场景,可以非常有效的对数据库的性能进行测试。
+```yaml
+schemaName: sbtest
-| 脚本名称 | 执行sql
|
-| ----------------- |
------------------------------------------------------------ |
-| oltp\_point\_select | SELECT c FROM sbtest1 WHERE id=?
|
-| oltp\_read\_only | COMMIT <br> SELECT c FROM sbtest1 WHERE id=? |
-| oltp\_write\_only | COMMIT <br> UPDATE sbtest1 SET k=k+1 WHERE id=?
<br> UPDATE sbtest6 SET c=? WHERE id=? <br> DELETE FROM sbtest1 WHERE id=?
<br> INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?) <br> BEGIN |
-| oltp\_read\_write | COMMIT <br> SELECT c FROM sbtest1 WHERE id=?
<br> UPDATE sbtest3 SET k=k+1 WHERE id=? <br> UPDATE sbtest10 SET c=? WHERE
id=? <br> DELETE FROM sbtest8 WHERE id=? <br> INSERT INTO sbtest8 (id, k, c,
pad) VALUES (?, ?, ?, ?) <br> BEGIN |
-| oltp\_update\_index | UPDATE sbtest1 SET k=k+1 WHERE id=? |
-| oltp\_update\_non\_index | UPDATE sbtest1 SET c=? WHERE id=? |
-| oltp\_delete | DELETE FROM sbtest1 WHERE id=? |
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
-通过 sysbench 分别测试 `Proxy + Database + 分片`、`直连 Database` 进行横向对比。
+masterSlaveRule:
+ name: ms_ds
+ masterDataSourceName: ds_0
+ slaveDataSourceNames:
+ - ds_0
+ - ds_0
+```
-如下脚本为 sysbench 压测 proxy 的相应命令:
+config-sharding-master_slave.yaml
-```bash
-# clean and prepare the test data for sysbench. need to create a schema called
sbtest before execute the following command
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off prepare
-
-# start to test by corresponding script
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_read\_only.txt
-sysbench oltp\_point\_select --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_point\_select.txt
-sysbench oltp\_read\_write --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_read\_write.txt
-sysbench oltp\_write\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_write\_only.txt
-sysbench oltp\_update\_index --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_update\_index.txt
-sysbench oltp\_update\_non\_index --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_update\_non\_index.txt
-sysbench oltp\_delete --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_delete.txt
-```
-
-## 测试结果
-
-`point_select` 作为最基础的测试用例,这里我们以 `point_select` 为基础测试脚本,横向对比不同数据库以及
ShardingSphere 的性能。如下即为对应的数据库以及 ShardingSphere 产品的 QPS
-
-| 线程数 | MySQL | ShardingSphere-Proxy(分片) | ShardingSphere-JDBC(分片 by JMH) |
-| :----- | :------ | :-------------------------- |
:------------------------------- |
-| 20 | 154,408 | 50,042 | 101,687
|
-| 100 | 283,918 | 107,488 | 245,676
|
-| 200 | 281,902 | 110,278 | 252,621
|
-
-> Sysbench 是由 C 语言编写的,所以无法直接测试 ShardingSphere-JDBC,这里对 ShardingSphere-JDBC
的测试使用的是 OpenJDK 自带的压测工具 JMH
-
-其他测试结果
-
-### MySQL 的测试结果:
-| MySQL | oltp\_read\_only | oltp\_point\_select | oltp\_read\_write |
oltp\_write\_only | oltp\_update\_index | oltp\_update\_non\_index |
oltp\_delete |
-| --------- | -------------- | ----------------- | --------------- |
--------------- | ----------------- | --------------------- | ----------- |
-| thread20 | 172,640 | 154,408 | 63,520 | 33,890
| 12,779 | 14,256 | 24,318 |
-| thread100 | 308,513 | 283,918 | 107,942 | 50,664
| 18,659 | 18,350 | 29,799 |
-| thread200 | 309,668 | 281,902 | 125,311 | 64,977
| 21,181 | 20,587 | 34,745 |
-
-### ShardingSphere-Proxy + MySQL + 分片的测试结果:
-| ShardingSphere-Proxy\_Sharding\_MySQL | oltp\_read\_only |
oltp\_point\_select | oltp\_read\_write | oltp\_write\_only |
oltp\_update\_index | oltp\_update\_non\_index | oltp\_delete |
-| ----------------------------------- | -------------- | ----------------- |
--------------- | --------------- | ----------------- | --------------------- |
----------- |
-| thread20 | 53,953 | 50,042 |
41,929 | 36,395 | 21,700 | 23,863 |
34,000 |
-| thread100 | 117,897 | 107,488 |
104,338 | 74,393 | 38,222 | 39,742 |
93,573 |
-| thread200 | 113,608 | 110,278 |
110,829 | 84,354 | 46,583 | 45,283 |
104,681 |
-
-### ShardingSphere-JDBC + MySQL + 分片的测试结果:
-| ShardingSphere-JDBC\_Sharding\_MySQL | oltp\_point\_select |
-| ---------------------------------- | ----------------- |
-| thread20 | 101,687 |
-| thread100 | 245,676 |
-| thread200 | 252,621 |
-
-### PostgreSQL 的测试结果:
-| PostgreSQL | oltp\_read\_only | oltp\_point\_select | oltp\_read\_write |
oltp\_write\_only | oltp\_update\_index | oltp\_update\_non\_index |
oltp\_delete |
-| ---------- | -------------- | ----------------- | --------------- |
--------------- | ----------------- | --------------------- | ----------- |
-| thread100 | 364,045 | 302,767 | 3,300 | 1,469
| 704 | 1,236 | 1,460 |
-| thread200 | 347,426 | 280,177 | 3,261 | 1,575
| 688 | 1,209 | 1,518 |
-
-### ShardingSphere-Proxy + PostgreSQL + 分片的测试结果:
-| ShardingSphere-Proxy\_Sharding\_PostgreSQL | oltp\_read\_only |
oltp\_point\_select | oltp\_read\_write | oltp\_write\_only |
oltp\_update\_index | oltp\_update\_non\_index | oltp\_delete |
-| ---------------------------------------- | -------------- |
----------------- | --------------- | --------------- | ----------------- |
--------------------- | ----------- |
-| thread20 | 52,831 | 56,259
| 2,666 | 1,233 | 583 | 826
| 989 |
-| thread100 | 121,476 | 126,167
| 3,187 | 1,160 | 555 | 827
| 1,053 |
-| thread200 | 118,351 | 122,423
| 3,254 | 1,125 | 544 | 785
| 1,016 |
-
-### ShardingSphere-JDBC + PostgreSQL + 分片的测试结果:
-| ShardingSphere-JDBC\_Sharding\_PostgreSQL | oltp\_point\_select |
-| --------------------------------------- | ----------------- |
-| thread20 | 112,977 |
-| thread100 | 280,439 |
-| thread200 | 284,474 |
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+
+ masterSlaveRules:
+ ds_0:
+ masterDataSourceName: primary_ds_0
+ slaveDataSourceNames: [primary_ds_0, primary_ds_0]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+ ds_1:
+ masterDataSourceName: primary_ds_1
+ slaveDataSourceNames: [primary_ds_1, primary_ds_1]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+```
+
+config-encrypt.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+encryptRule:
+ encryptors:
+ encryptor_md5:
+ type: md5
+ tables:
+ sbtest1:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest2:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest3:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest4:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest5:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest6:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest7:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest8:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest9:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest10:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+```
+
+#### 3.0.0 version
+
+server.yaml
+
+```yaml
+authentication:
+ username: root
+ password: root
+
+props:
+ max.connections.size.per.query: 10
+ acceptor.size: 256 # The default value is available processors count * 2.
+ executor.size: 128 # Infinite by default.
+ proxy.frontend.flush.threshold: 128 # The default value is 128.
+ # LOCAL: Proxy will run with LOCAL transaction.
+ # XA: Proxy will run with XA transaction.
+ # BASE: Proxy will run with B.A.S.E transaction.
+ proxy.transaction.type: LOCAL
+ proxy.opentracing.enabled: false
+ sql.show: false
+```
+
+config-sharding.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+ ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+```
+
+config-master_slave.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+masterSlaveRule:
+ name: ms_ds
+ masterDataSourceName: ds_0
+ slaveDataSourceNames:
+ - ds_0
+ - ds_0
+```
+
+config-sharding-master_slave.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+
+ masterSlaveRules:
+ ds_0:
+ masterDataSourceName: primary_ds_0
+ slaveDataSourceNames: [primary_ds_0, primary_ds_0]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+ ds_1:
+ masterDataSourceName: primary_ds_1
+ slaveDataSourceNames: [primary_ds_1, primary_ds_1]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+```
+
+config-encrypt.yaml
+
+```
+不支持
+```
+
+## 附录2
+
+plot_graph.py
+
+```python
+import sys
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def generate_graph(path, case_name):
+ dataset = {
+ 'build_num': [],
+ 'master_version': [],
+ 'master_xa': [],
+ '4.1.1_version': [],
+ '3.0.0_version': [],
+ 'mysql_server': []
+ }
+ with open(path + '/.build_number.txt') as builds:
+ for line in builds:
+ dataset['build_num'].append(int(line))
+ generate_data(path, case_name, dataset)
+ print(dataset)
+ fig, ax = plt.subplots()
+ ax.grid(True)
+ plt.title(case_name)
+
+ data = [dataset['master_version'][-7:], dataset['master_xa'][-7:],
dataset['4.1.1_version'][-7:], dataset['3.0.0_version'][-7:],
dataset['mysql_server'][-7:]]
+ columns = dataset['build_num'][-7:]
+ rows = ['master', 'xa', '4.1.1', '3.0.0', 'mysql']
+ rcolors = plt.cm.BuPu(np.full(len(rows), 0.1))
+ ccolors = plt.cm.BuPu(np.full(len(columns), 0.1))
+ the_table = plt.table(cellText=data, rowLabels=rows, colLabels=columns,
rowColours=rcolors, colColours=ccolors,
+ loc='bottom', bbox=[0.0, -0.50, 1, .28])
+ plt.subplots_adjust(left=0.15, bottom=0.3, right=0.98)
+
+ plt.xticks(range(14))
+ ax.set_xticklabels(dataset['build_num'])
+ plt.plot(dataset['master_version'], 'o-', color='magenta',
label='master_version')
+ plt.plot(dataset['master_xa'], 'o-', color='darkviolet', label='master_xa')
+ plt.plot(dataset['4.1.1_version'], 'r--', color='blue',
label='4.1.1_version')
+ plt.plot(dataset['3.0.0_version'], 'r--', color='orange',
label='3.0.0_version')
+ plt.plot(dataset['mysql_server'], 'r--', color='lime',
label='mysql_server')
+ plt.xlim()
+ plt.legend()
+ plt.xlabel('build_num')
+ plt.ylabel('transactions per second')
+ plt.savefig('graph/' + path + '/' + case_name)
+ plt.show()
+
+
+def generate_data(path, case_name, dataset):
+ for build in dataset['build_num']:
+ fill_dataset(build, case_name, dataset, path, 'master_version',
'.master.txt')
+ fill_dataset(build, case_name, dataset, path, 'master_xa', '.xa.txt')
+ fill_dataset(build, case_name, dataset, path, '4.1.1_version',
'.4_1_1.txt')
+ fill_dataset(build, case_name, dataset, path, '3.0.0_version',
'.3_0_0.txt')
+ fill_dataset(build, case_name, dataset, path, 'mysql_server',
'.mysql.txt')
+
+
+def fill_dataset(build, case_name, dataset, path, version, suffix):
+ try:
+ with open(path + '/' + str(build) + '/' + case_name + suffix) as
version_master:
+ value = 0
+ for line in version_master:
+ if 'transactions:' in line:
+ items = line.split('(')
+ value = float(items[1][:-10])
+ dataset[version].append(value)
+ except FileNotFoundError:
+ dataset[version].append(0)
+
+
+if __name__ == '__main__':
+ path = sys.argv[1]
+ generate_graph(path, 'oltp_point_select')
+ generate_graph(path, 'oltp_read_only')
+ generate_graph(path, 'oltp_write_only')
+ generate_graph(path, 'oltp_read_write')
+ generate_graph(path, 'oltp_update_index')
+ generate_graph(path, 'oltp_update_non_index')
+ generate_graph(path, 'oltp_delete')
+```
+
+目前在 ShardingSphere 的 benchmark 项目
[shardingsphere-benchmark](https://github.com/apache/shardingsphere-benchmark)
中已经共享了 sysbench 的使用方式 : [sysbench
压测工具](https://github.com/apache/shardingsphere-benchmark/blob/master/sysbench/README_ZH.md)
diff --git
a/docs/document/content/features/test-engine/performance-test-sysbench.en.md
b/docs/document/content/features/test-engine/performance-test-sysbench.en.md
index cb8dadf..923cfbb 100644
--- a/docs/document/content/features/test-engine/performance-test-sysbench.en.md
+++ b/docs/document/content/features/test-engine/performance-test-sysbench.en.md
@@ -4,104 +4,490 @@ title = "Performance Test(sysbench)"
weight = 5
+++
-## Target
+## Environment
-This pressure test is for the performance compare between
ShardingSphere-JDBC,ShardingSphere-Proxy in Sharding Rule to MySQL,PostgreSQL
+#### Recommended Hardware
-## Environment
+```
+CPU: 32 Cores
+RAM: 128 GB
+NIC: 10Gb Ethernet
+```
+
+At least 5 machines are required:
+
+```
+Jenkins * 1: ${host-jenkins}
+Sysbench * 1: ${host-sysbench}
+ShardingSphere-Proxy * 1: ${host-proxy}
+MySQL Server * 2: ${host-mysql-1}, ${host-mysql-2}
+```
+
+The hardware standards of Jenkins and Sysbench machines can appropriately
lower.
+
+#### Software Environment
+
+```
+Jenins: The latest version
+Sysbench: 1.0.20
+ShardingSphere-Proxy: package from master branch
+MySQL Server: 5.7.28
+```
+
+## Test Program
+
+According to the above hardware environment, the configuration parameters are
as follows,
+and the parameters should be adjusted according to the changes in the hardware
environment.
+
+#### ShardingSphere-Proxy Configuration
+
+```
+Proxy runs on ${host-proxy}
+Version includes: Master branch, 4.1.1, 3.0.0
+Scenarios: config-sharding, config-replica-query,
config-sharding-replica-query, config-encrypt
+Configurations: Refer to Appendix 1
+```
+
+#### MySQL Server Configuration
+
+Two MySQL instances runs on `${host-mysql-1}` and `${host-mysql-2}` machines
respectively.
+```
+Need to create the 'sbtest' database on both instances in advance.
+Set parameter: max_prepared_stmt_count = 500000
+Set parameter: max_connections = 2000
+```
+
+#### Jenkins Configuration
+
+Create 6 Jenkins tasks, and each task calls the next task in turn: (runs on
the `${host-jenkins}` machine).
+```
+1. sysbench_install: Pull the latest code, package the Proxy compression
package
+```
+
+The following tasks are run on a separate Sysbench pressure generating machine
via Jenkins slave: (runs on the `{host-sysbench}` machine)
+```
+2. sysbench_sharding:
+ a. Sharding scenarios for remote deployment of various versions of Proxy
+ b. Execute Sysbench command to pressure test Proxy
+ c. Execute Sysbench command to pressure test MySQL Server
+ d. Save Sysbench stress test results
+ e. Use drawing scripts to generate performance curves and tables (see
Appendix 2 for drawing scripts)
+3. sysbench_master_slave:
+ a. Read and write separation scenarios for remote deployment of various
versions of Proxy
+ b. Execute Sysbench command to pressure test Proxy
+ c. Execute Sysbench command to pressure test MySQL Server
+ d. Save Sysbench stress test results
+ e. Use drawing scripts to generate performance curves and tables
+4. sysbench_sharding_master_slave:
+ a. Remote deployment of sharding + read-write splitting scenarios of
various versions of Proxy
+ b. Execute Sysbench command to pressure test Proxy
+ c. Execute Sysbench command to pressure test MySQL Server
+ d. Save Sysbench stress test results
+ e. Use drawing scripts to generate performance curves and tables
+5. sysbench_encrypt:
+ a. Encryption scenarios for remote deployment of various versions of Proxy
+ b. Execute Sysbench command to pressure test Proxy
+ c. Execute Sysbench command to pressure test MySQL Server
+ d. Save Sysbench stress test results
+ e. Use drawing scripts to generate performance curves and tables
+6. sysbench_result_aggregation:
+ a. Re-execute the drawing script for the pressure test results of all tasks
+ python3 plot_graph.py sharding
+ python3 plot_graph.py ms
+ python3 plot_graph.py sharding_ms
+ python3 plot_graph.py encrypt
+ b. Use Jenkins "Publish HTML reports" plugin to integrate all images into
one HTML page
+```
+
+## Testing Process
+
+Take sysbench sharding as an example (other scenarios are similar)
+
+#### Enter the Sysbench pressure test result directory
+
+```bash
+cd /home/jenkins/sysbench_res/sharding
+```
+
+#### Create the folder for this build
+
+```bash
+mkdir $BUILD_NUMBER
+```
+
+#### Take the last 14 builds and save them in a hidden file
+
+```bash
+ls -v | tail -n14 > .build_number.txt
+```
+
+#### Deployment and stress testing
+
+Step 1: Execute remote deployment script to deploy Proxy to `{host-proxy}`
+
+./deploy_sharding.sh
+
+```bash
+#!/bin/sh
+
+rm -fr apache-shardingsphere-*-shardingsphere-proxy-bin
+tar zxvf apache-shardingsphere-*-shardingsphere-proxy-bin.tar.gz
+
+sh stop_proxy.sh
+
+cp -f prepared_conf/mysql-connector-java-5.1.47.jar
apache-shardingsphere-*-shardingsphere-proxy-bin/lib
+cp -f prepared_conf/start.sh
apache-shardingsphere-*-shardingsphere-proxy-bin/bin
+cp -f prepared_conf/config-sharding.yaml prepared_conf/server.yaml
apache-shardingsphere-*-shardingsphere-proxy-bin/conf
+
+./apache-shardingsphere-*-shardingsphere-proxy-bin/bin/start.sh
+
+sleep 30
+```
+
+Step 2: Execute the sysbench script
+
+```bash
+# master
+
+cd /home/jenkins/sysbench_res/sharding
+cd $BUILD_NUMBER
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off prepare
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_read_only.master.txt
+sysbench oltp_point_select --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_point_select.master.txt
+sysbench oltp_read_write --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_read_write.master.txt
+sysbench oltp_write_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_write_only.master.txt
+sysbench oltp_update_index --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_update_index.master.txt
+sysbench oltp_update_non_index --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_update_non_index.master.txt
+sysbench oltp_delete --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=30 --time=180 --threads=256
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--range_selects=off --rand-type=uniform --auto_inc=off run | tee
oltp_delete.master.txt
+
+sysbench oltp_read_only --mysql-host=${host-proxy} --mysql-port=3307
--mysql-user=root --mysql-password='root' --mysql-db=sbtest --tables=10
--table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
+```
+
+4.1.1, 3.0.0, three scenarios of direct connection to MySQL, repeat steps 1
and 2 above.
+
+#### Execute stop proxy script
+
+./stop_proxy.sh
+
+```bash
+#!/bin/sh
+
+./3.0.0_sharding-proxy/bin/stop.sh
+./4.1.1_apache-shardingsphere-4.1.1-sharding-proxy-bin/bin/stop.sh
+./apache-shardingsphere-*-shardingsphere-proxy-bin/bin/stop.sh
+```
+
+#### Generate pressure test curve picture
+
+```bash
+# Generate graph
+
+cd /home/jenkins/sysbench_res/
+python3 plot_graph.py sharding
+```
+
+#### Use Jenkins Publish HTML reports plugin to publish pictures to the page
+
+```
+HTML directory to archive: /home/jenkins/sysbench_res/graph/
+Index page[s]: 01_sharding.html
+Report title: HTML Report
+```
+
+## sysbench test case describe
+
+#### oltp_point_select
+
+```
+Prepare Statement (ID = 1): SELECT c FROM sbtest1 WHERE id=?
+Execute Statement: ID = 1
+```
+
+#### oltp_read_only
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): SELECT c FROM sbtest1 WHERE id=?
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 1
+```
+
+#### oltp_write_only
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): UPDATE sbtest1 SET k=k+1 WHERE id=?
+Prepare Statement (ID = 3): UPDATE sbtest6 SET c=? WHERE id=?
+Prepare Statement (ID = 4): DELETE FROM sbtest1 WHERE id=?
+Prepare Statement (ID = 5): INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?,
?, ?)
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 3
+Execute Statement: ID = 4
+Execute Statement: ID = 5
+Execute Statement: ID = 1
+```
+
+#### oltp_read_write
+
+```
+Prepare Statement (ID = 1): 'COMMIT'
+Prepare Statement (ID = 2): SELECT c FROM sbtest1 WHERE id=?
+Prepare Statement (ID = 3): UPDATE sbtest3 SET k=k+1 WHERE id=?
+Prepare Statement (ID = 4): UPDATE sbtest10 SET c=? WHERE id=?
+Prepare Statement (ID = 5): DELETE FROM sbtest8 WHERE id=?
+Prepare Statement (ID = 6): INSERT INTO sbtest8 (id, k, c, pad) VALUES (?, ?,
?, ?)
+
+Statement: 'BEGIN'
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 2
+Execute Statement: ID = 3
+Execute Statement: ID = 4
+Execute Statement: ID = 5
+Execute Statement: ID = 6
+Execute Statement: ID = 1
+```
+
+#### oltp_update_index
+
+```
+Prepare Statement (ID = 1): UPDATE sbtest1 SET k=k+1 WHERE id=?
+
+Execute Statement: ID = 1
+```
+
+#### oltp_update_non_index
+
+```
+Prepare Statement (ID = 1): UPDATE sbtest1 SET c=? WHERE id=?
+
+Execute Statement: ID = 1
+```
+
+#### oltp_delete
-### Software
+```
+Prepare Statement (ID = 1): DELETE FROM sbtest1 WHERE id=?
+
+Execute Statement: ID = 1
+```
-| **Name** | **Version** |
-| ---------------------- | --------- |
-| CentOS | 7.3.1 |
-| MySQL | 5.7 |
-| PostgreSQL | 10.0 |
-| ShardingSphere-JDBC | 5.0.0-RC1 |
-| ShardingSphere-Proxy | 5.0.0-RC1 |
+## Appendix 1
-### Hardware
+#### Master branch version
-| **Name** | **Hardware** | **Comment**
|
-| ------------------- | ------------ |
------------------------------------------------------- |
-| Sysbench | 32C 64G | the machine send request by
sysbench,deployed separately |
-| ShardingSphere-Proxy | 32C 64G | 5.0.0-RC1 版本的
ShardingSphere-Proxy,deployed separately |
-| MySQL | 32C 64G | MySQL, installed with PostgreSQL on
the same machine |
-| PostgreSQL | 32C 64G | MySQL, installed with PostgreSQL on
the same machine |
+server.yaml
-## Performance Test
+```yaml
+users:
+ - root@%:root
+ - sharding@:sharding
-Prepare the config for ShardingSphere-Proxy and ShardingSphere-JDBC for
testing(following configs are for MySQL)
+props:
+ max-connections-size-per-query: 10
+ kernel-executor-size: 128 # Infinite by default.
+ proxy-frontend-flush-threshold: 128 # The default value is 128.
+ proxy-opentracing-enabled: false
+ proxy-hint-enabled: false
+ sql-show: false
+ check-table-metadata-enabled: false
+ lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock
+```
-### ShardingSphere-Proxy Sharding
+config-sharding.yaml
```yaml
-schemaName: sharding_db
+
+schemaName: sbtest
dataSources:
ds_0:
- url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
- maxPoolSize: 50
- minPoolSize: 1
+ maxPoolSize: 256
+ minPoolSize: 256
ds_1:
- url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
- maxPoolSize: 50
- minPoolSize: 1
+ maxPoolSize: 256
+ minPoolSize: 256
rules:
- !SHARDING
tables:
- t_order:
- actualDataNodes: ds_${0..1}.t_order_${0..1}
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_1
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_2
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_3
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_4
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_5
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
tableStrategy:
standard:
- shardingColumn: order_id
- shardingAlgorithmName: t_order_inline
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_6
keyGenerateStrategy:
- column: order_id
+ column: id
keyGeneratorName: snowflake
- t_order_item:
- actualDataNodes: ds_${0..1}.t_order_item_${0..1}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
tableStrategy:
standard:
- shardingColumn: order_id
- shardingAlgorithmName: t_order_item_inline
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_7
keyGenerateStrategy:
- column: order_item_id
+ column: id
keyGeneratorName: snowflake
- bindingTables:
- - t_order,t_order_item
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_8
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_9
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_10
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+
defaultDatabaseStrategy:
standard:
- shardingColumn: user_id
+ shardingColumn: id
shardingAlgorithmName: database_inline
- defaultTableStrategy:
- none:
shardingAlgorithms:
database_inline:
type: INLINE
props:
- algorithm-expression: ds_${user_id % 2}
- t_order_inline:
+ algorithm-expression: ds_${id % 2}
+ table_inline_1:
type: INLINE
props:
- algorithm-expression: t_order_${order_id % 2}
- t_order_item_inline:
+ algorithm-expression: sbtest1_${id % 100}
+ table_inline_2:
type: INLINE
props:
- algorithm-expression: t_order_item_${order_id % 2}
-
+ algorithm-expression: sbtest2_${id % 100}
+ table_inline_3:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest3_${id % 100}
+ table_inline_4:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest4_${id % 100}
+ table_inline_5:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest5_${id % 100}
+ table_inline_6:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest6_${id % 100}
+ table_inline_7:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest7_${id % 100}
+ table_inline_8:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest8_${id % 100}
+ table_inline_9:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest9_${id % 100}
+ table_inline_10:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest10_${id % 100}
keyGenerators:
snowflake:
type: SNOWFLAKE
@@ -109,155 +495,1005 @@ rules:
worker-id: 123
```
-### ShardingSphere-JDBC Sharding
+config-replica-query.yaml
```yaml
-mode:
- type: Standalone
- repository:
- type: File
- overwrite: true
+schemaName: sbtest
dataSources:
ds_0:
- dataSourceClassName: com.zaxxer.hikari.HikariDataSource
- driverClassName: com.mysql.jdbc.Driver
- jdbcUrl:
jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
- ds_1:
- dataSourceClassName: com.zaxxer.hikari.HikariDataSource
- driverClassName: com.mysql.jdbc.Driver
- jdbcUrl:
jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 128
+ minPoolSize: 128
+
+rules:
+- !READWRITE_SPLITTING
+ dataSources:
+ pr_ds:
+ primaryDataSourceName: ds_0
+ replicaDataSourceNames:
+ - ds_0
+ - ds_0
+```
+
+config-sharding-replica-query.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
username: root
password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
rules:
- !SHARDING
tables:
- t_order:
- actualDataNodes: ds_${0..1}.t_order
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_1
keyGenerateStrategy:
- column: order_id
+ column: id
keyGeneratorName: snowflake
- t_order_item:
- actualDataNodes: ds_${0..1}.t_order_item
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_2
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_3
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_4
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_5
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_6
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_7
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_8
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_9
keyGenerateStrategy:
- column: order_item_id
+ column: id
keyGeneratorName: snowflake
- bindingTables:
- - t_order,t_order_item
- broadcastTables:
- - t_address
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ standard:
+ shardingColumn: id
+ shardingAlgorithmName: table_inline_10
+ keyGenerateStrategy:
+ column: id
+ keyGeneratorName: snowflake
+
defaultDatabaseStrategy:
standard:
- shardingColumn: user_id
+ shardingColumn: id
shardingAlgorithmName: database_inline
- defaultTableStrategy:
- none:
-
+
shardingAlgorithms:
database_inline:
type: INLINE
props:
- algorithm-expression: ds_${user_id % 2}
-
+ algorithm-expression: ds_${id % 2}
+ table_inline_1:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest1_${id % 100}
+ table_inline_2:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest2_${id % 100}
+ table_inline_3:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest3_${id % 100}
+ table_inline_4:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest4_${id % 100}
+ table_inline_5:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest5_${id % 100}
+ table_inline_6:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest6_${id % 100}
+ table_inline_7:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest7_${id % 100}
+ table_inline_8:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest8_${id % 100}
+ table_inline_9:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest9_${id % 100}
+ table_inline_10:
+ type: INLINE
+ props:
+ algorithm-expression: sbtest10_${id % 100}
keyGenerators:
snowflake:
type: SNOWFLAKE
props:
- worker-id: 123
+ worker-id: 123
+
+- !READWRITE_SPLITTING
+ dataSources:
+ ds_0:
+ primaryDataSourceName: primary_ds_0
+ replicaDataSourceNames:
+ - primary_ds_0
+ - primary_ds_0
+ ds_1:
+ name: ds_1
+ primaryDataSourceName: primary_ds_1
+ replicaDataSourceNames:
+ - primary_ds_1
+ - primary_ds_1
+```
+
+config-encrypt.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ minPoolSize: 256
+
+rules:
+- !ENCRYPT
+ encryptors:
+ md5_encryptor:
+ type: MD5
+ tables:
+ sbtest1:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest2:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest3:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest4:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest5:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest6:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest7:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest8:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest9:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+ sbtest10:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptorName: md5_encryptor
+```
+
+#### 4.1.1 version
+
+server.yaml
+
+```yaml
+authentication:
+ users:
+ root:
+ password: root
+ sharding:
+ password: sharding
+ authorizedSchemas: sharding_db
props:
- sql-show: false
+ max.connections.size.per.query: 10
+ acceptor.size: 256 # The default value is available processors count * 2.
+ executor.size: 128 # Infinite by default.
+ proxy.frontend.flush.threshold: 128 # The default value is 128.
+ # LOCAL: Proxy will run with LOCAL transaction.
+ # XA: Proxy will run with XA transaction.
+ # BASE: Proxy will run with B.A.S.E transaction.
+ proxy.transaction.type: LOCAL
+ proxy.opentracing.enabled: false
+ proxy.hint.enabled: false
+ query.with.cipher.column: true
+ sql.show: false
+ allow.range.query.with.inline.sharding: false
+```
+
+config-sharding.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
```
-[](https://shardingsphere.apache.org/document/current/img/stress-test/sysbench_test_process.jpg)
+config-master_slave.yaml
-Sysbench is a scriptable multi-threaded benchmark tool based on LuaJIT. It is
most frequently used for database benchmarks
-The scripts contained in sysbench, covered a lot of database test situation,
it's very easy to test database performance.
+```yaml
+schemaName: sbtest
-| Script | SQL
|
-| ----------------------- |
------------------------------------------------------------ |
-| oltp\_point\_select | SELECT c FROM sbtest1 WHERE id=?
|
-| oltp\_read\_only | COMMIT <br> SELECT c FROM sbtest1 WHERE id=? |
-| oltp\_write\_only | COMMIT <br> UPDATE sbtest1 SET k=k+1 WHERE id=?
<br> UPDATE sbtest6 SET c=? WHERE id=? <br> DELETE FROM sbtest1 WHERE id=?
<br> INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?) <br> BEGIN |
-| oltp\_read\_write | COMMIT <br> SELECT c FROM sbtest1 WHERE id=?
<br> UPDATE sbtest3 SET k=k+1 WHERE id=? <br> UPDATE sbtest10 SET c=? WHERE
id=? <br> DELETE FROM sbtest8 WHERE id=? <br> INSERT INTO sbtest8 (id, k, c,
pad) VALUES (?, ?, ?, ?) <br> BEGIN |
-| oltp\_update\_index | UPDATE sbtest1 SET k=k+1 WHERE id=? |
-| oltp\_update\_non\_index | UPDATE sbtest1 SET c=? WHERE id=? |
-| oltp\_delete | DELETE FROM sbtest1 WHERE id=? |
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
-By sysbench, test `Proxy + Database +Sharding`、`Direct to Database` and
compare these result
-Following is the test script for proxy by sysbench:
+masterSlaveRule:
+ name: ms_ds
+ masterDataSourceName: ds_0
+ slaveDataSourceNames:
+ - ds_0
+ - ds_0
+```
-```bash
-# clean and prepare the test data for sysbench. need to create a schema called
sbtest before execute the following command
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off cleanup
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=10 --time=3600 --threads=10
--max-requests=0 --percentile=99 --mysql-ignore-errors="all"
--rand-type=uniform --range_selects=off --auto_inc=off prepare
-
-# start to test by corresponding script
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run
-sysbench oltp\_read\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_read\_only.txt
-sysbench oltp\_point\_select --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_point\_select.txt
-sysbench oltp\_read\_write --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_read\_write.txt
-sysbench oltp\_write\_only --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_write\_only.txt
-sysbench oltp\_update\_index --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_update\_index.txt
-sysbench oltp\_update\_non\_index --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_update\_non\_index.txt
-sysbench oltp\_delete --mysql-host=${SHARDINGSPHERE_PROXY_IP}
--mysql-port=3307 --mysql-user=root --mysql-password='root' --mysql-db=sbtest
--tables=10 --table-size=1000000 --report-interval=5 --time=1800
--threads=${THREADS} --max-requests=0 --percentile=99
--mysql-ignore-errors="all" --range_selects=off --rand-type=uniform
--auto_inc=off run | tee oltp\_delete.txt
-```
-
-## Test Result
-
-`point_select` as most base test case, it's very obvious to test the
performance between different databases and product in ShardingSphere.Following
is the QPS result for MySQL and ShardingSphere
-
-| Thread | MySQL | ShardingSphere-Proxy(Sharding) |
ShardingSphere-JDBC(Sharding by JMH) |
-| :----- | :------ | :----------------------------- |
:----------------------------------- |
-| 20 | 154,408 | 50,042 | 101,687
|
-| 100 | 283,918 | 107,488 | 245,676
|
-| 200 | 281,902 | 110,278 | 252,621
|
-
-> Sysbench is written by C language, so it could not test
ShardingSphere-JDBC.Here by, the tool for testing ShardingSphere-JDBC, is a
test tool from OpenJDK, called JMH
-Other Test Result
-
-### MySQL Test Result :
-| MySQL | oltp\_read\_only | oltp\_point\_select | oltp\_read\_write |
oltp\_write\_only | oltp\_update\_index | oltp\_update\_non\_index |
oltp\_delete |
-| --------- | -------------- | ----------------- | --------------- |
--------------- | ----------------- | --------------------- | ----------- |
-| thread20 | 172,640 | 154,408 | 63,520 | 33,890
| 12,779 | 14,256 | 24,318 |
-| thread100 | 308,513 | 283,918 | 107,942 | 50,664
| 18,659 | 18,350 | 29,799 |
-| thread200 | 309,668 | 281,902 | 125,311 | 64,977
| 21,181 | 20,587 | 34,745 |
-
-### ShardingSphere-Proxy + MySQL + Sharding Test Result :
-| ShardingSphere-Proxy\_Sharding\_MySQL | oltp\_read\_only |
oltp\_point\_select | oltp\_read\_write | oltp\_write\_only |
oltp\_update\_index | oltp\_update\_non\_index | oltp\_delete |
-| ----------------------------------- | -------------- | ----------------- |
--------------- | --------------- | ----------------- | --------------------- |
----------- |
-| thread20 | 53,953 | 50,042 |
41,929 | 36,395 | 21,700 | 23,863 |
34,000 |
-| thread100 | 117,897 | 107,488 |
104,338 | 74,393 | 38,222 | 39,742 |
93,573 |
-| thread200 | 113,608 | 110,278 |
110,829 | 84,354 | 46,583 | 45,283 |
104,681 |
-
-### ShardingSphere-JDBC + MySQL + Sharding Test Result :
-| ShardingSphere-JDBC\_Sharding\_MySQL | oltp\_point\_select |
-| ---------------------------------- | ----------------- |
-| thread20 | 101,687 |
-| thread100 | 245,676 |
-| thread200 | 252,621 |
-
-### PostgreSQL Test Result :
-| PostgreSQL | oltp\_read\_only | oltp\_point\_select | oltp\_read\_write |
oltp\_write\_only | oltp\_update\_index | oltp\_update\_non\_index |
oltp\_delete |
-| ---------- | -------------- | ----------------- | --------------- |
--------------- | ----------------- | --------------------- | ----------- |
-| thread20 | 198,943 | 179,174 | 3,594 | 1,504
| 669 | 1,240 | 1,502 |
-| thread100 | 364,045 | 302,767 | 3,300 | 1,469
| 704 | 1,236 | 1,460 |
-| thread200 | 347,426 | 280,177 | 3,261 | 1,575
| 688 | 1,209 | 1,518 |
-
-### ShardingSphere-Proxy + PostgreSQL + Sharding Test Result :
-| ShardingSphere-Proxy\_Sharding\_PostgreSQL | oltp\_read\_only |
oltp\_point\_select | oltp\_read\_write | oltp\_write\_only |
oltp\_update\_index | oltp\_update\_non\_index | oltp\_delete |
-| ---------------------------------------- | -------------- |
----------------- | --------------- | --------------- | ----------------- |
--------------------- | ----------- |
-| thread20 | 52,831 | 56,259
| 2,666 | 1,233 | 583 | 826
| 989 |
-| thread100 | 121,476 | 126,167
| 3,187 | 1,160 | 555 | 827
| 1,053 |
-| thread200 | 118,351 | 122,423
| 3,254 | 1,125 | 544 | 785
| 1,016 |
-
-### ShardingSphere-JDBC + PostgreSQL + Sharding Test Result :
-| ShardingSphere-JDBC\_Sharding\_PostgreSQL | oltp\_point\_select |
-| --------------------------------------- | ----------------- |
-| thread20 | 112,977 |
-| thread100 | 280,439 |
-| thread200 | 284,474 |
+config-sharding-master_slave.yaml
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+ keyGenerator:
+ type: SNOWFLAKE
+ column: id
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+
+ masterSlaveRules:
+ ds_0:
+ masterDataSourceName: primary_ds_0
+ slaveDataSourceNames: [primary_ds_0, primary_ds_0]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+ ds_1:
+ masterDataSourceName: primary_ds_1
+ slaveDataSourceNames: [primary_ds_1, primary_ds_1]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+```
+
+config-encrypt.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ connectionTimeoutMilliseconds: 30000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 256
+
+encryptRule:
+ encryptors:
+ encryptor_md5:
+ type: md5
+ tables:
+ sbtest1:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest2:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest3:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest4:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest5:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest6:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest7:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest8:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest9:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+ sbtest10:
+ columns:
+ pad:
+ cipherColumn: pad
+ encryptor: encryptor_md5
+```
+
+#### 3.0.0 version
+
+server.yaml
+
+```yaml
+authentication:
+ username: root
+ password: root
+
+props:
+ max.connections.size.per.query: 10
+ acceptor.size: 256 # The default value is available processors count * 2.
+ executor.size: 128 # Infinite by default.
+ proxy.frontend.flush.threshold: 128 # The default value is 128.
+ # LOCAL: Proxy will run with LOCAL transaction.
+ # XA: Proxy will run with XA transaction.
+ # BASE: Proxy will run with B.A.S.E transaction.
+ proxy.transaction.type: LOCAL
+ proxy.opentracing.enabled: false
+ sql.show: false
+```
+
+config-sharding.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+ ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+```
+
+config-master_slave.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+masterSlaveRule:
+ name: ms_ds
+ masterDataSourceName: ds_0
+ slaveDataSourceNames:
+ - ds_0
+ - ds_0
+```
+
+config-sharding-master_slave.yaml
+
+```yaml
+schemaName: sbtest
+
+dataSources:
+ primary_ds_0:
+ url:
jdbc:mysql://${host-mysql-1}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+ primary_ds_1:
+ url:
jdbc:mysql://${host-mysql-2}:3306/sbtest?serverTimezone=UTC&useSSL=false
+ username: root
+ password:
+ autoCommit: true
+ connectionTimeout: 30000
+ idleTimeout: 60000
+ maxLifetime: 1800000
+ maximumPoolSize: 256
+
+shardingRule:
+ tables:
+ sbtest1:
+ actualDataNodes: ds_${0..1}.sbtest1_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest1_${id % 100}
+ sbtest2:
+ actualDataNodes: ds_${0..1}.sbtest2_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest2_${id % 100}
+ sbtest3:
+ actualDataNodes: ds_${0..1}.sbtest3_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest3_${id % 100}
+ sbtest4:
+ actualDataNodes: ds_${0..1}.sbtest4_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest4_${id % 100}
+ sbtest5:
+ actualDataNodes: ds_${0..1}.sbtest5_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest5_${id % 100}
+ sbtest6:
+ actualDataNodes: ds_${0..1}.sbtest6_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest6_${id % 100}
+ sbtest7:
+ actualDataNodes: ds_${0..1}.sbtest7_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest7_${id % 100}
+ sbtest8:
+ actualDataNodes: ds_${0..1}.sbtest8_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest8_${id % 100}
+ sbtest9:
+ actualDataNodes: ds_${0..1}.sbtest9_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest9_${id % 100}
+ sbtest10:
+ actualDataNodes: ds_${0..1}.sbtest10_${0..99}
+ tableStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: sbtest10_${id % 100}
+
+ defaultDatabaseStrategy:
+ inline:
+ shardingColumn: id
+ algorithmExpression: ds_${id % 2}
+
+ masterSlaveRules:
+ ds_0:
+ masterDataSourceName: primary_ds_0
+ slaveDataSourceNames: [primary_ds_0, primary_ds_0]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+ ds_1:
+ masterDataSourceName: primary_ds_1
+ slaveDataSourceNames: [primary_ds_1, primary_ds_1]
+ loadBalanceAlgorithmType: ROUND_ROBIN
+```
+
+config-encrypt.yaml
+
+```
+Unsupported
+```
+
+## Appendix 2
+
+plot_graph.py
+
+```python
+import sys
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def generate_graph(path, case_name):
+ dataset = {
+ 'build_num': [],
+ 'master_version': [],
+ 'master_xa': [],
+ '4.1.1_version': [],
+ '3.0.0_version': [],
+ 'mysql_server': []
+ }
+ with open(path + '/.build_number.txt') as builds:
+ for line in builds:
+ dataset['build_num'].append(int(line))
+ generate_data(path, case_name, dataset)
+ print(dataset)
+ fig, ax = plt.subplots()
+ ax.grid(True)
+ plt.title(case_name)
+
+ data = [dataset['master_version'][-7:], dataset['master_xa'][-7:],
dataset['4.1.1_version'][-7:], dataset['3.0.0_version'][-7:],
dataset['mysql_server'][-7:]]
+ columns = dataset['build_num'][-7:]
+ rows = ['master', 'xa', '4.1.1', '3.0.0', 'mysql']
+ rcolors = plt.cm.BuPu(np.full(len(rows), 0.1))
+ ccolors = plt.cm.BuPu(np.full(len(columns), 0.1))
+ the_table = plt.table(cellText=data, rowLabels=rows, colLabels=columns,
rowColours=rcolors, colColours=ccolors,
+ loc='bottom', bbox=[0.0, -0.50, 1, .28])
+ plt.subplots_adjust(left=0.15, bottom=0.3, right=0.98)
+
+ plt.xticks(range(14))
+ ax.set_xticklabels(dataset['build_num'])
+ plt.plot(dataset['master_version'], 'o-', color='magenta',
label='master_version')
+ plt.plot(dataset['master_xa'], 'o-', color='darkviolet', label='master_xa')
+ plt.plot(dataset['4.1.1_version'], 'r--', color='blue',
label='4.1.1_version')
+ plt.plot(dataset['3.0.0_version'], 'r--', color='orange',
label='3.0.0_version')
+ plt.plot(dataset['mysql_server'], 'r--', color='lime',
label='mysql_server')
+ plt.xlim()
+ plt.legend()
+ plt.xlabel('build_num')
+ plt.ylabel('transactions per second')
+ plt.savefig('graph/' + path + '/' + case_name)
+ plt.show()
+
+
+def generate_data(path, case_name, dataset):
+ for build in dataset['build_num']:
+ fill_dataset(build, case_name, dataset, path, 'master_version',
'.master.txt')
+ fill_dataset(build, case_name, dataset, path, 'master_xa', '.xa.txt')
+ fill_dataset(build, case_name, dataset, path, '4.1.1_version',
'.4_1_1.txt')
+ fill_dataset(build, case_name, dataset, path, '3.0.0_version',
'.3_0_0.txt')
+ fill_dataset(build, case_name, dataset, path, 'mysql_server',
'.mysql.txt')
+
+
+def fill_dataset(build, case_name, dataset, path, version, suffix):
+ try:
+ with open(path + '/' + str(build) + '/' + case_name + suffix) as
version_master:
+ value = 0
+ for line in version_master:
+ if 'transactions:' in line:
+ items = line.split('(')
+ value = float(items[1][:-10])
+ dataset[version].append(value)
+ except FileNotFoundError:
+ dataset[version].append(0)
+
+
+if __name__ == '__main__':
+ path = sys.argv[1]
+ generate_graph(path, 'oltp_point_select')
+ generate_graph(path, 'oltp_read_only')
+ generate_graph(path, 'oltp_write_only')
+ generate_graph(path, 'oltp_read_write')
+ generate_graph(path, 'oltp_update_index')
+ generate_graph(path, 'oltp_update_non_index')
+ generate_graph(path, 'oltp_delete')
+```