次世代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の製品を横に並べて機能を比較検討されたい等のニーズがある方は、ぜひ一度お試しいただければと思います。


 
		 
		 
			 
			 
			 
			 
			 
			 
			 
			