網路命名空間是主機系統網路堆疊的邏輯副本。網路命名空間對於設定容器或虛擬環境很有用。每個命名空間都有自己的 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 中使用網路命名空間
在 MySQL 中使用網路命名空間支援之前,必須滿足這些主機系統先決條件
主機作業系統必須支援網路命名空間。(例如,Linux。)
任何將由 MySQL 使用的網路命名空間必須先在主機系統上建立。
系統管理員必須設定主機名稱解析,以支援網路命名空間。
注意一個已知的限制是,在 MySQL 內部,主機名稱解析對於在網路命名空間特定主機檔案中指定的名稱不起作用。例如,如果在
red
命名空間中的主機名稱位址是在/etc/netns/red/hosts
檔案中指定的,則伺服器和客戶端都無法綁定到該名稱。 解決方法是使用 IP 位址而不是主機名稱。系統管理員必須為支援網路命名空間的 MySQL 二進位檔啟用
CAP_SYS_ADMIN
作業系統權限(mysqld、mysql、mysqlxtest)。重要啟用
CAP_SYS_ADMIN
是一項對安全性敏感的操作,因為它允許程序除了設定命名空間之外,還執行其他特權操作。有關其影響的說明,請參閱 https://man7.org/linux/man-pages/man7/capabilities.7.html。由於
CAP_SYS_ADMIN
必須由系統管理員明確啟用,因此預設情況下,MySQL 二進位檔未啟用網路命名空間支援。系統管理員應在啟用CAP_SYS_ADMIN
之前,評估使用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
功能
$> 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 允許設定連線的接聽(輸入)端的伺服器端命名空間和連線的輸出端的用戶端命名空間。
在伺服器端,bind_address
、admin_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
和mysqlx_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 伺服器,該伺服器接聽全域、red
和 blue
命名空間中的連線,並顯示如何設定從 red
和 blue
命名空間連線的帳戶。假設 red
和 blue
命名空間已按照主機系統先決條件中所示建立。
設定伺服器以接聽多個命名空間中的位址。將這些行放入伺服器
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
。連線到全域命名空間中的伺服器,並建立允許從每個已命名命名空間的位址空間中的位址連線的帳戶
$> 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';
驗證您是否可以連線到每個已命名命名空間中的伺服器
$> 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()
值會如何受到影響。
為了進行複寫監控,這些資訊來源具有一個欄,可顯示連線的適用網路命名空間
效能結構描述
replication_connection_configuration
資料表。請參閱第 29.12.11.1 節「replication_connection_configuration 資料表」。複本伺服器連線中繼資料存放區。請參閱第 19.2.4.2 節「複寫中繼資料存放區」。
SHOW REPLICA STATUS
陳述式。