Spec-Zone.ru › MySQL 9.2

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.12, «Таблица 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-9.2-en/network-namespace-support.html

Spec-Zone.ru

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