MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  ネットワークネームスペースのサポート

5.1.14 ネットワークネームスペースのサポート

ネットワークネームスペースは、ホストシステムからのネットワークスタックの論理コピーです。 ネットワークネームスペースは、コンテナまたは仮想環境の設定に役立ちます。 各ネームスペースには、独自の IP アドレス、ネットワークインタフェース、ルーティングテーブルなどがあります。 デフォルトまたはグローバル名前空間は、ホストシステムの物理インタフェースが存在する名前空間です。

ネームスペース固有のアドレス空間は、MySQL 接続がネームスペース間をまたがる場合に問題になる可能性があります。 たとえば、コンテナまたは仮想ネットワークで実行されている MySQL インスタンスのネットワークアドレス空間は、ホストマシンのアドレス空間とは異なる場合があります。 これにより、同じマシン上で実行されているクライアントとサーバーであっても、MySQL サーバーに表示されるネームスペース内のアドレスからのクライアント接続などの現象が発生する可能性があります。 両方のプロセスが IP アドレスが 203.0.113.10 のホストで実行されているが、異なるネームスペースを使用しているとします。 接続によって次のような結果が生成される場合があります:

shell> mysql --user=admin --host=203.0.113.10 --protocol=tcp

mysql> SELECT USER();
+--------------------+
| USER()             |
+--------------------+
| admin@198.51.100.2 |
+--------------------+

この場合、予想される USER() 値は admin@203.0.113.10 です。 このような動作により、接続元のアドレスが表示されない場合に、アカウント権限を正しく割り当てることが困難になる可能性があります。

この問題に対処するために、MySQL では、TCP/IP 接続に使用するネットワークネームスペースを指定できるため、接続の両方のエンドポイントが合意した共通アドレス空間を使用します。

MySQL 8.0.22 以上では、それらを実装するプラットフォームでネットワークネームスペースがサポートされます。 MySQL 内のサポートは、次のものに適用されます:

  • MySQL サーバー、mysqld

  • X プラグイン。

  • mysql クライアントおよび mysqlxtest テストスイートクライアント。 (他のクライアントはサポートされていません。 これらは、接続先のサーバーのネットワークネームスペース内から呼び出す必要があります。)

  • 通常のレプリケーション。 (グループレプリケーションはサポートされていません。)

次の各セクションでは、MySQL でネットワークネームスペースを使用する方法について説明します:

ホストシステムの前提条件

MySQL でネットワークネームスペースのサポートを使用する前に、次のホストシステムの前提条件を満たす必要があります:

  • ホストオペレーティングシステムは、ネットワークネームスペースをサポートする必要があります。 (たとえば、Linux。)

  • MySQL で使用されるネットワークネームスペースは、最初にホストシステムに作成する必要があります。

  • ネットワークネームスペースをサポートするには、システム管理者がホスト名解決を構成する必要があります。

    注記

    既知の制限は、MySQL 内では、ネットワークネームスペース固有のホストファイルで指定された名前に対してホスト名解決が機能しないことです。 たとえば、red ネームスペースのホスト名のアドレスが/etc/netns/red/hosts ファイルで指定されている場合、名前へのバインドはサーバー側とクライアント側の両方で失敗します。 回避策は、ホスト名ではなく IP アドレスを使用することです。

  • システム管理者は、ネットワークネームスペース (mysqld, mysql, mysqlxtest) をサポートする MySQL バイナリに対して CAP_SYS_ADMIN オペレーティングシステム権限を有効にする必要があります。

    重要

    CAP_SYS_ADMIN の有効化は、ネームスペースの設定に加えてプロセスが他の権限アクションを実行できるようにするため、セキュリティに依存する操作です。 効果の詳細は、https://man7.org/linux/man-pages/man7/capabilities.7.html を参照してください。

    CAP_SYS_ADMIN はシステム管理者が明示的に有効にする必要があるため、MySQL バイナリではデフォルトでネットワークネームスペースのサポートは有効になっていません。 システム管理者は、有効にする前に、CAP_SYS_ADMIN で MySQL プロセスを実行した場合のセキュリティの影響を評価する必要があります。

次の例の手順では、red および blue という名前のネットワークネームスペースを設定します。 選択する名前は、ホストシステムのネットワークアドレスおよびインタフェースとは異なる場合があります。

ここに示すコマンドは、root オペレーティングシステムユーザーとして、または各コマンドの前に sudo を付けて起動します。 たとえば、root 以外の場合に ip または setcap コマンドを起動するには、sudo ip または sudo setcap を使用します。

ネットワークネームスペースを構成するには、ip コマンドを使用します。 一部の操作では、ip コマンドは特定のネームスペース (すでに存在している必要があります) 内で実行する必要があります。 このような場合は、次のようにコマンドを開始します:

