スマートスタイル TECH BLOG

データベース&クラウド技術情報

Percona XtraDB Cluster 8.0 をローカルPC環境で手軽に構築する方法(dbdeployer,docker)

先週のPercona XtraDB Cluster 8.0(PXC8.0)の記事に引き続き、
Percona XtraDB Cluster 8.0 GAを調査 | スマートスタイル TECH BLOG

今回もPXC8.0について取り上げていきます。

PXCは高可用性構成の仕様上、3ノード以上でクラスターを組むことが強く推奨されていますが、ちょっと手元で機能検証など試してみたい場合に、3ノード準備して、インストールして、というステップがなかなか面倒ではあると思います。

そこで、PXC8.0をローカルPC環境で手軽に構築する方法を2つご紹介致します。

  1. dbdeployer
  2. docker(docker-compose)

2については、過去にも弊社の記事にて既に取り上げている内容ですので、ご存じの方も多いかもしれませんが、PXCのバージョンが5.7の内容なので、今回は情報のアップデートの意味合いでもあります。
Dockerで Percona XtraDB Cluster 環境を構築する方法 | スマートスタイル TECH BLOG

※ただし、少し趣向を変え、etcd+docker-composeでクラスターのスケールが容易にできる構成を構築する方法をご紹介します。

1. dbdeployer

MySQL Sandbox の進化版である dbdeployer では、PXCのデプロイに対応しています。

dbdeployerについては是非過去ブログをご一読ください。
次世代MySQL Sandbox! dbdeployerの使用方法について | スマートスタイル TECH BLOG

細かい手順については、以下のページで既に公開されており、試してみた方もいらっしゃるかもしれません。

特にPerconaの記事がジャストな内容でして、記事の手順をほぼそのまま試していただければ完結してしまうので(※ただし、バージョンが8.0.18の手順なので最新ではない点はご注意ください)、本項では少しTipsなどを補足説明をさせていただきます。

Windows 10 WSL2 の Ubuntu 18.04 LTS で試す場合

WSL2(Windows Subsystem for Linux 2)は、つい先日の Windows 10 May 2020 Update で正式版が公開され、すでに利用されている方も多いと思います。
筆者も多分に漏れず、日々便利に使わせてもらっていますが、もちろんWSL2上でも手軽にdbdeployerを使えますので、その場合の注意点などをお伝えします。

最新版へのアップデート

既に dbdeployer をインストール済みの場合は、最新版にアップデートしておきましょう。
PXC8.0のデプロイのための拡張がされているバージョン(v.1.46.0以降)を推奨します。

PXCに必要な追加パッケージ

PXC をデプロイするために、WSL2 の Ubuntu 18.04 LTS の場合、デフォルトでは以下のパッケージが不足しているので、無ければ追加しておきましょう。

ダウンロードするPXCのパッケージ

WSL2 の Ubuntu 18.04 LTS で、PXC 8.0.19-10.1(本記事執筆時点の最新GAバージョン)をインストールする場合は、以下のバイナリーtarballをダウンロードします。
dbdeployer ではLinux Genericパッケージのtarballを選択する必要があります。

※その他のOSの場合は、以下のダウンロードページから対象のOS用のURLを選択してください。
Download Percona XtraDB Cluster 8.0

dbdeployer の配置・展開先

公式のインストール手順の通りホームディレクトリ配下でインストールしていれば気にする必要はありませんが、WSL2 では前バージョンよりファイルシステムI/Oパフォーマンスの大幅な向上がなされているとのことで、
実際に検証したわけではないですが、dbdeployer のバイナリやデータを展開する場所は /dev/sda(/) 配下のほうが /mnt/c などの(元々)Windowsファイルシステムを使うよりも性能が良いかもしれません。

ちなみに、以下のコマンドで sandbox-home(データディレクトリなどの格納場所)、sandbox-binary(MySQLバイナリの格納場所)を任意の場所に変更することができます。

その他

デバッグフラグ

もし、PXCデプロイがうまくいかない(エラーが発生した)場合、デバッグフラグ(SBDEBUG=1)をコマンド先頭に付与することで、何らかのエラーのヒントが得られるかもしれません。

