作者:MiguelAraújo 译:徐轶韬
MySQL Router是InnoDB Cluster / ReplicaSet的核心组件,可将客户端流量自动路由到数据库组中的正确实例。MySQL Router可以自动适应拓扑更改,但在某些情况下,我们可以使用特定属性标记一个实例,这个属性将更改路由器的默认行为。
在8.0.21版本中,我们在AdminAPI引入了标记框架,通过它我们能够引入非常需要的功能:
隐藏MySQL InnoDB Cluster / ReplicaSet实例
为什么要隐藏实例?
暂时将实例标记为无法接收流量这一功能非常重要,因为它可以:
在服务器上执行滚动升级而不会中断传入流量
在服务器上执行维护操作或配置更改,而不必停止MySQL
将服务器从滞后的客户端工作负载中排除
排除出于灾难恢复目的而位于不同区域/区域中的数据库服务器
在进行备份或生成报告时,从读取的工作负载中排除SECONDARY服务器,以避免影响其他查询。
升级/维护
执行MySQL的滚动升级需要使脱机实例。但必须注意,可能会产生与该实例的连接失败。从路由目标候选列表中排除该实例后,DBA可以安全地使服务器脱机,并确保没有应用程序/路由器流量发送到该服务器。
根据维护任务的不同,甚至可能不需要使服务器脱机。在这之前,这意味着停止组复制或MySQL本身,以避免破坏可能影响性能的传入流量。而现在通过从路由候选中隐藏该实例,可以完全避免这种情况。
复制滞后
考虑到InnoDB ReplicaSet基于异步复制,复制滞后是要考虑的常见因素。如果某个实例滞后,DBA可能希望对应用程序隐藏它,直到它赶上来为止,从而减少了复制滞后。这同样适用于InnoDB Cluster,尽管组复制实际上是同步的,并且复制滞后的度量方式有所不同。
灾难恢复和备份
更复杂的体系结构包括用于备份或灾难恢复的服务器。这些服务器不应承担任何工作负载,或者应在执行备份时暂时从客户端流量中排除这些服务器。
现在可以通过将这些服务器从路由候选列表中排除来实现。
注意:Secondary2用于进行备份,因此DBA将其从传入的客户端连接中排除
数据报表
在特定实例上生成数据报表可能会非常耗时,并且会影响实例的性能。因此,推荐的方法是将该服务器从路由候选列表中排除。
如何将服务器从候选列表中排除呢?
MySQL Router不断地对配置更改汇集元数据,因此使用标记框架无疑是允许此类自定义的正确方法。
借助AdminAPI及其易用性,用户现在可以通过简单地调用.setInstanceOption()来为实例设置标签。
为了从客户端流量中隐藏实例,我们引入了两个“内置”标签,使您可以立即更改路由器的行为:
_hidden
_disconnect_existing_sessions_when_hidden
通过_hidden在特定实例上启用标签,您可以指示MySQL Router 将实例从客户端应用程序的候选目标列表中排除。考虑到MySQL路由器不断轮询元数据,其效果实际上是立竿见影的。
通过_disconnect_existing_sessions_when_hidden在特定实例上启用标签,您可以指示路由器断开与标记为隐藏的实例的连接。
注意:默认情况下_disconnect_existing_sessions_when_hidden为启用。
结论
对于MySQL InnoDB Cluster和ReplicaSet的任何生产部署,隐藏实例无疑是一项重要功能。它可以执行许多繁琐的任务,而又不会中断客户端的流量,最重要的是,可以进行更复杂的设置。