ip netns exec namespace_name

たとえば、次のコマンドは red ネームスペース内で実行され、ループバックインタフェースを起動します:

ip netns exec red ip link set lo up

ネームスペースと独自のループバックインタフェース間のリンクとして使用される独自の仮想イーサネットデバイスを持つ、red および blue という名前のネームスペースを追加するには:

ip netns add red
ip link add veth-red type veth peer name vpeer-red
ip link set vpeer-red netns red
ip addr add 192.0.2.1/24 dev veth-red
ip link set veth-red up
ip netns exec red ip addr add 192.0.2.2/24 dev vpeer-red
ip netns exec red ip link set vpeer-red up
ip netns exec red ip link set lo up

ip netns add blue
ip link add veth-blue type veth peer name vpeer-blue
ip link set vpeer-blue netns blue
ip addr add 198.51.100.1/24 dev veth-blue
ip link set veth-blue up
ip netns exec blue ip addr add 198.51.100.2/24 dev vpeer-blue
ip netns exec blue ip link set vpeer-blue up
ip netns exec blue ip link set lo up

# if you want to enable inter-subnet routing...
sysctl net.ipv4.ip_forward=1
ip netns exec red ip route add default via 192.0.2.1
ip netns exec blue ip route add default via 198.51.100.1

ネームスペース間のリンクのダイアグラムは次のようになります:

red              global           blue

192.0.2.2   <=>  192.0.2.1
(vpeer-red)      (veth-red)

                 198.51.100.1 <=> 198.51.100.2
                 (veth-blue)      (vpeer-blue)

存在するネームスペースおよびリンクを確認するには:

ip netns list
ip link list

グローバルおよび名前付きネームスペースのルーティングテーブルを表示するには:

ip route show
ip netns exec red ip route show
ip netns exec blue ip route show

red および blue のリンクとネームスペースを削除するには:

ip link del veth-red
ip link del veth-blue

ip netns del red
ip netns del blue

sysctl net.ipv4.ip_forward=0

ネットワーク名前空間のサポートを含む MySQL バイナリが実際に名前空間を使用できるようにするには、それらに CAP_SYS_ADMIN 機能を付与する必要があります。 次の setcap コマンドは、MySQL バイナリを含むディレクトリの場所を変更したことを前提としています (必要に応じてシステムのパス名を調整します):

cd /usr/local/mysql/bin

CAP_SYS_ADMIN 機能を適切なバイナリに付与するには:

setcap cap_sys_admin+ep ./mysqld
setcap cap_sys_admin+ep ./mysql
setcap cap_sys_admin+ep ./mysqlxtest

CAP_SYS_ADMIN の機能を確認するには:

shell> getcap ./mysqld ./mysql ./mysqlxtest
./mysqld = cap_sys_admin+ep
./mysql = cap_sys_admin+ep
./mysqlxtest = cap_sys_admin+ep

CAP_SYS_ADMIN 機能を削除するには:

setcap -r ./mysqld
setcap -r ./mysql
setcap -r ./mysqlxtest
重要

以前に setcap を適用したバイナリを再インストールする場合は、setcap を再度使用する必要があります。 たとえば、MySQL のインプレースアップグレードを実行する場合、CAP_SYS_ADMIN 機能の付与に再度失敗すると、ネームスペース関連の障害が発生します。 名前付きネームスペースを持つアドレスにバインドしようとすると、サーバーは次のエラーで失敗します:

[ERROR] [MY-013408] [Server] setns() failed with error 'Operation not permitted'

--network-namespace オプションを指定して起動されたクライアントは、次のように失敗します:

ERROR: Network namespace error: Operation not permitted

MySQL 構成

前述のホストシステムの前提条件が満たされている場合、MySQL では、接続のリスニング (インバウンド) 側のサーバー側ネームスペースおよび接続のアウトバウンド側のクライアント側ネームスペースを構成できます。

サーバー側では、bind_addressadmin_address および mysqlx_bind_address システム変数に、着信接続をリスニングする特定の IP アドレスまたはホスト名に使用するネットワークネームスペースを指定するための拡張構文があります。 アドレスのネームスペースを指定するには、スラッシュとネームスペース名を追加します。 たとえば、サーバー my.cnf ファイルには次の行が含まれる場合があります:

[mysqld]
bind_address = 127.0.1.1,192.0.2.2/red,198.51.100.2/blue
admin_address = 102.0.2.2/red
mysqlx_bind_address = 102.0.2.2/red

