Spec-Zone.ru › MySQL 8.4

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

  • Мониторинг пространств имён сети

Предварительные требования к системе хоста

Перед использованием поддержки пространств имён сети в 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 суффикса использует глобальное пространство имен хост-системы. Глобальное пространство имен является, следовательно, значением по умолчанию.

  • Адрес с /ns суффиксом использует пространство имен, имя которого ns.

  • Система хоста должна поддерживать пространства имен сети, и каждое именованное пространство имен должно быть предварительно настроено. Указание несуществующего пространства имен приводит к ошибке.

  • 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 уже созданы, как показано в Предварительные требования к системе хоста.

  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 в пространстве имен red и адрес 198.51.100.2 в пространстве имен blue.

  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(), который может вернуть значение, включающее имя хоста вместо 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/network-namespace-support.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API