なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

HammerDBをCLIで使うなど(1):環境構築

TPC-C、TPC-Hワークロードを各種DBMSに対して実行できるベンチマークソフト「HammerDB」

HammerDBは、フリーでOSSDBMSベンチマークソフトです。
各DB専用に用意されたベンチマークソフトではなく、同じ条件(同じソフト)で負荷をかけて性能を見たいときに重宝してます。


Windows版もLinux版も用意されていて、GUIで操作できる敷居の低さも魅力の1つですね。
ただし、自動化したい、ってなるとGUIは逆にじゃまになってしまいますが、このHammerDBは、CLIも同梱しています。

しかし、CLI関連情報は、公式(英語)以外で紹介している記事がちょっと少ない。。。
そのため、こちらを使った最小限の環境構築手順と、実際にベンチマークを行うまでの手順をまとめておきたいと思います。


なお、他のベンチマークソフトも同様ですが、TPCルールに厳密に準拠しているわけではないので、このツールで出したスコアを公表値として使ってはいけません。

TPC-CとTPC-Hについての細かい説明は省略します。ご存知でない方は、それぞれTPC-C=OLTP、TPC-H=OLAPのワークロード、とだけ覚えておいて貰えればよいかと。
複雑度としては、MySQLでよく使われるSysbench<PostgreSQLでよく使われるpgBench≒TPC-B<TPC-Cという順でOLTPベンチマークがあり、別軸のOLAP系ベンチマークとしてTPC-Hがあります。
TPC本家 http://www.tpc.org には、もっとたくさんのベンチマークがありますので、TPC-C/Hの厳密な定義の理解と合わせて読んでみてください、といっても英語でツライですが。

今回は環境構築までとし、続いて、MySQLPostgreSQLOracleに対するTPH-C、TPC-Hの実行や、試験の自動化についても触れていきたいと思います。
Redisはどうしようかな。MS SQL Serverdb2は全く解ってないので、余程の余裕が生まれない限り省略する予定です、あしからず。

CentOS7環境用意

VirtualBoxにMinimalのCentOS7イメージからOSをminimalでインストールするものとします。
例によって、firewalldとかselinuxとかは無効化してしまいます。
minimalインストールだとwgetすら入ってないので入れておきましょう。

# yum -y update

# systemctl stop firewalld
# systemctl disable firewalld
# systemctl stop iptables
# systemctl disable iptables

# vi /etc/selinux/config
  SELINUX= enforcing -> disabled に変更

# yum -y install wget

EC2でREHLやAmazonLinuxイメージを使用しても構いません。むしろAWS上のDBに対して負荷をかけるときはそうしますね。

HammerDBのダウンロード&インストール

# wget https://jaist.dl.sourceforge.net/project/hammerdb/HammerDB/HammerDB-3.2/HammerDB-3.2-Linux.tar.gz

sourceforgeのダウンロードアイコンをクリックした後、色々リダイレクトしてからダウンロードが始まる仕組みなので、ホストマシン(Windows)のChromeでダウンロードした後、ダウンロード履歴からURLを確認しました。
もちろん、ホストマシンにダウンロードしたものをSCPなどで転送しても良いです。

# tar zxvf HammerDB-3.2-Linux.tar.gz
# cd ./HammerDB-3.2
# ./hammerdbcli

これだけでHammerDBのCLIは起動する状態になりました。


なおLinuxGUIが必要なときはREHL7以上にしないとglibcあたりでつまづきます。さらに、AWSだとLinuxGUI使えない?ので素直にWindowsServerで作りましょう。

あくまでCLI前提で進めますので、そのあたりについて多くは触れません。

各種DBへの接続用ドライバ

ドライバライブラリ確認コマンド実行

「librarycheck」を実行すると、セットアップ直後は以下のように表示されます。
エラーになっていないのは、Redisだけですね。

# cd HammerDB-3.2/
# ./hammerdbcli
hammerdb>librarycheck
Checking database library for Oracle
Error: failed to load Oratcl - can't read "env(ORACLE_HOME)": no such variable
Ensure that Oracle client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for MSSQLServer
Error: failed to load tclodbc - couldn't load file "/root/HammerDB-3.2/lib/tclodbc2.5.2/libtclodbc2.5.so": libodbcinst.so.2: cannot open shared object file: No such file or directory
Ensure that MSSQLServer client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for Db2
Error: failed to load db2tcl - couldn't load file "/root/HammerDB-3.2/lib/db2tcl2.0.0/libdb2tcl.so.0.0.1": libdb2.so.1: cannot open shared object file: No such file or directory
Ensure that Db2 client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for MySQL
Error: failed to load mysqltcl - couldn't load file "/root/HammerDB-3.2/lib/mysqltcl-3.052/libmysqltcl3.052.so": libmysqlclient.so.20: cannot open shared object file: No such file or directory
Ensure that MySQL client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for PostgreSQL
Error: failed to load Pgtcl - couldn't load file "/root/HammerDB-3.2/lib/pgtcl2.1.1/libpgtcl2.1.1.so": libpq.so.5: cannot open shared object file: No such file or directory
Ensure that PostgreSQL client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for Redis
Success ... loaded library redis for Redis


