obd.shを使用してmysqltestテストを実行するには、obd.shでデプロイされたOceanBaseデータベースが必要です。本記事では、コンパイル済みソースコードから始めて、obd.shを使用してOceanBaseデータベースをデプロイし、mysqltestテストを実行する方法を例を交えて紹介します。
背景
開発者の操作手順を簡素化し、理解コストを低減するため、obdの一部のコマンドをobd.shスクリプトにカプセル化し、このスクリプトをOceanBaseソースコードのoceanbase/tools/deployディレクトリに配置しています。本記事で実行されるmysqltestテストは、obdのobd test mysqltestコマンドを呼び出しています。
概念
mysqltestは、OceanBaseデータベースのアクセステストにおける一つのテストです。簡単に言えば、作成されたcaseファイルを入力として使用し、データベースの出力と期待される出力を比較します。OceanBaseデータベースにおけるmysqltestテストのcaseはすべて、OceanBaseソースコードの oceanbase/tools/deploy/mysql_test ディレクトリに配置されています。
caseはmysqltestの最小実行単位であり、一つのcaseには少なくとも一つのテストファイルと一つの結果ファイルが含まれます。caseを分類することでsuiteが形成され、suiteは一連のcaseの集合です。
mysqltestテストの実行時には、選択したノードに応じて異なるモードに分かれます。一般的なmysqltestモードは以下のとおりです。
説明
mysqltestの実行に関わる構成パラメータについては、以下の付録を参照してください。
cモード:Primary Zoneが存在するノードに接続してmysqltestを実行します。例えば、設定ファイルdistributed.yamlを使用してクラスタをデプロイした後、server1ノードからOceanBaseクラスタに接続してテストを実行します。
./obd.sh mysqltest -n <name> --suite acs --test-server=server1slaveモード:Primary Zoneが存在しないノードに接続してmysqltestを実行します。例えば、設定ファイルdistributed.yamlを使用してクラスタをデプロイした後、server2ノードからOceanBaseクラスタに接続してテストを実行します。
./obd.sh mysqltest -n <name> --suite acs --test-server=server2proxyモード:ODPを介してクラスタに接続し、mysqltestテストを実行します。例えば、設定ファイルdistributed-with-proxy.yamlを使用してクラスタをデプロイした後にテストを実行します。
./obd.sh mysqltest -n <name> --all
手順
本記事では、x86アーキテクチャのCentOS Linux 7.9を環境として操作方法を紹介しますが、参考用です。詳細なコンパイルおよびデプロイの手順については、OceanBaseのGitHubリポジトリを参照してください。
ステップ1:OceanBaseデータベースのソースコードをコンパイルする
OceanBaseのソースコードをダウンロードします。
[admin@obtest ~]$ git clone https://github.com/oceanbase/oceanbase.gitオペレーティングシステムに応じて依存パッケージを準備します。
[admin@obtest ~]$ sudo yum install git wget rpm* cpio make glibc-devel glibc-headers binutils m4コンパイルします。
[admin@obtest ~]$ cd oceanbase [admin@obtest oceanbase]$ bash build.sh release --init --make
ステップ2:コンパイル済みのOceanBaseファイルをデプロイする
設定ファイルの準備
[admin@obtest ~]$ sudo yum install -y yum-utils [admin@obtest ~]$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo [admin@obtest ~]$ sudo yum install -y libtool libaio obclient [admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh prepareobd.sh prepare コマンドは、コンパイルディレクトリ(例:build_release)からバイナリファイルをコピーしてイメージを作成し、現在の環境情報に基づいてデフォルト設定ファイルを生成します。複数のコンパイルディレクトリが存在する場合、このコマンドはデフォルトで最初のものを選択します。
デプロイ時には、生成されたデフォルト設定ファイルを使用するか、GitHubリポジトリから他のサンプル設定ファイルをダウンロードして変更して使用することができます。mysqltestのテストモードに応じて対応する設定ファイルを選択する必要があります。詳細は以下の通りです。
説明
mysqltestのテストモードについては、上記の概念紹介を参照してください。
Cモードでmysqltestテストを実行する場合は、任意の設定ファイルを使用してデプロイできます。
スレーブモードでmysqltestテストを実行する場合は、distributed.yamlまたはdistributed-with-proxy.yaml設定ファイルを使用して2ノードクラスタをデプロイする必要があります。
プロキシモードでmysqltestテストを実行する場合は、distributed-with-proxy.yaml設定ファイルを使用してOceanBase + ODPクラスタをデプロイする必要があります。
(オプション)設定ファイルの変更
ポートやディレクトリなどの情報を変更する必要がある場合は、以下のコマンドで設定ファイルを開いて変更できます。
[admin@obtest deploy]$ vim distributed-with-proxy.yaml注目すべきパラメータは以下の表のとおりです。
パラメータ必須説明servers 必須 各マシンは - name: マシン識別子 (改行)ip: マシンIPの形式で指定する必要があります。複数のマシンがある場合は、同様に複数回指定します。マシン識別子は重複してはなりません。
マシンIPが重複しない場合は、- <ip> (改行)- <ip>の形式でも指定できます。この場合、- <ip>の形式は- name: マシンIP(改行)ip: マシンIPと同等です。mysql_port 必須 SQLサービスプロトコルのポート番号を設定します。 rpc_port 必須 リモートアクセスプロトコルのポート番号を設定します。これは、observerプロセスと他ノードのプロセス間のRPC通信ポートです。 home_path 必須 コンポーネントのインストールパス。 production_mode 必須 本番モードパラメータです。有効にすると、サーバーリソースが本番環境での使用を満たしているかどうかチェックされます。テストシナリオでは無効の方が推奨されます。無効の場合、デプロイが失敗する可能性があります。 devname オプション serversで指定したIPに対応するNICです。IPとNICの対応関係はip addrコマンドで確認できます。listen_port 必須 ODPリスニングポート。 prometheus_listen_port 必須 ODP prometheusリスニングポート。 OceanBaseデータベースのデプロイ
[admin@obtest deploy]$ ./obd.sh deploy -c distributed-with-proxy.yaml -n testここでは、
-cはデプロイに必要な設定ファイルのパスを指定するために使用されます。ここではdistributed-with-proxy.yamlを例に示します。-nはデプロイするクラスタ名を指定するために使用されます。ここではtestを例に示します。
ステップ3:mysqltestテストの実行
フルテストを実行するか、特定のcaseまたはsuiteを指定してテストを実行できます。
フルテストとは、
mysql_test/test_suiteディレクトリ内のすべてのsuiteを実行することです。以下のコマンドを参照してください。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --all特定のcaseを指定してテストを実行します。例えば、
mysql_test/test_suite/alter/t/alter_log_archive_option.testを指定する場合、以下のコマンドを参照してください。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --test-dir ./mysql_test/test_suite/alter/t --result-dir ./mysql_test/test_suite/alter/r --test-set alter_log_archive_optionsuiteを指定してテストを実行します。例えば、
mysql_test/test_suiteディレクトリ内の特定のsuiteに対してテストを実行する場合、以下のコマンドを参照してください。[admin@obtest ~]$ cd oceanbase/tools/deploy [admin@obtest deploy]$ ./obd.sh mysqltest -n test --suite acs
付録
mysqltestテストを実行する際には、実際の状況に応じていくつかのパラメータを設定できます。各パラメータの説明は以下の表のとおりです。
パラメータ名 |
必須 |
データ型 |
デフォルト値 |
説明 |
|---|---|---|---|---|
| -n | はい | string | デフォルトは空文字列 | テストを実行するクラスタ名。 |
| --component | いいえ | string | デフォルトは空文字列 | テスト対象のコンポーネント名。選択肢は obproxy、obproxy-ce、oceanbase、oceanbase-ce です。空の場合、obproxy、obproxy-ce、oceanbase、oceanbase-ce の順でチェックします。コンポーネントが存在すると検索を終了し、該当するコンポーネントを使用して以降のテストを実行します。 |
| --test-server | いいえ | string | デフォルトは指定されたコンポーネント配下のサーバーの最初のノード | テスト対象のマシン。yamlファイル内のserversに対応するname値を設定できます。servers後にname値が設定されていない場合は、ip値を使用します。指定されたコンポーネント配下のノード名である必要があります。 |
| --user | いいえ | string | admin | テストを実行するユーザー名。通常は変更不要です。 |
| --password | いいえ | string | admin | テストを実行するユーザーのパスワード。 |
| --database | いいえ | string | test | テストを実行するデータベース。 |
| --mysqltest-bin | いいえ | string | /u01/obclient/bin/mysqltest | mysqltestバイナリファイルのパス。 |
| --obclient-bin | いいえ | string | obclient | OBClientバイナリファイルのパス。 |
| --test-dir | いいえ | string | ./mysql_test/t | mysqltestに必要なtest-fileを格納するディレクトリ。testファイルが見つからない場合、obdの組み込みから検索を試みます。 |
| --test-file-suffix | いいえ | string | .test | mysqltestに必要なtest-fileの拡張子。 |
| --result-dir | いいえ | string | ./mysql_test/r | mysqltestに必要なresult-fileを格納するディレクトリ。resultファイルが見つからない場合、obdの組み込みから検索を試みます。 |
| --result-file-suffix | いいえ | string | .result | mysqltestに必要なresult-fileの拡張子。 |
| --record | いいえ | bool | false | mysqltestの実行結果をrecord-fileとしてのみ記録します。 |
| --record-dir | いいえ | string | ./record | mysqltestの実行結果を記録するディレクトリ。 |
| --record-file-suffix | いいえ | string | .record | mysqltestの実行結果の拡張子。 |
| --tmp-dir | いいえ | string | ./tmp | mysqltestの一時ディレクトリ。テスト実行中に生成される一時ファイルを格納します。 |
| --var-dir | いいえ | string | ./var | このディレクトリ配下にlogディレクトリを作成し、logディレクトリを--log-dirパラメータとしてmysqltestに渡します。 |
| --test-set | いいえ | string | なし | test caseの配列。複数のcaseは半角カンマ(,)で区切ります。 |
| --exclude | いいえ | string | なし | 除外するtest caseの配列。複数のcaseは半角カンマ(,)で区切ります。 |
| --test-pattern | いいえ | string | なし | testファイル名の正規表現。すべての一致するパターンのcaseはtest-setオプションを上書きします。 |
| --suite | いいえ | string | なし | suiteの配列。1つのsuiteには複数のtestが含まれ、半角カンマ(,)で区切ることができます。 |
| --suite-dir | いいえ | string | ./mysql_test/test_suite | suiteディレクトリを格納するディレクトリ。suiteディレクトリが見つからない場合、obdの組み込みから検索を試みます。 |
| --all | いいえ | bool | false | --suite-dir ディレクトリ配下のすべてのケースを実行します。--suite-dir パラメータは、スイートディレクトリが保存されるディレクトリです。 |
| --need-init | いいえ | bool | false | init sqlファイルを実行します。新しいクラスタがmysqltestを実行する前に、ケース作成に必要なアカウントやテナントの作成など、初期化ファイルを実行する必要がある場合があります。デフォルトでは無効です。 |
| --init-sql-dir | いいえ | string | ./ | init sqlファイルがあるディレクトリです。sqlファイルが見つからない場合、obdの組み込みを検索します。 |
| --init-sql-files | いいえ | string | デフォルトは空文字列 | initが必要な場合に実行するinit sqlファイルの配列です。英字のカンマ(,)で区切ります。指定しない場合、initが必要な場合、obdはクラスタ設定に基づいて組み込みのinitを実行します。 |
| --auto-retry | いいえ | bool | false | 失敗した場合、自動的にクラスタを再デプロイして再試行します。 |
| --psmall | いいえ | bool | false | psmallモードのケースを実行します。 |
| --slices | いいえ | int | デフォルトは空文字列 | 実行するケースが分割されるグループ数です。 |
| --slice-idx | いいえ | int | デフォルトは空文字列 | 現在のグループIDを指定します。 |
| --slb-host | いいえ | string | デフォルトは空文字列 | ソフトロードバランシングセンターを指定します。 |
| --exec-id | いいえ | string | デフォルトは空文字列 | 実行IDを指定します。 |
| --case-filter | いいえ | string | ./mysql_test/filter.py | filter.pyファイルは、フィルタリングが必要なケースを管理します。 |
| --reboot-timeout | いいえ | int | 0 | リブートのタイムアウト時間です。 |
| --reboot-retries | いいえ | int | 5 | リブート失敗時の再試行回数です。 |
| --collect-all | いいえ | bool | false | コンポーネントログを収集するかどうかです。 |
| --log-dir | いいえ | string | デフォルトは$--var-dir/log | mysqltestのログ保存パスです。 |
| --log-pattern | いいえ | string | *.log | 収集するログファイル名に一致する正規表現です。一致するファイルが収集されます。 |
| --case-timeout | いいえ | int | 3600 | mysqltestの単一テストのタイムアウト時間です。 |
| --disable-reboot | いいえ | bool | false | テスト実行中にリブートしないようにします。 |
| --collect-components | いいえ | string | デフォルトは空文字列 | ログ収集を行うコンポーネントを指定するために使用されます。複数のコンポーネントは英字のカンマ(,)で区切ります。 |
| --init-only | いいえ | bool | false | trueの場合、init SQLのみを実行します。 |