文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  網路命名空間支援

7.1.14 網路命名空間支援

網路命名空間是主機系統網路堆疊的邏輯副本。網路命名空間適用於設定容器或虛擬環境。每個命名空間都有自己的 IP 位址、網路介面、路由表等等。預設或全域命名空間是主機系統實體介面所在的命名空間。

當 MySQL 連線跨越命名空間時,特定於命名空間的位址空間可能會導致問題。例如,在容器或虛擬網路中執行的 MySQL 執行個體的網路位址空間可能與主機的位址空間不同。這可能會產生一些現象,例如來自一個命名空間中位址的用戶端連線,即使客戶端和伺服器在同一部機器上執行,在 MySQL 伺服器看來也像是來自不同的位址。假設兩個程序都在 IP 位址為 203.0.113.10 的主機上執行,但使用不同的命名空間。連線可能會產生如下結果

$> 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 支援實作網路命名空間的平台上的網路命名空間。MySQL 內的支援適用於

  • MySQL 伺服器,mysqld

  • X 外掛程式。

  • mysql 用戶端和 mysqlxtest 測試套件用戶端。(不支援其他用戶端。它們必須從要連線的伺服器的網路命名空間內叫用。)

  • 一般複寫。

  • 群組複寫,僅當使用 MySQL 通訊堆疊來建立群組通訊連線時。

以下章節說明如何在 MySQL 中使用網路命名空間

主機系統先決條件

在 MySQL 中使用網路命名空間支援之前,必須滿足這些主機系統先決條件

  • 主機作業系統必須支援網路命名空間。(例如,Linux。)

  • MySQL 要使用的任何網路命名空間都必須先在主機系統上建立。

  • 系統管理員必須設定主機名稱解析,以支援網路命名空間。

    注意

    一個已知的限制是,在 MySQL 中,主機名稱解析不適用於網路命名空間特定主機檔案中指定的名稱。例如,如果在 /etc/netns/red/hosts 檔案中指定 red 命名空間中主機名稱的位址,則在伺服器和用戶端都會發生繫結到該名稱失敗的情況。解決方法是使用 IP 位址,而不是主機名稱。

  • 系統管理員必須為支援網路命名空間的 MySQL 二進制檔案 (mysqldmysqlmysqlxtest) 啟用 CAP_SYS_ADMIN 作業系統權限。

    重要

    啟用 CAP_SYS_ADMIN 是一項安全性敏感操作,因為它除了設定命名空間外,還允許程序執行其他特權操作。有關其影響的說明,請參閱 https://man7.org/linux/man-pages/man7/capabilities.7.html

    由於 CAP_SYS_ADMIN 必須由系統管理員明確啟用,預設情況下,MySQL 二進位檔不具備網路命名空間支援。系統管理員在啟用 CAP_SYS_ADMIN 之前,應評估使用該權限執行 MySQL 程序所帶來的安全性影響。

以下範例中的說明會設定名為 redblue 的網路命名空間。您選擇的名稱可能會不同,您主機系統上的網路位址和介面也可能不同。

請以 root 作業系統使用者身分,或在每個命令前加上 sudo 來執行此處顯示的命令。例如,如果您不是 root,若要執行 ipsetcap 命令,請使用 sudo ipsudo setcap

若要設定網路命名空間,請使用 ip 命令。對於某些操作,ip 命令必須在特定的命名空間(必須已存在)內執行。在這種情況下,命令的開頭如下所示

ip netns exec namespace_name

例如,此命令會在 red 命名空間內執行,以啟動迴路介面

ip netns exec red ip link set lo up

若要新增名為 redblue 的命名空間,每個命名空間都有自己的虛擬乙太網路裝置,作為命名空間之間的連結,以及各自的迴路介面

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

若要移除 redblue 連結和命名空間

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 功能

$> 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 允許設定連線的伺服器端命名空間,以用於接聽 (inbound) 端,以及用戶端命名空間,以用於連線的出 (outbound) 端。

在伺服器端,bind_addressadmin_addressmysqlx_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_addressmysqlx_bind_address 接受多個以逗號分隔的位址清單,變數值可以指定全域命名空間、已命名命名空間或混合中的位址。

如果在伺服器啟動期間嘗試使用命名空間時發生錯誤,伺服器將不會啟動。如果 X Plugin 在外掛程式初始化期間發生錯誤,導致無法繫結至任何位址,則外掛程式會初始化失敗,並且伺服器不會載入它。

在用戶端端,可以在以下情況下指定網路命名空間

  • 對於 mysql 用戶端和 mysqlxtest 測試套件用戶端,請使用 --network-namespace 選項。例如

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

    如果省略 --network-namespace 選項,連線會使用預設 (全域) 命名空間。

  • 對於從複本伺服器到來源伺服器的複寫連線,請使用 CHANGE REPLICATION SOURCE TO 陳述式,並指定 NETWORK_NAMESPACE 選項。例如

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

    如果省略 NETWORK_NAMESPACE 選項,複寫連線會使用預設 (全域) 命名空間。

以下範例設定一個 MySQL 伺服器,以接聽全域、redblue 命名空間中的連線,並示範如何設定從 redblue 命名空間連線的帳戶。假設 redblue 命名空間已如主機系統先決條件 中所示建立。

  1. 設定伺服器以接聽多個命名空間中的位址。將以下幾行放入伺服器 my.cnf 檔案,然後啟動伺服器

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

    該值會告知伺服器接聽全域命名空間中的迴路位址 127.0.0.1red 命名空間中的位址 192.0.2.2blue 命名空間中的位址 198.51.100.2

  2. 連線至全域命名空間中的伺服器,並建立具有權限從每個已命名命名空間的位址空間中的位址連線的帳戶

    $> 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. 驗證您是否可以連線至每個已命名命名空間中的伺服器

    $> 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 |
    +--------------------+
    $> 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 |
    +------------------------+
    注意

    您可能會從 USER() 看到不同的結果,如果您的 DNS 設定為能夠將位址解析為對應的主機名稱,且伺服器未啟用 skip_name_resolve 系統變數執行,則該函數可能會傳回包含主機名稱而非 IP 位址的值。

    您也可以嘗試在不使用 --network-namespace 選項的情況下叫用 mysql,以查看連線嘗試是否成功,以及 (如果成功) USER() 值如何受到影響。

網路命名空間監控

為了進行複寫監控,以下資訊來源具有一個欄位,可顯示連線的適用網路命名空間