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

私のDBAは病気です-SysAdminsのためのデータベースフェイルオーバーのヒント

    最良のシナリオは、データベースに障害が発生した場合に、適切なディザスタリカバリプラン(DRP)と、自動フェイルオーバープロセスを備えた高可用性環境があることです。予期しない理由はありますか?手動フェイルオーバーを実行する必要がある場合はどうなりますか?このブログでは、データベースをフェイルオーバーする必要がある場合に従うべきいくつかの推奨事項を共有します。

    検証チェック

    変更を実行する前に、フェイルオーバープロセス後の新しい問題を回避するために、いくつかの基本的なことを確認する必要があります。

    レプリケーションステータス

    ネットワーク障害、高負荷、またはその他の問題により、障害時にスレーブノードが最新ではない可能性があるため、次のことを確認する必要があります。スレーブはすべて(またはほとんどすべて)の情報を持っています。複数のスレーブノードがある場合は、どのノードが最も高度なノードであるかを確認し、フェイルオーバーするノードを選択する必要があります。

    例:MariaDBサーバーのレプリケーションステータスを確認しましょう。

    MariaDB [(none)]> SHOW SLAVE STATUS\G
    
    *************************** 1. row ***************************
    
    Slave_IO_State: Waiting for master to send event
    
    Master_Host: 192.168.100.110
    
    Master_User: rpl_user
    
    Master_Port: 3306
    
    Connect_Retry: 10
    
    Master_Log_File: binlog.000014
    
    Read_Master_Log_Pos: 339
    
    Relay_Log_File: relay-bin.000002
    
    Relay_Log_Pos: 635
    
    Relay_Master_Log_File: binlog.000014
    
    Slave_IO_Running: Yes
    
    Slave_SQL_Running: Yes
    
    Last_Errno: 0
    
    Skip_Counter: 0
    
    Exec_Master_Log_Pos: 339
    
    Relay_Log_Space: 938
    
    Until_Condition: None
    
    Until_Log_Pos: 0
    
    Master_SSL_Allowed: No
    
    Seconds_Behind_Master: 0
    
    Master_SSL_Verify_Server_Cert: No
    
    Last_IO_Errno: 0
    
    Last_SQL_Errno: 0
    
    Replicate_Ignore_Server_Ids:
    
    Master_Server_Id: 3001
    
    Using_Gtid: Slave_Pos
    
    Gtid_IO_Pos: 0-3001-20
    
    Parallel_Mode: conservative
    
    SQL_Delay: 0
    
    SQL_Remaining_Delay: NULL
    
    Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
    
    Slave_DDL_Groups: 0
    
    Slave_Non_Transactional_Groups: 0
    
    Slave_Transactional_Groups: 0
    
    1 row in set (0.000 sec)

    PostgreSQLの場合、WALのステータスを確認し、フェッチされたものに適用されたものを比較する必要があるため、少し異なります。

    postgres=# SELECT CASE WHEN pg_last_wal_receive_lsn()=pg_last_wal_replay_lsn()
    
    postgres-# THEN 0
    
    postgres-# ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())
    
    postgres-# END AS log_delay;
    
     log_delay
    
    -----------
    
             0
    
    (1 row)
    資格情報

    フェイルオーバーを実行する前に、アプリケーション/ユーザーが現在の資格情報を使用して新しいマスターにアクセスできるかどうかを確認する必要があります。データベースユーザーを複製していない場合は、資格情報が変更されている可能性があるため、変更する前にスレーブノードで資格情報を更新する必要があります。

    例:mysqlデータベースのユーザーテーブルをクエリして、MariaDB / MySQLサーバーのユーザー資格情報を確認できます:

    MariaDB [(none)]> SELECT Host,User,Password FROM mysql.user;
    
    +-----------------+--------------+-------------------------------------------+
    
    | Host            | User | Password                                  |
    
    +-----------------+--------------+-------------------------------------------+
    
    | localhost       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |
    
    | localhost       | mysql | invalid                                   |
    
    | 127.0.0.1       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |
    
    | 192.168.100.100 | cmon         | *F80B5EE41D1FB1FA67D83E96FCB1638ABCFB86E2 |
    
    | 127.0.0.1       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |
    
    | ::1             | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |
    
    | localhost       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |
    
    | 192.168.100.112 | user1        | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |
    
    | localhost       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |
    
    | 127.0.0.1       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |
    
    | ::1             | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |
    
    | 192.168.100.110 | rpl_user     | *EEA7B018B16E0201270B3CDC0AF8FC335048DC63 |
    
    +-----------------+--------------+-------------------------------------------+
    
    12 rows in set (0.001 sec)

    PostgreSQLの場合、「\ du」コマンドを使用して役割を知ることができます。また、pg_hba.conf構成ファイルをチェックして、ユーザーアクセス(資格情報ではない)を管理する必要があります。だから:

    postgres=# \du
    
                                           List of roles
    
        Role name     |             Attributes         | Member of
    
    ------------------+------------------------------------------------------------+-----------
    
     admindb          | Superuser, Create role, Create DB                          | {}
    
     cmon_replication | Replication                                                | {}
    
     cmonexporter     |                                             | {}
    
     postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
    
     s9smysqlchk      | Superuser, Create role, Create DB                          | {}

    そしてpg_hba.conf:

    # TYPE DATABASE USER ADDRESS METHOD
    
    host replication  cmon_replication  localhost  md5
    
    host  replication  cmon_replication  127.0.0.1/32  md5
    
    host  all  s9smysqlchk  localhost  md5
    
    host  all  s9smysqlchk  127.0.0.1/32  md5
    
    local   all            all                   trust
    
    host    all            all 127.0.0.1/32 trust
    ネットワーク/ファイアウォールアクセス

    新しいマスターにアクセスする際に発生する可能性のある問題は、クレデンシャルだけではありません。ノードが別のデータセンターにある場合、またはトラフィックをフィルタリングするローカルファイアウォールがある場合は、ノードへのアクセスが許可されているかどうか、または新しいマスターノードに到達するためのネットワークルートがあるかどうかを確認する必要があります。

    例:iptables。ネットワーク167.124.57.0/24からのトラフィックを許可し、追加後に現在のルールを確認しましょう:

    $ iptables -A INPUT  -s 167.124.57.0/24 -m state --state NEW  -j ACCEPT
    
    $ iptables -L -n
    
    Chain INPUT (policy ACCEPT)
    
    target     prot opt source               destination
    
    ACCEPT     all -- 167.124.57.0/24      0.0.0.0/0 state NEW
    
    Chain FORWARD (policy ACCEPT)
    
    target     prot opt source               destination
    
    Chain OUTPUT (policy ACCEPT)
    
    target     prot opt source               destination

    例:ルート。新しいマスターノードがネットワーク10.0.0.0/24にあり、アプリケーションサーバーが192.168.100.0/24にあり、192.168.100.100を使用してリモートネットワークに到達できると仮定します。したがって、アプリケーションサーバーに対応するルートを追加します。

    $ route add -net 10.0.0.0/24 gw 192.168.100.100
    
    $ route -n
    
    Kernel IP routing table
    
    Destination     Gateway Genmask         Flags Metric Ref Use Iface
    
    0.0.0.0         192.168.100.1 0.0.0.0         UG 0 0 0 eth0
    
    10.0.0.0        192.168.100.100 255.255.255.0   UG 0 0 0 eth0
    
    169.254.0.0     0.0.0.0 255.255.0.0     U 1027 0 0 eth0
    
    192.168.100.0   0.0.0.0 255.255.255.0   U 0 0 0 eth0
    アクションポイント

    上記のすべてのポイントを確認したら、データベースをフェイルオーバーするためのアクションを実行する準備ができているはずです。

    新しいIPアドレス

    スレーブノードをプロモートすると、マスターIPアドレスが変更されるため、アプリケーションまたはクライアントアクセスで変更する必要があります。

    ロードバランサーを使用することは、この問題/変更を回避するための優れた方法です。フェイルオーバープロセスの後、ロードバランサーは古いマスターをオフラインとして検出し、(構成に応じて)新しいマスターにトラフィックを送信して書き込むため、アプリケーションで何も変更する必要はありません。

    >

    例:HAProxy構成の例を見てみましょう:

    listen  haproxy_5433
    
            bind *:5433
    
            mode tcp
    
            timeout client  10800s
    
            timeout server  10800s
    
            balance leastconn
    
            option tcp-check
    
            server 192.168.100.119 192.168.100.119:5432 check
    
            server 192.168.100.120 192.168.100.120:5432 check

    この場合、1つのノードがダウンしていると、HAProxyはそこにトラフィックを送信せず、使用可能なノードにのみトラフィックを送信します。

    スレーブノードを再構成します

    複数のスレーブノードがある場合、それらの1つを昇格させた後、新しいマスターに接続するために残りのスレーブを再構成する必要があります。ノードの数によっては、これは時間のかかる作業になる可能性があります。

    バックアップの確認と構成

    すべての準備が整ったら(新しいマスターの昇格、スレーブの再構成、新しいマスターへのアプリケーションの書き込み)、新しい問題を防ぐために必要なアクションを実行することが重要です。そのため、バックアップは必須です。このステップ。ほとんどの場合、インシデントの前にバックアップポリシーを実行していたので(そうでない場合は、確実に実行する必要があります)、バックアップがまだ実行されているかどうか、または新しいトポロジで実行されるかどうかを確認する必要があります。古いマスターでバックアップを実行していたか、現在マスターであるスレーブノードを使用している可能性があるため、変更後もバックアップポリシーが機能することを確認する必要があります。

    データベースの監視

    フェイルオーバープロセスを実行する場合、プロセスの前、最中、および後に監視する必要があります。これにより、問題が悪化する前に防止したり、フェイルオーバー中に予期しない問題を検出したり、その後に問題が発生したかどうかを知ることができます。たとえば、アクティブな接続の数を確認して、アプリケーションが新しいマスターにアクセスできるかどうかを監視する必要があります。

    監視する主要な指標 考慮すべき最も重要な指標のいくつかを見てみましょう:

      レプリケーションラグ レプリケーションステータス 接続数 ネットワークの使用/エラー
    • サーバーの負荷(CPU、メモリ、ディスク)
    • データベースとシステムのログ
    ロールバック

    もちろん、問題が発生した場合は、ロールバックできる必要があります。古いノードへのトラフィックをブロックし、可能な限り分離しておくことは、このための良い戦略である可能性があるため、ロールバックが必要な場合に備えて、古いノードを使用できるようにします。ロールバックが数分後の場合、トラフィックによっては、おそらくこれらの分のデータを古いマスターに挿入する必要があるため、この情報を取得して適用するために、一時マスターノードも使用可能で分離されていることを確認してください。

    ClusterControlを使用したフェイルオーバープロセスの自動化

    フェイルオーバーを実行するために必要なこれらすべてのタスクを確認します。おそらく、フェイルオーバーを自動化し、このすべての手作業を避けたいと思うでしょう。このために、ClusterControlが提供できるいくつかの機能を利用できます。たとえば、自動回復、バックアップ、ユーザー管理、監視など、すべて同じシステムからの機能です。

    ClusterControlを使用すると、レプリケーションステータスとその遅延を確認し、資格情報を作成または変更し、ネットワークとホストのステータスを把握し、さらに多くの確認を行うことができます。

    ClusterControlを使用すると、スレーブのプロモートなど、さまざまなクラスターおよびノー​​ドアクションを実行することもできます。 、データベースとサーバーの再起動、データベースノードの追加または削除、ロードバランサーノードの追加または削除、レプリケーションスレーブの再構築など。

    これらのアクションを使用して、必要に応じて再構築およびプロモートすることでフェイルオーバーをロールバックすることもできます前のマスター。

    ClusterControlには、何が起こっているのか、または以前に何かが起こった場合でも、それを知るのに役立つ監視およびアラートサービスがあります。

    ダッシュボードセクションを使用して、よりユーザーフレンドリーなビューを表示することもできますシステムのステータスについて。

    結論

    マスターデータベースに障害が発生した場合は、必要なアクションをできるだけ早く実行するために、すべての情報を用意しておく必要があります。優れたDRPを持つことは、システムを常に(またはほぼすべて)実行し続けるための鍵です。このDRPには、企業にとって許容可能なRTO(目標復旧時間)を実現するための十分に文書化されたフェイルオーバープロセスを含める必要があります。


    1. 初心者のためのSQLIN演算子

    2. MySQLでのRIGHT()関数のしくみ

    3. 連続する連続番号のグループの境界を見つける方法は?

    4. MariaDBに存在しない場合にのみテーブルを作成する