【问题标题】:OpsCenter cannot recognize Cassandra nodes in the same networkOpsCenter 无法识别同一网络中的 Cassandra 节点
【发布时间】:2015-11-30 13:07:02
【问题描述】:

我正在试验 Datestax OpsCenter 5.2 和 Cassandra 2.1.7。我遇到的一个问题是 OpsCenter 守护程序(即服务器)似乎试图使用 broadcast_rpc_address 连接到 Cassandra 代理,该安全组已阻止(因为 broadcast_rpc_address 是 AWS 上的公共 IP)。

详情

集群有3个节点(10.0.0.0/24是AWS上VPC的子网,52.x.x.x是公网IP)

节点0

cassandra.yaml:broadcast_address=10.0.0.100,rpc_address=10.0.0.100,broadcast_rpc_address=52.2.3.100

address.yaml: stomp_interface=10.0.0.99, local_interface=10.0.0.100, agent_rpc_broadcast_address=10.0.0.100

节点1

cassandra.yaml:broadcast_address=10.0.0.101,rpc_address=10.0.0.101,broadcast_rpc_address=52.2.3.101

address.yaml: stomp_interface=10.0.0.99, local_interface=10.0.0.101, agent_rpc_broadcast_address=10.0.0.101

节点2

cassandra.yaml:broadcast_address=10.0.0.102,rpc_address=10.0.0.102,broadcast_rpc_address=52.2.3.102

address.yaml: stomp_interface=10.0.0.99, local_interface=10.0.0.102, agent_rpc_broadcast_address=10.0.0.102

OpsCenter 节点

部署在同一个子网

ip=10.0.0.99

症状

在 OpsCenter Web 控制台的“添加集群”窗口中添加“10.0.0.100, 10.0.0.101, 10.0.0.102”后,我在opscenterd.log 中得到以下信息:

2015-09-04 11:05:38+0000 []  INFO: New Cassandra host 52.2.3.100 discovered
2015-09-04 11:05:38+0000 []  INFO: New Cassandra host 52.2.3.101 discovered
...
2015-09-04 11:05:43+0000 []  WARN: [control connection] Error connecting to 52.2.3.100: errors=Timed out creating connection, last_host=None
2015-09-04 11:05:43+0000 [] ERROR: Control connection failed to connect, shutting down Cluster: ('Unable to connect to any servers', {'52.2.3.100': OperationTimedOut('errors=Timed out creating connection, last_host=None',)})

注意 OpsCenter 会尝试通过其 broadcast_rpc_address 连接到节点,但已被安全组阻止。尽管我已将 agent_rpc_broadcast_address 设置为子网 IP。

问题 1

这是 OpsCenter 的正确行为吗?为什么不使用agent_rpc_broadcast_address

问题 2

如果我将 broadcast_rpc_address 更改为子网 IP,则 OpsCenter 连接正常。但这会阻止我的客户端连接,因为非种子节点的子网 IP 将由种子节点报告给客户端,客户端无法访问。

我也可以向 OpsCenter 服务器开放安全组,但这样做有风险,需要通过网关。

那么在这种情况下我应该如何解决这个问题呢?

想法

这个问题的核心是如何根据客户端是在子网内部还是外部来“智能”地决定连接哪个IP。我看到的所有文档都没有说明这是如何工作的。

感谢您的帮助。

加法1

如果您能阐明客户端和 OpsCenter 如何使用 rpc(thrift) 和 native(binary) 协议,我们将不胜感激。

我的印象是 rpc 已被弃用以支持本机协议,但这会影响节点间和客户端节点连接吗?

【问题讨论】:

  • 注释掉broadcast_rpc_address,它可能会工作
  • @LHWizard,评论 broadcast_rpc_address 将导致客户端尝试连接到子网 IP(对于任何非种子节点)。对于不在子网中的客户端,这将失败。
  • 我的目的是让 a) 同一子网中的 OpsCenter 和 b) 子网外的客户端都工作。
  • 您可以尝试将 rpc_address 设置为 0.0.0.0
  • 您在问题 2 中的陈述也是错误的。种子不会向客户端报告 IP 地址。

标签: cassandra cassandra-2.0 datastax datastax-java-driver opscenter


【解决方案1】:

问题 1

这是 OpsCenter 的正确行为吗?为什么不使用agent_rpc_broadcast_address?

就在此刻。 OpsCenter(通过底层 python 驱动程序)从 Cassandra 本身获取 rpc 地址,因此它获取的值是 broadcast_rpc_address,这是无法访问的。 agent_rpc_broadcast_address 用于连接代理,而不是 Cassandra 节点本身。

我不知道您为什么要阻止从同一子网(甚至同一安全组?)访问广播地址,同时还允许从子网外部访问它。

如果您能阐明客户端和 OpsCenter 如何使用 rpc(thrift) 和 native(binary) 协议,我们将不胜感激。

从 5.2 开始,OpsCenter 不再使用 thrift 与 Cassandra 通信,依赖于 opscenterd 的本机协议和代理的本机协议 + jmx。

【讨论】:

  • 访问广播地址被阻止,因为网关路由请求,将源IP伪装成公共IP,被安全组阻止(公共IP是动态分配的,所以我不能轻易白名单)。如果它连接到私有IP,一切都会好起来的。
  • 这是否意味着客户端有静态地址?您如何将您的应用列入白名单?
  • 应用程序在另一个网络中,其网关被列入白名单。看起来我可能应该将 OpsCenter 部署到该网络而不是 Cassandra 网络。
猜你喜欢
  • 2014-03-08
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2016-06-16
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多