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.11, «Таблица replication_connection_configuration».Репозиторий метаданных соединения сервера-реплики. См. Раздел 19.2.4.2, «Репозитории метаданных репликации».
Оператор
SHOW REPLICA STATUS.
© 2025 Oracle
Licensed under the GPLv2 License.