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-адрес вместо имени хоста. -
Системный администратор должен включить системный привилегий
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, прежде чем включать его.
Инструкции в следующем примере настраивают пространства имён сети, называемые red и blue. Выбранные вами имена могут отличаться, как и сетевые адреса и интерфейсы в вашей системе хоста.
Выполните команды, показанные здесь, либо как пользователь root операционной системы, либо добавив перед каждой командой sudo. Например, чтобы выполнить команду ip или setcap, если вы не являетесь root, используйте sudo ip или sudo setcap.
Для настройки пространств имён сети используйте команду ip. Для некоторых операций команда ip должна выполняться внутри определенного пространства имён (которое должно уже существовать). В таких случаях начинайте команду так:
ip netns exec namespace_name
Например, эта команда выполняется внутри пространства имён red для запуска интерфейса loopback:
ip netns exec red ip link set lo up
Для добавления пространств имён, названных red и blue, каждое со своим виртуальным Ethernet-устройством, используемым как ссылка между пространствами и своим собственным интерфейсом loopback:
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
Предполагая, что предшествующие системные требования для хоста выполнены, 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Адрес с
/суффиксом использует пространство имён, названноеnsns.Система хоста должна поддерживать пространства имён сети, и каждое именованное пространство должно быть предварительно настроено. Назначение несуществующего пространства имён приводит к ошибке.
bind_addressиmysqlx_bind_addressпринимают список нескольких адресов, разделённых запятыми; значение переменной может указывать адреса в глобальном пространстве имён, в именованных пространствах имён или их комбинацию.
Если при запуске сервера возникает ошибка из-за попытки использовать пространство имён, сервер не запускается. Если при инициализации плагина X Plugin возникают ошибки, из-за которых он не может связаться ни с одним адресом, плагин прерывает свою последовательность инициализации, и сервер его не загружает.
На стороне клиента пространство имён сети может быть указано в следующих контекстах:
-
Для клиента 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в глобальном пространстве имён, адрес192.0.2.2в пространстве имёнredи адрес198.51.100.2в пространстве имёнblue. -
Подключитесь к серверу в глобальном пространстве имён и создайте учётные записи, у которых есть разрешения на подключение с адреса в адресном пространстве каждого именованного пространства имён:
$>
mysql -u root -h 127.0.0.1 -pEnter password:root_passwordmysql>CREATE USER 'red_user'@'192.0.2.2'IDENTIFIED BY 'mysql>red_user_password';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 -pEnter 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 -pEnter password:blue_user_passwordmysql>SELECT USER();+------------------------+ | USER() | +------------------------+ | blue_user@198.51.100.2 | +------------------------+ПримечаниеВы можете увидеть разные результаты от
USER(), которые могут возвращать значение, включающее имя хоста вместо IP-адреса, если ваша система DNS настроена для разрешения адреса до соответствующего имени хоста, и сервер не запускается с включённой переменной системыskip_name_resolve.Вы также можете попробовать вызвать mysql без опции
--network-namespace, чтобы увидеть, удаётся ли попытка подключения, и, если да, как это влияет на значениеUSER().
Мониторинг пространства имён сети
Для целей мониторинга репликации эти источники информации имеют столбец, отображающий применимое пространство имён сети для подключений:
Таблица Performance Schema
replication_connection_configuration. См. Раздел 29.12.11.12, «Таблица replication_connection_configuration».Репозиторий метаданных соединения сервера-реплики. См. Раздел 19.2.4.2, «Репозитории метаданных репликации».
Оператор
SHOW REPLICA STATUS.
© 2025 Oracle
Licensed under the GPLv2 License.