Spec-Zone.ru › MySQL Shell 9.2

6.9 Метаданные тегов

Доступен настраиваемый фреймворк тегов, позволяющий помечать метаданные InnoDB Cluster, InnoDB ClusterSet или InnoDB ReplicaSet дополнительной информацией. Теги позволяют ассоциировать произвольные пары ключ-значение с кластером, ReplicaSet или экземпляром. Теги зарезервированы для использования MySQL Router, что позволяет совместимому MySQL Router скрывать экземпляры от приложений. Следующие теги зарезервированы для этой цели:

  • _hidden указывает MySQL Router: исключает экземпляр из списка возможных пунктов назначения для приложений-клиентов.

  • _disconnect_existing_sessions_when_hidden: указывает маршрутизатору разорвать существующие соединения с экземплярами, помеченными как скрытые.

Более подробная информация приведена в разделе Удаление экземпляров из маршрутизации.

Кроме того, фреймворк тегов настраивается пользователем. Пользовательские теги могут состоять из любых символов ASCII и предоставляют namespace, который служит в качестве словаря пар ключ-значение, которые могут быть связаны с кластерами, ReplicaSets или их конкретными экземплярами. Значения тегов могут быть любым значением JSON. Эта настройка позволяет добавить собственные атрибуты поверх метаданных.

Отображение тегов

Операция Cluster.options() отображает информацию о тегах, назначенных отдельным экземплярам кластера, а также самому кластеру. Например, InnoDB Cluster, назначенный myCluster, может отобразить:

mysql-js> myCluster.options()
{
    "cluster": {
        "name": "test1",
        "tags": {
            "ic-1:3306": [
                {
                    "option": "_disconnect_existing_sessions_when_hidden",
                    "value": true
                },
                {
                    "option": "_hidden",
                    "value": false
                }
            ],
            "ic-2:3306": [],
            "ic-3:3306": [],
            "global": [
                {
                    "option": "location:",
                    "value": "US East"
                }
            ]
        }
    }
}

Этот кластер имеет глобальный тег с именем location, который имеет значение US East, и экземпляр ic-1 был помечен.

Настройка тегов экземпляра кластера

Вы можете настроить теги на уровне экземпляра, что позволяет, например, помечать экземпляр как недоступный, так что приложения и маршрутизатор будут считать его оффлайн. Используйте операцию Cluster.setInstanceOption(instance, option, value) для установки значения тега для экземпляра.

Аргумент instance — строка подключения к целевому экземпляру. Аргумент option должен быть строкой в формате namespace:option. Параметр value — значение, которое должно быть назначено option в указанном namespace. Если значение равно null, option удаляется из указанного namespace. Для экземпляров, принадлежащих кластеру, операция setInstanceOption() принимает только пространство имен tag. Любое другое пространство имен приводит к ArgumentError.

Например, для установки тега test со значением true на экземпляре myCluster ic-1 используйте:

mysql-js> myCluster.setInstanceOption("icadmin@ic-1:3306", "tag:test", true);

Или, используя Python, для установки тега test со значением true на экземпляре myCluster ic-1 используйте:

mysql-py> myCluster.set_instance_option("icadmin@ic-1:3306", "tag:test", True);

Удаление экземпляров из маршрутизации

При совместной работе AdminAPI и MySQL Router они поддерживают определенные теги, которые позволяют помечать экземпляры как скрытые и удалять их из маршрутизации. MySQL Router затем исключает такие помеченные экземпляры из списка кандидатов на маршрутизацию. Эта функциональность позволяет безопасно выводить экземпляр сервера из работы, чтобы приложения и MySQL Router игнорировали его. Например, во время выполнения задач технического обслуживания, таких как обновление сервера или изменения конфигурации.

Когда тег _hidden установлен в значение true, это указывает MySQL Router исключить экземпляр из списка возможных пунктов назначения для приложений-клиентов. Экземпляр остается активным, но не маршрутизируется для новых входящих соединений. Тег _disconnect_existing_sessions_when_hidden контролирует, как закрываются существующие соединения с экземпляром. Предполагается, что этот тег имеет значение true, и он указывает любым экземплярам MySQL Router, запущенным на InnoDB Cluster, InnoDB ClusterSet или InnoDB ReplicaSet, разорвать существующие соединения с экземпляром, когда тег _hidden имеет значение true.

Когда _disconnect_existing_sessions_when_hidden имеет значение false, существующие соединения клиентов с экземпляром не закрываются, если _hidden имеет значение true. Зарезервированные теги _hidden и _disconnect_existing_sessions_when_hidden относятся только к экземплярам и не могут использоваться на уровне кластера.

Предупреждение

Если опция MySQL Router use_gr_notifications включена, она устанавливается по умолчанию в 60 секунд. Это означает, что при настройке тегов MySQL Router может обнаружить изменения в течение до 60 секунд. Для сокращения времени ожидания измените use_gr_notifications на меньшее значение.

Например, если нужно удалить экземпляр ic-1, который входит в InnoDB Cluster, назначенный myCluster, из пунктов назначения маршрутизации, используйте операцию JavaScript setInstanceOption() для включения тегов _hidden и _disconnect_existing_sessions_when_hidden:

mysql-js> myCluster.setInstanceOption("icadmin@ic-1:3306", "tag:_hidden", true);

Или используйте операцию Python set_instance_option() для включения тегов _hidden и _disconnect_existing_sessions_when_hidden:

			mysql-js> myCluster.set_instance_option("icadmin@ic-1:3306", "tag:_hidden", true);
		

Можно проверить изменения в метаданных, проверив параметры. Например, изменение, внесенное в ic-1, отобразится в параметрах как:

