网络命名空间是来自主机系统的网络堆栈的逻辑副本。网络名称空间对于设置容器或虚拟环境非常有用。每个名称空间都有自己的IP地址、网络接口、路由表等等。默认或全局名称空间是主机系统物理接口所在的名称空间。
当MySQL连接跨越名称空间时,特定于名称空间的地址空间会导致问题。例如,运行在容器或虚拟网络中的MySQL实例的网络地址空间可能与主机的地址空间不同。这可能会产生这样的现象,例如来自一个名称空间中的地址的客户端连接对MySQL服务器来说似乎来自不同的地址,即使对于运行在同一台机器上的客户端和服务器也是如此。假设两个进程都运行在具有IP地址的主机上203.0.113.10
但是使用不同的名称空间。连接可能会产生这样的结果:
shell> mysql——user=admin——host=203.0.113.10——protocol=tcp mysql> SELECT user ()+--------------------+ | 用户 () | +--------------------+ | admin@198.51.100.2 | +--------------------+
在这种情况下,预期用户()
值是admin@203.0.113.10
.如果产生连接的地址不是它所显示的地址,这种行为可能会使正确分配帐户权限变得困难。
为了解决这个问题,MySQL允许指定TCP/IP连接使用的网络名称空间,这样连接的两个端点都使用一个商定的公共地址空间。
MySQL 8.0.22及更高版本在实现它们的平台上支持网络名称空间。MySQL内的支持适用于:
下面介绍如何在MySQL中使用网络名称空间:
在MySQL中使用网络命名空间支持之前,必须满足以下主机系统先决条件:
主机操作系统必须支持网络名称空间。(例如Linux)
MySQL要使用的任何网络名称空间都必须首先在主机系统上创建。
主机名解析必须由系统管理员配置,以支持网络名称空间。
请注意一个已知的限制是,在MySQL中,主机名解析不适用于特定于网络名称空间的主机文件中指定的名称。例如,如果地址为主机名中的
红色的
名称空间中指定/etc/netns/red/hosts
文件,绑定到该名称在服务器端和客户端都失败。解决方法是使用IP地址而不是主机名。系统管理员必须启用
CAP_SYS_ADMIN
支持网络名称空间的MySQL二进制文件(mysqld,mysql,mysqlxtest).重要的启用
CAP_SYS_ADMIN
是安全敏感操作,因为它允许进程执行除设置名称空间外的其他特权操作。有关其效果的描述,请参见https://man7.org/linux/man-pages/man7/capabilities.7.html.因为
CAP_SYS_ADMIN
必须由系统管理员显式启用,MySQL二进制文件默认情况下不启用网络命名空间支持。系统管理员应该评估运行MySQL进程的安全隐患CAP_SYS_ADMIN
启用前。
下面示例中的说明设置名为红色的
而且蓝色的
.您选择的名称可能不同,主机系统上的网络地址和接口也可能不同。
调用这里所示的命令根
操作系统用户或通过在每个命令前加上sudo.例如,调用知识产权或setcap如果不是,就命令根
,使用sudo ip或sudo setcap.
要配置网络名称空间,请使用知识产权命令。对于某些操作,使用知识产权命令必须在特定的名称空间(必须已经存在)内执行。在这种情况下,像这样开始命令:
IP netns execnamespace_name
例如,此命令在红色的
命名空间来显示环回接口:
IP netns执行红色IP链路建立失败
添加命名空间红色的
而且蓝色的
,每个都有自己的虚拟以太网设备,用作名称空间和自己的loopback接口之间的链接:
ip netns添加红色ip链接添加veth-red类型veth对等名称vpeer-red ip链路群vpeer-red netns红色ip addr添加192.0.2.1/24 dev veth-red ip连接设置veth-red ip netns exec红色ip addr添加192.0.2.2/24 dev vpeer-red ip netns exec红ip连接设置vpeer-red ip netns exec红ip链接设置lo ip netns添加蓝色ip链接添加veth-blue类型veth对等名称vpeer-blue ip链路群vpeer-blue netns蓝色ip addr添加198.51.100.1/24 dev veth-blue ip连接设置veth-blue ip netns exec蓝色ip addr添加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
命名空间之间的链接图如下所示:
红色全局蓝192.0.2.2 <=> 192.0.2.1 (vpeer-red) (vth - Red) 198.51.100.1 <=> 198.51.100.2 (vpeer-blue) (vpeer-blue)
检查存在哪些名称空间和链接:
IP netns list IP链路列表
查看全局名称空间和命名名称空间的路由表:
IP route show IP netns exec红色IP route show IP netns exec蓝色IP route show
删除红色的
而且蓝色的
链接和命名空间:
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 ./mysqld Setcap
检查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 . mysql
如果重新安装之前应用的二进制文件setcap,你必须使用setcap一次。例如,如果执行就地MySQL升级,则无法授予CAP_SYS_ADMIN
功能再次导致与名称空间相关的失败。服务器尝试绑定带有命名命名空间的地址时会出现以下错误:
[ERROR] [MY-013408] [Server] setns()失败,错误为'操作不允许'
调用的客户端——网络名称空间
选项失败如下:
网络命名空间错误:不允许操作
假设前面的主机系统先决条件已经满足,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地址指定网络名称空间。
对于给定的地址,网络名称空间是可选的。如果给定,则必须指定为a
/
紧跟在地址后面的后缀。ns
地址没有
/
Suffix使用主机系统全局命名空间。因此全局命名空间是默认的。ns
地址
/
Suffix使用命名的名称空间ns
ns
.主机系统必须支持网络名称空间,并且每个命名的名称空间必须事先设置好。命名不存在的名称空间将产生错误。
bind_address
and(从MySQL 8.0.21开始)mysqlx_bind_address
接受一个由多个逗号分隔的地址组成的列表,变量值可以指定全局名称空间、命名名称空间或混合的地址。
如果在试图使用命名空间的服务器启动过程中发生错误,则服务器不会启动。如果X Plugin在初始化过程中出现错误,无法绑定到任何地址,则该插件初始化顺序失败,服务器不会加载它。
在客户端,网络命名空间可以在以下上下文中指定:
为mysql客户与mysqlxtest测试套件客户端,使用
——网络名称空间
选择。例如:Mysql——host=192.0.2.2——network-namespace=red
如果
——网络名称空间
选项,则连接使用默认的(全局)名称空间。对于从副本服务器到源服务器的复制连接,请使用
将复制源更改为
语句(从MySQL 8.0.23)或将master更改为
语句(MySQL 8.0.23之前),并指定NETWORK_NAMESPACE
选择。例如:更改复制源为SOURCE_HOST = '192.0.2.2', NETWORK_NAMESPACE = 'red';
如果
NETWORK_NAMESPACE
选项时,复制连接使用默认的(全局)名称空间。
下面的例子设置了一个MySQL服务器来监听全局的连接,红色的
,蓝色的
命名空间,并展示如何配置从红色的
而且蓝色的
名称空间。这是假定的红色的
而且蓝色的
已经创建了名称空间,如主机系统前提条件.
配置服务器监听多个名称空间中的地址。把这些行放到服务器中
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
在蓝色的
名称空间。连接到全局命名空间中的服务器,并创建具有从每个命名命名空间的地址空间中的地址连接的权限的帐户:
shell> mysql -u root -h 127.0.0.1root_passwordCREATE USER 'red_user'@'192.0.2.2' IDENTIFIED BY 'red_user_password”;mysql>创建用户“blue_user”@“198.51.100.2”blue_user_password”;
验证您可以连接到每个命名命名空间中的服务器:
shell> mysql -u red_user -h 192.0.2.2——network-namespace=red -p输入密码:red_user_passwordmysql> SELECT 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_passwordmysql> SELECT USER()+------------------------+ | 用户 () | +------------------------+ | blue_user@198.51.100.2 | +------------------------+
请注意你可能会看到不同的结果
用户()
,如果将DNS配置为能够将地址解析为相应的主机名,且服务器没有使用skip_name_resolve
系统变量已启用。
出于复制监视的目的,这些信息源有一列显示连接的适用网络名称空间:
性能模式
replication_connection_configuration
表格看到章节27.12.11.1,“replication_connection_configuration表”.复制服务器连接元数据存储库。看到第17.2.4.2节,“复制元数据存储库”.
的
显示副本|从站状态
声明。看到第13.7.7.35节,“SHOW REPLICA | SLAVE STATUS Statement”.