MariaDBでレプリカサーバーの状態を監視する:SHOW SLAVE HOSTSコマンドとSHOW REPLICASコマンド


SHOW SLAVE HOSTS コマンドは、MariaDBプライマリサーバーに登録されているすべてのレプリカサーバーのリストを表示します。レプリカサーバーは、プライマリサーバーからデータ変更を複製し、同期を維持するために使用されます。

構文

SHOW SLAVE HOSTS;

出力

以下の列を含む表が表示されます。

  • Master_id: レプリカサーバーが複製しているプライマリサーバーの一意なID
  • Port: レプリカサーバーがリッスンしているポート
  • Host: レプリカサーバーのホスト名
  • Server_id: レプリカサーバーの一意なID

SHOW SLAVE HOSTS;
+------------+-----------+------+-----------+
| Server_id | Host       | Port | Master_id |
+------------+-----------+------+-----------+
| 10000001  | replica1   | 3306 | 10000000 |
| 10000002  | replica2   | 3306 | 10000000 |
+------------+-----------+------+-----------+
  • レプリカサーバーがプライマリサーバーから切断されている場合、出力には Slave_IO_State: Waiting for master to connect と表示されます。
  • レプリカサーバーがプライマリサーバーに登録されていない場合、出力には表示されません。
  • このコマンドは、プライマリサーバーでのみ実行できます。
  • コマンドを実行する前に、MariaDB のドキュメントを参照することをお勧めします。
  • この説明は、MariaDB 10.7 を対象としています。他のバージョンでは、コマンドの動作や出力が異なる場合があります。

プログラミングへの応用

SHOW SLAVE HOSTS コマンドは、レプリカサーバーの状態を監視するスクリプトやツールを作成するために使用できます。たとえば、すべてのレプリカサーバーがプライマリサーバーに接続されていることを確認するスクリプトを作成したり、複製遅延が許容範囲を超えていないことを確認するツールを作成したりできます。

以下のスクリプトは、すべてのレプリカサーバーがプライマリサーバーに接続されていることを確認します。

import mariadb

def check_slave_hosts():
    # Connect to the primary server
    db = mariadb.connect(
        host="localhost",
        port=3306,
        user="root",
        password="password",
        database="master"
    )
    cursor = db.cursor()

    # Execute the SHOW SLAVE HOSTS command
    cursor.execute("SHOW SLAVE HOSTS")

    # Check each replica server
    for row in cursor.fetchall():
        server_id, host, port, master_id = row

        # Check if the replica server is connected
        if cursor.fetchone()[0] == "Yes":
            print(f"Replica server {host} is connected to the primary server.")
        else:
            print(f"Replica server {host} is not connected to the primary server.")

    # Close the database connection
    db.close()

if __name__ == "__main__":
    check_slave_hosts()
  • コマンドを実行する前に、MariaDB のドキュメントを参照することをお勧めします。
  • このスクリプトはあくまでも例であり、本番環境で使用するには修正が必要な場合があります。


すべてのレプリカサーバーの情報を取得する

import mariadb

def get_slave_hosts():
    # Connect to the primary server
    db = mariadb.connect(
        host="localhost",
        port=3306,
        user="root",
        password="password",
        database="master"
    )
    cursor = db.cursor()

    # Execute the SHOW SLAVE HOSTS command
    cursor.execute("SHOW SLAVE HOSTS")

    # Fetch all rows
    rows = cursor.fetchall()

    # Close the database connection
    db.close()

    # Return the list of replica servers
    return rows

if __name__ == "__main__":
    slave_hosts = get_slave_hosts()
    for row in slave_hosts:
        server_id, host, port, master_id = row
        print(f"Server ID: {server_id}, Host: {host}, Port: {port}, Master ID: {master_id}")

特定のレプリカサーバーの情報を取得する

import mariadb

def get_slave_host_info(server_id):
    # Connect to the primary server
    db = mariadb.connect(
        host="localhost",
        port=3306,
        user="root",
        password="password",
        database="master"
    )
    cursor = db.cursor()

    # Execute the SHOW SLAVE HOSTS command with WHERE clause
    cursor.execute("SHOW SLAVE HOSTS WHERE Server_id = {}".format(server_id))

    # Fetch the first row (if any)
    row = cursor.fetchone()

    # Close the database connection
    db.close()

    # If a row was found, return the information; otherwise, return None
    if row:
        server_id, host, port, master_id = row
        return {"server_id": server_id, "host": host, "port": port, "master_id": master_id}
    else:
        return None

