09、Sharding-Sphere 实战:tpcc-MySQL 压测

一、环境

MySQL版本:5.7.34
ShardingSphere-Proxy:5.1.2

MySQL客户端与tpcc-mysql:172.18.16.156
ShardingSphere-Proxy Cluster模式:172.18.10.66:3307; 172.18.18.102:3307
底层资源库:172.18.10.66:3306 db1、db2; 172.18.18.102:3306 db1、db2

二、准备

在172.18.16.156执行以下步骤:

1. 建库

# 连接ShardingSphere-Proxy
mysql -u root -h 172.18.10.66 -P 3307 -p123456

-- 建库
create database sharding_db;
use sharding_db;

-- 查看运行模式
show instance mode\G

2. 添加资源

add resource 
resource_1 (host=172.18.10.66, port=3306, db=db1, user=wxy, password=mypass),
resource_2 (host=172.18.10.66, port=3306, db=db2, user=wxy, password=mypass),
resource_3 (host=172.18.18.102, port=3306, db=db1, user=wxy, password=mypass),
resource_4 (host=172.18.18.102, port=3306, db=db2, user=wxy, password=mypass);

3. 创建分片规则

-- 用以各个表中的 warehouse id 作为分片键。

create sharding table rule warehouse (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule district (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=d_w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule customer (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=c_w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule history (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=h_c_w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule new_orders (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=no_w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule orders (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=o_w_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule order_line (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=ol_w_id,type(name=hash_mod,properties("sharding-count"=16)));

-- 表 item 没有 warehouse id,取 i_id 作为分片键
create sharding table rule item (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=i_id,type(name=hash_mod,properties("sharding-count"=16)));

create sharding table rule stock (
resources(resource_1,resource_2,resource_3,resource_4),
sharding_column=s_w_id,type(name=hash_mod,properties("sharding-count"=16)));

-- 创建绑定表规则
create sharding binding table rules (warehouse, customer);
create sharding binding table rules (stock, district, order_line);

4. 建表

create table warehouse (
w_id smallint not null,
w_name varchar(10), 
w_street_1 varchar(20), 
w_street_2 varchar(20), 
w_city varchar(20), 
w_state char(2), 
w_zip char(9), 
w_tax decimal(4,2), 
w_ytd decimal(12,2),
primary key (w_id) );

create table district (
d_id tinyint not null, 
d_w_id smallint not null, 
d_name varchar(10), 
d_street_1 varchar(20), 
d_street_2 varchar(20), 
d_city varchar(20), 
d_state char(2), 
d_zip char(9), 
d_tax decimal(4,2), 
d_ytd decimal(12,2), 
d_next_o_id int,
primary key (d_w_id, d_id) );

create table customer (
c_id int not null, 
c_d_id tinyint not null,
c_w_id smallint not null, 
c_first varchar(16), 
c_middle char(2), 
c_last varchar(16), 
c_street_1 varchar(20), 
c_street_2 varchar(20), 
c_city varchar(20), 
c_state char(2), 
c_zip char(9), 
c_phone char(16), 
c_since datetime, 
c_credit char(2), 
c_credit_lim bigint, 
c_discount decimal(4,2), 
c_balance decimal(12,2), 
c_ytd_payment decimal(12,2), 
c_payment_cnt smallint, 
c_delivery_cnt smallint, 
c_data text,
PRIMARY KEY(c_w_id, c_d_id, c_id) );

create table history (
h_c_id int, 
h_c_d_id tinyint, 
h_c_w_id smallint,
h_d_id tinyint,
h_w_id smallint,
h_date datetime,
h_amount decimal(6,2), 
h_data varchar(24) );

create table new_orders (
no_o_id int not null,
no_d_id tinyint not null,
no_w_id smallint not null,
PRIMARY KEY(no_w_id, no_d_id, no_o_id));

create table orders (
o_id int not null, 
o_d_id tinyint not null, 
o_w_id smallint not null,
o_c_id int,
o_entry_d datetime,
o_carrier_id tinyint,
o_ol_cnt tinyint, 
o_all_local tinyint,
PRIMARY KEY(o_w_id, o_d_id, o_id) );

create table order_line ( 
ol_o_id int not null, 
ol_d_id tinyint not null,
ol_w_id smallint not null,
ol_number tinyint not null,
ol_i_id int, 
ol_supply_w_id smallint,
ol_delivery_d datetime, 
ol_quantity tinyint, 
ol_amount decimal(6,2), 
ol_dist_info char(24),
PRIMARY KEY(ol_w_id, ol_d_id, ol_o_id, ol_number) );

create table item (
i_id int not null, 
i_im_id int, 
i_name varchar(24), 
i_price decimal(5,2), 
i_data varchar(50),
PRIMARY KEY(i_id) );

create table stock (
s_i_id int not null, 
s_w_id smallint not null, 
s_quantity smallint, 
s_dist_01 char(24), 
s_dist_02 char(24),
s_dist_03 char(24),
s_dist_04 char(24), 
s_dist_05 char(24), 
s_dist_06 char(24), 
s_dist_07 char(24), 
s_dist_08 char(24), 
s_dist_09 char(24), 
s_dist_10 char(24), 
s_ytd decimal(8,0), 
s_order_cnt smallint, 
s_remote_cnt smallint,
s_data varchar(50),
PRIMARY KEY(s_w_id, s_i_id) );

此时每个底层库中共建了36张表。

5. 创建索引

CREATE INDEX idx_customer ON customer (c_w_id,c_d_id,c_last,c_first);
CREATE INDEX idx_orders ON orders (o_w_id,o_d_id,o_c_id,o_id);
CREATE INDEX fkey_stock_2 ON stock (s_i_id);
CREATE INDEX fkey_order_line_2 ON order_line (ol_supply_w_id,ol_i_id);

三、测试

在172.18.16.156执行以下步骤:

1. 生成数据

cd tpcc-mysql-master
./tpcc_load -h172.18.10.66 -P3307 -d sharding_db -u root -p "123456" -w 10
# 在底层库验证数据分片
mysql -u wxy -h 172.18.10.66 -P 3306 -pmypass -e "select table_name,table_rows from information_schema.tables where table_schema in ('db1','db2') order by table_name;"

mysql -u wxy -h 172.18.18.102 -P 3306 -pmypass -e "select table_name,table_rows from information_schema.tables where table_schema in ('db1','db2') order by table_name;"

2. 执行测试

./tpcc_start -h172.18.10.66 -P3307 -d sharding_db -u root -p "123456" -w 10 -c 32 -r 60 -l 300
***************************************
***easy### TPC-C Load Generator ***
***************************************
option h with value '172.18.10.66'
option P with value '3307'
option d with value 'sharding_db'
option u with value 'root'
option p with value '123456'
option w with value '10'
option c with value '32'
option r with value '60'
option l with value '300'
<Parameters>
     [server]: 172.18.10.66
     [port]: 3307
     [DBname]: sharding_db
       [user]: root
       [pass]: 123456
  [warehouse]: 10
 [connection]: 32
     [rampup]: 60 (sec.)
    [measure]: 300 (sec.)

RAMP-UP TIME.(60 sec.)

MEASURING START.

  10, trx: 3062, 95%: 111.463, 99%: 189.563, max_rt: 711.993, 3069|651.786, 306|217.951, 309|776.611, 303|592.028
  20, trx: 3022, 95%: 110.037, 99%: 199.638, max_rt: 391.838, 3015|310.603, 303|73.809, 303|668.539, 304|428.889
  30, trx: 2963, 95%: 116.442, 99%: 202.770, max_rt: 311.041, 2965|268.137, 295|60.957, 296|522.173, 295|257.502
  40, trx: 3048, 95%: 111.430, 99%: 165.624, max_rt: 313.213, 3046|297.311, 306|86.424, 300|413.657, 307|277.432
  50, trx: 3013, 95%: 112.468, 99%: 181.131, max_rt: 268.876, 3020|248.877, 301|86.293, 303|365.797, 300|270.426
  60, trx: 2900, 95%: 123.515, 99%: 218.853, max_rt: 315.579, 2891|287.822, 289|80.036, 291|464.209, 290|268.983
  70, trx: 2959, 95%: 119.015, 99%: 217.808, max_rt: 410.160, 2967|306.270, 297|166.883, 296|598.515, 295|317.983
  80, trx: 2996, 95%: 120.340, 99%: 188.488, max_rt: 294.824, 2993|261.048, 299|115.812, 297|445.097, 300|256.325
  90, trx: 2896, 95%: 114.678, 99%: 208.556, max_rt: 409.167, 2901|507.539, 290|218.929, 291|666.638, 290|359.124
 100, trx: 3017, 95%: 114.816, 99%: 183.039, max_rt: 348.340, 2998|300.141, 301|43.226, 305|441.041, 302|273.250
 110, trx: 2999, 95%: 109.676, 99%: 155.068, max_rt: 338.924, 3014|290.687, 301|152.292, 296|409.574, 299|307.160
 120, trx: 2987, 95%: 112.536, 99%: 196.613, max_rt: 376.467, 2984|403.399, 298|33.264, 301|476.778, 298|269.229
 130, trx: 3075, 95%: 102.379, 99%: 182.382, max_rt: 268.987, 3073|325.951, 308|24.234, 308|444.558, 309|291.164
 140, trx: 2990, 95%: 109.544, 99%: 171.065, max_rt: 303.076, 2998|298.628, 299|61.614, 296|427.772, 300|260.419
 150, trx: 3008, 95%: 114.609, 99%: 172.660, max_rt: 317.678, 2996|252.899, 300|69.993, 303|448.189, 301|271.076
 160, trx: 2997, 95%: 118.340, 99%: 200.656, max_rt: 354.310, 2999|341.182, 300|35.762, 299|430.661, 299|266.809
 170, trx: 2926, 95%: 116.617, 99%: 211.701, max_rt: 501.076, 2937|329.547, 293|122.047, 291|641.033, 293|264.955
 180, trx: 3080, 95%: 104.672, 99%: 175.421, max_rt: 293.909, 3067|235.559, 307|62.325, 308|558.521, 308|262.407
 190, trx: 3030, 95%: 108.793, 99%: 169.232, max_rt: 270.285, 3043|205.226, 304|23.850, 303|477.463, 302|262.811
 200, trx: 2975, 95%: 108.403, 99%: 191.961, max_rt: 328.167, 2967|313.387, 296|109.531, 296|448.603, 297|296.855
 210, trx: 2970, 95%: 123.257, 99%: 198.328, max_rt: 351.876, 2973|275.930, 299|100.404, 302|382.861, 298|281.152
 220, trx: 3013, 95%: 114.233, 99%: 181.239, max_rt: 296.523, 3006|369.986, 300|112.732, 297|401.169, 301|313.082
 230, trx: 2996, 95%: 108.630, 99%: 168.524, max_rt: 283.116, 2989|256.835, 300|144.143, 303|469.823, 302|280.525
 240, trx: 3021, 95%: 111.363, 99%: 176.264, max_rt: 251.433, 3038|261.560, 303|58.479, 300|478.107, 300|253.895
 250, trx: 3100, 95%: 100.256, 99%: 160.451, max_rt: 228.671, 3096|273.776, 309|36.466, 312|397.942, 308|242.824
 260, trx: 2980, 95%: 114.712, 99%: 188.149, max_rt: 264.282, 2976|258.548, 299|45.803, 299|569.312, 300|265.342
 270, trx: 2957, 95%: 119.479, 99%: 203.195, max_rt: 317.772, 2957|287.913, 295|85.910, 294|434.697, 297|328.697
 280, trx: 2941, 95%: 117.036, 99%: 237.063, max_rt: 359.832, 2947|395.890, 294|80.413, 295|552.508, 292|278.432
 290, trx: 2997, 95%: 113.960, 99%: 186.691, max_rt: 359.951, 2995|260.096, 299|35.765, 296|551.468, 300|266.878
 300, trx: 3023, 95%: 114.164, 99%: 196.613, max_rt: 293.087, 3019|446.366, 303|138.081, 306|409.839, 301|291.629

STOPPING THREADS................................

<Raw Results>
  [0] sc:0 lt:89941  rt:0  fl:0 avg_rt: 63.7 (5)
  [1] sc:895 lt:89044  rt:0  fl:0 avg_rt: 25.5 (5)
  [2] sc:5709 lt:3285  rt:0  fl:0 avg_rt: 6.5 (5)
  [3] sc:2498 lt:6498  rt:0  fl:0 avg_rt: 176.2 (80)
  [4] sc:0 lt:8991  rt:0  fl:0 avg_rt: 204.6 (20)
 in 300 sec.

<Raw Results2(sum ver.)>
  [0] sc:0  lt:89941  rt:0  fl:0 
  [1] sc:895  lt:89045  rt:0  fl:0 
  [2] sc:5709  lt:3285  rt:0  fl:0 
  [3] sc:2498  lt:6498  rt:0  fl:0 
  [4] sc:0  lt:8991  rt:0  fl:0 

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.48% (>=43.0%) [OK]
   Order-Status: 4.35% (>= 4.0%) [OK]
       Delivery: 4.35% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 0.00%  [NG] *
        Payment: 1.00%  [NG] *
   Order-Status: 63.48%  [NG] *
       Delivery: 27.77%  [NG] *
    Stock-Level: 0.00%  [NG] *

<TpmC>
                 17988.199 TpmC