ドライバを組み込んでこのErrorを解消した状態にすれば、実際にベンチマークのワークロードを実行できるようになります。5. Verifying Client Librariesに、各DBMSへの接続に必要なライブラリの一覧と、雑に簡単にセットアップ方法が書いてあります。


しかし、これはで、必要になるたびにセットアップし直しては毎回躓いていたのです。なので今回、真面目に調べて記録に残しておこう、と。


MySQL

MySQLの場合、現時点の最新版であるHammerDB 3.2は、MySQL5.7を対象としているので、MySQL5.7のクライアントをインストールします
HammerDBのドキュメントには「Oracle用の説明に倣って LD_LIBRARY_PATH をホゲホゲ」って書いてありますが、yummysqlクライアントを仕込めばそれだけでOKです。


HammerDB 3.2が使っているlibmysqltcl3.052.soの依存ライブラリがlibmysqlclient.so.20(MySQL 5.7用)で生成されているため、MySQL 8.0(libmysqlclient.so.21)を入れても動きません。
もしかしたら、libmysqlclient.so.20の名前でlibmysqlclient.so.21にシンボリックリンクを張れば動くのかもしれませんが、試してません。

# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# yum -y localinstall mysql80-community-release-el7-3.noarch.rpm
# yum -y install mysql-community-client.x86_64 --enablerepo=mysql57-community --disablerepo=mysql80-community
PostgreSQL

PostgreSQLの場合、PostgreSQL10.x系で準備します。これもlibpgtcl2.1.1.soがlibpq.so.5=postgreSQL10に依存しているため、PostgreSQL11版は厳しそうです。
epelも必要になりそうなので、一旦入れておきます。

# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum -y install postgresql10.x86_64

なお、Amazon Linux2だと、上記やり方では/etc/redhat-releaseのチェックで引っかかってしまうため、以下を実行します。

# yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-latest-x86_64/postgresql10-libs-10.7-2PGDG.rhel7.x86_64.rpm
# yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-latest-x86_64/postgresql10-10.7-2PGDG.rhel7.x86_64.rpm
Oracle

Oracle Instant Clientを使用します。
Oracle Database Instant Clientのインストール に倣ってインストールします。


現時点では最新が19c用のものですので、以下コマンドでインストールします。MySQLPostgreSQLのような、新しすぎてもダメ、ってことはなさそうです(今の所)。

yum install  https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm

一式が、「/usr/lib/oracle/19.3/client64/lib」にインストールされるので、以下を実行するか、「~/.bash_profile」に以下を追加し、soruceコマンドで読み込んでおきます。

export ORACLE_HOME=/usr/lib/oracle/19.3/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_LIBRARY=$ORACLE_HOME/lib/libclntsh.so
export PATH=$ORACLE_HOME/bin:$PATH

なお、SQL*Plus、SQL*Loader、DataPumpなどを入れておきたい場合は、以下も実行しておきます。

# yum install  https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
# yum install  https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-tools-19.3.0.0.0-1.x86_64.rpm

Oracle Client一式をOUIなどでインストールする場合、環境変数は違ったものになるかと思いますので、そちらに従ってください。

再びlibrarycheck

ここまでやると、先程のlibrarycheckは以下のようになります。

hammerdb>librarycheck
Checking database library for Oracle
Success ... loaded library Oratcl for Oracle
Checking database library for MSSQLServer
Error: failed to load tclodbc - couldn't load file "/root/HammerDB-3.2/lib/tclodbc2.5.2/libtclodbc2.5.so": libodbcinst.so.2: cannot open shared object file: No such file or directory
Ensure that MSSQLServer client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for Db2
Error: failed to load db2tcl - couldn't load file "/root/HammerDB-3.2/lib/db2tcl2.0.0/libdb2tcl.so.0.0.1": libdb2.so.1: cannot open shared object file: No such file or directory
Ensure that Db2 client libraries are installed and the location in the LD_LIBRARY_PATH environment variable
Checking database library for MySQL
Success ... loaded library mysqltcl for MySQL
Checking database library for PostgreSQL
Success ... loaded library Pgtcl for PostgreSQL
Checking database library for Redis
Success ... loaded library redis for Redis

MSSQLServerとDb2以外は「Success」になりました。

まとめ

  • HammerDBは色々なDBにTPC-C/H相当の負荷をかけることができ、Windows/Linux両方に対応し、GUI/CLIが利用可能な、FreeでOpen SourceなSoftwareです。
  • Linux版の場合、本体のtar.gzを展開+接続先DBに対応したクライアントをインストールすると使えるようになります。
  • HammerDBのバージョンによって、対応しているDBクライアントのバージョンが決まっているので要注意です。


環境構築はココまでです。
次回からは、具体的に負荷をかけるための手順です。


HammerDBは紹介されていないけど、負荷試験に関する知識という点で、合わせて読みたいこの本を紹介しておきます。