次のルールが適用されます:

  • ネットワークネームスペースは、IP アドレスまたはホスト名に指定できます。

  • ワイルドカード IP アドレスにはネットワークネームスペースを指定できません。

  • 指定されたアドレスでは、ネットワーク名前空間はオプションです。 指定する場合は、アドレスの直後に/ns 接尾辞として指定する必要があります。

  • /ns 接尾辞のないアドレスは、ホストシステムのグローバルネームスペースを使用します。 したがって、グローバルネームスペースがデフォルトです。

  • /ns 接尾辞の付いたアドレスは、ns という名前のネームスペースを使用します。

  • ホストシステムはネットワークネームスペースをサポートしている必要があり、各名前付きネームスペースは事前に設定されている必要があります。 存在しないネームスペースに名前を付けると、エラーが発生します。

  • bind_address および (MySQL 8.0.21) mysqlx_bind_address は、カンマ区切りの複数のアドレスのリストを受け入れます。変数値は、グローバルネームスペース、名前付きネームスペースまたはその組合せでアドレスを指定できます。

ネームスペースを使用しようとしてサーバーの起動中にエラーが発生した場合、サーバーは起動しません。 プラグインの初期化中に X プラグイン でエラーが発生し、どのアドレスにもバインドできない場合、プラグインはその初期化シーケンスに失敗し、サーバーはそれをロードしません。

クライアント側では、ネットワークネームスペースを次のコンテキストで指定できます:

  • mysql クライアントおよび mysqlxtest テストスイートクライアントの場合は、--network-namespace オプションを使用します。 例:

    mysql --host=192.0.2.2 --network-namespace=red

    --network-namespace オプションを省略すると、接続ではデフォルト (グローバル) のネームスペースが使用されます。

  • レプリカサーバーからソースサーバーへのレプリケーション接続には、CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23) または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) を使用し、NETWORK_NAMESPACE オプションを指定します。 例:

    CHANGE REPLICATION SOURCE TO
      SOURCE_HOST = '192.0.2.2',
      NETWORK_NAMESPACE = 'red';

    NETWORK_NAMESPACE オプションを省略すると、レプリケーション接続はデフォルト (グローバル) 名前空間を使用します。

次の例では、グローバル、red および blue ネームスペースで接続をリスニングする MySQL サーバーを設定し、red および blue ネームスペースから接続するアカウントを構成する方法を示します。 ホストシステムの前提条件 に示すように、red および blue ネームスペースがすでに作成されていることを前提としています。

  1. 複数のネームスペースのアドレスをリスニングするようにサーバーを構成します。 サーバー my.cnf ファイルに次の行を入力し、サーバーを起動します:

    [mysqld]
    bind_address = 127.0.1.1,192.0.2.2/red,198.51.100.2/blue

    この値は、グローバルネームスペースでループバックアドレス 127.0.0.1 をリスニングし、red ネームスペースでアドレス 192.0.2.2 をリスニングし、blue ネームスペースでアドレス 198.51.100.2 をリスニングするようサーバーに指示します。

  2. グローバルネームスペースのサーバーに接続し、各名前付きネームスペースのアドレス空間のアドレスから接続する権限を持つアカウントを作成します:

    shell> mysql -u root -h 127.0.0.1 -p
    Enter password: root_password
    
    mysql> CREATE USER 'red_user'@'192.0.2.2'
           IDENTIFIED BY 'red_user_password';
    mysql> CREATE USER 'blue_user'@'198.51.100.2'
           IDENTIFIED BY 'blue_user_password';
  3. 各名前付きネームスペースのサーバーに接続できることを確認します:

    shell> mysql -u red_user -h 192.0.2.2 --network-namespace=red -p
    Enter password: red_user_password
    
    mysql> SELECT USER();
    +--------------------+
    | USER()             |
    +--------------------+
    | red_user@192.0.2.2 |
    +--------------------+
    shell> mysql -u blue_user -h 198.51.100.2 --network-namespace=blue -p
    Enter password: blue_user_password
    
    mysql> SELECT USER();
    +------------------------+
    | USER()                 |
    +------------------------+
    | blue_user@198.51.100.2 |
    +------------------------+
    注記

    DNS がアドレスを対応するホスト名に解決できるように構成されており、サーバーが skip_name_resolve システム変数を有効にして実行されていない場合、USER() とは異なる結果が表示され、IP アドレスではなくホスト名を含む値が返されることがあります。

    --network-namespace オプションを指定せずに mysql を起動して、接続試行が成功したかどうか、成功した場合は USER() 値がどのように影響を受けるかを確認することもできます。

ネットワークネームスペースのモニタリング

レプリケーションモニタリングのために、これらの情報ソースには、接続に適用可能なネットワークネームスペースを表示するカラムがあります:


関連キーワード:  ネーム, スペース, サーバー, red, ネットワーク, 接続, アドレス, netns, 変数, サポート