概要
Percona XtraDB Cluster (以下、PXC)は、Percona社が開発するクラスタソフトウェアです。全ノードに対して参照・更新が可能な「マルチマスタ構成」を実現でき、オープンソースで提供されているため、気軽に利用することができます。
※ PXCは、「Galera Cluster」をベースとした製品です
しかし、推奨される最小構成が「3台以上」という制限が存在します。そのため、手元の環境で試そうとすると3台のサーバーを用意する必要があり、少々大変です。
そこで、この記事ではDockerを利用して、1台のサーバー上に3ノード構成のPXC環境を構築する手順について紹介したいと思います。
構築手順
1. Linuxサーバーをセットアップ
Dockerをインストールする任意のLinuxサーバーをセットアップします。
※ CentOS 7系でないと以下の手順が上手くいかない可能性があります
2. Docker, docker-compose をセットアップ
以下の手順で、Docker をインストールします。
1 2 3 4 5 6 7 |
$ su - # yum install -y yum-utils # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum makecache fast # yum -y install docker-ce # systemctl start docker.service |
次に、docker-composeをインストールします。このコマンドを使うと、複数台のコンテナを起動する作業を楽に進めることができます。
1 2 |
# curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose |
3. 各種設定ファイルを用意
以下の docker-compose.yml を作成します。
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 52 53 54 55 56 |
# cat << EOT >> ./docker-compose.yml version: '2' services: node01: image: percona/percona-xtradb-cluster:5.7 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_NAME=pxctest - XTRABACKUP_PASSWORD=password volumes: - ./node1_conf.d:/etc/mysql/conf.d ports: - "13306:3306" - "14567:4567" node02: image: percona/percona-xtradb-cluster:5.7 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=pxctest - XTRABACKUP_PASSWORD=password volumes: - ./node2_conf.d:/etc/mysql/conf.d ports: - "13307:3306" - "14568:4567" depends_on: - node01 node03: image: percona/percona-xtradb-cluster:5.7 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=pxctest - XTRABACKUP_PASSWORD=password volumes: - ./node3_conf.d:/etc/mysql/conf.d ports: - "13308:3306" - "14569:4567" depends_on: - node01 networks: cluster: driver: bridge EOT |
次に各ノードの設定ファイル(いわゆるmy.cnf)を作成します。
設定の内容は自由ですが、PXCで必須となるパラメータは必ず設定して下さい。
(binlog_format = ROW, wsrep_provider など)
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 |
# mkdir ./node1_conf.d # cat << EOT >> ./node1_conf.d/node.cnf [mysqld] datadir=/var/lib/mysql default_storage_engine=InnoDB binlog_format=ROW 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 = 4 wsrep_cluster_address = gcomm:// wsrep_provider = /usr/lib/galera3/libgalera_smm.so wsrep_cluster_name = demo wsrep_sst_method = xtrabackup-v2 wsrep_sst_auth = "root:" loose-pxc_strict_mode = PERMISSIVE EOT |
node2, node3 の設定ファイルは、上記の流用で問題ありません。
1 2 3 4 |
# mkdir ./node2_conf.d # mkdir ./node3_conf.d # cp ./node1_conf.d/node.cnf ./node2_conf.d # cp ./node1_conf.d/node.cnf ./node3_conf.d |
4. PXCのコンテナを起動
docker-composeコマンドで、PXCのコンテナを起動します。
1 2 3 4 5 6 7 8 9 10 11 |
# docker-compose up -d node01 # docker-compose logs -f -> 正常に起動したことを確認したら、Ctrl + C # docker-compose up -d node02 # docker-compose logs -f -> 正常に起動したことを確認したら、Ctrl + C # docker-compose up -d node03 # docker-compose logs -f -> 正常に起動したことを確認したら、Ctrl + C |
※ “mysqld: ready for connections.” などのメッセージが出力されたら、
ノードが正常に起動したと判断してよいです
5. 各ノードにアクセスする
以下のコマンドでPXCのノードにアクセスすることができます。
rootユーザのパスワードは、”password”です(ymlファイル内で設定しています)。
1 2 3 4 5 6 |
@ node1 # mysql -u root -p -h 127.0.0.1 -P13306 @ node2 # mysql -u root -p -h 127.0.0.1 -P13307 @ node3 # mysql -u root -p -h 127.0.0.1 -P13308 |
ログインしたら、念のため wsrep_cluster_size 変数の値を確認しましょう。
以下であれば、3ノードが問題なく接続できています。
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL STATUS LIKE "wsrep_cluster_size"; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ 1 row in set (0.00 sec) |
6. その他
問題なくPXCコンテナが起動していることが確認できたら、自由に操作して構いません。
ベンチマークや機能検証を行ってもよいかと思います。
もし、各ノードで何らかのエラーが発生し、ノードがダウンしてしまった場合は、
以下の手順で全コンテナを再構築することを推奨します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# docker ls -a -> 存在しているDockerコンテナを確認 # docker-compose stop -> 全てのコンテナを停止 # docker-compose rm -f -> 既存のDockerイメージを全て破棄 # docker ls -a -> 全てのコンテナが削除されたことを確認 # docker-compose up -d node01 -> もう一度各ノードを起動する |