MySQL中的网络命名空间支持

Network Namespace Support(网络命名空间支持) 提供了在Linux系统中创建和管理多个隔离网络空间的能力。网络命名空间是来自主机系统的网络堆栈的逻辑副本。网络命名空间对于设置容器或虚拟环境非常有用。每个名称空间都有自己的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 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 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

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 TO
  SOURCE_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_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系统变量的情况下运行,USER可以返回一个包含主机名而非IP地址的值。

您也可以尝试在不使用--network - namespace选项的情况下调用mysql,以查看连接尝试是否成功,如果成功,USER()值将如何受到影响。

3 网络命名空间监视

出于复制监视的目的,这些信息源有一列显示连接的适用网络命名空间:

  • 性能架构replication_connection_configuration表。
  • 副本服务器连接元数据存储库。
  • SHOW REPLICA STATUS(或MySQL 8.0.22之前的SHOW SLAVE STATUS)语句。
  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值