データベースをデプロイする方法は複数あります。手作業でインストールでき、Ansible、Chef、Puppet、Saltなどの広く利用可能なインフラストラクチャオーケストレーションツールを利用できます。これらのツールは非常に人気があり、スクリプト、レシピ、プレイブックを見つけるのは非常に簡単です。名前を付けると、データベースクラスターのインストールを自動化するのに役立ちます。 ClusterControlのような、より特殊なデータベース自動化プラットフォームもあります。これは、自動展開にも使用できます。クラスタをデプロイするための最良の方法は何でしょうか?実際に展開するのにどれくらいの時間が必要ですか?
まず、何をしたいのかを明確にしましょう。 Percona XtraDBCluster5.7を展開するとします。これは3つのノードで構成され、そのためにUbuntu 16.04(bento / ubuntu-16.04イメージ)を実行する3つのVagrant仮想マシンを使用します。クラスターを手動でデプロイしてから、AnsibleとClusterControlを使用してデプロイを試みます。結果がどのようになるか見てみましょう。
手動展開
リポジトリの設定-1分45秒。
まず、すべてのUbuntuノードでPerconaリポジトリを構成する必要があります。クイックグーグル検索、仮想マシンへのssh、および必要なコマンドの実行には1分45秒かかります
手順が記載された次のページが見つかりました:
https://www.percona.com/doc/percona-repo-config/percona-release.html
「DEBベースのGNU/Linuxディストリビューション」セクションで説明されている手順を実行しました。また、aptのキャッシュを更新するために、aptupdateを実行しました。
PXCノードのインストール-2分45秒
このステップは基本的に次の実行で構成されます:
[email protected]:~# apt install percona-xtradb-cluster-5.7
残りは、パッケージがダウンロードされているため、主にインターネット接続速度に依存します。無人インストールではないため、入力も必要になります(スーパーユーザーのパスワードを渡すことになります)。すべてが完了すると、3つのPerconaXtraDBクラスターノードが実行されることになります。
root 15488 0.0 0.2 4504 1788 ? S 10:12 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 15847 0.3 28.3 1339576 215084 ? Sl 10:12 0:00 \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --wsrep-provider=/usr/lib/galera3/libgalera_smm.so --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --wsrep_start_position=00000000-0000-0000-0000-000000000000:-1
PXCノードの構成-3分25秒
ここからトリッキーな部分が始まります。経験と、何をする必要があるかを実際に理解するために必要な時間を定量化することは非常に困難です。良いことは、グーグル検索「percona xtrabdbクラスターをインストールする方法」は、プロセスがどのように見えるべきかを説明しているPerconaのドキュメントを指しています。 PXCとGaleraにどれだけ慣れているかにもよりますが、それでも多少時間がかかる場合があります。最悪のシナリオでは、追加の必要なアクションに気付かず、PXCに接続して作業を開始しますが、実際には3つのノードがあり、それぞれが独自のクラスターを形成していることに気づいていません。
Perconaの推奨事項に従い、それらのステップだけを実行する時間を計るとします。つまり、Percona Webサイトの指示に従って構成ファイルを変更し、最初のノードをブートストラップしようとしました。
[email protected]:~# /etc/init.d/mysql bootstrap-pxc
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
* Bootstrapping Percona XtraDB Cluster database server mysqld ^C
これは正しく見えませんでした。残念ながら、指示は明確ではありませんでした。繰り返しになりますが、何が起こっているのかわからない場合は、何が起こったのかを理解するためにより多くの時間を費やすでしょう。幸いなことに、stackoverflow.comは非常に役立ちます(ただし、取得したリストの最初の応答ではありません)。/etc/mysql/my.cnfファイルの[mysqld]セクションヘッダーが欠落していることに注意してください。これをすべてのノードに追加し、ブートストラッププロセスを繰り返すことで、問題が解決しました。合計で3分25秒を費やしました(問題が何であるかにすぐに気付いたので、エラーのグーグルは含まれていません)。
SSTの構成、他のノードのクラスターへの取り込み-8分から無限大まで
PerconaWebサイトの説明は非常に明確です。 1つのノードを稼働させたら、残りのノードを起動するだけで問題ありません。それを試しましたが、クラスターに参加しているノードをこれ以上見ることができませんでした。これは、問題の診断にかかる時間を知ることが事実上不可能な場所です。 6〜7分かかりましたが、すばやく実行できるようにするには、次のことを行う必要があります。
- PXC構成の構造をよく理解してください:
[email protected]:~# tree /etc/mysql/ /etc/mysql/ ├── conf.d │ ├── mysql.cnf │ └── mysqldump.cnf ├── my.cnf -> /etc/alternatives/my.cnf ├── my.cnf.fallback ├── my.cnf.old ├── percona-xtradb-cluster.cnf └── percona-xtradb-cluster.conf.d ├── client.cnf ├── mysqld.cnf ├── mysqld_safe.cnf └── wsrep.cnf
- MySQL構成ファイルで!includeおよび!includedirディレクティブがどのように機能するかを理解する
- MySQLが複数のファイルに含まれる同じ変数をどのように処理するかを理解する
- 何を探すべきかを理解し、ノードがそれ自体をブートストラップして独自にクラスターを形成する結果となる構成に注意してください。
この問題は、/ etc / mysql / my.cnfを除いて、命令がファイルについて言及していないという事実に関連していました。実際には、/ etc / mysql / percona-xtradb-cluster.conf.d/wsrepを変更する必要がありました。 .cnf。そのファイルには空の変数が含まれていました:
wsrep_cluster_address=gcomm://
また、このような構成では、参加する他のノードに関する情報がないため、ノードは強制的にブートストラップされます。その変数を/etc/mysql/my.cnfに設定しましたが、後でwsrep.cnfファイルが含まれ、設定が上書きされました。
この問題は、MySQLとGaleraの動作にあまり精通していない人にとっては深刻な障害となる可能性があり、デバッグに時間がかかるとは言えないまでも数時間かかる可能性があります。
合計インストール時間-16分(MySQL DBAの場合)
PerconaXtraDBClusterを16分でインストールできました。いくつかの点に注意する必要があります。構成は調整していません。これは、より多くの時間と知識を必要とするものです。 PXCノードには、主にバイナリロギングとGaleraライトセットレプリケーションに関連するいくつかの単純な構成が付属しています。 InnoDBのチューニングはありません。 MySQLの内部に精通していない場合、これは、内部メカニズムを読んで理解するのに数日ではないにしても数時間です。もう1つの重要なことは、これは、デプロイするすべてのクラスターに再適用する必要があるプロセスであるということです。最後に、Percona XtraDB ClusterとMySQL全般の経験により、問題を特定して非常に迅速に解決することができました。カジュアルユーザーは、何が起こっているのか、そしてその理由を理解するためにかなり多くの時間を費やす可能性があります。
Ansible Playbook
次に、Ansibleを使用した自動化について説明します。 Ansible Playbookを見つけて使用してみましょう。これは、以降のすべての展開で再利用できます。それを行うのにどれくらいの時間がかかるか見てみましょう。
SSH接続の構成-1分
Ansibleを接続して構成するには、すべてのノードにSSH接続が必要です。 SSHキーを生成し、手動でノード全体に配布しました。
AnsiblePlaybookの検索-2分15秒
ここでの主な問題は、利用できるプレイブックが非常に多いため、何が最適かを判断できないことです。そのため、Googleの上位3件の結果を使用して、そのうちの1つを選択することにしました。 https://github.com/cdelgehier/ansible-role-XtraDB-Clusterは、残りのものよりも構成可能であると思われるため、決定しました。
リポジトリのクローン作成とAnsibleのインストール-30秒
これは迅速です。必要なのは
apt install ansible git
git clone https://github.com/cdelgehier/ansible-role-XtraDB-Cluster.git
インベントリファイルの準備-1分10秒
この手順も非常に簡単で、ドキュメントの例を使用してインベントリファイルを作成しました。ノードのIPアドレスを環境で構成したものに置き換えただけです。
プレイブックの準備-1分45秒
ドキュメントからの最も広範な例を使用することにしました。これには、構成の調整も少し含まれています。 Ansibleの正しい構造を準備しました(ドキュメントにはそのような情報はありませんでした):
/root/pxcansible/
├── inventory
├── pxcplay.yml
└── roles
└── ansible-role-XtraDB-Cluster
次に実行しましたが、すぐにエラーが発生しました:
[email protected]:~/pxcansible# ansible-playbook pxcplay.yml
[WARNING]: provided hosts list is empty, only localhost is available
ERROR! no action detected in task
The error appears to have been in '/root/pxcansible/roles/ansible-role-XtraDB-Cluster/tasks/main.yml': line 28, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: "Include {{ ansible_distribution }} tasks"
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
これには1分45秒かかりました。
Playbook構文の問題の修正-3分25秒
エラーは誤解を招くものでしたが、一般的な経験則では、より新しいAnsibleバージョンを試してみました。私たちはグーグルで検索し、AnsibleのWebサイトで適切な手順を見つけました。プレイブックを実行する次の試みも失敗しました:
TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node2]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node3]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node1]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
新しいAnsibleバージョンをセットアップし、このエラーまでプレイブックを実行するには、3分25秒かかりました。
欠落しているPythonモジュールの修正-3分20秒
どうやら、私たちが使用した役割はその前提条件を処理しておらず、Galeraクラスターに接続して保護するためのPythonモジュールがありませんでした。最初にpipを介してMySQL-pythonをインストールしようとしましたが、mysql_configが必要なため、さらに時間がかかることが明らかになりました:
[email protected]:~# pip install MySQL-python
Collecting MySQL-python
Downloading https://files.pythonhosted.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip (108kB)
100% |████████████████████████████████| 112kB 278kB/s
Complete output from command python setup.py egg_info:
sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-zzwUtq/MySQL-python/setup.py", line 17, in <module>
metadata, options = get_config()
File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 43, in get_config
libs = mysql_config("libs_r")
File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 25, in mysql_config
raise EnvironmentError("%s not found" % (mysql_config.path,))
EnvironmentError: mysql_config not found
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-zzwUtq/MySQL-python/
これはMySQL開発ライブラリによって提供されるため、手動でインストールする必要がありますが、これはほとんど意味がありません。他のパッケージをインストールする必要がないPyMySQLを使用することにしました。これにより、別の問題が発生しました:
TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
to retry, use: --limit @/root/pxcansible/pxcplay.retry
この時点まで、3分20秒を費やしました。
「アクセスが拒否されました」エラーの修正-18分55秒
エラーごとに、MySQL構成が正しく準備され、データベースに接続するための正しいユーザーとパスワードが含まれていることを確認しました。残念ながら、これは期待どおりに機能しませんでした。さらに調査したところ、ステップが完了としてマークされていても、ロールがrootユーザーを適切に作成していないことがわかりました。簡単な調査を行いましたが、プレイブックをデバッグするのではなく、手動で修正することにしました。これは、実行した手順よりも時間がかかります。正しいパスワードを使用して、ユーザー[email protected]と[email protected]を手動で作成しました。これにより、このステップを通過して別のエラーに進むことができました:
TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]
TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]
TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]
TASK [ansible-role-XtraDB-Cluster : Start the slave nodes] ************************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
to retry, use: --limit @/root/pxcansible/pxcplay.retry
このセクションでは、18分55秒を費やしました。
「スレーブノードの開始」の問題の修正(パート1)-7分40秒
この問題を解決するために、いくつかのことを試みました。その名前を使用してノードを指定しようとしましたが、グループ名を切り替えようとしましたが、問題は解決しませんでした。ドキュメントで提供されているスクリプトを使用して環境をクリーンアップし、最初から始めることにしました。それはそれをきれいにしませんでしたが、ただ事態をさらに悪化させました。 7分40秒後、仮想マシンを消去し、環境を再作成して、Pythonの依存関係を追加するときに問題が解決することを期待して、最初からやり直すことにしました。
「スレーブノードの開始」の問題の修正(パート2)-13分15秒
残念ながら、Pythonの前提条件を設定してもまったく役に立ちませんでした。プロセスを手動で終了し、最初のノードをブートストラップしてから、SSTユーザーを構成し、残りのスレーブを開始することにしました。これで「自動化された」セットアップが完了し、デバッグに13分15秒かかり、最終的にはプレイブックデザイナーが期待したように機能しないことを受け入れました。
さらなるデバッグ-10分45秒
私たちはそこで止まらず、もう1つ試してみることにしました。 Ansible変数に依存する代わりに、ノードの1つのIPをマスターノードとして配置します。これで問題のその部分が解決され、最終的に次のようになりました。
TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node2]
skipping: [node3]
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1045, u\"Access denied for user 'root'@'::1' (using password: YES)\")"}
これで試行は終了しました。このユーザーを追加しようとしましたが、MySQLクライアントを使用しているときにIPv6 localhostアドレスを使用して接続できたため、ansibleプレイブックでは正しく機能しませんでした。
合計インストール時間-不明(自動インストールに失敗しました)
合計で64分を費やしましたが、まだ自動的に処理を進めることができていません。残りの問題は、ルートパスワードの作成が機能していないようで、Galera Clusterを起動することです(SSTユーザーの問題)。それをさらにデバッグするのにどれくらいの時間がかかるかを知るのは難しいです。それは確かに可能です-それは本当にAnsibleとMySQLの経験に依存しているので、定量化するのは難しいです。これは、誰もがダウンロード、構成、実行できるものではありません。ええと、多分別のプレイブックは違った働きをしたでしょう?可能ですが、別の問題が発生する可能性もあります。さて、登る学習曲線とデバッグする必要がありますが、すべての準備が整ったら、スクリプトを実行するだけです。まあ、それは一種の真実です。メンテナによって導入された変更が依存するものを壊さない限り、または新しいAnsibleバージョンがプレイブックを壊すか、メンテナがプロジェクトを忘れて開発を停止する限り(私たちが使用した役割については、非常に便利なプルリクエストが待機していますすでにほぼ1年間、Pythonの依存関係の問題を解決できる可能性があります-マージされていません)。このコードを維持する必要があることに同意しない限り、特に元の開発者がコードを最新の状態に保つインセンティブがないことを考えると、100%正確で環境内で機能していることを信頼することはできません。また、他のバージョンはどうですか?この特定のプレイブックを使用して、PXC5.6またはMariaDBバージョンをインストールすることはできません。確かに、あなたが見つけることができる他のプレイブックがあります。それらはより良く機能しますか、それとも機能させるためにさらに何時間も費やしますか?
データベースインフラストラクチャ全体のClusterControlSingleコンソールClusterControlのその他の新機能を確認するClusterControlを無料でインストールClusterControl
最後に、ClusterControlを使用してPerconaXtraDBクラスターをデプロイする方法を見てみましょう。
SSH接続の構成-1分
ClusterControlを接続して構成するには、すべてのノードにSSH接続が必要です。 SSHキーを生成し、手動でノード全体に配布しました。
ClusterControlの設定-3分15秒
「ClusterControlのインストール」をすばやく検索すると、関連するClusterControlのドキュメントページが表示されました。 「ClusterControlをインストールするためのより簡単な方法」を探していたため、リンクをたどると次の手順が見つかりました。
スクリプトのダウンロードと実行には3分15秒かかりました。無人インストールではないように、インストールの進行中にいくつかのアクションを実行する必要がありました。
UIへのログインと展開の開始-1分10秒
ブラウザでClusterControlノードのIPを指定しました。
必要な連絡先情報を渡し、ようこそ画面が表示されました:
次のステップ-展開オプションを選択しました。
SSH接続の詳細を渡す必要がありました。
また、使用するベンダー、バージョン、パスワード、およびホストも決定しました。このプロセス全体には1分10秒かかりました。
PerconaXtraDBクラスターの展開-12分5秒
残ったのは、ClusterControlが展開を完了するのを待つことだけでした。 12分5秒後、クラスターの準備が整いました:
合計インストール時間-17分30秒
関連リソースClusterControlforMySQL ClusterControl for MariaDB ClusterControl for Galera ClusterClusterControlをデプロイしてから、ClusterControlを使用してPXCクラスターを17分30秒でデプロイすることができました。 PXCの導入自体には12分5秒かかりました 。最後に、ベストプラクティスに従って展開された作業クラスターがあります。 ClusterControlは、クラスターの構成が適切であることも保証します。つまり、MySQLまたはGalera Clusterについて何も知らなくても、数分で実稼働対応のクラスターをデプロイできます。 ClusterControlは単なるデプロイメントツールではなく、管理プラットフォームでもあります。MySQLとGaleraの経験がない人でも、パフォーマンスの問題を(アドバイザーを通じて)特定し、管理アクション(クラスターのスケールアップとスケールダウン、バックアップの実行、作成)を行うのがさらに簡単になります。 Galeraへの非同期スレーブ)。重要なのは、ClusterControlが常に維持され、すべてのMySQLフレーバーをデプロイするために使用できることです(MySQL / MariaDBだけでなく、TimeScaleDB、PostgreSQL、MongoDBもサポートしています)。また、箱から出してすぐに機能しました。これは、私たちがテストした他の方法では言えません。
同じことを体験したい場合は、ClusterControlを無料でダウンロードできます。気に入った点を教えてください。