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


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

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 內部,主機名稱解析對於在網路命名空間特定主機檔案中指定的名稱不起作用。例如,如果在 red 命名空間中的主機名稱位址是在 /etc/netns/red/hosts 檔案中指定的,則伺服器和客戶端都無法綁定到該名稱。 解決方法是使用 IP 位址而不是主機名稱。

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

    重要

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

    由於 CAP_SYS_ADMIN 必須由系統管理員明確啟用,因此預設情況下,MySQL 二進位檔未啟用網路命名空間支援。系統管理員應在啟用 CAP_SYS_ADMIN 之前,評估使用 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 允許設定連線的接聽(輸入)端的伺服器端命名空間和連線的輸出端的用戶端命名空間。

在伺服器端,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 外掛程式發生錯誤,導致它無法繫結到任何位址,則外掛程式會失敗其初始化順序,且伺服器不會載入它。

在用戶端端,可以在下列內容中指定網路命名空間

  • 對於 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.2 以及 blue 命名空間中的位址 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() 值會如何受到影響。

網路命名空間監控

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