コマンド(スクリプト)Usageの確認

デプロイを実行した際にメッセージが出力されますが、以下のコマンドを実行するとマルチインスタンスのdbdeployerで使用可能なコマンドのusageを確認することができます。
PXCの全ノードを操作できるなど、便利なスクリプトが揃っていますので、是非ご活用ください。

2. docker(docker-compose)

Docker HubにPerconaの公式イメージが公開されていますのでこれを利用します。
Docker Hub

ただ、その Docker Hub の Overview ページには、肝心のPXC自体のデプロイ方法はかなりドライに端折られており、かつまだ8.0の公式マニュアルへのリンクもない状態です。
その公式のマニュアルはこちらになります。
Running Percona XtraDB Cluster in a Docker Container

マニュアル上では、docker コマンドを使用した手順になっていて、これはこれでシンプルでわかりやすいコマンドです。

※ただし、上記公式マニュアルで以下の手順の際に、自己証明書のボリュームマウントオプション(-v ~/pxc-docker-test/cert:/cert \)の記載が漏れているのでこのマニュアルのまま実行するとpxc-node1がエラーで起動しません。ご注意ください!

5. Bootstrap the cluster (create the first node):
docker run -d \
-e MYSQL_ROOT_PASSWORD=test1234# \
-e CLUSTER_NAME=pxc-cluster1 \
–name=pxc-node1 \
–net=pxc-network \
-v ~/pxc-docker-test/config:/etc/percona-xtradb-cluster.conf.d \
percona/percona-xtradb-cluster:8.0

冒頭でも触れましたが、本記事ではせっかくなので、PXCクラスターノード数を簡単にスケールすることができるように

  • 分散KVSのetcdによるサービスディスカバリを使った構成をdocker-compose で構築する手順

という内容をご紹介します。

etcdを使った構成方法は上記のDocker Hub Percona公式PXCイメージで紹介されている方法ですが、これに少し手を加えてdocker-composeで手軽に試せるようにしてみます。

※なお、マニュアルにも明記されていますが、本記事の内容も自己署名の証明書を使用する手順になるので、検証環境用途に留め、本番環境では使用しないようご注意ください。
(その他、パスワードを直書きしていたり、データディレクトリの永続化も行っていないなど諸所簡易的に済ませています)

Dockerのバージョン

前述の WSL2 Ubuntu 18.04 LTS 上で実行していますが、今回使用したDockerのバージョンは以下の通りです。

  • Docker Desktop 2.3.2.1(46329) / Engine 19.03.12, build 48a66213fe
  • docker-compose version 1.25.5, build 8a1c60f6

事前準備

PXC8.0の公式マニュアルに従った事前準備を行っておきます。
前回の記事でも紹介がありました通り、PXC8.0ではデフォルトで通信の暗号化が有効になるので、SSL証明書関連のセットアップが必要となります。

  • certディレクトリは、この後PXCコンテナが起動時にマウント・参照する証明書の配置用です。
  • config/custom.cnfにその設定を書き込んでおきます。

その他、今回はデフォルトのままですが、必要に応じてパラメータをカスタムしたmy.cnfを配置してマウントさせることもできます。
なお、PXCの/etc/my.cnfの構成は以下のようなインクルード構成になっていますので、適宜マウント先を指定してください。

ついでに、デフォルトのmy.cnfの中身もご紹介しておきます。

docker-compose.yml

docker-compose.ymlは次の通りの内容で作成します。

  • etcdコンテナはサービスディスカバリ用です。
    Perconaの公式イメージは、DISCOVERY_SERVICE環境変数を設定することでサービスディスカバリによるノード追加・削除の状態管理ができるようになります。
  • pxc-certは、先ほど紹介した、SSL自己署名証明書を事前に作成する役割になります。

pxc80-scaleディレクトリ内は以下のとおりに構成されました。

初回起動(bootstrap)

まずは、etcdpxc-certpxcイニシャルノードを起動してみます。
ETCD_HOST環境変数をexportしておくことをお忘れなく。
※今回は単一PC内で構築しているので、ip a s dev docker0 コマンドで確認できたIPアドレスを指定しています。

