6.3标记元数据

从8.0.21版本开始,提供了一个可配置的标记框架,允许在InnoDB Cluster或InnoDB ReplicaSet的元数据中标记额外的信息。标记使自定义键-值对与Cluster、ReplicaSet或实例相关联成为可能。标签已经为MySQL路由器的使用保留,这使得兼容的MySQL路由器支持从应用程序中隐藏实例。以下标签是为此目的保留的:

  • _hidden指示MySQL路由器将该实例从客户端应用程序的可能目的地列表中排除

  • _disconnect_existing_sessions_when_hidden指示路由器断开标记为隐藏的实例的现有连接

有关更多信息,请参见从路由中删除实例

此外,标签框架是用户可配置的。自定义标记可以由任何ASCII字符组成,并提供名称空间,它作为键值对的字典,可以与集群、复制集或它们的特定实例相关联。标签值可以是任何JSON值。这使您能够在元数据之上添加自己的属性。

显示标签

集群.options ()操作显示分配给单个集群实例以及集群本身的标记的信息。例如,分配给的InnoDB集群myCluster可以显示:

mysql-js > myCluster.options(){“集群”:{“名称”:“test1”、“标签”:{“ic-1:3306”:[{“选项”:“_disconnect_existing_sessions_when_hidden”,“价值”:真正的},{“选项”:“_hidden”,“价值”:假}],“ic-2:3306”:[],“ic-3:3306”:[],“全球”:[{“选项”:“位置:”,“价值”:“美国东部 " } ] } } }

这个集群有一个全局标记位置它的值是我们东,和实例ic-1已被标记。

在集群实例上设置标签

您可以在实例级别设置标记,例如,这使您能够将一个实例标记为不可用,以便应用程序和路由器将其视为脱机。使用集群.setInstanceOption (实例选项价值操作为实例设置标记的值。的实例参数是到目标实例的连接字符串。的选项参数必须是格式为名称空间选项.的价值参数是应赋值的值选项在指定的名称空间.如果值为,选项从指定的名称空间.对于属于集群的实例,使用setInstanceOption ()操作只接受标签名称空间。任何其他名称空间都会导致ArgumentError

例如,设置标签测验真正的myCluster实例ic-1问题:

mysql-js >myCluster.setInstanceOption (icadmin@ic-1:3306”标签:测验”,真正的);

从路由中删除实例

当AdminAPI和MySQL路由器一起工作时,它们支持特定的标记,使您能够将实例标记为隐藏并从路由中删除它们。然后MySQL路由器从路由目的地候选列表中排除这样的标记实例。这使您能够安全地将服务器实例脱机,以便应用程序和MySQL路由器忽略它,例如当您执行维护任务时,如服务器升级或配置更改。

_hidden标签被设置为true,这将指示MySQL路由器从客户端应用程序的可能目的地列表中排除该实例。实例保持在线,但没有路由到新的传入连接。的_disconnect_existing_sessions_when_hidden标记控制如何关闭到实例的现有连接。这个标记被假设为真,它指示任何在InnoDB Cluster或InnoDB ReplicaSet上引导的MySQL路由器断开与实例的任何现有连接_hiddenTag是真的。当_disconnect_existing_sessions_when_hidden为false,则到实例的任何现有客户端连接未关闭,如果_hidden是真的。保留_hidden而且_disconnect_existing_sessions_when_hidden标签是特定于实例的,不能在集群级别使用。

警告

use_gr_notificationsMySQL路由器选项已启用,默认为60秒。这意味着当你设置标签时,MySQL路由器需要60秒的时间来检测变化。要减少等待时间,请更改use_gr_notifications到一个更低的值。

例如,假设您想删除ic-1实例,它是分配给InnoDB集群的一部分myCluster从路由目的地。使用setInstanceOption ()操作,以启用_hidden而且_disconnect_existing_sessions_when_hidden标签:

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

您可以通过检查选项来验证元数据中的更改。例如,对ic-1将在选项中显示为:

mysql-js > myCluster.options(){“集群”:{“名称”:“test1”、“标签”:{“ic-1:3306”:[{“选项”:“_disconnect_existing_sessions_when_hidden”,“价值”:真正的},{“选项”:“_hidden”,“价值”:真正}],“ic-2:3306”:[],“ic-3:3306”:[],“全球 ": [] } } }

您可以通过查看日志文件来验证MySQL Router是否检测到了元数据中的变化。检测到更改的MySQL路由器ic-1将显示如下更改:

2020-07-03 16:32:16 metadata_cache INFO [7fa9d164c700]元数据刷新后检测到集群“testCluster”的潜在变化(3个成员)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_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

要使实例重新联机,请使用setInstanceOption ()操作删除标签,MySQL路由器自动将实例添加回路由目的地,并且它对应用程序在线。例如:

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

通过再次检查选项来验证元数据中的更改:

mysql-js > myCluster.options(){“集群”:{“名称”:“test1”、“标签”:{“ic-1:3306”:[{“选项”:“_disconnect_existing_sessions_when_hidden”,“价值”:真正的},{“选项”:“_hidden”,“价值”:假}],“ic-2:3306”:[],“ic-3:3306”:[],“全球 ": [] } } }

设置集群标签

集群.setOption (选项价值操作,修改整个集群的某个命名空间选项的值。的选项参数必须是格式为名称空间选项.的价值参数是要赋值的值选项在指定的名称空间.如果值为,选项从指定的名称空间.对于集群,setOption ()操作接受标签名称空间。任何其他名称空间都会导致ArgumentError

提示

在集群级别设置的标记不会覆盖在实例级别设置的标记。你不能使用集群.setOption ()删除在实例级设置的所有标记。

不要求所有实例都在线,只要求集群具有仲裁。标记分配到的InnoDB集群myCluster位置标签设置为美国东部,问题:

mysql-js > myCluster。setOption(“标签:位置”、“东”)mysql-js > myCluster.options(){“集群”:{“名称”:“test1”,“标签”:{“ic-1:3306”:[],“ic-2:3306”:[],“ic-3:3306”:[],“全球”:[{“选项”:“位置:”,“价值”:“美国东部 " } ] } } }

用户自定义标签

AdminAPI支持标签您可以将信息存储在与给定Cluster、ReplicaSet或实例关联的键-值对中。下面的选项标签命名空间是不受约束的,这意味着你可以标记任何信息,只要它是一个有效的MySQL ASCII标识符。您可以为标记使用任何名称和值,只要名称遵循以下语法:_或字母后跟字母数字和_字符。

名称空间选项是一个冒号分隔的字符串,格式为名称空间:选项,在那里名称空间命名空间的名称和选项实际的选项名称。您可以在实例级别,或者在Cluster或ReplicaSet级别设置和删除标记。

标签名可以有任何值,只要它以字母或下划线开头,后面可选跟着字母数字和_比如字符,^ [a-zA-Z_] [0-9a-zA-Z_] *.只有内置标签才允许以下划线开头_的性格。

如何使用自定义标记取决于您自己。您可以在Cluster上设置自定义标记来标记它正在运行的区域。例如,您可以在集群上设置一个名为location的自定义标记,其值为EMEA。