6.9 Метки метаданных
Доступен настраиваемый механизм меток, позволяющий отмечать метаданные кластера InnoDB, набора кластеров InnoDB или реплики InnoDB дополнительной информацией. Метки позволяют связать пользовательские пары «ключ-значение» с кластером, набором реплик или экземпляром. Метки зарезервированы для использования MySQL Router, что позволяет совместимому MySQL Router скрывать экземпляры от приложений. Следующие метки зарезервированы для этой цели:
_hiddenуказывает MySQL Router: исключает экземпляр из списка возможных пунктов назначения для приложений клиентов._disconnect_existing_sessions_when_hidden: Указывает маршрутизатору отключить существующие подключения от экземпляров, помеченных для скрытия.
Для получения дополнительной информации см. Удаление экземпляров из маршрутизации.
Кроме того, механизм меток настраивается пользователем. Пользовательские метки могут состоять из любого символа ASCII и предоставлять namespace, который служит словарем пар «ключ-значение», которые могут быть связаны с кластерами, наборами реплик или их конкретными экземплярами. Значения меток могут быть любым JSON-значением. Эта настройка позволяет добавлять собственные атрибуты поверх метаданных.
Отображение меток
Операция отображает информацию о метках, назначенных отдельным экземплярам кластера, а также самому кластеру. Например, кластер InnoDB, назначенный Cluster.options()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:optionvalue — это значение, которое должно быть присвоено option в указанном namespace. Если значение равно null, option удаляется из указанного namespace. Для экземпляров, принадлежащих кластеру, операция setInstanceOption() принимает только пространство имен tag. Любое другое пространство имен приводит к ArgumentError.
Например, чтобы использовать JavaScript для установки метки 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, набора кластеров InnoDB или набора реплик InnoDB, на отключение любых существующих подключений от экземпляра, когда метка _hidden имеет значение true.
Когда _disconnect_existing_sessions_when_hidden имеет значение false, любые существующие подключения клиентов к экземпляру не закрываются, если _hidden имеет значение true. Зарезервированные метки _hidden и _disconnect_existing_sessions_when_hidden специфичны для экземпляров и не могут использоваться на уровне кластера.
При включенном MySQL Router значение по умолчанию составляет 60 секунд. Это означает, что когда вы устанавливаете метки, у MySQL Router может быть до 60 секунд на обнаружение изменения. Чтобы сократить время ожидания, измените значение на меньшее.
Например, предположим, что вы хотите удалить экземпляр ic-1, который является частью кластера InnoDB, назначенного 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()
Не требуется, чтобы все экземпляры были в режиме онлайн, достаточно, чтобы кластер имел кворум. Для добавления метки location с значением «US East» к кластеру InnoDB, назначенному myCluster, выполните следующую команду в 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.
Для удаления метки location из кластера InnoDB, назначенного myCluster, выполните следующую команду в JavaScript:
mysql-js> myCluster.setOption("tag:location", null)
Или используя Python:
mysql-js> myCluster.set_option("tag:location", None)
Пользовательские метки
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.