先週のPercona XtraDB Cluster 8.0
(PXC8.0)の記事に引き続き、
Percona XtraDB Cluster 8.0 GAを調査 | スマートスタイル TECH BLOG
今回もPXC8.0について取り上げていきます。
PXCは高可用性構成の仕様上、3ノード以上でクラスターを組むことが強く推奨されていますが、ちょっと手元で機能検証など試してみたい場合に、3ノード準備して、インストールして、というステップがなかなか面倒ではあると思います。
そこで、PXC8.0をローカルPC環境で手軽に構築する方法
を2つご紹介致します。
- dbdeployer
- 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
細かい手順については、以下のページで既に公開されており、試してみた方もいらっしゃるかもしれません。
- dbdeployer開発者の公式ブログの記事
The Data Charmer: dbdeployer community – Part 2: Percona XtraDB Cluster - Percona Database Performance Blog の記事
Testing Percona XtraDB Cluster 8.0 with DBdeployer – Percona Database Performance 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 の場合、デフォルトでは以下のパッケージが不足しているので、無ければ追加しておきましょう。
1 |
$ sudo apt install -y socat libev4 |
ダウンロードするPXCのパッケージ
WSL2 の Ubuntu 18.04 LTS で、PXC 8.0.19-10.1(本記事執筆時点の最新GAバージョン)をインストールする場合は、以下のバイナリーtarballをダウンロードします。
※dbdeployer
ではLinux Generic
パッケージのtarballを選択する必要があります。
1 |
$ wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-80/Percona-XtraDB-Cluster-8.0.19-10.1/binary/tarball/Percona-XtraDB-Cluster_8.0.19-10.1_Linux.x86_64.bionic.tar.gz |
※その他のOSの場合は、以下のダウンロードページから対象のOS用のURLを選択してください。
Download Percona XtraDB Cluster 8.0
dbdeployer の配置・展開先
公式のインストール手順の通りホームディレクトリ配下でインストールしていれば気にする必要はありませんが、WSL2 では前バージョンよりファイルシステムI/Oパフォーマンスの大幅な向上がなされているとのことで、
実際に検証したわけではないですが、dbdeployer
のバイナリやデータを展開する場所は /dev/sda(/)
配下のほうが /mnt/c
などの(元々)Windowsファイルシステムを使うよりも性能が良いかもしれません。
ちなみに、以下のコマンドで sandbox-home
(データディレクトリなどの格納場所)、sandbox-binary
(MySQLバイナリの格納場所)を任意の場所に変更することができます。
1 2 |
$ dbdeployer defaults update sandbox-home /opt/dbdeployer/sandboxes $ dbdeployer defaults update sandbox-binary /opt/dbdeployer/binaries |
その他
デバッグフラグ
もし、PXCデプロイがうまくいかない(エラーが発生した)場合、デバッグフラグ(SBDEBUG=1
)をコマンド先頭に付与することで、何らかのエラーのヒントが得られるかもしれません。
1 |
$ SBDEBUG=1 dbdeployer deploy replication --topology=pxc pxc_8.0.19 |
コマンド(スクリプト)Usageの確認
デプロイを実行した際にメッセージが出力されますが、以下のコマンドを実行するとマルチインスタンスのdbdeployer
で使用可能なコマンドのusageを確認することができます。
PXCの全ノードを操作できるなど、便利なスクリプトが揃っていますので、是非ご活用ください。
1 |
$ deployer usage multiple |
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
にその設定を書き込んでおきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ mkdir -p pxc80-scale/{config,cert} && chmod 777 pxc80-scale/cert && cd pxc80-scale $ cat > config/custom.cnf <<EOS [mysqld] ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem [client] ssl-ca = /cert/ca.pem ssl-cert = /cert/client-cert.pem ssl-key = /cert/client-key.pem [sst] encrypt = 4 ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem EOS |
その他、今回はデフォルトのままですが、必要に応じてパラメータをカスタムしたmy.cnf
を配置してマウントさせることもできます。
なお、PXCの/etc/my.cnfの構成は以下のようなインクルード構成になっていますので、適宜マウント先を指定してください。
1 2 3 4 |
bash-4.2$ cat /etc/my.cnf !include /etc/mysql/node.cnf !includedir /etc/my.cnf.d/ !includedir /etc/percona-xtradb-cluster.conf.d/ |
ついでに、デフォルトのmy.cnf
の中身もご紹介しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
bash-4.2$ cat /etc/mysql/node.cnf [mysqld] default_authentication_plugin=mysql_native_password datadir=/var/lib/mysql socket=/tmp/mysql.sock skip-host-cache core-file #server_id=0 binlog_format=ROW default_storage_engine=InnoDB innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_file_per_table = 1 innodb_autoinc_lock_mode=2 bind_address = 0.0.0.0 wsrep_slave_threads=2 wsrep_cluster_address=gcomm:// wsrep_provider=/usr/lib64/galera4/libgalera_smm.so wsrep_cluster_name=pxc80cluster wsrep_node_address=172.31.0.2 wsrep_node_incoming_address=e0d915aba34d:3306 wsrep_sst_method=xtrabackup-v2 [client] socket=/tmp/mysql.sock [sst] progress=/var/lib/mysql/sst_in_progress |
wsrep_cluster_name
はdocker-comopose.ymlで指定するクラスター名(CLUSTER_NAME
)がセットされます。wsrep_sst_method
がXtraBackup
になっていて、PXC8.0からの変更点として伺えます。
Index of wsrep system variables- さらに、PXC8.0ではXtraBackupの認証情報を内部的に生成するように変更されたので、以前のバージョンのDockerイメージでSSTメソッドをXtraBackupにしたい場合に設定していた
XTRABACKUP_PASSWORD
環境変数は不要になりました。
Percona XtraDB Cluster 8.0 New Feature: wsrep_sst_auth Removal – Percona Database Performance Blog
docker-compose.yml
docker-compose.yml
は次の通りの内容で作成します。
etcd
コンテナはサービスディスカバリ用です。
Perconaの公式イメージは、DISCOVERY_SERVICE
環境変数を設定することでサービスディスカバリによるノード追加・削除の状態管理ができるようになります。pxc-cert
は、先ほど紹介した、SSL自己署名証明書を事前に作成する役割になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
$ cat > docker-compose.yml <<'EOS' version: '3' services: etcd: image: quay.io/coreos/etcd ports: - "4001:4001" - "2380:2380" - "2379:2379" volumes: - /usr/share/ca-certificates/:/etc/ssl/certs environment: - ETCD_DATA_DIR=/opt/etcd/data - ETCD_NAME=etcd0 - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379,http://0.0.0.0:4001 - ETCD_ADVERTISE_CLIENT_URLS=http://${ETCD_HOST}:2379,http://${ETCD_HOST}:4001 - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://${ETCD_HOST}:2380 - ETCD-INITIAL-CLUSTER=etcd0=http://${ETCD_HOST}:2380 - ETCD_INITIAL_CLUSTER_STATE=new - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1 command: /usr/local/bin/etcd pxc-cert: image: percona/percona-xtradb-cluster:8.0 volumes: - ./cert:/cert command: mysql_ssl_rsa_setup -d ./cert pxc: image: percona/percona-xtradb-cluster:8.0 networks: - pxc-network volumes: - ./cert:/cert - ./config:/etc/percona-xtradb-cluster.conf.d environment: - DISCOVERY_SERVICE=${ETCD_HOST}:2379 - MYSQL_ROOT_PASSWORD=Pxc8.0 - CLUSTER_NAME=pxc80cluster ports: - "3306" depends_on: - etcd - pxc-cert networks: pxc-network: driver: bridge EOS |
pxc80-scale
ディレクトリ内は以下のとおりに構成されました。
1 2 3 4 5 6 |
$ tree . ├── cert ├── config │ └── custom.cnf └── docker-compose.yml |
初回起動(bootstrap)
まずは、etcd
・pxc-cert
・pxc
イニシャルノードを起動してみます。
ETCD_HOST
環境変数をexportしておくことをお忘れなく。
※今回は単一PC内で構築しているので、ip a s dev docker0
コマンドで確認できたIPアドレスを指定しています。
1 2 3 4 5 6 7 |
$ export ETCD_HOST=172.17.0.1;docker-compose up -d Creating network "pxc80-scale_default" with the default driver Creating network "pxc80-scale_pxc-network" with driver "bridge" Creating pxc80-scale_pxc-cert_1 ... done Creating pxc80-scale_etcd_1 ... done Creating pxc80-scale_pxc_1 ... done Attaching to pxc80-scale_pxc_1, pxc80-scale_etcd_1, pxc80-scale_pxc-cert_1 |
起動状況などをログなどで確認します。(出力が多いので割愛します)
1 |
$ docker-compose logs -f |
以下のコマンドでetcd
とpxc
が1コンテナづつUpしているのが確認できます。
1 2 3 4 5 6 |
$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------------------------- pxc80-scale_etcd_1 /usr/local/bin/etcd Up 0.0.0.0:2379->2379/tcp, 0.0.0.0:2380->2380/tcp, 0.0.0.0:4001->4001/tcp pxc80-scale_pxc-cert_1 /entrypoint.sh mysql_ssl_r ... Exit 0 pxc80-scale_pxc_1 /entrypoint.sh mysqld Up 0.0.0.0:32803->3306/tcp, 33060/tcp, 4567/tcp, 4568/tcp |
etcd
の状態も確認してみましょう。
etcdctl
とjq
を使用しますのでインストールがまだでしたら済ませておきます。
1 |
$ sudo apt install etcdctl jq |
以下のコマンドを実行して、etcd
自身の状態が正常に取得できれば問題ありません。
1 2 |
$ etcdctl --endpoints=http://${ETCD_HOST}:2379 member list 39687afabc2a1887: name=etcd0 peerURLs=http://172.17.0.1:2380 clientURLs=http://172.17.0.1:2379,http://172.17.0.1:4001 isLeader=true |
PXCクラスターの登録状態を確認するには以下のコマンドを実行します。
今はまだノードが一つだけ登録されている状態が確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ curl http://$ETCD_HOST:2379/v2/keys/pxc-cluster/$CLUSTER_NAME/?recursive=true | jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 628 100 628 0 0 306k 0 --:--:-- --:--:-- --:--:-- 306k { "action": "get", "node": { "key": "/pxc-cluster/pxc80cluster", "dir": true, "nodes": [ { "key": "/pxc-cluster/pxc80cluster/192.168.192.3", "dir": true, "expiration": "2020-06-30T05:09:42.05079726Z", "ttl": 28, "nodes": [ { "key": "/pxc-cluster/pxc80cluster/192.168.192.3/ipaddr", "value": "192.168.192.3", "expiration": "2020-06-30T05:09:42.03963913Z", "ttl": 28, "modifiedIndex": 137, "createdIndex": 137 }, { "key": "/pxc-cluster/pxc80cluster/192.168.192.3/hostname", "value": "2e4a938a8956", "expiration": "2020-06-30T05:09:42.044866691Z", "ttl": 28, "modifiedIndex": 138, "createdIndex": 138 } ], "modifiedIndex": 16, "createdIndex": 16 } ], "modifiedIndex": 5, "createdIndex": 5 } } |
PXCのwsrepステータス変数も確認してみます。
wsrep_cluster_size
が1で、各ステータスも正常です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ docker exec -it pxc80-scale_pxc_1 /usr/bin/mysql -uroot -pPxc8.0 -e " SHOW GLOBAL STATUS WHERE variable_name IN ('wsrep_local_state','wsrep_local_state_comment', 'wsrep_local_commits','wsrep_received', 'wsrep_cluster_size','wsrep_cluster_status', 'wsrep_local_state_uuid','wsrep_incoming_addresses', 'wsrep_gcomm_uuid','wsrep_connected','wsrep_ready')" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------------------+--------------------------------------+ | Variable_name | Value | +---------------------------+--------------------------------------+ | wsrep_local_state_uuid | 5025bd26-ba8f-11ea-847e-b6a5da6ebe47 | | wsrep_received | 2 | | wsrep_local_commits | 0 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_incoming_addresses | 2e4a938a8956:3306 | | wsrep_gcomm_uuid | 5c167303-ba8f-11ea-9f67-0b0027a2fe4a | | wsrep_cluster_size | 1 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | +---------------------------+--------------------------------------+ |
スケールアップ(ノード追加)
pxc
コンテナ数を1→3に増やしてスケールアップしてみます。
1 2 3 4 5 6 |
$ docker-compose up -d --scale pxc=3 pxc80-scale_etcd_1 is up-to-date Starting pxc80-scale_pxc-cert_1 ... done Starting pxc80-scale_pxc_1 ... done Creating pxc80-scale_pxc_2 ... done Creating pxc80-scale_pxc_3 ... done |
SSTによる同期が完了後、無事3ノード構成にスケールアップしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------------------------- pxc80-scale_etcd_1 /usr/local/bin/etcd Up 0.0.0.0:2379->2379/tcp, 0.0.0.0:2380->2380/tcp, 0.0.0.0:4001->4001/tcp pxc80-scale_pxc-cert_1 /entrypoint.sh mysql_ssl_r ... Exit 0 pxc80-scale_pxc_1 /entrypoint.sh mysqld Up 0.0.0.0:32803->3306/tcp, 33060/tcp, 4567/tcp, 4568/tcp pxc80-scale_pxc_2 /entrypoint.sh mysqld Up 0.0.0.0:32805->3306/tcp, 33060/tcp, 4567/tcp, 4568/tcp pxc80-scale_pxc_3 /entrypoint.sh mysqld Up 0.0.0.0:32804->3306/tcp, 33060/tcp, 4567/tcp, 4568/tcp $ docker-compose logs -f ... pxc_1 | 2020-06-30T05:34:04.426628Z 0 [Note] [MY-000000] [Galera] Member 1.0 (66da03ee3b97) synced with group. pxc_3 | 2020-06-30T05:34:04.426627Z 0 [Note] [MY-000000] [Galera] Member 1.0 (66da03ee3b97) synced with group. pxc_2 | 2020-06-30T05:34:04.426721Z 0 [Note] [MY-000000] [Galera] Member 1.0 (66da03ee3b97) synced with group. ... |
前掲のコマンドで(出力が多いのでフィルタして)、etcd
にPXCクラスターの状態が正常に追加登録されているか確認してみます。
1 2 3 4 5 6 7 |
$ curl http://$ETCD_HOST:2379/v2/keys/pxc-cluster/$CLUSTER_NAME/?recursive=true | jq -r '.node.nodes[].key' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1684 100 1684 0 0 822k 0 --:--:-- --:--:-- --:--:-- 822k /pxc-cluster/pxc80cluster/192.168.192.3 /pxc-cluster/pxc80cluster/192.168.192.4 /pxc-cluster/pxc80cluster/192.168.192.5 |
wsrep_cluster_size
も3に増加してます。
1 2 3 4 5 6 7 8 |
$ docker exec -it pxc80-scale_pxc_1 /usr/bin/mysql -uroot -pPxc8.0 -e " > SHOW GLOBAL STATUS WHERE variable_name LIKE 'wsrep_cluster_size'" mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ |
スケールダウン(縮退)
さらに3→5ノードにスケールアップしたのち、3ノードまで縮退させてみます。
ノード4,5が停止→削除されました。
1 2 3 4 5 6 7 8 |
$ docker-compose up -d --scale pxc=3 Starting pxc80-scale_pxc-cert_1 ... Starting pxc80-scale_pxc-cert_1 ... done Stopping and removing pxc80-scale_pxc_4 ... done Stopping and removing pxc80-scale_pxc_5 ... done Starting pxc80-scale_pxc_1 ... done Starting pxc80-scale_pxc_2 ... done Starting pxc80-scale_pxc_3 ... done |
出力ログも多いので抜粋ですが、4,5ノードはcleran upされて、3ノード構成に戻りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ docker-compose logs -f ... pxc_1 | 2020-06-30T05:38:05.085669Z 0 [Note] [MY-000000] [Galera] Quorum results: pxc_1 | version = 6, pxc_1 | component = PRIMARY, pxc_1 | conf_id = 4, pxc_1 | members = 3/3 (primary/total), pxc_1 | act_id = 10, pxc_1 | last_appl. = 6, pxc_1 | protocols = 2/10/4 (gcs/repl/appl), pxc_1 | vote policy= 0, pxc_1 | group UUID = 5025bd26-ba8f-11ea-847e-b6a5da6ebe47 pxc_1 | 2020-06-30T05:38:05.092300Z 2 [Note] [MY-000000] [Galera] ================================================ pxc_1 | View: pxc_1 | id: 5025bd26-ba8f-11ea-847e-b6a5da6ebe47:11 pxc_1 | status: primary pxc_1 | protocol_version: 4 pxc_1 | capabilities: MULTI-MASTER, CERTIFICATION, PARALLEL_APPLYING, REPLAY, ISOLATION, PAUSE, CAUSAL_READ, INCREMENTAL_WS, UNORDERED, PREORDERED, STREAMING, NBO pxc_1 | final: no pxc_1 | own_index: 2 pxc_1 | members(3): pxc_1 | 0: 381edde2-ba93-11ea-9fab-33a721a26518, cdb2f8052344 pxc_1 | 1: 3838e11c-ba93-11ea-8016-4b2964580b93, 66da03ee3b97 pxc_1 | 2: 5c167303-ba8f-11ea-9f67-0b0027a2fe4a, 2e4a938a8956 pxc_1 | ================================================= pxc_1 | 2020-06-30T05:38:05.092353Z 2 [Note] [MY-000000] [WSREP] wsrep_notify_cmd is not defined, skipping notification. pxc_1 | 2020-06-30T05:38:07.584678Z 0 [Note] [MY-000000] [Galera] cleaning up 9fbc3849 (ssl://192.168.144.5:4567) pxc_1 | 2020-06-30T05:38:07.584783Z 0 [Note] [MY-000000] [Galera] cleaning up 9fbfe557 (ssl://192.168.144.6:4567) ... |
この構成方法で、docker-compose.yml
に必要ノード数分コンテナを並べて書いて、初期ノード以外はCLUSTER_JOIN
環境変数を設定して…といった煩雑さがなくなり、docker-compose up -d --scale
コマンドだけでスケールアップ&スケールダウンが比較的自在に操作できるので、興味ありましたら是非試してみてください。
(おまけ) ProxySQL を追加構成する場合
docker-compose.yml
に以下のようなエントリを追記すると、ProxySQL
も併せて構成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
proxy: image: perconalab/proxysql networks: - pxc-network ports: - "3306:3306" - "6032:6032" environment: - CLUSTER_NAME=pxc80cluster - DISCOVERY_SERVICE=${ETCD_HOST}:2379 - MYSQL_ROOT_PASSWORD=Pxc8.0 - MYSQL_PROXY_USER=proxyuser - MYSQL_PROXY_PASSWORD=ProxyPxc8.0 |
※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
に設定する便利なスクリプトですが…
1 2 3 4 5 6 |
$ docker exec -it pxc80-scale_proxy_1 add_cluster_nodes.sh ... 192.168.192.3 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'ProxyPxc8.0'' at line 1 ... |
原因は、スクリプト内でユーザー作成を行っている箇所で、CREATE USER
でなくGRANT ... IDENTIFIED BY
を使っているので、MySQL 8.0 と非互換になってしまっていることです。
proxysql-docker/add_cluster_nodes.sh at adcd2f50e60fe42b1ca76ef10bc2888be98240f5 · Percona-Lab/proxysql-docker · GitHub
Dockerfile やスクリプトを修正するか、Percona公式の最新のイメージを使うようにするなりの対応が必要です。(ただしサービスディスカバリには対応していないので、perconalab版の拡張を適用してあげる必要あり)
- 1.4系:Docker Hub
- 2.0系:Docker Hub
まとめ
ローカルPCで(と言っても WSL2 にスポットを当てた内容になってしまいましたが)、手軽にPXC8.0を構築する方法を紹介させていただきました。
多少、etcd
の説明が多くなってしまったので、手軽にどころか一見面倒そうに見えるかもしれませんが、実際試してみると意外と簡単だと感じました。
もちろん、etcd
は使わずに、pxc
だけで(必要ノード分コンテナを並べて)構築するのでもアリだと思います。
PoCや実環境に即した目的や用途だったり、予め構築する環境やツールが整っている(VM や Vagrant, Ansible, e.t.c…)などの場合は別の選択肢が良いかもしれませんが、そのような環境が準備できない(ローカルPCしかない)といった場合には、本記事の内容がお役に立てるかもしれません。
また、これから初めてPXCを触ってみたいという方にも、是非お勧めの方法です。