• orchestrator HTTP接口forget-cluster误下线集群问题


    orchestrator 提供了"forget-cluster"HTTP接口用于下线集群。该接口可以根据提供的参数,推测可能的集群名cluster name,然后使用cluster name下线集群。其中cluster name在orchestrator的格式是集群主库的hostname和port的组合:hostname:port。例如,一个集群主库的hostname为waimai-mysql-001,port为3308,则集群的cluster name为waimai-mysql-001:3308

    该接口推测cluster name的设计,是为了方便使用,用户可以只提供一个简短的参数,就可以下线集群。
    但这样设计也存在一定隐患的。

    先来看下"forget-cluster"的推测集群名cluster name的过程。

    推测cluster name

    假设用户提供的参数是clusterHint。cluster name查找过程如下:

    • 判断clusterHint是不是cluster name,如果是,直接返回这个cluster name,否则,继续;
    • 判断clusterHint是不是集群别名cluster alias,如果是,进而得到cluster name并返回,否则,继续;
    • 判断clusterHint是不是包含DB实例的hostname,如果是,进而得到cluster name并返回,否则,继续;
    • 判断clusterHint是不是包含DB实例hostname的一部分,如果是,进而得到cluster name并返回,否则,返回错误。

    存在的问题

    从上面cluster name的推测过程看,如果用户提供的参数clusterHint是某个集群A的cluster alias,同时又是集群B中的DB实例的hostname或者hostname的一部分,当集群A已下线的情况下,调用"forget-cluster"接口,就会将集群B下线,但这是超出预期的。

    例如,

    集群 集群别名 DB实例
    A test waimai-mysql-test
    B hotel hotel-mysql-test

    解决方案

    方案一

    尽量不使用cluster alias作为参数,而是使用cluster name,可以在一定程度上避免这个问题。但不能完全解决这个问题。

    方案二

    新增加一个接口,严格限制参数是cluster name或cluster alias,这样可以完全解决这个问题。

  • 相关阅读:
    Excel 如何在程序运行期间提示信息“正在运行中。。。请稍候 38云淡淡
    EXT学习笔记第一课
    java学习日志1
    C语言基础知识
    js所学知识点
    javascript 取最大值和最小值!
    html常用标签
    javascript4位随机数(字体都有颜色)
    marginpadding区别及bug
    数独的优化回朔算法(四)
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/10629272.html
Copyright © 2020-2023  润新知