Network Namespace Support(網絡命名空間支持) 提供了在Linux系統中創建和管理多個隔離網絡空間的能力。網絡命名空間是來自主機系統的網絡堆棧的邏輯副本。網絡命名空間對于設置容器或虛擬環境非常有用。每個名稱空間都有自己的IP地址、網絡接口、路由表等等。默認命名空間或全局命名空間是主機系統物理接口所在的命名空間。
當MySQL連接跨命名空間時,命名空間特定的地址空間可能會導致問題。例如,在容器或虛擬網絡中運行的MySQL實例的網絡地址空間可能與主機的地址空間不同。這可能會產生一些現象,例如來自一個命名空間中地址的客戶端連接對MySQL服務器來說似乎來自不同的地址,即使是運行在同一臺機器上的客戶端和服務器也是如此。假設兩個進程都在IP地址為203.0.113.10的主機上運行,但使用不同的命名空間。連接可能會產生這樣的結果:
$> mysql --user=admin --host=203.0.113.10 --protocol=tcpmysql> 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 8.0.27開始)。
以下部分介紹如何在MySQL中使用網絡命名空間:
1?主機系統先決條件
在MySQL中使用網絡命名空間支持之前,必須滿足以下主機系統先決條件:
- 主機操作系統必須支持網絡命名空間。(例如,Linux。)
- MySQL要使用的任何網絡命名空間都必須首先在主機系統上創建。
- 主機名解析必須由系統管理員配置,以支持網絡命名空間。
注意:在MySQL中,主機名解析不適用于網絡命名空間特定主機文件中指定的名稱。例如,如果在/etc/netns/red/hosts文件中指定了red命名空間中主機名的地址,則綁定到該名稱在服務器端和客戶端都會失敗。解決方法是使用IP地址而不是主機名。
- 系統管理員必須為支持網絡命名空間(mysqld、MySQL、mysqlxtest)的MySQL二進制文件啟用CAP_SYS_ADMIN操作系統權限。
注意:
啟用CAP_SYS_ADMIN是一項對安全性敏感的操作,因為它使進程能夠執行除設置命名空間之外的其他特權操作。由于系統管理員必須顯式啟用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 upip 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 blue192.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-blueip netns del red
ip netns del bluesysctl 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
2 MySQL 配置
假設前面的主機系統先決條件已經得到滿足,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和(自MySQL 8.0.21起)mysqlx_bind_addresss接受多個逗號分隔地址的列表,變量值可以指定全局命名空間、命名命名空間或混合命名空間中的地址。
如果在服務器啟動期間嘗試使用命名空間時發生錯誤,則服務器不會啟動。如果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.00.23之前),并指定NETWORK_NAMESPACE選項。例如:
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '192.0.2.2',NETWORK_NAMESPACE = 'red';
如果省略了NETWORK_NAMESPACE選項,則復制連接將使用默認(全局)命名空間。
以下示例設置了一個MySQL服務器,該服務器偵聽全局、red和blue命名空間中的連接,并顯示了如何配置從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、紅色命名空間中的地址192.0.2.2和藍色命名空間中的198.51.100.2。
?2. 連接到全局命名空間中的服務器,并創建具有從每個命名命名空間的地址空間中的地址進行連接的權限的帳戶:
$> mysql -u root -h 127.0.0.1 -p
Enter password: root_passwordmysql> 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_passwordmysql> 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_passwordmysql> SELECT USER();
+------------------------+
| USER() |
+------------------------+
| blue_user@198.51.100.2 |
+------------------------+
注意:
可能會從USER()中看到不同的結果,如果您的DNS被配置為能夠將地址解析為相應的主機名,并且服務器沒有在啟用skip_name_resolve系統變量的情況下運行,USER可以返回一個包含主機名而非IP地址的值。
您也可以嘗試在不使用--network - namespace選項的情況下調用mysql,以查看連接嘗試是否成功,如果成功,USER()值將如何受到影響。
3 網絡命名空間監視
出于復制監視的目的,這些信息源有一列顯示連接的適用網絡命名空間:
- 性能架構replication_connection_configuration表。
- 副本服務器連接元數據存儲庫。
- SHOW REPLICA STATUS(或MySQL 8.0.22之前的SHOW SLAVE STATUS)語句。