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 addrコマンドでIPとNICの対応関係を確認できます。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 | なし | テストケースの配列。複数のcaseは英語のカンマ(,)で区切ります。 |
| --exclude | いいえ | string | なし | 除外するテストケースの配列。複数のcaseは英語のカンマ(,)で区切ります。 |
| --test-pattern | いいえ | string | なし | テストファイル名の正規表現。すべての一致する表現のcaseは、test-setオプションを上書きします。 |
| --suite | いいえ | string | なし | スイートの配列。1つのスイートには複数のテストが含まれ、英語のカンマ(,)で区切ることができます。 |
| --suite-dir | いいえ | string | ./mysql_test/test_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のみを実行します。 |