起動状況などをログなどで確認します。(出力が多いので割愛します)

以下のコマンドでetcdpxcが1コンテナづつUpしているのが確認できます。

etcd の状態も確認してみましょう。
etcdctljqを使用しますのでインストールがまだでしたら済ませておきます。

以下のコマンドを実行して、etcd自身の状態が正常に取得できれば問題ありません。

PXCクラスターの登録状態を確認するには以下のコマンドを実行します。
今はまだノードが一つだけ登録されている状態が確認できます。

PXCのwsrepステータス変数も確認してみます。
wsrep_cluster_sizeが1で、各ステータスも正常です。

スケールアップ(ノード追加)

pxcコンテナ数を1→3に増やしてスケールアップしてみます。

SSTによる同期が完了後、無事3ノード構成にスケールアップしました。

前掲のコマンドで(出力が多いのでフィルタして)、etcdにPXCクラスターの状態が正常に追加登録されているか確認してみます。

wsrep_cluster_sizeも3に増加してます。

スケールダウン(縮退)

さらに3→5ノードにスケールアップしたのち、3ノードまで縮退させてみます。
ノード4,5が停止→削除されました。

出力ログも多いので抜粋ですが、4,5ノードはcleran upされて、3ノード構成に戻りました。

この構成方法で、docker-compose.ymlに必要ノード数分コンテナを並べて書いて、初期ノード以外はCLUSTER_JOIN環境変数を設定して…といった煩雑さがなくなり、docker-compose up -d --scaleコマンドだけでスケールアップ&スケールダウンが比較的自在に操作できるので、興味ありましたら是非試してみてください。

(おまけ) ProxySQL を追加構成する場合

docker-compose.ymlに以下のようなエントリを追記すると、ProxySQLも併せて構成できます。

※DockerHubの公式ページに記載されているコマンドでは -e ETCD_HOST=$ETCD_HOSTを指定していますが誤りで、DISCOVERY_SERVICEを指定しないとエラーになります。

お気付きになったかもしれませんが、指定イメージがperconalab/proxysqlになっています。
このイメージは、PXC公式Dockerイメージ用にサービスディスカバリのための拡張がしてある(スクリプトが同梱されている)ものになります。
ただし、以下の難点があり、現在は実際のところそのままでは使用できる状態ではありません。

  • ProxySQLのバージョンがかなり古い(1.3.7-1.1)
    ※1.4.12も選択できるようですが、更新が2018年で止まっています。
  • サービスディスカバリ用のProxySQL設定スクリプトを実行するとエラーになる。
    add_cluster_nodes.shはその名の通り、etcdに登録されているPXCのノード情報をProxySQLに設定する便利なスクリプトですが…

原因は、スクリプト内でユーザー作成を行っている箇所で、CREATE USERでなくGRANT ... IDENTIFIED BYを使っているので、MySQL 8.0 と非互換になってしまっていることです。
proxysql-docker/add_cluster_nodes.sh at adcd2f50e60fe42b1ca76ef10bc2888be98240f5 · Percona-Lab/proxysql-docker · GitHub

Dockerfile やスクリプトを修正するか、Percona公式の最新のイメージを使うようにするなりの対応が必要です。(ただしサービスディスカバリには対応していないので、perconalab版の拡張を適用してあげる必要あり)

まとめ

ローカルPCで(と言っても WSL2 にスポットを当てた内容になってしまいましたが)、手軽にPXC8.0を構築する方法を紹介させていただきました。

多少、etcdの説明が多くなってしまったので、手軽にどころか一見面倒そうに見えるかもしれませんが、実際試してみると意外と簡単だと感じました。
もちろん、etcdは使わずに、pxcだけで(必要ノード分コンテナを並べて)構築するのでもアリだと思います。

PoCや実環境に即した目的や用途だったり、予め構築する環境やツールが整っている(VM や Vagrant, Ansible, e.t.c…)などの場合は別の選択肢が良いかもしれませんが、そのような環境が準備できない(ローカルPCしかない)といった場合には、本記事の内容がお役に立てるかもしれません。
また、これから初めてPXCを触ってみたいという方にも、是非お勧めの方法です。


Percona

 

Return Top