if __name__ == "__main__":
    server_id = 10000002  # Replace with the desired server ID
    slave_host_info = get_slave_host_info(server_id)
    if slave_host_info:
        print(f"Server ID: {slave_host_info['server_id']}")
        print(f"Host: {slave_host_info['host']}")
        print(f"Port: {slave_host_info['port']}")
        print(f"Master ID: {slave_host_info['master_id']}")
    else:
        print(f"Replica server with ID {server_id} not found.")
import mariadb

def check_slave_hosts():
    # Connect to the primary server
    db = mariadb.connect(
        host="localhost",
        port=3306,
        user="root",
        password="password",
        database="master"
    )
    cursor = db.cursor()

    # Execute the SHOW SLAVE HOSTS command
    cursor.execute("SHOW SLAVE HOSTS")

    # Check each replica server
    for row in cursor.fetchall():
        server_id, host, port, master_id = row

        # Check if the replica server is connected
        cursor.execute("SHOW SLAVE STATUS WHERE Server_id = {}".format(server_id))
        slave_status = cursor.fetchone()
        if slave_status[0] == "Yes":
            print(f"Replica server {host} is connected to the primary server.")
        else:
            print(f"Replica server {host} is not connected to the primary server.")

    # Close the database connection
    db.close()

if __name__ == "__main__":
    check_slave_hosts()


機能

両方のコマンドは、ソースサーバーに登録されているレプリカサーバーのリストを表示するという点では同じ機能を提供しますが、SHOW REPLICAS コマンドには以下の利点があります。

  • 一貫性: MySQL 8.0 以降で導入された他のステートメントと命名規則が統一されています。
  • 拡張性: 将来的にレプリカに関する情報を表示する機能が追加される可能性を考慮した設計になっています。
  • より明確なネーミング: コマンド名がレプリカサーバーの情報を表示することをより明確に示しています。

構文

SHOW REPLICAS;

出力

  • Replica_SQL_Thread_Id: レプリカサーバーのSQLスレッドID
  • Replica_IO_Thread_Id: レプリカサーバーのI/OスレッドID
  • Replica_Lag: レプリカサーバーとマスターサーバー間の遅延時間 (秒単位)
  • Slave_SQL_State: レプリカサーバーのSQLスレッドの状態 (Yes または No)
  • Slave_IO_State: レプリカサーバーのI/Oスレッドの状態 (Yes または No)
  • Master_port: レプリカサーバーが複製しているマスターサーバーのポート番号
  • Master_host: レプリカサーバーが複製しているマスターサーバーのホスト名
  • Master_id: レプリカサーバーが複製しているマスターサーバーの一意なID
  • Status: レプリカサーバーのステータス (RUNNING、SLAVE_PENDING_CHANGE、SLAVE_NOT_RUNNING など)
  • Password: レプリケーションパスワード (セキュリティ上の理由により、出力ではマスクされます)
  • User: レプリケーションユーザー名
  • Source_port: ソースサーバーのポート番号
  • Source_host: ソースサーバーのホスト名
  • Source_id: ソースサーバーの一意なID
  • Replica_id: レプリカサーバーの一意なID

SHOW REPLICAS;
+------------+------------+-----------+------------+---------+----------+------------+-----------+-----------+------------+-------------------+-------------------+-----------------+-------------------+
| Replica_id | Source_id | Source_host | Source_port | User     | Password | Status     | Master_id | Master_host | Master_port | Slave_IO_State | Slave_SQL_State | Replica_Lag | Replica_IO_Thread_Id | Replica_SQL_Thread_Id |
+------------+------------+-----------+------------+---------+----------+------------+-----------+-----------+------------+-------------------+-------------------+-----------------+-------------------+
|          1 |        1000 | localhost  |     3306 | repluser | ********* | RUNNING    |      1000 | localhost  |     3306 | Yes              | Yes              |           0 |                1 |                2 |
+------------+------------+-----------+------------+---------+----------+------------+-----------+-----------+------------+-------------------+-------------------+-----------------+-------------------+

互換性

SHOW SLAVE HOSTS コマンドで表示される情報は、SHOW REPLICAS コマンドの対応する列にほぼすべて含まれています。

移行

SHOW SLAVE HOSTS コマンドから SHOW REPLICAS コマンドへの移行は、スクリプトやツールを以下のように変更することで簡単に行うことができます。

  • 必要に応じて、出力列の処理を修正する。
  • コマンド名を SHOW SLAVE HOSTS から SHOW REPLICAS に変更する。
  • コマンドを実行する前に、MariaDB のドキュメントを参照することをお勧めします。
  • この説明は、MariaDB 10.7 を対象としています。他のバージョンでは、コマンドの動作や出力が異なる場合があります。