こんにちは、SBC エンジニアのZです。
POLARDBはアリババクラウドが開発した次世代のクラウドネイティブリレーショナルデータベースです、全称はApsaraDB for POLARDBです。MySQLとPostgreSQLとの完全互換性を持ち、既存のリレーションナルデータベースサービスのApsaraDB for RDS より性能は大幅に向上されているとアナウンスされています。
さらにPOLARDB8.0が2019年9月にリリースされ、MySQL8.0を完全互換しているクラウドデータベースサービスとして使えるようになりました。
今回は集計・意思決定 (DSS :Decision Support System)でよく使われているベンチマークツールTPC-HをPOLARDB8.0で実行してみました。TPC-Hは複雑な検索・集計SQLを実行して集計性能を測るベンチマークツールです。
詳細についてはこちらの定義書(PDFファイル)をご覧ください。
追記:POLARDBは2020年5月より日本リージョンがリリースされました。
準備作業
1. TPC-Hのダウンロード
TPC-H_Toolsのダウンロードページから,TPC-Toolsを入手できます。
• メールアドレスを入力してダウンロードキー付きのURLが送信されますので,それをクリックしてダウンロードできます。
• 2019年11月時点でTPC-H_Toolsバージョンは2.18.0です。
2. POLARDBの購入&データベースの用意
Alibaba Cloudのアカウントを持っていれば、ログインして、POLARDBの コンソールから購入できます。下記のようにコンソールよりクラスタ作成ボタンを押して、 購入ページに移します。
ほとんどのAlibaba Cloudサービスと同じく、サブスクリプションとPay-As-You-Goの二種類の課金方法があります、簡単に検証するだけなので、Pay-As-You-Goを選びます。
・China Hangzhouリージョンを選んで、デフォルトでマルチゾーン構成であることがわかります。(日本リージョンにもまもなく展開されます。)
・同じリージョンでVPCとVSwitchが作成されていれば、そのまま使えます。
・データベースは最新版のMySQL8.0を選択します。
・デフォルトでは2ノード構成、後ほどノード追加も自由にできます。
Buy Nowをクリックすれば、支払い画面に移し、問題なければ規約を同意して購入します。 数分でPOLARDBのクラスタが準備できます。
クラスタ作成完了したら、ホワイトリスト設定とアカウント作成が必要です。
下記のドキュメントを参考したら良いかと思います。
tpchというデータベースを作成します。
以上でデータベースの準備が完了します。
POLARDBがマネジドサービスのため、リモートから接続するクラアントサーバーも用意する必要あります。
POLARDBと同じリージョンのほうが良いので、China HangzhouでAlibaba CloudのECSを一台購入します。
このクライアントサーバからTPC-Hを実行してみます。
3.TPC-H インストール
テスト環境が用意できましたので、早速 ECS に TPC-H をインストールします。
また、記事 https://qiita.com/myoshimi/items/bd460164af48ece1ab2d
のおかげで TPC-H のデータ(生成用のddlファイル)とクエリをMySQLで実行できるようにするパッチ(tpch-patch)が存在していることもわかり、合わせてダウンロードしました。
ダウンロードURL:
https://github.com/itiut/tpch-patches
パッチを解凍して、install.shスクリプトを実行することで、データロードプログラムのDBGENとクエリ作成プログラムのQGEN、ddlファイル全部用意してくれます。
下記実行手順になります:
cd [execute path]
mkdir -p ./{src,bin,share}
unzip tpch-patches-master.zip
cp tpc-h-tool.zip ./tpch-patches-master/
cd tpch-patches-master
./install.sh mysql (※)
※説明:
install.shをバージョンに合わせて変更する必要があります。下記2箇所:
①
-TPCH_PROG=tpch_2_17_0
→
+TPCH_PROG=tpc-h-tool
+TPCH_VER=2.18.0_rc2
②
TPC-Hツールすでにローカルにダウンロードしましたので、自動ダウンロードしないように変更します。
こちらの行をコメントアウトか削除する:
- if [ ! -f $TPCH_PROG.zip ]; then
- echo "Download $TPCH_PROG.zip ..."
- curl -LO http://www.tpc.org/tpch/spec/$TPCH_PROG.zip
- fi
- unzip $TPCH_PROG
こちらの行を追加する:
+ unzip $TPCH_PROG.zip
rm -rf __MACOSX
+ mv $TPCH_VER $SRC_DIR/$TPCH_PROG
問題なく実行できたら、[execute path]/bin フォルダーの下に dbgen と qgen ができます。
dbgen がテーブルデータを作成するためのプログラムになります。
qgen がクエリを作成するプログラムです。
ベンチマークテスト
1. テーブル作成
TPC-H のフォルダで先ほどできた DDL を実行して定義したテーブルを作成します。
cd [execute path]/share/dbgen
mysql -h[POLARDBの接続URL] -u[アカウント名] -p[パスワード] -Dtpch < dss.ddl
下記のように8つのテーブルができます。
MySQL [tpch]> show tables;
+----------------+
| Tables_in_tpch |
+----------------+
| customer |
| lineitem |
| nation |
| orders |
| part |
| partsupp |
| region |
| supplier |
+----------------+
8 rows in set (0.01 sec)
2. データファイル作成
dbgenコマンドでベンチマーク用にデータを作成します:
cd [execute path]/bin
./dbgen -s 10
説明:
-s オプションで,ScaleFactorを指定して、データの量を示す数値(GB)です。
この数値が大きいと、データ作成とロードで恐ろしいぐらい時間かかります、今回では控えめで10を設定します。
TPC-Hで使用されるデータが,tblファイルとして作られます、そちらのファイルを適当なフォルダに移します。
mkdir [execute path]/bin/tpch #tpchがデータベース名
mv *.tbl [execute path]/bin/tpch
データファイルをPOLARDBにロードします:
cd ~/bin/tpch
for tbl_file in *.tbl;
do
mysql -h [POLARDBの接続アドレス] -u [アカウント名] -p[パスワード] –Dtpch -e \
"LOAD DATA LOCAL INFILE '$tbl_file' INTO TABLE $(basename $tbl_file .tbl) FIELDS TERMINATED by '|' LINES TERMINATED BY '\n';";
done
説明:
MySQL8.0でLOAD DATA実行する際、いとつ注意点があります。
上記のコマンドのままだと、エラーで失敗します。
ERROR 1148 (42000) at line 1: The used command is not allowed with this MySQL version
MySQL8.0では 仕様として、サーバーサイドとクライアントサイドの両方でLOAD DATA LOCAL INFILEをデフォルトでは使用できないようにしているようです。デフォルトでOFFに設定されています、グローバル変数のため、管理者権限がないと変更できないが、RDSではコンソールでパラメータlocal_infileを変更できます。
確認したところ、設定変更されています:
mysql> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
LOAD DATAコマンドにもオプション--local-infile=1を追加することで、問題なく実行できました。
3.インデックス付与
データロードが完了後、Constraint keyとかインデックスなどをつけることで、テスト用のデータベースが完成できます。
スクリプトを実行してインデックスを付与します。
dss.ri というインデックス作成スクリプトも先ほど用意してくれましたので、そのスクリプトを実行してインデックスを付与します。
cd [execute path]/share/dbgen
mysql -h [POLARDBの接続アドレス] -u [アカウント名] -p[パスワード] < dss.ri
注意:
データベース名がtpch以外の場合は、事前にスクリプト内のデータベース名を書き換える必要があります。
4. クエリ実行
データベースが用意できましたので、性能測るためのSQL文も作成します。
下記コマンドで作成します。
cd [execute path]/bin
for i in $(seq 1 22); do ./qgen -s 10 $i > $i.sql; done
説明:
sオプションにはdbgen実行時のScaleFactorの数値と合わせます。
上記コマンド実行することで1.sql~22.sqlで全部22のクエリができます。
できたクエリファイルをPOLARDBで実行したら、実行結果が出てきます。
mysql -h [POLARDBクラスタアクセスポイント] -u [ユーザ名] -p[パスワード] –Dtpch < 1.sql
今回 32コア256GB のPOLARDBで実行したクエリの結果は下記の図で示します。
縦軸は実行時間(秒)です。
以上、TPC-Hを POLARDB8.0 で実行しました。
今回はデータ量少ないですので、また参照物もなかったので、果たして性能がいいかどうかは判断するのが難しいです。
次回は他のベンチマークツール、また、他のデータベースサービスと比較しながら実行してみたいと思います。
POLARDBのサービス内容についてはこちらをご覧ください。
www.sbcloud.co.jp