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

ClusterControl CMON HA for Distributed Database High Availability-パート2(GUIアクセスセットアップ)

    最初の部分では、cmonHAクラスターが機能するようになりました。

    [email protected]:~# s9s controller --list --long
    
    S VERSION    OWNER GROUP NAME            IP PORT COMMENT
    
    l 1.7.4.3565 system admins 10.0.0.101      10.0.0.101 9501 Acting as leader.
    
    f 1.7.4.3565 system admins 10.0.0.102      10.0.0.102 9501 Accepting heartbeats.
    
    f 1.7.4.3565 system admins 10.0.0.103      10.0.0.103 9501 Accepting heartbeats.
    
    Total: 3 controller(s)

    3つのノードが稼働しており、1つはリーダーとして機能し、残りはフォロワーであり、アクセス可能です(ハートビートを受信して​​返信します)。残りの課題は、リーダーノードのUIに常にアクセスできるようにUIアクセスを構成することです。このブログ投稿では、それを実現するための可能な解決策の1つを紹介します。

    HAProxyの設定

    この問題は私たちにとって目新しいものではありません。 MySQLまたはPostgreSQLのすべてのレプリケーションクラスタで、問題はありません。書き込みを送信するノードが1つあります。これを実現する1つの方法は、HAProxyを使用して、ノードの状態をテストする外部チェックを追加し、それに基づいて適切な値を返すことです。これは基本的に、問題を解決するために使用するものです。十分にテストされたレイヤー4プロキシとしてHAProxyを使用し、ユースケース用に正確に作成するレイヤー7HTTPチェックと組み合わせます。まず最初に、HAProxyをインストールしましょう。 ClusterControlと併置しますが、別のノードにインストールすることもできます(理想的には、ノード-単一障害点としてHAProxyを削除します)。

    apt install haproxy

    これにより、HAProxyが設定されます。完了したら、構成を紹介する必要があります:

    global
    
            pidfile /var/run/haproxy.pid
    
            daemon
    
            user haproxy
    
            group haproxy
    
            stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin
    
            node haproxy_10.0.0.101
    
            description haproxy server
    
    
    
            #* Performance Tuning
    
            maxconn 8192
    
            spread-checks 3
    
            quiet
    
    defaults
    
            #log    global
    
            mode    tcp
    
            option  dontlognull
    
            option tcp-smart-accept
    
            option tcp-smart-connect
    
            #option dontlog-normal
    
            retries 3
    
            option redispatch
    
            maxconn 8192
    
            timeout check   10s
    
            timeout queue   3500ms
    
            timeout connect 3500ms
    
            timeout client  10800s
    
            timeout server  10800s
    
    
    
    userlist STATSUSERS
    
            group admin users admin
    
            user admin insecure-password admin
    
            user stats insecure-password admin
    
    
    
    listen admin_page
    
            bind *:9600
    
            mode http
    
            stats enable
    
            stats refresh 60s
    
            stats uri /
    
            acl AuthOkay_ReadOnly http_auth(STATSUSERS)
    
            acl AuthOkay_Admin http_auth_group(STATSUSERS) admin
    
            stats http-request auth realm admin_page unless AuthOkay_ReadOnly
    
            #stats admin if AuthOkay_Admin
    
    
    
    listen  haproxy_10.0.0.101_81
    
            bind *:81
    
            mode tcp
    
            tcp-check connect port 80
    
            timeout client  10800s
    
            timeout server  10800s
    
            balance leastconn
    
            option httpchk
    
    #        option allbackups
    
            default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
    
            server 10.0.0.101 10.0.0.101:443 check
    
            server 10.0.0.102 10.0.0.102:443 check
    
            server 10.0.0.103 10.0.0.103:443 check

    ここでノードのIPを含むノード名やバックエンド名など、いくつかの変更が必要になる場合があります。 HAProxyに含めるサーバーを変更することをお勧めします。

    最も重要なビットは次のとおりです。

            bind *:81

    HAProxyはポート81でリッスンします。

            option httpchk
    バックエンドノードでレイヤー7チェックを有効にしました。

            default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
    レイヤー7チェックはポート9201で実行されます。

    これが完了したら、HAProxyを起動します。

    xinetdとチェックスクリプトの設定

    xinetdを使用してチェックを実行し、HAProxyに正しい応答を返します。この段落で説明する手順は、すべてのcmonHAクラスターノードで実行する必要があります。

    まず、xinetdをインストールします:

    [email protected]:~# apt install xinetd

    これが完了したら、次の行を追加する必要があります:

    cmonhachk       9201/tcp

    to / etc / services-これにより、xinetdはポート9201でリッスンするサービスを開くことができます。次に、サービスファイル自体を追加する必要があります。 /etc/xinetd.d/cmonhachkに配置する必要があります:

    # default: on
    
    # description: cmonhachk
    
    service cmonhachk
    
    {
    
            flags           = REUSE
    
            socket_type     = stream
    
            port            = 9201
    
            wait            = no
    
            user            = root
    
            server          = /usr/local/sbin/cmonhachk.py
    
            log_on_failure  += USERID
    
            disable         = no
    
            #only_from       = 0.0.0.0/0
    
            only_from       = 0.0.0.0/0
    
            per_source      = UNLIMITED
    
    }

    最後に、xinetdによって呼び出されるチェックスクリプトが必要です。サービスファイルで定義されているように、それは/usr/local/sbin/cmonhachk.pyにあります。

    #!/usr/bin/python3.5
    
    
    
    import subprocess
    
    import re
    
    import sys
    
    from pathlib import Path
    
    import os
    
    
    
    def ret_leader():
    
        leader_str = """HTTP/1.1 200 OK\r\n
    
    Content-Type: text/html\r\n
    
    Content-Length: 48\r\n
    
    \r\n
    
    <html><body>This node is a leader.</body></html>\r\n
    
    \r\n"""
    
        print(leader_str)
    
    
    
    def ret_follower():
    
        follower_str = """
    
    HTTP/1.1 503 Service Unavailable\r\n
    
    Content-Type: text/html\r\n
    
    Content-Length: 50\r\n
    
    \r\n
    
    <html><body>This node is a follower.</body></html>\r\n
    
    \r\n"""
    
        print(follower_str)
    
    
    
    def ret_unknown():
    
        unknown_str = """
    
    HTTP/1.1 503 Service Unavailable\r\n
    
    Content-Type: text/html\r\n
    
    Content-Length: 59\r\n
    
    \r\n
    
    <html><body>This node is in an unknown state.</body></html>\r\n
    
    \r\n"""
    
        print(unknown_str)
    
    
    
    lockfile = "/tmp/cmonhachk_lockfile"
    
    
    
    if os.path.exists(lockfile):
    
        print("Lock file {} exists, exiting...".format(lockfile))
    
        sys.exit(1)
    
    
    
    Path(lockfile).touch()
    
    try:
    
        with open("/etc/default/cmon", 'r') as f:
    
            lines  = f.readlines()
    
    
    
        pattern1 = "RPC_BIND_ADDRESSES"
    
        pattern2 = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    
        m1 = re.compile(pattern1)
    
        m2 = re.compile(pattern2)
    
    
    
        for line in lines:
    
            res1 = m1.match(line)
    
            if res1 is not None:
    
                res2 = m2.findall(line)
    
                i = 0
    
                for r in res2:
    
                    if r != "127.0.0.1" and i == 0:
    
                        i += 1
    
                        hostname = r
    
    
    
        command = "s9s controller --list --long | grep {}".format(hostname)
    
        output = subprocess.check_output(command.split())
    
        state = output.splitlines()[1].decode('UTF-8')[0]
    
        if state == "l":
    
            ret_leader()
    
        if state == "f":
    
            ret_follower()
    
        else:
    
            ret_unknown()
    
    finally:
    
        os.remove(lockfile)

    ファイルを作成したら、実行可能であることを確認してください:

    chmod u+x /usr/local/sbin/cmonhachk.py

    このスクリプトの背後にある考え方は、「s9s controller --list --long」コマンドを使用してノードのステータスをテストし、IPに関連する出力をチェックすることです。ローカルノード。これにより、スクリプトは、スクリプトが実行されるホストがリーダーであるかどうかを判別できます。ノードがリーダーの場合、スクリプトは「HTTP / 1.1 200 OK」コードを返します。これは、HAProxyがノードが使用可能であると解釈し、トラフィックをノードにルーティングします。それ以外の場合は、「HTTP /1.1503サービス使用不可」を返します。正常ではなく、トラフィックがそこにルーティングされないノード。その結果、どのノードがリーダーになるかに関係なく、HAProxyはそれを検出し、バックエンドで使用可能としてマークします。

    すべての設定変更を適用する前に、HAProxyとxinetdを再起動する必要がある場合があります。パーツが正しく機能し始めます。

    複数のHAProxyがあると、HAProxyノードの1つに障害が発生した場合でも、ClusterControl UIに接続するための2つ(またはそれ以上)の異なるホスト名またはIPがある場合でも、ClusterControlUIにアクセスできます。より快適にするために、HAProxyの上にKeepalivedをデプロイします。 HAProxyサービスの状態を監視し、そのうちの1つに仮想IPを割り当てます。そのHAProxyが使用できなくなった場合、VIPは別の使用可能なHAProxyに移動されます。その結果、単一のエントリポイント(VIPまたはそれに関連付けられたホスト名)が作成されます。ここで実行する手順は、HAProxyがインストールされているすべてのノードで実行する必要があります。

    まず、keepalivedをインストールしましょう:

    apt install keepalived

    次に、構成する必要があります。次の構成ファイルを使用します:

    vrrp_script chk_haproxy {
    
       script "killall -0 haproxy"   # verify the pid existance
    
       interval 2                    # check every 2 seconds
    
       weight 2                      # add 2 points of prio if OK
    
    }
    
    vrrp_instance VI_HAPROXY {
    
       interface eth1                # interface to monitor
    
       state MASTER
    
       virtual_router_id 51          # Assign one ID for this route
    
       priority 102                   
    
       unicast_src_ip 10.0.0.101
    
       unicast_peer {
    
          10.0.0.102
    
    10.0.0.103
    
    
    
       }
    
       virtual_ipaddress {
    
           10.0.0.130                        # the virtual IP
    
       } 
    
       track_script {
    
           chk_haproxy
    
       }
    
    #    notify /usr/local/bin/notify_keepalived.sh
    
    }
    このファイルは別のノードで変更する必要があります。 IPアドレスは適切に構成する必要があり、優先度はすべてのノードで異なる必要があります。ネットワークで意味のあるVIPも構成してください。インターフェイスを変更することもできます。Eth1を使用しました。これは、Vagrantによって作成された仮想マシンでIPが割り当てられる場所です。

    この構成ファイルでキープアライブを開始すると、準備が整います。 VIPが1つのHAProxyノードで稼働している限り、VIPを使用して適切なClusterControlUIに接続できるはずです。

    これで、ClusterControlの高可用性クラスターの2部構成の紹介が完了しました。冒頭で述べたように、これはまだベータ状態ですが、テストからのフィードバックをお待ちしています。


    1. PHP + SQL Server-接続用の文字セットを設定するにはどうすればよいですか?

    2. ApacheOpenOfficeのSalesforceSOQL

    3. データベースメールアカウント(SSMS)を削除する

    4. PostgreSQLは世界最高のデータベースです