mysql-js> myCluster.options()
{
    "cluster": {
        "name": "test1",
        "tags": {
            "ic-1:3306": [
                {
                    "option": "_disconnect_existing_sessions_when_hidden",
                    "value": true
                },
                {
                    "option": "_hidden",
                    "value": true
                }
            ],
            "ic-2:3306": [],
            "ic-3:3306": [],
            "global": []
        }
    }
}

Проверьте, что MySQL Router обнаружил изменение в метаданных, посмотрев файл журнала. В MySQL Router, который обнаружил изменение в ic-1, будет показано подобное изменение:

2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] Potential changes detected in cluster 'testCluster' after metadata refresh
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700] view_id = 4, (3 members)
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700]     ic-1:3306 / 33060 - mode=RW
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700]     ic-1:3306 / 33060 - mode=RO
2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700]     ic-1:3306 / 33060 - mode=RO hidden=yes disconnect_when_hidden=yes
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_ro listening on 64470 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_x_rw listening on 64460 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_rw listening on 6446 got request to disconnect invalid connections: metadata change
2020-07-03 16:32:16 routing INFO [7fa9d164c700] Routing routing:testCluster_ro listening on 6447 got request to disconnect invalid connections: metadata change

Чтобы включить экземпляр обратно в работу, используйте операцию setInstanceOption() для удаления тегов, и MySQL Router автоматически добавит экземпляр обратно в пункты назначения маршрутизации, и он станет доступным для приложений. Например:

mysql-js> myCluster.setInstanceOption(icadmin@ic-1:3306, "tag:_hidden", false);

Проверьте изменения в метаданных, еще раз проверив параметры:

mysql-js> myCluster.options()
{
    "cluster": {
        "name": "test1",
        "tags": {
            "ic-1:3306": [
                {
                    "option": "_disconnect_existing_sessions_when_hidden",
                    "value": true
                },
                {
                    "option": "_hidden",
                    "value": false
                }
            ],
            "ic-2:3306": [],
            "ic-3:3306": [],
            "global": []
        }
    }
}

Также можно просмотреть статус _hidden для членов, используя атрибут hiddenFromRouter в выводе следующих команд:

  • Cluster.status()

  • Cluster.describe()

  • ReplicaSet.status()

Этот атрибут имеет значение true для любого члена, скрытого от трафика MySQL Router с помощью тега метаданных _hidden.

Настройка тегов кластера

Операция Cluster.setOption(option, value) позволяет изменить значение параметра пространства имен для всего кластера. Аргумент option должен быть строкой в формате namespace:option.

Параметр value — значение, которое должно быть назначено option в указанном namespace. Если значение равно null, option удаляется из указанного namespace. Для кластеров операция setOption() принимает пространство имен tag. Любое другое пространство имен приводит к ArgumentError.

Подсказка

Теги, установленные на уровне кластера, не переопределяют теги, установленные на уровне экземпляра. Нельзя использовать Cluster.setOption() для удаления всех тегов, установленных на уровне экземпляра.

Не требуется, чтобы все экземпляры были онлайн, достаточно, чтобы кластер имел кворум. Для помещения метки на InnoDB Cluster, назначенный myCluster, с тегом location, установленным в US East, выполните следующее в JavaScript:

mysql-js> myCluster.setOption("tag:location", "US East")
mysql-js> myCluster.options()
{
    "cluster": {
        "name": "test1",
        "tags": {
            "ic-1:3306": [],
            "ic-2:3306": [],
            "ic-3:3306": [],
            "global": [
                {
                    "option": "location:",
                    "value": "US East"
                }
            ]
        }
    }
}

Или выполните следующее в Python:

mysql-py> myCluster.set_option("tag:location", "US East")
mysql-pys> myCluster.options()
{
    "cluster": {
        "name": "test1",
        "tags": {
            "ic-1:3306": [],
            "ic-2:3306": [],
            "ic-3:3306": [],
            "global": [
                {
                    "option": "location:",
                    "value": "US East"
                }
            ]
        }
    }
}

Удаление тегов из кластера

Для удаления тега из кластера используйте операцию Cluster.setOption(option, value) со значением null в JavaScript и значением None в Python.

Для удаления тега из InnoDB Cluster, назначенного myCluster, с тегом location, выполните следующее в JavaScript:

mysql-js> myCluster.setOption("tag:location", null)

Или с помощью Python:

mysql-js> myCluster.set_option("tag:location", None)
END_OF_DOCUMENT_MARKER

Определение тегов пользователем

AdminAPI поддерживает пространство имён tag, где вы можете хранить информацию в парах «ключ-значение», связанных с заданным кластером, репликасетом или экземпляром. Параметры в пространстве имён tag не ограничены, что означает, что вы можете добавлять теги с любой информацией, которую вы выберете, при условии, что это допустимый идентификатор MySQL ASCII.

Вы можете использовать любое имя и значение для тега, при условии, что имя соответствует следующему синтаксису: _ или буквы, за которыми следуют буквенно-цифровые и _ символы.

Параметр namespace — это строка, разделенная двоеточием, с форматом namespace:option, где namespace — это имя пространства имён, а option — фактическое имя параметра. Вы можете устанавливать и удалять теги на уровне экземпляра или на уровне кластера или репликасета.

Имена тегов могут иметь любое значение, при условии, что оно начинается с буквы или символа подчеркивания, за которым необязательно следуют буквенно-цифровые и _ символы, например, ^[a-zA-Z_][0-9a-zA-Z_]*. Только встроенные теги разрешено начинать с символа подчеркивания _.

Способ использования пользовательских тегов зависит от вас. Вы можете установить пользовательский тег на кластере, чтобы отметить расположение кластера. Например, установите пользовательский тег с именем location со значением EMEA для кластера.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-shell-9.2-en/admin-api-tagging.html

Spec-Zone.ru

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