ClusterControlは、データベースクラスターをデプロイおよび管理するための優れたツールです。MySQLを使用している場合は、従来のMySQLマスタースレーブレプリケーション、GaleraクラスターまたはMySQLNDBクラスターの両方に基づいてクラスターを簡単にデプロイできます。ただし、高可用性を実現するには、クラスターをデプロイするだけでは不十分です。ノードがダウンする可能性があり(おそらくダウンする可能性があります)、システムはそれらの変更に適応できる必要があります。
この適応は、さまざまなレベルで発生する可能性があります。アプリケーション内にある種のロジックを実装できます。クラスターノードの状態をチェックし、特定の時点で到達可能なノードにトラフィックを転送します。システムに高可用性を実装するプロキシレイヤーを構築することもできます。このブログ投稿では、ClusterControlを使用してそれを実現する方法に関するヒントをいくつか紹介します。
ClusterControlを使用したHAProxyのデプロイ
HAProxyは標準であり、MySQLに関連して使用される最も人気のあるプロキシの1つです(もちろん、それだけではありません)。 ClusterControlは、HAProxyノードの展開と監視をサポートします。また、keepalivedを使用してプロキシ自体の高可用性を実装するのにも役立ちます。
展開は非常に簡単です。HAProxyがインストールされるホストのIPアドレスを選択または入力し、ポートを選択し、負荷分散ポリシーを選択し、ClusterControlがHAProxyを展開するために既存のリポジトリまたは最新のソースコードを使用するかどうかを決定する必要があります。プロキシ構成に含めるバックエンドノードと、それらをアクティブにするかバックアップするかを選択することもできます。
デフォルトでは、ClusterControlによってデプロイされたHAProxyインスタンスは、MySQLクラスター(NDB)、Galeraクラスター、PostgreSQLストリーミングレプリケーション、およびMySQLレプリケーションで機能します。マスタースレーブレプリケーションの場合、ClusterControlは2つのリスナーを構成できます。1つは読み取り専用用で、もう1つは読み取り/書き込み用です。次に、アプリケーションはそれぞれのポートに読み取りと書き込みを送信する必要があります。マルチマスターレプリケーションの場合、ClusterControlは、最小の接続バランシングアルゴリズムに基づいて、標準のTCPロードバランシングをセットアップします(たとえば、すべてのノードが書き込み可能なGalera Clusterの場合)。
Keepalivedは、プロキシ層に高可用性を追加するために使用されます。システムに少なくとも2つのHAProxyノードがある場合、ClusterControlUIからKeepalivedをインストールできます。
2つのHAProxyノードを選択する必要があり、それらはアクティブとスタンバイのペアとして構成されます。仮想IPはアクティブサーバーに割り当てられ、失敗した場合はスタンバイプロキシに再割り当てされます。このようにして、VIPに接続するだけで、すべてのクエリが現在アクティブで動作しているHAProxyノードにルーティングされます。
内部の構成方法の詳細については、HAProxyチュートリアルをお読みください。
ClusterControlを使用したProxySQLの展開
HAProxyは堅実なプロキシであり、非常に人気のある選択肢ですが、読み取りと書き込みの分割など、データベースの認識が不足しています。 HAProxyでこれを行う唯一の方法は、2つのバックエンドを作成し、2つのポート(1つは読み取り用、もう1つは書き込み用)でリッスンすることです。これは通常は問題ありませんが、アプリケーションに変更を実装する必要があります。アプリケーションは、読み取りと書き込みを理解してから、それらのクエリを正しいポートに送信する必要があります。単一のポートに接続して、次に何をするかをプロキシに決定させる方がはるかに簡単です-これは、パケットをルーティングするだけなので、HAProxyが実行できないことです-パケット検査は行われず、特に、 MySQLプロトコルの理解。
ProxySQLはこの問題を解決します-MySQLプロトコルと通信し、(とりわけ)強力なクエリルールを介して読み取り/書き込み分割を実行し、さまざまな基準に従って着信MySQLトラフィックをルーティングできます。 ClusterControlからのProxySQLのインストールは簡単です。[管理]->[ロードバランサー]セクションに移動し、[ProxySQLのデプロイ]タブに必要なデータを入力します。
つまり、ProxySQLをインストールする場所、管理ユーザーとパスワード、MySQLバックエンドに接続してステータスと監視状態を確認するために使用する監視ユーザーを選択する必要があります。 ClusterControlから、アプリケーションで使用する新しいユーザーを作成できます。名前、パスワード、付与するデータベースへのアクセス、およびそのユーザーが持つMySQL特権を決定できます。このようなユーザーは、MySQL側とProxySQL側の両方で作成されます。 2番目のオプションは、既存のインフラストラクチャにより適していますが、既存のデータベースユーザーを使用することです。ユーザー名とパスワードを渡す必要があります。そのようなユーザーはProxySQLでのみ作成されます。
最後に、質問に答える必要があります。暗黙のトランザクションを使用していますか?これにより、SET autocommit=0を実行することによって開始されるトランザクションを理解できます。これを使用する場合、ClusterControlはすべてのトラフィックをマスターに送信するようにProxySQLを構成します。これは、ProxySQLがProxySQL1.3.x以前でトランザクションを正しく処理するために必要です。 SET autocommit =0を使用して新しいトランザクションを作成しない場合、ClusterControlは読み取り/書き込み分割を構成します。
ProxySQLは、すべてのプロキシと同様に、単一障害点になる可能性があり、高可用性を実現するには冗長化する必要があります。これを行うにはいくつかの方法があります。それらの1つは、WebノードにProxySQLを併置することです。ここでの考え方は、ほとんどの場合、ProxySQLプロセスは正常に機能し、その使用不可の理由はノード全体がダウンしたことです。このような場合、ProxySQLがWebノードと同じ場所に配置されていれば、その特定のWebノードも利用できないため、それほど害はありません。
もう1つの方法は、HAProxyの場合と同様の方法でKeepalivedを使用することです。
ProxySQLチュートリアルを読むと、内部の構成方法の詳細を確認できます。