TPC-Cとは
TPC-Cは、OLTP(オンライン取引処理)システムをテストするための仕様であり、商品販売モデルを用いてOLTPシステムを評価します。
説明
ユーザー体験と使いやすさを向上させ、すべての開発者がデータベースを使用する際に良好なパフォーマンスを得られるようにするため、OceanBaseデータベースはV4.0.0以降で多くの最適化が行われました。このパフォーマンステスト方法は、基本的なパラメータに基づいてチューニングを行い、開発者が良好なデータベースパフォーマンス体験を得られるようにします。
環境準備
テスト前に、以下の要件に従ってテスト環境を準備してください。
説明
この例はMySQLテナントを例としています。
ソフトウェア要件
JDK:JDK 1.8u131以降のバージョンを推奨します。
JDBC:
mysql-connector-java-5.1.47バージョンを推奨します。Ant:
apache-ant-1.10以降のバージョンを推奨します。BenchmarkSQL:
BenchmarkSQL 5.0バージョンを推奨します。OBClient:詳細については、OBClientドキュメントを参照してください。
OceanBaseデータベース:詳細については、OceanBaseデータベースのクイックスタートを参照してください。
IOPS:ディスクIOPSは10000以上を推奨します。
テナントの仕様設定
テナントの仕様は、OceanBase TPC-C性能テストレポートに記載されているハードウェア構成に基づいて設定されます。ご自身のデータベースのハードウェア構成に応じて、動的に調整する必要があります。
クラスタのデプロイ
今回のテストでは4台のマシンを使用します。BenchmarkSQL、ODP、OBDはそれぞれ1台のマシンに独立してデプロイされ、クライアントの負荷マシンとして機能します。OceanBaseクラスタをOBDでデプロイするには3台のマシンが必要で、OceanBaseクラスタの規模は1:1:1です。マシンをデプロイする際には一定の柔軟性が求められ、OBServerの総コア数によって以下の3つのケースに分かれます:
- OBServerの総コア数が47コア以下の場合、そのマシンには8コア64GBで十分です。
- OBServerの総コア数が48コアから72コアの間の場合、そのマシンには16コア128GBが必要です。
- OBServerの総コア数が73コア以上の場合、そのマシンには32コア128GBが必要です。
説明
クラスタをデプロイする際は、
obd cluster autodeployコマンドの使用は推奨されません。このコマンドは安定性を確保するため、リソース利用率を最大限にしません(例えば、メモリ全体を使用しないなど)。設定ファイルを個別にチューニングし、リソース利用率を最大限にすることを推奨します。デプロイが成功した後、TPC-Cテストを実行するための新しいテナントとユーザーを作成します(
sysテナントはクラスタを管理するための組み込みシステムテナントであり、直接sysテナントを使用してテストを行うことは避けてください)。テナントのprimary_zoneをRANDOMに設定します。RANDOMは、新規作成されるテーブルパーティションのリーダーがこの3台のマシンにランダムに割り当てられることを意味します。
テナントの作成
OBD CLUSTER TENANT CREATEコマンドを使用して、テスト用のテナントを作成できます。対応するSQL構文は以下のとおりです:obd cluster tenant create <DEPLOY_NAME> -n <TENANT_NAME> --max-cpu=28 --memory-size=180G -–zone-list=zone1,zone2,zone3 -–primary-zone=RANDOM --locality=F@zone1,F@zone2,F@zone3 --charset=utf8 -s 'ob_tcp_invited_nodes="%"' --optimize=<optimize>パラメータの説明は以下のとおりです:
DEPLOY_NAME:クラスタ名。TENANT_NAME:テナント名。--zone-list:テナントのゾーンリスト。--primary-zone:テナントのプライマリゾーン。--locality:ゾーン間でのレプリカの分散状況。--charset:テナントの文字セット。-s:テナントのシステム変数値。OPTIMIZE:テナントのワークロードタイプ。express_oltp、complex_oltp、olap、htap、kvの5種類があり、デフォルトのワークロードタイプはhtapで、混合OLAPおよびOLTPワークロードに適しています。
OBDデプロイの詳細については、obd cluster tenant createを参照してください。
注意
V4.3.x以降のバージョンでは、OBDを使用してデプロイする際に、構成パラメータ
scenarioを設定して適切なクラスタワークロードタイプを選択できます。設定されていない場合、デフォルトのscenarioはhtapです。例えば、
tpcc_tenantという名前のテナントを作成し、使用するクラスタ名をobperfとし、CPUコア数28コア、メモリ容量180GBのリソース構成を設定し、デフォルトのテナントワークロードタイプをクラスタのシナリオと一致させます。obd cluster tenant create obperf -n tpcc_tenant --max-cpu=28 --memory-size=180G -–zone-list=zone1,zone2,zone3 -–primary-zone=RANDOM --locality=F@zone1,F@zone2,F@zone3 --charset=utf8 -s 'ob_tcp_invited_nodes="%"' --optimize=htap説明
この例では、
--optimize=htapがデフォルトのワークロードタイプです。本番環境では、実際のクラスタタイプに応じて適切なワークロードタイプを選択してください。
テスト方法
テスト環境が準備できたら、以下の2つの方法でTPC-C性能テストを実行できます。
OBDツールを使用してTPC-Cテストをワンクリックで実行する
TPC-Cツールを使用してTPC-Cテストを手動で実行する
OBDツールを使用したTPC-Cテストのワンクリック実行
OBDスクリプトを使用して、TPC-Cテストをワンクリックで実行できます。スクリプトコマンドは以下のとおりです:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install obtpcc java
obd test tpcc obperf --tenant=tpcc_mysql --warehouses 10 --run-mins 1
上記のスクリプトを使用してTPC-Cテストを実行する前に、以下の点に注意する必要があります:
OBDを使用してTPC-Cを実行するための詳細なパラメータについては、obd test tpccを参照してください。
この例では、ほとんどのパラメータがデフォルト値を使用しています。ユーザーのシナリオでは、自分の状況に応じて一部のパラメータを調整できます。例えば、この例で使用されるクラスタ名は
obperf、テナント名はtpcc_mysqlです。OBDを使用してワンクリックテストを実行する場合、クラスタのデプロイはOBDによってインストールおよびデプロイされていなければなりません。そうでない場合、クラスタの情報を取得できず、クラスタの設定に基づくパフォーマンスチューニングができなくなります。
システムテナントのパスワードがターミナルログインによって変更され、デフォルトの空値ではない場合、まずターミナルでパスワードをデフォルト値に変更し、次に
obd cluster edit-configコマンドを使用して設定ファイル内のシステムテナントにパスワードを設定する必要があります。構成パラメータは# root_password: # root user passwordです。obd cluster edit-configコマンドの実行後、変更を有効にするためにobd cluster reloadコマンドも実行する必要があります。obd test tpccを実行すると、システムは実行手順と出力を詳細に表示します。データ量が多いほど、実行時間も長くなります。obd test tpccコマンドは、テストデータの生成、転送、OceanBaseパラメータの最適化、読み込み、テストを含むすべての操作を自動的に完了します。追加の操作は不要です。途中でエラーが発生した場合は、obd test tpccを参照して再試行できます。例えば、データの生成と転送をスキップして、直接読み込みとテストを実行します。
TPC-Cツールを使用したTPC-Cテストの手動実行
手動テストは、選択したクラスタの負荷タイプとテナントのチューニングシナリオを設定した後に実施されます。これにより、OceanBaseデータベース、特にパラメータ設定の最適化について深く理解することができます。
ステップ1:Antのインストール
以下の手順に従って、Antをインストールします。
Antのインストールパッケージをダウンロードします。
wget "http://archive.apache.org/dist/ant/binaries/apache-ant-1.10.6-bin.zip"Antをインストールします。
unzip apache-ant-1.10.6-bin.zipAntの環境変数を設定します。
[admin@obtest004 ~]$ sudo vim /etc/profile #ant export ANT_HOME=xx/apache-ant-1.10.6 export PATH=xx/apache-ant-1.10.6/bin:$PATH [admin@obtest004 ~]$ source /etc/profileAntが正常にインストールされているか確認します。
[admin@obtest004 ~]$ant -version以下のメッセージが返された場合、インストールは成功です。
Apache Ant(TM) version 1.10.6 compiled on May 2 2019
ステップ2:BenchmarkSQLのインストール
以下の手順に従って、BenchmarkSQLをインストールします。
BenchmarkSQLのインストールパッケージをダウンロードします。
詳細については、BenchmarkSQLのダウンロードURLを参照してください。
BenchmarkSQLを解凍します。
unzip ./benchmarksql-5.0.zipBenchmarkSQLをコンパイルします。
Benchmark SQLの解凍ディレクトリに移動し、Antを使用してBenchmark SQLをコンパイルします。
[admin@obtest004 ~] $ cd benchmarksql-5.0
[admin@obtest004 benchmarksql-5.0] $ ant
ステップ3:BenchmarkSQL 5.0の適応
ネイティブのBenchmarkSQL 5.0はOceanBaseデータベースのTPC-Cテストをサポートしていないため、一部のソースコードを変更して適応させる必要があります。
benchmarksql-5.0/src/client/jTPCC.javaファイルを修正し、OceanBaseデータベース関連の内容を追加します。if (iDB.equals("firebird")) dbType = DB_fireBIRD; else if (iDB.equals("oracle")) dbType = DB_ORACLE; else if (iDB.equals("postgres")) dbType = DB_POSTGRES; else if (iDB.equals("oceanbase")) //OceanBaseデータベース関連の内容を追加 dbType = DB_OCEANBASE; else { log.error("unknown database type '" + iDB + "'"); return; }benchmarksql-5.0/src/client/jTPCCConfig.javaファイルを修正し、OceanBaseデータベースタイプを追加します。public final static int DB_UNKNOWN = 0, DB_FIREBIRD = 1, DB_ORACLE = 2, DB_POSTGRES = 3, DB_OCEANBASE = 4;benchmarksql-5.0/src/client/jTPCCConnection.javaファイルを修正し、SQLサブクエリにAS Lエイリアスを追加します。default: stmtStockLevelSelectLow = dbConn.prepareStatement( "SELECT count(*) AS low_stock FROM (" + " SELECT s_w_id, s_i_id, s_quantity " + " FROM bmsql_stock " + " WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN (" + " SELECT ol_i_id " + " FROM bmsql_district " + " JOIN bmsql_order_line ON ol_w_id = d_w_id " + " AND ol_d_id = d_id " + " AND ol_o_id >= d_next_o_id - 20 " + " AND ol_o_id < d_next_o_id " + " WHERE d_w_id = ? AND d_id = ? " + " ) " + " )AS L"); // "AS L" エイリアスを追加 break;変更後のソースコードを再コンパイルします。
[admin@obtest004 ~]# cd benchmarksql-5.0 [admin@obtest004 benchmarksql-5.0]# antbenchmarksql-5.0/runディレクトリにファイルprop.oceanbaseを作成します。db=oceanbase driver=com.mysql.jdbc.Driver conn=jdbc:mysql://$host_ip:$port/$db_name?rewriteBatchedStatements=true&allowMultiQueries=true&useLocalSessionState=true&useUnicode=true&characterEncoding=utf-8&socketTimeout=30000000 //Please fill in the complete user information. user=$user@$tenant password=***** warehouses=1000 loadWorkers=40 terminals=1000 database=$db_name //To run specified transactions per terminal- runMins must equal zero runTxnsPerTerminal=0 //To run for specified minutes- runTxnsPerTerminal must equal zero runMins=5 //Number of total transactions per minute limitTxnsPerMin=0 //Set to true to run in 4.x compatible mode. Set to false to use the //entire configured database evenly. terminalWarehouseFixed=true //The following five values must add up to 100 //The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec newOrderWeight=45 paymentWeight=43 orderStatusWeight=4 deliveryWeight=4 stockLevelWeight=4 // Directory name to create for collecting detailed result data. // Comment this out to suppress. resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS osCollectorScript=./misc/os_collector_linux.py osCollectorInterval=1 //osCollectorSSHAddr=user@dbhost //osCollectorDevices=net_eth0 blk_sdaprop.oceanbaseの重要なパラメータの説明:
JDBC接続文字列:
conn=jdbc:mysql://x.x.x.x(ip):xx(port)/xxxx(dbname)?rewriteBatchedStatements=true&allowMultiQueries=true&useLocalSessionState=true&useUnicode=true&characterEncoding=utf-8&socketTimeout=3000000rewriteBatchedStatements:
データのインポートが遅い場合は、対応するテナントでデータベースにログインし、
show full processlistコマンドを使用して有効になっているかどうか確認できます。new orderトランザクションでもbatch updateが使用されているため、データインポートとベンチマークの両方で有効にする必要があります。
useLocalSessionState:autocommit、read_only、およびtransaction isolationの内部値(JDBC側のローカル値)を使用するかどうか。trueに設定することを推奨します。falseに設定すると、リモートリクエストにステートメントを送信する必要があり、リクエストの送信頻度が増加し、パフォーマンスに影響します。
terminals:同時実行数。MySQLテナント構成では、同時実行数は具体的な設定に基づいて動的に調整する必要があります。
warehouses/loadWorkers:これら2つの項目はストレステストデータ量を設定するために使用され、適宜調整できます。
numTerminals > 0 && numTerminals <= 10*numWarehouses、terminalsの範囲はこの区間内である必要があります。
benchmarksql-5.0/run/funcs.shファイルを修正し、OceanBaseデータベースタイプを追加します。function setCP() { case "$(getProp db)" in firebird) cp="../lib/firebird/*:../lib/*" ;; oracle) cp="../lib/oracle/*" if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then cp="${cp}:${ORACLE_HOME}/lib/*" fi cp="${cp}:../lib/*" ;; postgres) cp="../lib/postgres/*:../lib/*" ;; oceanbase) #OceanBaseデータベースタイプを追加 cp="../lib/oceanbase/*:../lib/*" ;; esac myCP=".:${cp}:../dist/*" export myCP }case "$(getProp db)" in firebird|oracle|postgres|oceanbase) #OceanBaseデータベースタイプを追加 ;; "") echo "ERROR: missing db= config option in ${PROPS}" >&2 exit 1 ;; *) echo "ERROR: unsupported database type 'db=$(getProp db)' in ${PROPS}" >&2 exit 1 ;; esacMySQL Java Connectorドライバーを追加します。
mysql-connector-java-5.1.47.jarの使用を推奨します。[admin@obtest004 benchmarksql-5.0]# mkdir lib/oceanbase/ [admin@obtest004 benchmarksql-5.0]# cp xx/mysql-connector-java-5.1.47.jar lib/oceanbase/benchmarksql-5.0/run/runDatabaseBuild.shファイルを修正します。AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish" # 以下のように変更します: AFTER_LOAD="indexCreates buildFinish"BenchmarkSQL 5.0のSQLを改造します。
benchmarksql-5.0/run/sql.common/tableCreates.sqlをバックアップして上書きします。CREATE TABLE bmsql_config ( cfg_name varchar(30) PRIMARY KEY, cfg_value varchar(50) ); CREATE TABLEGROUP IF NOT EXISTS tpcc_group binding true partition by hash partitions 96; CREATE TABLE bmsql_warehouse ( w_id integer not null, w_ytd decimal(12,2), w_tax decimal(4,4), 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), PRIMARY KEY(w_id) )tablegroup='tpcc_group' partition by hash(w_id) partitions 96; CREATE TABLE bmsql_district ( d_w_id integer not null, d_id integer not null, d_ytd decimal(12,2), d_tax decimal(4,4), d_next_o_id integer, 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), PRIMARY KEY (d_w_id, d_id) )tablegroup='tpcc_group' partition by hash(d_w_id) partitions 96; CREATE TABLE bmsql_customer ( c_w_id integer not null, c_d_id integer not null, c_id integer not null, c_discount decimal(4,4), c_credit char(2), c_last varchar(16), c_first varchar(16), c_credit_lim decimal(12,2), c_balance decimal(12,2), c_ytd_payment decimal(12,2), c_payment_cnt integer, c_delivery_cnt integer, 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 timestamp, c_middle char(2), c_data varchar(500), PRIMARY KEY (c_w_id, c_d_id, c_id) )tablegroup='tpcc_group' partition by hash(c_w_id) partitions 96; CREATE TABLE bmsql_history ( hist_id integer AUTO_INCREMENT, h_c_id integer, h_c_d_id integer, h_c_w_id integer, h_d_id integer, h_w_id integer, h_date timestamp, h_amount decimal(6,2), h_data varchar(24) )tablegroup='tpcc_group' partition by hash(h_w_id) partitions 96; CREATE TABLE bmsql_new_order ( no_w_id integer not null , no_d_id integer not null, no_o_id integer not null, PRIMARY KEY (no_w_id, no_d_id, no_o_id) )tablegroup='tpcc_group' partition by hash(no_w_id) partitions 96; CREATE TABLE bmsql_oorder ( o_w_id integer not null, o_d_id integer not null, o_id integer not null, o_c_id integer, o_carrier_id integer, o_ol_cnt integer, o_all_local integer, o_entry_d timestamp, PRIMARY KEY (o_w_id, o_d_id, o_id) )tablegroup='tpcc_group' partition by hash(o_w_id) partitions 96; CREATE TABLE bmsql_order_line ( ol_w_id integer not null, ol_d_id integer not null, ol_o_id integer not null, ol_number integer not null, ol_i_id integer not null, ol_delivery_d timestamp, ol_amount decimal(6,2), ol_supply_w_id integer, ol_quantity integer, ol_dist_info char(24), PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number) )tablegroup='tpcc_group' partition by hash(ol_w_id) partitions 96; CREATE TABLE bmsql_item ( i_id integer not null, i_name varchar(24), i_price decimal(5,2), i_data varchar(50), i_im_id integer, PRIMARY KEY (i_id) ); CREATE TABLE bmsql_stock ( s_w_id integer not null, s_i_id integer not null, s_quantity integer, s_ytd integer, s_order_cnt integer, s_remote_cnt integer, s_data varchar(50), 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), PRIMARY KEY (s_w_id, s_i_id) )tablegroup='tpcc_group' partition by hash(s_w_id) partitions 96;benchmarksql-5.0/run/sql.common/tableDrops.sqlファイルをバックアップして上書きします。DROP TABLE bmsql_config; DROP TABLE bmsql_new_order; DROP TABLE bmsql_order_line; DROP TABLE bmsql_oorder; DROP TABLE bmsql_history; DROP TABLE bmsql_customer; DROP TABLE bmsql_stock; DROP TABLE bmsql_item; DROP TABLE bmsql_district; DROP TABLE bmsql_warehouse; DROP TABLEGROUP tpcc_group;benchmarksql-5.0/run/sql.common/indexCreates.sqlファイルをバックアップして上書きします。CREATE INDEX bmsql_customer_idx1 ON bmsql_customer (c_w_id, c_d_id, c_last, c_first) local; CREATE INDEX bmsql_oorder_idx1 ON bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id) local;benchmarksql-5.0/run/sql.common/indexDrops.sqlファイルをバックアップして上書きします。ALTER TABLE bmsql_customer DROP INDEX bmsql_customer_idx1; ALTER TABLE bmsql_oorder DROP INDEX bmsql_oorder_idx1;
ステップ4:環境のチューニングを行う
ODPのチューニング。
システムテナント(
sysテナント)で以下のステートメントを実行して、関連パラメータを設定してください。ALTER PROXYCONFIG SET proxy_mem_limited='4G'; ALTER PROXYCONFIG SET enable_compression_protocol=false;OceanBaseデータベースのチューニング。
システムテナント(
sysテナント)で以下のステートメントを実行して、関連パラメータを設定してください。ALTER SYSTEM SET enable_sql_audit=false; select sleep(5); ALTER SYSTEM SET enable_perf_event=false; ALTER SYSTEM SET syslog_level='PERF'; ALTER SYSTEM SET enable_record_trace_log=false;パラメータの設定が完了したら、
obd cluster restart $cluster_nameコマンドを実行してクラスタを再起動してください。
ステップ5:TPC-Cテストを実行する
benchmarksql-5.0/run ディレクトリで以下のコマンドを実行して、TPC-Cテストを実行します。
環境を初期化します。
./runDatabaseDestroy.sh prop.oceanbaseテーブルを作成し、データをインポートします。
./runDatabaseBuild.sh prop.oceanbaseマージを実行します(
sysテナントにログインする必要があります)。Majorマージは、現在の大きなバージョンのSSTableとMemTableを前の大きなバージョンのフルスタティックデータとマージし、ストレージ層の統計情報をより正確にし、生成される実行計画をより安定させます。
MySQL [(none)]> USE oceanbase Database changed MySQL [oceanbase]> ALTER SYSTEM major freeze tenant=<your tenant name>; Query OK, 0 rows affectedマージが完了したかどうかを確認します。
MySQL [oceanbase]> SELECT FROZEN_SCN, LAST_SCN FROM oceanbase.CDB_OB_MAJOR_COMPACTION; +---------------------+---------------------+ | FROZEN_SCN | LAST_SCN | +---------------------+---------------------+ | 1667239201167716767 | 1667239201167716767 | | 1667239200111919300 | 1667239200111919300 | | 1667239201167452168 | 1667239201167452168 | | 1667239201168053124 | 1667239201168053124 | | 1667239201167520213 | 1667239201167520213 | +---------------------+---------------------+すべての
FROZEN_SCNとLAST_SCNの値が等しい場合、マージが完了したことを示します。統計情報を手動で収集します。
obclient -h$host_ip -P$host_port -u$user@$tenant -p$password -A -D$databaseコマンドを実行して、テストテナントに入ります。call dbms_stats.gather_schema_stats('$db_name',degree=>96);以下のコマンドを実行して、ストレステストを実行します。
./runBenchmark.sh prop.oceanbase
テスト結果については、OceanBase TPC-C性能テストレポートを参照してください。
よくあるエラーメッセージ
BenchmarkSQLツールをどのように停止するか。
到期時自動停止:prop.oceanbase内のrunMins設定値に依存します。
強制停止:
ps auxf | grep java --を実行してJavaプロセスを削除し、runBenchmarkプロセスを終了します。mainタイプが見つからない。エラーメッセージは以下のとおりです:
Could not find the main class: ExecJDBC. Program will exit.考えられる原因は2つあります:JDKをアップグレードするか、JDBCバージョンをアップグレードするかのいずれかです。次のコマンドを実行してJavaをインストールします:
sudo yum install jdkターミナル数が無効です。エラーメッセージは以下のとおりです:
Invalid number of terminals!これはprop.oceanbase内で設定されたterminals値が正しくないためです。
numTerminals > 0 && numTerminals <= 10 * numWarehousesの範囲内のterminals値を入力する必要があります。トランザクションタイムアウト。エラーメッセージは以下のとおりです:
transaction timeoutタイムアウト時間を延長する必要があります。テストテナントで次のコマンドを実行します:
set global ob_query_timeout=36000000000;set global ob_trx_timeout=36000000000。