3.5. MariaDB
3.5.1. 概要
OpenShift Online には、MariaDB の実行用のコンテナーイメージがあります。このイメージでは、設定ファイルで指定されるユーザー名、パスワード、データベース名の設定に基づいてデータベースサービスが提供されます。
3.5.2. バージョン
現時点で、OpenShift Online は MariaDB のバージョン 10.0 および 10.1 を提供しています。
3.5.3. イメージ
RHEL 7 イメージは、Red Hat レジストリーから入手できます。
$ docker pull registry.access.redhat.com/rhscl/mariadb-100-rhel7 $ docker pull registry.access.redhat.com/rhscl/mariadb-101-rhel7
mariadb
イメージストリームを使用して、MariaDB 10.1 イメージを使用できます。
3.5.4. 設定および用途
3.5.4.1. データベースの初期化
共有ボリュームを初めて使用する場合には、データベース、データベースの管理ユーザー、MariaDB root ユーザー (MYSQL_ROOT_PASSWORD
環境変数を指定した場合) が作成されます。その後、MariaDB デーモンが起動します。別のコンテナーにボリュームを再アタッチする場合には、データベース、データベースユーザー、管理者ユーザーは作成されず、MariaDB デーモンが開始されます。
以下のコマンドは、新しいデータベースの Pod を作成し、さらにコンテナー内で MariaDB を実行します。
$ oc new-app \ -e MYSQL_USER=<username> \ -e MYSQL_PASSWORD=<password> \ -e MYSQL_DATABASE=<database_name> \ mariadb:10.1
3.5.4.2. コンテナーでの MariaDB コマンドの実行
OpenShift Online は Software Collections (SCL) を使用して、MariaDB をインストールし、起動します。(デバッグ用に) 実行中のコンテナー内で MariaDB コマンドを実行する場合には bash を使用して呼び出す必要があります。
これを実行するには、まず、実行中の MariaDB Pod の名前を特定します。たとえば、現在のプロジェクトで Pod の一覧を表示できます。
$ oc get pods
次に、Pod に対してリモートシェルセッションを開始します。
$ oc rsh <pod>
コンテナーに入ると、必要な SCL が自動的に有効になります。
Bash シェルから mysql コマンドを実行し、MariaDB の対話セッションを開始して通常の MariaDB 操作が実行できるようになりました。たとえば、データベースユーザーとして認証するには、以下を実行します。
bash-4.2$ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $HOSTNAME $MYSQL_DATABASE Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.37 MySQL Community Server (GPL) ... mysql>
完了したら、quit または exit を入力して MySQL セッションを終了します。
3.5.4.3. 環境変数
MariaDB ユーザー名、パスワード、データベース名は、以下の環境変数で設定する必要があります。
変数名 | 説明 |
---|---|
| 作成する MySQL アカウントのユーザー名 |
| ユーザーアカウントのパスワード |
| データベース名 |
| root ユーザーのパスワード (オプション) |
ユーザー名、パスワード、データベース名を指定する必要があります。この 3 つすべてを指定しない場合には、Pod は起動に失敗し、OpenShift Online は Pod の再起動を継続的に試行します。
MariaDB 設定は、以下の環境変数で設定できます。
変数名 | 説明 | デフォルト |
---|---|---|
| テーブル名の保存および比較方法を設定します。 | 0 |
| クライアントが同時に接続可能な最大数 | 151 |
| 生成された文字列/中間文字列または 1 つのパケットの最大サイズ | 200M |
| FULLTEXT インデックスに含める文字の最小長 | 4 |
| FULLTEXT インデックスに含める文字の最大長 | 20 |
| ネイティブの AIO が壊れている場合に innodb_use_native_aio の設定値を制御します。 | 1 |
| 全スレッド用に開くテーブル数 | 400 |
| インデックスブロックに使用するバッファーサイズ | 32M (または利用可能なメモリーの 10%) |
| 分類に使用するバッファーサイズ | 256K |
| シーケンススキャンに使用するバッファーサイズ | 8M (または利用可能メモリーの 5%) |
| InnoDB がテーブルやインデックスデータをキャッシュするバッファープールのサイズ | 32M (または利用可能なメモリーの 50%) |
| ロググループにある各ログファイルのサイズ | 8M (または利用可能メモリーの 15%) |
| InnoDB がディスクのログファイルへの書き込みに使用するバッファーサイズ | 8M (または利用可能メモリーの 15%) |
| 別の設定ファイルを参照します。 | /etc/my.cnf |
|
binlog 形式で設定します。 サポートされる値は、 | statement |
3.5.4.4. ボリュームのマウントポイント
MariaDB イメージは、マウントしたボリュームで実行して、データベース用に永続ストレージを有効化できます。
- /var/lib/mysql/data: MySQL のデータディレクトリーは、MariaDB がデータベースファイルを保存する場所にあります。
3.5.4.5. パスワードの変更
パスワードはイメージ設定の一部であるため、データベースユーザー (MYSQL_USER
) と admin ユーザーのパスワードを変更するための唯一のサポートされる方法とし、環境変数 MYSQL_PASSWORD
と MYSQL_ROOT_PASSWORD
をそれぞれ変更することができます。
現在のパスワードは、Pod またはデプロイメント設定を Web コンソールで表示するか、CLI で環境変数を表示して、確認できます。
$ oc set env pod <pod_name> --list
SQL ステートメントや、前述した環境変数以外の方法でデータベースのパスワードを変更すると、変数に保存されている値と、実際のパスワードが一致しなくなる可能性があります。データベースコンテナーが起動するたびに、パスワードは環境変数に保存されている値にリセットされます。
これらのパスワードを変更するには、oc set env
コマンドを使用して、関連するデプロイメント設定の任意の環境変数 1 つまたは両方を更新します。たとえば、テンプレートからアプリケーションを作成する場合など、複数のデプロイメント設定がこれらの環境変数を使用する場合には、デプロイメント設定ごとに変数を更新し、パスワードがどこでも同期されるようにします。これは、すべて同じコマンドで実行できます。
$ oc set env dc <dc_name> [<dc_name_2> ...] \ MYSQL_PASSWORD=<new_password> \ MYSQL_ROOT_PASSWORD=<new_root_password>
アプリケーションによっては、アプリケーションの他の場所にあるパスワードの他の環境変数を更新して一致させる必要があるものもあります。たとえば、フロントエンド Pod のより一般的な DATABASE_USER
変数などは、データベースユーザーのパスワードと一致する必要がある場合があります。必要とされる環境変数すべてにおいて、パスワードがアプリケーションごとに一致しているようにしてください。 一致しない場合には、トリガーされた時点で、Pod の再デプロイメントが失敗する場合があります。
設定変更トリガーが設定されている場合には、環境変数を更新すると、データベースサーバーの再デプロイメントがトリガーされます。設定されていない場合には、新しいデプロイメントを手動で起動して、パスワードの変更を適用する必要があります。
新規パスワードが有効になっていることを確認するには、まず、実行中の MariaDB Pod へのリモートシェルセッションを開始します。
$ oc rsh <pod>
Bash シェルから、データベースユーザーの新規パスワードを確認します。
bash-4.2$ mysql -u $MYSQL_USER -p<new_password> -h $HOSTNAME $MYSQL_DATABASE -te "SELECT * FROM (SELECT database()) db CROSS JOIN (SELECT user()) u"
パスワードが正しく変更された場合には、以下のような表が表示されるはずです。
+------------+---------------------+ | database() | user() | +------------+---------------------+ | sampledb | user0PG@172.17.42.1 | +------------+---------------------+
root ユーザーの新規パスワードを確認するには、以下を実行します。
bash-4.2$ mysql -u root -p<new_root_password> -h $HOSTNAME $MYSQL_DATABASE -te "SELECT * FROM (SELECT database()) db CROSS JOIN (SELECT user()) u"
パスワードが正しく変更された場合には、以下のような表が表示されるはずです。
+------------+------------------+ | database() | user() | +------------+------------------+ | sampledb | root@172.17.42.1 | +------------+------------------+
3.5.5. テンプレートからのデータベースサービスの作成
OpenShift Online には テンプレートが含まれており、新規データベースサービスの作成を簡素化します。テンプレートには、必須の環境変数をすべて定義するパラメーターフィールドがあり (ユーザー、パスワード、データベース名など)、自動生成されたパスワード値など、事前定義済みのデフォルト値が設定されます。また、テンプレートは デプロイメント設定 および サービス の両方を定義します。
MariaDB テンプレートは、クラスターの初期設定時にクラスター管理者により、デフォルトの openshift プロジェクトに登録しておく必要があります。
以下のテンプレートを使用できます。
-
mariadb-persistent
は、データベースのデータ用に永続ボリュームストアを使用するので、データは Pod が再起動されても残ります。
この説明に従い、テンプレートをインスタンス化できます。
サービスをインスタンス化したら、データベースにアクセスする予定のある別のコンポーネントのデプロイメント設定に、ユーザー名、パスワード、データベース名の環境変数をコピーできます。このコンポーネントは、定義したサービスを使用してこのデータベースにアクセスできます。
3.5.6. トラブルシューティング
以下のセクションでは、発生する可能性のある問題と、考えられる解決策を説明します。
3.5.6.1. Linux ネイティブの AIO の障害
現象
MySQL コンテナーが起動に失敗し、以下のようなログを出力します。
151113 5:06:56 InnoDB: Using Linux native AIO 151113 5:06:56 InnoDB: Warning: io_setup() failed with EAGAIN. Will make 5 attempts before giving up. InnoDB: Warning: io_setup() attempt 1 failed. InnoDB: Warning: io_setup() attempt 2 failed. Waiting for MySQL to start ... InnoDB: Warning: io_setup() attempt 3 failed. InnoDB: Warning: io_setup() attempt 4 failed. Waiting for MySQL to start ... InnoDB: Warning: io_setup() attempt 5 failed. 151113 5:06:59 InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts. InnoDB: You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf 151113 5:06:59 InnoDB: Fatal error: cannot initialize AIO sub-system 151113 5:06:59 [ERROR] Plugin 'InnoDB' init function returned error. 151113 5:06:59 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 151113 5:06:59 [ERROR] Unknown/unsupported storage engine: InnoDB 151113 5:06:59 [ERROR] Aborting
説明
MariaDB のストレージエンジンは、リソース制限が原因で、カーネルの AIO (非同期 I/O) 機能を使用できませんでした。
解決策
環境変数 MYSQL_AIO
の値を 0
に設定して、AIO の使用を完全に停止します。今後のデプロイメントでは、この設定により MySQL の設定変数 innodb_use_native_aio
の値が 0
に指定されます。