zoukankan      html  css  js  c++  java
  • 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,这样可以完全解决这个问题。

  • 相关阅读:
    deque源码2(deque迭代器、deque的数据结构)
    layui 使用随记
    SQL Server 跨服务器、跨版本使用复制 (2008、2012)
    SQLServer 跨服务器链接 Access数据库
    asp.net发布后其他电脑部署——未能加载文件或程序集 System.Web.Mvc, Version=2.0.0.0, Culture=neutral,
    JQuery 遍历table中的checkbox 并对行数据进行校验
    sql 动态行转列 (2005及以上版本)
    JS读取xml
    MVC 创建Controllers 发生 EntityType has no key defined error
    C# 去除数字中多于的0
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/10629272.html
Copyright © 2011-2022 走看看