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

WHM / cPanelサーバーでのProxySQLを使用したMySQLレプリケーション:パート1

    WHMとcPanelは、間違いなくLinuxベースの環境で最も人気のあるホスティングコントロールパネルです。アプリケーションデータストアとして、MySQL、MariaDB、PostgreSQLなどの多くのデータベースバックエンドをサポートしています。 WHMはスタンドアロンのデータベース設定のみをサポートしており、外部データベースサーバーと統合することにより、ローカル(デフォルト構成)またはリモートで展開できます。 WHM / cPanelはHTTP(S)、FTP、DNS、MySQLなどの多くのプロセスとアプリケーションを処理するため、負荷分散を改善したい場合は後者の方が適しています。

    このブログ投稿では、外部のMySQLレプリケーションセットアップをWHMにシームレスに統合して、データベースの可用性を向上させ、WHM/cPanelホスティングサーバーの負荷を軽減する方法を紹介します。 WHMサーバー上でローカルにMySQLを実行するホスティングプロバイダーは、リソース使用率の観点からMySQLがどれほど要求が厳しいかを知っています(ホストするアカウントの数とサーバーの仕様によって異なります)。

    WHM/cPanelでのMySQLレプリケーション

    デフォルトでは、WHMはスタンドアロンセットアップとしてMariaDBとMySQLの両方をネイティブにサポートします。外部のMySQLサーバーをWHMに接続できますが、スタンドアロンホストとして機能します。さらに、cPanelユーザーは、MySQLサーバーのIPアドレスを知っている必要があり、この機能が有効になっている場合は、Webアプリケーションで外部ホストを手動で指定する必要があります。

    このブログ投稿では、ProxySQL UNIXソケットファイルを使用して、UNIXソケットファイルを介して外部MySQLサーバーに接続する際にWHM/cPanelをだまします。このようにして、MySQLをローカルで実行しているような感覚が得られるため、ユーザーはポート3306を使用して「localhost」をMySQLデータベースホストとして使用できます。

    次の図は、最終的なアーキテクチャを示しています。

    WHM / cPanel 80.0(ビルド18)がインストールされた新しいWHMサーバーがあります。次に、別の3つのサーバーがあります。1つはClusterControl用で、2つはマスタースレーブレプリケーション用です。 ProxySQLはWHMサーバー自体にインストールされます。

    MySQLレプリケーションの導入

    この記事の執筆時点では、MySQL5.7およびMariaDB10.3までのみをサポートするWHM80.0(ビルド18)を使用しています。この場合、OracleのMySQL5.7を使用します。 ClusterControlサーバーにClusterControlがすでにインストールされていることを前提としています。

    まず、ClusterControlサーバーからMySQLレプリケーションサーバーへのパスワードなしのSSHをセットアップします。 ClusterControlサーバーで、次の手順を実行します。

    $ ssh-copy-id 192.168.0.31
    $ ssh-copy-id 192.168.0.32

    間にパスワードプロンプトを表示せずに、ClusterControlで次のコマンドを実行できることを確認してください。

    $ ssh 192.168.0.31 "sudo ls -al /root"
    $ ssh 192.168.0.32 "sudo ls -al /root"

    次に、 ClusterControl-> Deploy-> MySQL Replicationに移動します。 必要な情報を入力します。 2番目のステップでは、ベンダーとしてOracleを選択し、データベースバージョンとして5.7を選択します。

    次に、マスターとスレーブのIPアドレスを指定します。

    IPアドレスの直前の緑色のチェックマークに注意してください。これは、ClusterControlがサーバーに接続でき、次のステップの準備ができていることを意味します。 [デプロイ]をクリックしてデプロイを開始します。導入プロセスには15〜20分かかります。

    WHM/cPanelでのProxySQLのデプロイ

    ProxySQLにデフォルトのMySQLポート3306を引き継がせたいので、最初にWHMによってインストールされた既存のMySQLサーバーを変更して、他のポートや他のソケットファイルをリッスンする必要があります。 /etc/my.cnfで、次の行を変更します(存在しない場合は追加します):

    socket=/var/lib/mysql/mysql2.sock
    port=3307
    bind-address=127.0.0.1

    次に、cPanelサーバーでMySQLサーバーを再起動します。

    $ systemctl restart mysqld

    この時点で、ローカルMySQLサーバーはポート3307でリッスンし、ローカルホストのみにバインドする必要があります(より安全にするために外部アクセスからサーバーを閉じます)。これで、ClusterControlを介してWHMホスト192.168.0.16にProxySQLをデプロイすることができます。

    まず、ClusterControlノードからProxySQLをインストールするWHMサーバーへのパスワードなしのSSHをセットアップします。

    (clustercontrol)$ ssh-copy-id [email protected]

    間にパスワードプロンプトを表示せずに、ClusterControlで次のコマンドを実行できることを確認してください。

    (clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"

    次に、 ClusterControl-> Manage-> Load Balancer-> ProxySQL-> Deploy ProxySQLに移動します。 必要な情報を指定します:

    図の上の矢印で強調表示されているように、必要なすべての詳細を入力します。サーバーアドレスは、WHMサーバー192.168.0.16です。リスニングポートはWHMサーバーの3306で、ポート3307ですでに実行されているローカルMySQLを引き継ぎます。さらに下に、ProxySQL管理者と監視ユーザーのパスワードを指定します。次に、両方のMySQLサーバーを負荷分散セットに含め、[暗黙のトランザクション]セクションで[いいえ]を選択します。 [ProxySQLの展開]をクリックして展開を開始します。

    これで、ProxySQLがインストールされ、MySQLレプリケーション用の2つのホストグループで構成されました。 1つはライターグループ(ホストグループ10)用で、すべての接続はマスターに転送され、リーダーグループ(ホストグループ20)は、両方のMySQLサーバーにバランスされるすべての読み取り専用ワークロード用に転送されます。

    次のステップは、MySQLのrootユーザーを付与し、それをProxySQLにインポートすることです。時折、WHMはUNIXソケットファイルをバイパスして、TCP接続を介してデータベースに接続することがあります。この場合、レプリケーションクラスター内の[email protected][email protected](WHMサーバーのIPアドレス)の両方からのMySQLルートアクセスを許可する必要があります。

    したがって、マスターサーバー(192.168.0.31)で次のステートメントを実行する必要があります。

    (master)$ mysql -uroot -p
    mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;

    次に、 ClusterControl->ノード->ProxySQLノードを選択->ユーザー->ユーザーのインポートに移動して、MySQLサーバーからProxySQLユーザーに'root'@'localhost'ユーザーをインポートします。 。次のダイアログが表示されます:

    [email protected]チェックボックスをオンにして、[次へ]をクリックします。 ユーザー設定 ページで、ユーザーのデフォルトのホストグループとしてホストグループ10を選択します。

    次に、次のコマンドを使用して、ProxySQLがWHM/cPanelサーバーで正しく実行されているかどうかを確認できます。

    $ netstat -tulpn | grep -i proxysql
    tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      17306/proxysql
    tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      17306/proxysql

    ポート3306は、ProxySQLがすべてのMySQL接続を受け入れるためにリッスンする必要があるものです。ポート6032はProxySQL管理ポートであり、ユーザー、ホストグループ、サーバー、変数などのProxySQLコンポーネントを構成および監視するために接続します。

    この時点で、 ClusterControl-> Topology に移動すると、 、次のトポロジが表示されます。

    MySQLUNIXソケットの構成

    Linux環境では、MySQLホストを「localhost」として定義すると、クライアント/アプリケーションはUNIXソケットファイルを介して接続を試みます。UNIXソケットファイルは、デフォルトでcPanelサーバーの/var/lib/mysql/mysql.sockにあります。ソケットファイルを使用することは、TCP接続と比較してオーバーヘッドが少ないため、MySQLサーバーにアクセスするための最も推奨される方法です。ソケットファイルには実際にはデータが含まれていません。データを転送します。これは、サーバーと同じマシン上のクライアントが接続してリクエストとデータを交換するために使用できるローカルパイプのようなものです。

    そうは言っても、アプリケーションが「localhost」を介して接続し、データベースのホストおよびポートとしてポート3306を使用する場合、アプリケーションはソケットファイルを介して接続します。 「127.0.0.1」とポート3306を使用する場合、ほとんどの場合、アプリケーションはTCPを介してデータベースに接続します。この動作は、MySQLのドキュメントで詳しく説明されています。簡単に言うと、ローカル通信にはソケットファイル(または「localhost」)を使用し、アプリケーションがリモートで接続している場合はTCPを使用します。

    cPanelでは、MySQLソケットファイルはcpservdプロセスによって監視され、デフォルトのパスとは異なるパスを構成した場合、別のソケットファイルにリンクされます。たとえば、前のセクションで構成したように、デフォルト以外のMySQLソケットファイルを構成したとします。

    $ cat /etc/my.cnf | grep socket
    socket=/var/lib/mysql/mysql2.sock

    cpservdプロセスを介したcPanelは、デフォルトのソケットパスへのシンボリックリンクを作成することでこれを修正します:

    (whm)$ ls -al /var/lib/mysql/mysql.sock
    lrwxrwxrwx. 1 root root 34 Jul  4 12:25 /var/lib/mysql/mysql.sock -> ../../../var/lib/mysql/mysql2.sock

    cpservdがこれを自動的に再修正しないようにするには(cPanelには「automagically」と呼ばれるこの動作の用語があります)、 WHM-> Service Managerに移動してMySQLモニタリングを無効にする必要があります。 (とにかくローカルMySQLを使用するつもりはありません)そして、以下のスクリーンショットに示すように、MySQLの[監視]チェックボックスをオフにします:

    WHMに変更を保存します。次のコマンドを使用して、デフォルトのソケットファイルを削除し、ProxySQLソケットファイルへのシンボリックリンクを作成しても安全です。

    (whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock

    ソケットMySQLソケットファイルがProxySQLソケットファイルにリダイレクトされていることを確認します。

    (whm)$ ls -al /var/lib/mysql/mysql.sock
    lrwxrwxrwx. 1 root root 18 Jul  3 12:47 /var/lib/mysql/mysql.sock -> /tmp/proxysql.sock

    また、/ root/.my.cnf内のデフォルトのログインクレデンシャルを次のように変更する必要があります。

    (whm)$ cat ~/.my.cnf
    [client]
    #password="T<y4ar&cgjIu"
    user=root
    password='[email protected]'
    socket=/var/lib/mysql/mysql.sock

    少し説明-コメントアウトした最初の行は、ローカルMySQLサーバー用にcPanelによって生成されたMySQLルートパスワードです。これは使用しないため、「#」は行の先頭にあります。次に、MySQLレプリケーションセットアップのMySQLルートパスワードとUNIXソケットパスを追加しました。これは、ProxySQLソケットファイルへのシンボリックリンクになりました。

    この時点で、WHMサーバーでは、「mysql」と入力するだけで、rootユーザーとしてMySQLレプリケーションクラスターにアクセスできるはずです。例:

    (whm)$ mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 239
    Server version: 5.5.30 (ProxySQL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    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>

    サーバーのバージョンが5.5.30(ProxySQL)であることに注意してください。上記のように接続できる場合は、次のセクションで説明するように統合部分を構成できます。

    WHM/cPanelの統合

    WHMは、MySQL 5.7、MariaDB 10.2、MariaDB10.3などの多数のデータベースサーバーをサポートしています。 WHMは現在ProxySQLのみを認識しており、バージョン5.5.30として検出されるため(上​​記のとおり)、WHMはサポートされていないMySQLバージョンについて文句を言います。 WHM-> SQLServices->MySQLプロファイルの管理に移動できます。 検証ボタンをクリックします。このエラーを知らせる赤いトースター通知が右上隅に表示されます。

    したがって、ProxySQLのMySQLバージョンをMySQLレプリケーションクラスターと同じバージョンに変更する必要があります。この情報は、マスターサーバーで次のステートメントを実行することで取得できます。

    mysql> SELECT @@version;
    +------------+
    | @@version  |
    +------------+
    | 5.7.26-log |
    +------------+

    次に、ProxySQL管理コンソールにログインして、 mysql-server_versionを変更します。 変数:

    (whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032

    以下のようにSETステートメントを使用します:

    mysql> SET mysql-server_version = '5.7.26';

    次に、変数をランタイムにロードし、ディスクに保存して永続化します。

    mysql> LOAD MYSQL VARIABLES TO RUNTIME;
    mysql> SAVE MYSQL VARIABLES TO DISK;

    最後に、ProxySQLが表すバージョンを確認します。

    mysql> SHOW VARIABLES LIKE 'mysql-server_version';
    +----------------------+--------+
    | Variable_name        | Value  |
    +----------------------+--------+
    | mysql-server_version | 5.7.26 |
    +----------------------+--------+

    「mysql」コマンドを実行してMySQLに再度接続しようとすると、ターミナルに「Server version:5.7.26(ProxySQL)」が表示されます。

    これで、WHM->SQLサービス->MySQLプロファイルの管理でMySQLルートパスワードを更新できます。 。下部の[パスワード]フィールドをレプリケーションクラスターのMySQLルートパスワードに変更して、ローカルホストプロファイルを編集します。完了したら、[保存]ボタンをクリックします。次に、[検証]をクリックして、WHMがProxySQLサービスを介してMySQLレプリケーションクラスターに正しくアクセスできるかどうかを確認できます。右上隅に次の緑色のトースターが表示されます。

    緑のトースター通知を受け取ったら、cPanelフックを介してProxySQLの統合に進むことができます。

    cPanelフックを介したProxySQLの統合

    WHMとMySQLレプリケーションの仲介役としてのProxySQLには、通過するすべてのMySQLユーザーのユーザー名とパスワードが必要です。現在のアーキテクチャでは、コントロールパネル(アカウント作成によるWHMまたはMySQLデータベースウィザードによるcPanel)を介してユーザーを作成すると、WHMは[email protected](インポートされた)を使用してMySQLレプリケーションクラスターに直接ユーザーを自動的に作成します事前にProxySQLに)。ただし、同じデータベースユーザーがProxySQLmysql_usersテーブルに自動的に追加されることはありません。

    エンドユーザーの観点からは、この時点でのすべてのローカルホスト接続はProxySQLを介して渡される必要があるため、これは機能しません。 cPanelをProxySQLと統合する方法が必要です。これにより、WHMおよびcPanelによって実行されるMySQLユーザー関連の操作について、ProxySQLに通知し、内部mysql_usersテーブルを追加/削除/更新するために必要なアクションを実行する必要があります。

    これらのコンポーネントを自動化および統合する最良の方法は、cPanelの標準化されたフックシステムを使用することです。標準化されたフックは、cPanelとWHMがアクションを実行するときにアプリケーションをトリガーします。このシステムを使用してカスタムコード(フックアクションコード)を実行し、特定のシナリオ(フック可能なイベント)でcPanelとWHMがどのように機能するかをカスタマイズします。

    まず、/ usr / local/cpanelディレクトリの下にProxysqlHook.pmというPerlモジュールファイルを作成します。

    $ touch /usr/local/cpanel/ProxysqlHook.pm

    次に、ここから行をコピーして貼り付けます。詳細については、ProxySQLcPanelHookのGithubリポジトリを確認してください。

    ProxySQL管理インターフェースを16行目から19行目まで構成します。

    my $proxysql_admin_host = '192.168.0.16';
    my $proxysql_admin_port = '6032';
    my $proxysql_admin_user = 'proxysql-admin';
    my $proxysql_admin_pass = 'mys3cr3t';

    フックが配置されたので、cPanelフックシステムに登録する必要があります:

    (whm)$ /usr/local/cpanel/bin/manage_hooks add module ProxysqlHook
    info [manage_hooks] **** Reading ProxySQL information: Host: 192.168.0.16, Port: 6032, User: proxysql-admin *****
    Added hook for Whostmgr::Accounts::Create to hooks registry
    Added hook for Whostmgr::Accounts::Remove to hooks registry
    Added hook for Cpanel::UAPI::Mysql::create_user to hooks registry
    Added hook for Cpanel::Api2::MySQLFE::createdbuser to hooks registry
    Added hook for Cpanel::UAPI::Mysql::delete_user to hooks registry
    Added hook for Cpanel::Api2::MySQLFE::deletedbuser to hooks registry
    Added hook for Cpanel::UAPI::Mysql::set_privileges_on_database to hooks registry
    Added hook for Cpanel::Api2::MySQLFE::setdbuserprivileges to hooks registry
    Added hook for Cpanel::UAPI::Mysql::rename_user to hooks registry
    Added hook for Cpanel::UAPI::Mysql::set_password to hooks registry

    上記の出力から、このモジュールはいくつかのcPanelおよびWHMイベントにフックします:

    • Whostmgr ::Accounts ::Create-WHM->アカウント機能->新しいアカウントの作成
    • Whostmgr ::Accounts ::Remove-WHM->アカウント機能->アカウントの終了
    • Cpanel ::UAPI ::Mysql ::create_user-cPanel->データベース->MySQLデータベース->新しいユーザーの追加
    • Cpanel ::Api2 ::MySQLFE ::createdbuser-cPanel->データベース->MySQLデータベース->新しいユーザーの追加 (Softaculous統合に必要です。)
    • Cpanel ::UAPI ::Mysql ::delete_user-cPanel->データベース->MySQLデータベース->ユーザーの削除
    • Cpanel ::Api2 ::MySQLFE ::deletedbuser-cPanel->データベース->MySQLデータベース->新しいユーザーの追加 (Softaculous統合に必要です。)
    • Cpanel ::UAPI ::Mysql ::set_privileges_on_database-cPanel->データベース->MySQLデータベース->データベースへのユーザーの追加
    • Cpanel ::Api2 ::MySQLFE ::setdbuserprivileges-cPanel->データベース->MySQLデータベース->データベースへのユーザーの追加 (Softaculous統合に必要です。)
    • Cpanel ::UAPI ::Mysql ::rename_user-cPanel->データベース->MySQLデータベース->ユーザー名の変更
    • Cpanel ::UAPI ::MySQL ::set_password-cPanel->データベース->MySQLデータベース->パスワードの変更

    上記のイベントがトリガーされた場合、モジュールはProxySQLのmysql_usersテーブルを同期するために必要なアクションを実行します。 WHMサーバーのポート6032で実行されているProxySQL管理インターフェースを介して操作を実行します。したがって、すべてのユーザーがProxySQLと正しく同期されるようにするには、ProxySQL管理者ユーザーに正しいユーザー資格情報を指定することが重要です。

    このモジュール、ProxysqlHook.pmは、実際のホスティング環境(多くのアカウントと多くのサードパーティプラグインを使用)でテストされたことがなく、cPanel内のすべてのMySQL関連イベントをカバーしているわけではないことに注意してください。 Softaculousの無料版でテストしましたが、cPanelAPI2フックを介して大いに機能しました。完全な自動化を採用するには、さらにいくつかの変更が必要になる場合があります。

    今のところ以上です。次のパートでは、展開後の操作と、標準のスタンドアロンMySQLセットアップと比較した場合にホスティングサーバー用の高可用性MySQLサーバーソリューションで得られるものについて説明します。


    1. テーブル式の基礎、パート4 –派生テーブル、最適化の考慮事項、続き

    2. CriteriaQueryの月と年のフィルター

    3. SQLCOALESCE関数の実用的な使用

    4. OracleODP.NETバージョンに依存しない代替