次世代MySQL Sandbox! dbdeployerの使用方法について
私は以前からMySQL Sandboxの愛用者なのですが、
先日のPercona社のブログで、Peter Z氏が新MySQL Sandboxであるdbdeployerについて紹介していたので、ただでさえ便利なMySQL Sandboxが、どれだけ改善されているのか検証してみました。
検証環境には、CentOS 7.4を使用しました。
DB Deployer のインストール
MySQL SandboxはPerl製で、いくつかの依存パッケージとともにインストールが必要
でしたが、dbdeployerはGoで作成されており、単一のバイナリファイルとして提供されています。
インストールは簡単で、任意のディレクトリにDB Deployerのパッケージを展開するだけです。バイナリを直接実行してもいいですが、例では/usr/local/binに配置しています。
1 2 3 4 5 6 7 8 |
$ VERSION=1.5.0 $ curl -OkL \ https://github.com/datacharmer/dbdeployer/releases/download/$VERSION/dbdeployer-$VERSION.linux.tar.gz $ tar xzvf dbdeployer-$VERSION.linux.tar.gz $ ls dbdeployer-$VERSION.linux $ chmod +x dbdeployer-$VERSION.linux $ sudo mv dbdeployer-$VERSION.linux /usr/local/bin/dbdeployer |
dbdeployer自体の動作のために追加のパッケージは必要ありませんが、MySQL 5.6以上の依存関係のために、事前にlibaio、libnumaをインストールしておきます。
1 |
$ sudo yum -y install libaio numactl-libs |
また、MySQL自体のtar.gz版パッケージも必要です。
デフォルトでは、$HOME/opt/mysql配下に展開したパッケージが検索されます。
今回は、MySQL、Percona、MariaDBのパッケージを用意しました。
いずれも2018/05/28現在の最新版を使用しています。
1 2 3 4 5 6 |
# MySQL $ curl -OkL https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz # Percona $ curl -OkL https://www.percona.com/downloads/Percona-Server-LATEST/Percona-Server-5.7.21-21/binary/tarball/Percona-Server-5.7.21-21-Linux.x86_64.ssl101.tar.gz # MariaDB $ curl -OkL https://downloads.mariadb.org/interstitial/mariadb-10.3.7/bintar-linux-systemd-x86_64/mariadb-10.3.7-linux-systemd-x86_64.tar.gz |
展開先ディレクトリも作成しておきましょう。
1 |
$ mkdir -p $HOME/opt/mysql |
MySQL Sandboxは、make_sandboxコマンドでtar.gzファイルを直接指定すれば自動で展開、起動までをしてくれましたが、dbdeployerでは unpackサブコマンドで展開を先に行う必要があるようです。
1 2 3 |
$ dbdeployer unpack ./mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz Unpacking tarball ./mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz to $HOME/opt/mysql/8.0.11 .........100.........200........289 |
進捗の数値の意味は不明ですが、解凍が完了すると、$HOME/opt/mysql配下にディレクトリが作成されていると思います。
同様にすべてのパッケージを展開しますが、一つ問題があります。
通常のコマンドで展開した場合は、MySQLとPercona Serverのバージョン体系は同じなので、どちらのパッケージなのかわからなくなってしまいます。
dbdeployerにはそのような場合に対応できるように --perfix オプションが用意されています。
--prefix=percona_とすることで、ディレクトリ名の先頭に指定した文字列を付けて展開します。
1 |
$ dbdeployer unpack --prefix=percona_ ./Percona-Server-5.7.21-21-Linux.x86_64.ssl101.tar.gz |
展開したパッケージは available で確認可能です。
1 2 3 |
dbdeployer available Basedir: /home/vagrant/opt/mysql 10.3.7 8.0.11 percona_5.7.21 |
インスタンスの起動
dbdeployerでは、single、multiple、replicationの3パターンの構築方法が用意されています。
まずは、単純にMySQL 8.0.11のシングルインスタンスを起動してみます。
1 2 3 4 |
$ dbdeployer deploy single 8.0.11 Database installed in $HOME/sandboxes/msb_8_0_11 run 'dbdeployer usage single' for basic instructions' .. sandbox server started |
無事起動したようです。
作成済みのインスタンスは、
sandboxesで確認できます。
1 2 |
$ dbdeployer sandboxes msb_8_0_11 : single 8.0.11 [8011 18011] |
インスタンスへの操作方法は、 usageで確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ dbdeployer usage single USING A SANDBOX Change directory to the newly created one (default: $SANDBOX_HOME/msb_VERSION for single sandboxes) [ $SANDBOX_HOME = $HOME/sandboxes unless modified with flag --sandbox-home ] The sandbox directory of the instance you just created contains some handy scripts to manage your server easily and in isolation. "./start", "./status", "./restart", and "./stop" do what their name suggests. start and restart accept parameters that are eventually passed to the server. e.g.: : : : |
作成済みのインスタンスのディレクトリは、デフォルトで
$HOME/sandboxes/msb_$VERSION です。
MySQL Sandboxと同じディレクトリ構造のようです。
バージョンのドット(.)はアンダースコア(_)に変換されますので、ご注意ください。
インスタンスに接続してみましょう。
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 |
$ VERSION=8_0_11 $ $HOME/sandboxes/msb_$VERSION/use mysql [localhost] {msandbox} ((none)) > status -------------- /home/vagrant/opt/mysql/8.0.11/bin/mysql Ver 8.0.11 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL) Connection id: 9 Current database: Current user: msandbox@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.11 MySQL Community Server - GPL Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 UNIX socket: /tmp/mysql_sandbox8011.sock Uptime: 1 min 57 sec Threads: 2 Questions: 42 Slow queries: 0 Opens: 201 Flush tables: 2 Open tables: 76 Queries per second avg: 0.358 -------------- |
正常に起動し、接続できました。
それでは、MariaDB、Percona Serverも同様に構築してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ dbdeployer deploy single percona_5.7.21 Database installed in $HOME/sandboxes/msb_percona_5_7_21 run 'dbdeployer usage single' for basic instructions' . sandbox server started $ dbdeployer deploy single 10.3.7 Database installed in $HOME/sandboxes/msb_10_3_7 run 'dbdeployer usage single' for basic instructions' . sandbox server started [vagrant@sandbox dbdeployer]$ dbdeployer sandboxes msb_10_3_7 : single 10.3.7 [10307] msb_8_0_11 : single 8.0.11 [8011 18011] msb_percona_5_7_21 : single percona_5.7.21 [5721] |
すべてのバージョンの環境が非常に簡単に構築できました。
インスタンスへの操作
個々のインスタンスへの操作は、 $HOME/sandboxes/msb_$VERSIONディレクトリ配下のスクリプト(start/stop/restart/status etc..)を使用して行います。
このあたりについては、MySQL Sandboxと変更はありません。
すべてのインスタンスに対する操作を、 globalで行うことが可能となっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ dbdeployer global use "select @@version" # Running "use" on msb_10_3_7 @@version 10.3.7-MariaDB # Running "use" on msb_8_0_11 @@version 8.0.11 # Running "use" on msb_percona_5_7_21 @@version 5.7.21-21 |
今回構築した全環境のパラメータを1回の操作で確認することができ、検証用途では非常に便利です。
useの他に、restart、start、stop、status、test、test_replicationのコマンドが実行できます。
環境の削除
MySQL Sandboxでは環境の削除は、sbtoolを使用していましたが、dbdeployerではサブコマンドに統合されました。
指定するのは、環境のディレクトリ名になりますので、
sandboxesで事前に確認します。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ dbdeployer sandboxes msb_10_3_7 : single 10.3.7 [10307] msb_8_0_11 : single 8.0.11 [8011 18011] msb_percona_5_7_21 : single percona_5.7.21 [5721] $ dbdeployer delete msb_8_0_11 List of deployed sandboxes: /home/vagrant/sandboxes/msb_8_0_11 Running /home/vagrant/sandboxes/msb_8_0_11/stop stop /home/vagrant/sandboxes/msb_8_0_11 Running rm -rf /home/vagrant/sandboxes/msb_8_0_11 Sandbox /home/vagrant/sandboxes/msb_8_0_11 deleted |
非同期レプリケーション環境の作成
インスタンスの構築の際に、replicationが指定可能という事を記載しました。
実際に、レプリケーション環境が構築できるか試してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ dbdeployer deploy replication 8.0.11 Installing and starting master .. sandbox server started Installing and starting slave1 .. sandbox server started Installing and starting slave2 .. sandbox server started $HOME/sandboxes/rsandbox_8_0_11/initialize_slaves initializing slave 1 initializing slave 2 Replication directory installed in $HOME/sandboxes/rsandbox_8_0_11 run 'dbdeployer usage multiple' for basic instructions' |
Master 1 + Slave 2 の非同期レプリケーション環境が作成されました。
操作はMySQL Sandboxと同様です。
1 2 3 |
$ $HOME/sandboxes/rsandbox_$VERSION/m # Masterへ接続 $ $HOME/sandboxes/rsandbox_$VERSION/s1 # Slave1へ接続 $ $HOME/sandboxes/rsandbox_$VERSION/s2 # Slave2へ接続 |
しかし、usage multipleを見ると、対象をmaster/slaveに絞ってSQLを実行する方法が追加されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ dbdeployer usage multiple USING MULTIPLE SERVER SANDBOX On a replication sandbox, you have the same commands (run "dbdeployer usage single"), with an "_all" suffix, meaning that you propagate the command to all the members. Then you have "./m" as a shortcut to use the master, "./s1" and "./s2" to access the slaves (and "s3", "s4" ... if you define more). In group sandboxes without a master slave relationship (group replication and multiple sandboxes) the nodes can be accessed by ./n1, ./n2, ./n3, and so on. start_all [options] > starts all nodes status_all > get the status of all nodes restart_all [options] > restarts all nodes stop_all > stops all nodes use_all "SQL" > runs a SQL statement in all nodes use_all_masters "SQL" > runs a SQL statement in all masters ★ use_all_slaves "SQL" > runs a SQL statement in all slaves ★ clear_all > stops all nodes and removes all data m > invokes MySQL client in the master s1, s2, n1, n2 > invokes MySQL client in slave 1, 2, node 1, 2 The scripts "check_slaves" or "check_nodes" give the status of replication in the sandbox. |
また、check_slaves/check_masterスクリプトが追加されていて、非常に便利に
ステータスを確認できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ $HOME/sandboxes/rsandbox_8_0_11/check_slaves master port 19023 - server_id 100 File: mysql-bin.000001 Position: 7603 Executed_Gtid_Set: slave1 port 19024 - server_id 200 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 7603 Slave_IO_Running: Yes Slave_SQL_Running: Yes Exec_Master_Log_Pos: 7603 Retrieved_Gtid_Set: Executed_Gtid_Set: slave2 port 19025 - server_id 300 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 7603 Slave_IO_Running: Yes Slave_SQL_Running: Yes Exec_Master_Log_Pos: 7603 Retrieved_Gtid_Set: Executed_Gtid_Set: |
グループレプリケーション環境の作成
dbdeployerではMySQL Group Replicationも、簡単に作成できます。
構築は–topology=groupを指定するだけです。
さらに、シングルプライマリ、マルチプライマリも選択可能です。
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 |
$ dbdeployer deploy --topology=group replication percona_5.7.21 : : $HOME/sandboxes/group_msb_percona_5_7_21/initialize_nodes # Node 1 # reset master; CHANGE MASTER TO MASTER_USER='rsandbox', MASTER_PASSWORD='rsandbox' FOR CHANNEL 'group_replication_recovery'; # Node 2 # reset master; CHANGE MASTER TO MASTER_USER='rsandbox', MASTER_PASSWORD='rsandbox' FOR CHANNEL 'group_replication_recovery'; # Node 3 # reset master; CHANGE MASTER TO MASTER_USER='rsandbox', MASTER_PASSWORD='rsandbox' FOR CHANNEL 'group_replication_recovery'; # Node 1 # SET GLOBAL group_replication_bootstrap_group=ON; # Node 1 # START GROUP_REPLICATION; # Node 2 # START GROUP_REPLICATION; # Node 3 # START GROUP_REPLICATION; # Node 1 # SET GLOBAL group_replication_bootstrap_group=OFF; # Node 1 # select * from performance_schema.replication_group_members +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 00017743-1111-1111-1111-111111111111 | 127.0.0.1 | 17743 | ONLINE | | group_replication_applier | 00017744-2222-2222-2222-222222222222 | 127.0.0.1 | 17744 | ONLINE | | group_replication_applier | 00017745-3333-3333-3333-333333333333 | 127.0.0.1 | 17745 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ # Node 2 # select * from performance_schema.replication_group_members +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 00017743-1111-1111-1111-111111111111 | 127.0.0.1 | 17743 | ONLINE | | group_replication_applier | 00017744-2222-2222-2222-222222222222 | 127.0.0.1 | 17744 | ONLINE | | group_replication_applier | 00017745-3333-3333-3333-333333333333 | 127.0.0.1 | 17745 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ # Node 3 # select * from performance_schema.replication_group_members +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 00017743-1111-1111-1111-111111111111 | 127.0.0.1 | 17743 | ONLINE | | group_replication_applier | 00017744-2222-2222-2222-222222222222 | 127.0.0.1 | 17744 | ONLINE | | group_replication_applier | 00017745-3333-3333-3333-333333333333 | 127.0.0.1 | 17745 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ Replication directory installed in $HOME/sandboxes/group_msb_percona_5_7_21 |
通常のレプリケーションの処理を行いサーバを起動した後、追加の処理でグループレプリケーションを構築しています。
シングルプライマリの場合は、以下のコマンドとなります。
1 |
$ dbdeployer deploy --topology=group replication 5.7.21 --single-primary |
マルチソースレプリケーション環境の作成
マルチソースレプリケーション環境もコマンド1つで作成可能です。
マルチソースレプリケーションは、Fan-in レプリケーションとも呼ばれ、dbdeployerでは–topology=fan-inで指定します。
1 |
$ dbdeployer deploy --topology=fan-in replication 8.0.11 |
MySQL Sandboxとの機能差異
下記のページに網羅されています。
https://github.com/datacharmer/dbdeployer/blob/master/docs/features.md
今後のプランとしては、Galera Replication/MySQL Clusterの対応、リモートに配置した
tar ballのデプロイ等があり、非常に楽しみです。
bash-completion対応
コマンドのサブコマンドやオプションをタブ補完するために、bash-completionのスクリプトを提供しているコマンドは数多くありますが、dbdeployerもbash_completion用のスクリプトがあります。
利用には、別途生成する作業が必要です。
生成のためには、パッケージ名に
-docsとついたほうのバイナリを使用する必要があります。
-docsパッケージは、通常のdbdeployerとしても使用可能ですが、いくつかの追加機能があります。
ここでは簡単にbash_completionの設定のみご紹介しますが、興味があればドキュメントを参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ curl -OkL https://github.com/datacharmer/dbdeployer/releases/download/1.5.0/dbdeployer-1.5.0-docs.linux.tar.gz $ tar xzvf dbdeployer-1.5.0-docs.linux.tar.gz $ ./dbdeployer-1.5.0-docs.linux tree -h This command is only used to create API documentation. You can, however, use it to show the command structure at a glance. Usage: dbdeployer tree [flags] Aliases: tree, docs Flags: --api Writes API template --bash-completion creates bash-completion file -h, --help help for tree --man-pages Writes man pages --markdown-pages Writes Markdown docs --rst-pages Writes Restructured Text docs --show-hidden Shows also hidden commands |
treeコマンドは、dbdeployerの各APIを網羅するためのコマンドです。
treeに–bash-completionオプションをつけて実行すると、スクリプトが生成されます。
1 2 |
$ ./dbdeployer-1.5.0-docs.linux tree --bash-completion Copy dbdeployer_completion.sh to the completion directory (/etc/bash_completion.d or /usr/local/etc/bash_completion.d) |
出力結果の通り、/etc/bash_completion.dにスクリプトをコピーします。
1 |
$ sudo cp -pi ./dbdeployer_completion.sh /etc/bash_completion.d/ |
現在のシェルで補完を有効化するために、スクリプトを読み込みます。
1 |
$ source /etc/bash_completion.d/dbdeployer_completion.sh |
補完が有効化されます。
1 2 |
$ dbdeployer admin defaults delete deploy global sandboxes unpack usage versions |
まとめ
MySQL SandboxのReDesignというだけあり、MySQL Sandboxでできていたことは、ほぼすべて網羅されているようでした。
また、比較的新しい機能(MySQL GROUP REPLICATION/Multi Source Replication/X Plugin)についても網羅され、更に便利になっていました。
将来的には、あらゆるMySQL Fork製品を場所、構成問わず1コマンドでデプロイできるようなツールになりえる可能性を感じました。
いくつものバージョンのMySQLの検証環境を構築する必要がある、MySQL Forkの製品を横に並べて機能を比較検討されたい等のニーズがある方は、ぜひ一度お試しいただければと思います。