MarkLogic:无法更新主机名 - 等待重试

时间:2017-03-03 22:38:57

标签: marklogic amazon-cloudformation

我在3节点集群中使用了云形态模板,并在AWS中测试了DR的AZ故障。

我做的是:

  1. 成功创建了3个节点集群(Master +2 slave),
  2. 终止ASG与Master(ELB下的实例进入OutOfService状态,这很好)和Master正在使用的EBS
  3. 与Master&创建了ASG EBS在另一个AZ(结果:Master重新上线,ELB回来了,网站又回来了但是奴隶永远不会离开OutOfService状态)
  4. 我用slave2&删除了ASG它的EBS。重新创建的ASG& EBS但Slave实例抱怨这些消息:
  5.   

    3月3日16:31:30 ip-10-58-3-36 MarkLogic:原始主机名ip-10-58-3-68.us-west-1.compute.internal与我们的新主机名不匹配IP-10-58-3-36.us - 西1.compute.internal   3月3日16:31:30 ip-10-58-3-36 MarkLogic:[/opt/MarkLogic/mlcmd/scripts/initialize-node.xsh line:52]   3月3日16:31:31 ip-10-58-3-36 MarkLogic:没有群集主机在线 - 尝试其他主机   3月3日16:31:31 ip-10-58-3-36 MarkLogic:[/opt/MarkLogic/mlcmd/scripts/initialize-node.xsh line:56]   3月3日16:31:31 ip-10-58-3-36 MarkLogic:没有在线的已知主机   3月3日16:31:31 ip-10-58-3-36 MarkLogic:[/opt/MarkLogic/mlcmd/scripts/initialize-node.xsh line:59]   3月3日16:31:31 ip-10-58-3-36 MarkLogic:无法更新主机名 - 等待重试   3月3日16:31:31 ip-10-58-3-36 MarkLogic:[/opt/MarkLogic/mlcmd/scripts/initialize-node.xsh line:153]   3月3日16:31:31 ip-10-58-3-36 MarkLogic:睡眠14秒   3月3日16:31:31 ip-10-58-3-36 MarkLogic:[/opt/MarkLogic/mlcmd/scripts/initialize-node.xsh line:154]

    我滚动浏览/ var / log / messages并看到:

      

    3月3日15:05:05 ip-10-58-3-36 MarkLogic:MARKLOGIC_INSTANCE:INSTANCE:i- MDM_NODE_NAME:MARKLOGIC_NODE_NAME:NodeB#MARKLOGIC_ZONE: us-west-1a ZONE:us -West-1B

    MARKLOGIC_ZONE 参数指向错误的区域。

    我的问题是:为什么这个参数在这里错了?这是软件中的错误吗?

    我尝试通过user_data更新此参数,但仍然没有骰子。

    我很想知道其他人是如何解决这个问题的,因为看起来这个群集看起来并不自愈。

    另一件事是如果我杀死Master(停止服务/停止ec2),那么整个群集都不可用。是否可以设定,所以奴隶可以提升自己成为师父?

    我正在使用MarkLogic 8.0-6

1 个答案:

答案 0 :(得分:3)

如果您手动修改模板中创建的资源,则会遇到很大问题。参数“错误”,很可能是因为:

  

用Master&创建了ASG EBS在另一个AZ

AWS CF模板'管理'他们创建的所有资源,删除和创建新资源都会导致内部问题,您应该更新'模板,以便Cloud Formation了解正在发生的事情并处理(如果可能)所有依赖项。

托管群集功能本身无法以任何方式识别CF模板(您可以在不使用CF的情况下运行托管群集)。 它在启动时由环境变量配置,然后在DynamoDB中保留长期状态,以便它可以在任何或所有EC2实例终止后生存。初始状态需要在其生命周期内与动态状态保持一致。一旦新实例第一次运行,状态初始配置将缓存在根卷中,以确保它在该EC2实例的生命周期内不会更改。 使用示例模板时,这些作为用户数据传入。 从ASG开始的EC2实例需要"启动配置"提供用户数据。这是在模板中设置的。如果删除ASG(或启动配置) - 并创建一个新的 - 不仅CF会感到困惑,而且除非您非常仔细地配置启动配置和用户数据,否则启动的节点将被错误配置 - - 最好。一旦新实例第一次运行,状态初始配置将缓存在根卷中,以确保它在该EC2实例的生命周期内不会更改。

这就是您所看到的:由于在不同区域中创建ASG但从原始区域获取配置,节点从错误区域获取配置。要做这种手术需要深入了解整个过程和体系结构,即使这样也不太可能成功,因为它的设计不是以这种方式改变配置。

按照您期望的方式设计为容错,但由于EBS的限制,它有点复杂 - EBS卷不跨越区域, 因此,在新区域中启动ML实例将无法直接使用另一个EBS卷。相反,您需要首先跨区域复制林,然后如果存在区域故障,则其他节点将具有副本并且群集仍然存在。如果您需要更多节点,则修改"每个区域的实例"通过CF更新。这将在可用区域中生成新实例,并且它们将加入群集。托管群集功能仅适用于群集连接'水平。您需要自己管理数据(林,卷等)重新平衡(通过REST API,手动或其他过程)。

一般情况下 - *托管群集功能的架构旨在通过EC2实例终止来实现。如果出现问题,解决问题的最佳方法是让实例死掉,新的实例取而代之。

  • 不对资源进行任何更改'您没有手动创建,而是更新CF堆栈。你无法移植'资源。相反,您可以创建新的,迁移数据并淘汰旧的。

  • 复制所有关键数据,以便一个区域故障不会将其隔离,例如,所有节点都必须始终可以访问安全数据库。 通过复制,群集可以在所有区域失效时生存,并在任何区域启动时重新启动。你只需要让它。

  • 使用工作,而不是针对他们的ASG。阅读有关暂停ASG流程的各种方法,以便您可以拯救'如果需要服务器而不会被杀死。如果需要更多,则增加节点数。

  • ASG配置为每个群集每个区域一个。