sql >> データベース >  >> RDS >> MariaDB

ClusterControlを使用したVitessとMySQLの実行

    Vitessに精通していないすべての人にとって、これはMySQLベースのデータベースシステムであり、拡張が容易な、シャーディングされたリレーショナルデータベース管理システムを提供することを目的としています。設計の詳細については説明しませんが、要するに、Vitessは、要求をルーティングするプロキシノード、データベースノードを管理するゲートウェイ、そして最後に、データを格納することを目的としたMySQLデータベースノード自体で構成されます。 MySQLについて話している場合、実際には、ClusterControlなどの外部ツールを使用してこれらの基盤となるデータベースを管理するオプションがあるかどうかを考えるかもしれません。簡単な答えは「はい」です。より長い答えはこのブログ投稿になります。

    VitessのMySQL

    まず、VitessがMySQLをどのように使用しているかについて少し時間をかけて話したいと思います。高レベルのアーキテクチャについては、Vitessのドキュメントページで説明されています。つまり、プロキシとして機能するVTGate、Zookeeper、Consul、またはEtcdに基づくメタデータストアであるTopology Serviceがあり、システム内のノードに関するすべての情報が配置され、最後にVTTabletsが機能します。 VTGateとMySQLインスタンス間の仲介者として。 MySQLインスタンスはスタンドアロンにすることも、標準の非同期(または準同期)レプリケーションを使用して構成することもできます。 MySQLはデータの保存に使用されます。データはシャードに分割できます。その場合、MySQLインスタンスにはデータのサブセットが含まれます。

    これはすべてうまく機能します。 Vitessは、どのノードがマスターで、どのノードがスレーブであるかを判別し、それに応じてクエリをルーティングできます。ただし、いくつかの問題があります。最も基本的な機能のすべてがVitessによって提供されるわけではありません。はい、トポロジ検出とクエリルーティング。バックアップ-はい、同様に、Vitessはデータのバックアップを取り、ユーザーがバックアップされたものを復元できるように構成できます。残念ながら、自動フェイルオーバーの内部サポートはありません。ユーザーがデータベースの状態とそのワークロードを理解するのに役立つ適切なトレンドUIはありません。幸い、標準のMySQLについて話しているので、これを実現するために外部ソリューションを簡単に使用できます。たとえば、フェイルオーバーの場合、VitessをOrchestratorと統合できます。 ClusterControlをVitessと組み合わせて使用​​して、管理、監視、フェイルオーバーを提供する方法を見てみましょう。

    ClusterControlを使用した新しいデータベースクラスターの導入

    まず、新しいクラスターをデプロイしましょう。 ClusterControlの場合と同様に、ハードウェアをプロビジョニングし、ClusterControlがSSHを使用してそれらのノードにアクセスできるようにする必要があります。

    まず、SSH接続を定義する必要があります。

    次に、ベンダーとバージョンを選択します。ドキュメントによると、Vitessはバージョン5.7および8.0でMySQLおよびPercona Serverをサポートしています(ただし、caching_sha2_passwordメソッドはサポートされていないため、ユーザーを作成するときは注意が必要です)。また、10.3までのMariaDBもサポートしています。

    最後に、トポロジを定義します。 [デプロイ]をクリックすると、ClusterControlがクラスターのデプロイを実行します。

    準備ができたら、クラスターが表示され、次のことができるようになります。 ClusterControlを使用して管理します。クラスターとノードの自動回復が有効になっている場合、ClusterControlは必要に応じて自動フェイルオーバーを実行します。

    「ダッシュボード」セクションでは、エージェントベースの監視も利用できます。 ClusterControlUIの。

    クラスターをVitessにインポートする

    次のステップとして、Vitessをデプロイする必要があります。ここで説明するのは、決して実稼働グレードのセットアップではないため、Vitessドキュメントのチュートリアルに従って、いくつかのコーナーを切り取り、Vitessスイートを単一ノードにデプロイするだけです。扱いやすくするために、ローカルインストールガイドを使用します。このガイドでは、すべてのサービスとサンプルデータベースを単一のノードにデプロイします。それらを収容するのに十分な大きさにします。テストの目的では、2つのCPUコアと4GBのメモリを備えたノードで十分です。

    すべてがうまくいき、ノードでローカルのVitessデプロイメントが実行されていると仮定しましょう。次のステップは、ClusterControlによってデプロイされたクラスターをVitessにインポートすることです。そのためには、さらに2つのVTTabletsを実行する必要があります。まず、これらのVTTabletsのディレクトリを作成します。

    [email protected]:~$ cd /home/vagrant/my-vitess-example/
    [email protected]:~/my-vitess-example$ source env.sh
    [email protected]:~/my-vitess-example$ mkdir $VTDATAROOT/vt_0000000401
    [email protected]:~/my-vitess-example$ mkdir $VTDATAROOT/vt_0000000402

    次に、データベース上に、Vitessがデータベースに接続して管理するために使用するユーザーを作成します。

    mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'pass';
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT ALL ON *.* TO [email protected]'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0.01 sec)

    必要に応じて、さらに多くのユーザーを作成することもできます。 Vitessを使用すると、アプリケーションユーザー、DBAユーザー、レプリケーションユーザー、完全な特権ユーザーなど、さまざまなアクセス権限を持つ2人のユーザーを渡すことができます。

    最後に行う必要があるのは、すべてのMySQLでsuper_read_onlyを無効にすることです。 Vitessがレプリカ上にメタデータを作成しようとするため、vttabletサービスの開始に失敗します。

    これが完了したら、VTTabletsを起動する必要があります。どちらの場合も、ポートが一意であることと、データベースインスタンスにアクセスするための正しい資格情報を渡すことを確認する必要があります。

    vttablet $TOPOLOGY_FLAGS -logtostderr -log_queries_to_file $VTDATAROOT/tmp/vttablet_0000000401_querylog.txt -tablet-path "zone1-0000000401" -init_keyspace clustercontrol -init_shard 0 -init_tablet_type replica -port 15401 -grpc_port 16401 -service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' -pid_file $VTDATAROOT/vt_0000000401/vttablet.pid -vtctld_addr http://localhost:15000/ -db_host 10.0.0.181 -db_port 3306 -db_app_user vtuser -db_app_password pass -db_dba_user vtuser -db_dba_password pass -db_repl_user vtuser -db_repl_password pass -db_filtered_user vtuser -db_filtered_password pass -db_allprivs_user vtuser -db_allprivs_password pass -init_db_name_override clustercontrol -init_populate_metadata &
    
    vttablet $TOPOLOGY_FLAGS -logtostderr -log_queries_to_file $VTDATAROOT/tmp/vttablet_0000000402_querylog.txt -tablet-path "zone1-0000000402" -init_keyspace clustercontrol -init_shard 0 -init_tablet_type replica -port 15402 -grpc_port 16402 -service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' -pid_file $VTDATAROOT/vt_0000000402/vttablet.pid -vtctld_addr http://localhost:15000/ -db_host 10.0.0.182 -db_port 3306 -db_app_user vtuser -db_app_password pass -db_dba_user vtuser -db_dba_password pass -db_repl_user vtuser -db_repl_password pass -db_filtered_user vtuser -db_filtered_password pass -db_allprivs_user vtuser -db_allprivs_password pass -init_db_name_override clustercontrol -init_populate_metadata &

    準備ができたら、Vitessが新しいVTTabletsをどのように認識しているかを確認できます。

    [email protected]:~/my-vitess-example$ mysql
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    
    Your MySQL connection id is 10
    
    Server version: 5.7.9-vitess-10.0.2 Version: 10.0.2 (Git revision fc78470 branch 'HEAD') built on Thu May 27 08:45:22 UTC 2021 by [email protected] using go1.15.12 linux/amd64
    
    
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    
    affiliates. Other names may be trademarks of their respective
    
    owners.
    
    
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    
    
    mysql> SHOW vitess_tablets;
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | Cell  | Keyspace       | Shard | TabletType | State   | Alias            | Hostname   | MasterTermStartTime  |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | zone1 | clustercontrol | 0     | REPLICA    | SERVING | zone1-0000000401 | vagrant.vm |                      |
    
    | zone1 | clustercontrol | 0     | REPLICA    | SERVING | zone1-0000000402 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | MASTER     | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
    
    | zone1 | commerce       | 0     | REPLICA    | SERVING | zone1-0000000101 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | RDONLY     | SERVING | zone1-0000000102 | vagrant.vm |                      |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    5 rows in set (0.00 sec)

    ノードはありますが、両方ともVitessによってレプリカとして報告されます。これで、Vitessをトリガーして、実際のマスター(IDが401でインポートしたノード)のトポロジを確認できます。

    [email protected]:~/my-vitess-example$ vtctlclient TabletExternallyReparented zone1-401

    これですべてが正しく見えます:

    mysql> SHOW vitess_tablets;
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | Cell  | Keyspace       | Shard | TabletType | State   | Alias            | Hostname   | MasterTermStartTime  |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | zone1 | clustercontrol | 0     | MASTER     | SERVING | zone1-0000000401 | vagrant.vm | 2021-07-08T13:27:34Z |
    
    | zone1 | clustercontrol | 0     | REPLICA    | SERVING | zone1-0000000402 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | MASTER     | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
    
    | zone1 | commerce       | 0     | REPLICA    | SERVING | zone1-0000000101 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | RDONLY     | SERVING | zone1-0000000102 | vagrant.vm |                      |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    5 rows in set (0.00 sec)

    ClusterControl自動フェイルオーバーをVitessに統合する

    最後に確認したいのは、ClusterControlを使用した自動フェイルオーバー処理であり、Vitessと統合する方法を確認します。これは、今見たものと非常によく似ています。対処すべき主な問題は、フェイルオーバーによってVitessの内容が何も変更されないことです。解決策は、以前に使用したTabletExternallyReparentedコマンドです。唯一の課題は、フェイルオーバーが発生したときにトリガーすることです。幸い、ClusterControlには、フェイルオーバープロセスにプラグインできるフックが付属しています。それらを使用してvtctlclientを実行します。ただし、最初にClusterControlインスタンスにインストールする必要があります。これを実現する最も簡単な方法は、バイナリをVitessインスタンスからClusterControlにコピーすることです。

    まず、ClusterControlノードにディレクトリを作成しましょう:

    mkdir -r /usr/local/vitess/bin

    次に、ファイルをコピーします:

    scp /usr/local/vitess/bin/vtctlclient [email protected]:/usr/local/vitess/bin/

    次のステップとして、シャードを再ペアレント化するコマンドを実行するスクリプトを作成する必要があります。 Replication_post_failover_scriptとreplication_post_switchover_scriptを使用します。 Cmonは、いくつかの引数を使用してスクリプトを実行します。それらの3番目に関心があります。これには、マスター候補のホスト名(新しいマスターとして選択されたノード)が含まれます。

    サンプルスクリプトは次のようになります。

    #!/bin/bash
    
    if [[ $3 == 10.0.0.181 ]] ; then tablet="zone1-401" ; fi
    
    if [[ $3 == 10.0.0.182 ]] ; then tablet="zone1-402" ; fi
    
    vitess="10.0.0.50"
    
    /usr/local/vitess/bin/vtctlclient -server ${vitess}:15999 TabletExternallyReparented ${tablet}
    これは最低限の機能であることに注意してください。おそらく追加の健全性チェックを実行する、より詳細なスクリプトを実装する必要があります。ホスト名とタブレット名をハードコーディングする代わりに、実際にClusterControlにクエリを実行してクラスター内のノードのリストを取得し、それをトポロジサービスのコンテンツと比較して、使用するタブレットエイリアスを確認することもできます。

    スクリプトの準備ができたら、ClusterControlによって実行されるようにスクリプトを構成する必要があります。

    レプリカを手動でプロモートすることで、これをテストできます。 Vitessから見た初期状態は、次のとおりです。

    mysql> SHOW vitess_tablets;
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | Cell  | Keyspace       | Shard | TabletType | State   | Alias            | Hostname   | MasterTermStartTime  |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    | zone1 | clustercontrol | 0     | MASTER     | SERVING | zone1-0000000401 | vagrant.vm | 2021-07-08T13:27:34Z |
    
    | zone1 | clustercontrol | 0     | REPLICA    | SERVING | zone1-0000000402 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | MASTER     | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
    
    | zone1 | commerce       | 0     | REPLICA    | SERVING | zone1-0000000101 | vagrant.vm |                      |
    
    | zone1 | commerce       | 0     | RDONLY     | SERVING | zone1-0000000102 | vagrant.vm |                      |
    
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    
    5 rows in set (0.00 sec)
    「clustercontrol」キースペースに関心があります。 401(10.0.0.181)がマスターで、402(10.0.0.182)がレプリカでした。

    10.0.0.182を新しいマスターに昇格させることができます。ジョブが開始され、スクリプトが実行されたことがわかります:

    最後に、ジョブが完了しました:

    ClusterControlではすべてうまくいきました。 Vitessを見てみましょう:

    mysql> SHOW vitess_tablets;
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    | Cell  | Keyspace       | Shard | TabletType | State   | Alias            | Hostname   | MasterTermStartTime  |
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    | zone1 | clustercontrol | 0     | MASTER     | SERVING | zone1-0000000402 | vagrant.vm | 2021-07-09T13:38:00Z |
    | zone1 | clustercontrol | 0     | REPLICA    | SERVING | zone1-0000000401 | vagrant.vm |                      |
    | zone1 | commerce       | 0     | MASTER     | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
    | zone1 | commerce       | 0     | REPLICA    | SERVING | zone1-0000000101 | vagrant.vm |                      |
    | zone1 | commerce       | 0     | RDONLY     | SERVING | zone1-0000000102 | vagrant.vm |                      |
    +-------+----------------+-------+------------+---------+------------------+------------+----------------------+
    5 rows in set (0.00 sec)

    ご覧のとおり、ここでもすべて問題ありません。 402は新しいマスターで、401はレプリカとしてマークされています。

    もちろん、これは、データをスケールアウトおよびシャーディングするVitessの機能を活用しながら、MySQLデータベースを監視および管理するClusterControlの機能からどのように利益を得ることができるかの一例にすぎません。 Vitessは優れたツールですが、いくつかの要素が欠けています。幸い、ClusterControlはそのような場合にあなたをバックアップすることができます。


    1. Docker-mysql接続の準備ができているかどうかを確認する

    2. MySQLにBLOBおよびCLOBファイルを挿入する方法は?

    3. SELECT max(x)はnullを返します。どうすれば0を返すことができますか?

    4. PostgreSQLでパーセンテージとして数値をフォーマットする3つの方法