OpsCenter 无法识别同一网络中的 Cassandra 节点
OpsCenter cannot recognize Cassandra nodes in the same network
我正在试验 Datestax OpsCenter 5.2 和 Cassandra 2.1.7。我遇到的一个麻烦是 OpsCenter 守护程序(即服务器)似乎尝试使用 broadcast_rpc_address
连接到 Cassandra 代理,但被安全组阻止了(因为 broadcast_rpc_address
是 public AWS 上的 IP)。
详情
集群有3个节点(10.0.0.0/24是AWS上VPC的子网,52.x.x.x是publicIP)
节点 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
症状
将“10.0.0.100、10.0.0.101、10.0.0.102”添加到 OpsCenter Web 控制台上的 "Add Cluster" window 后,我在 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
?
问题二
如果我将 broadcast_rpc_address
更改为子网 IP,则 OpsCenter 连接正常。但这会阻止我的客户端连接,因为非种子节点会将其子网 IP 由种子节点报告给客户端,客户端无法访问。
我也可以把安全组开放给OpsCenter服务器,但是有风险,需要通过网关
那么这种情况应该怎么解决呢?
想法
这个问题的核心是如何"intelligently"根据客户端是在子网内部还是外部来决定连接到哪个IP。我看到的所有文档都没有说明这是如何工作的。
感谢您的帮助。
加法 1
如果您也能说明客户端和 OpsCenter 如何使用 rpc(thrift) 和 native(binary) 协议,将不胜感激。
我的印象是不推荐使用 rpc,取而代之的是本机协议,但这会影响节点间和客户端节点连接吗?
Question 1
Is this the correct behavior of OpsCenter? Why agent_rpc_broadcast_address is not used?
现在是。 OpsCenter(通过底层 python 驱动程序)从 Cassandra 本身获取 rpc 地址,因此它获取无法访问的 broadcast_rpc_address
的值。 agent_rpc_broadcast_address
用于连接到代理,而不是 Cassandra 节点本身。
我不确定为什么要阻止从同一子网(甚至是同一安全组?)访问广播地址,同时还允许从子网外部访问它。
Would be grateful if you could also clarify how rpc(thrift) and native(binary) protocol are used by client and OpsCenter.
从 5.2 开始,OpsCenter 不使用 thrift 与 Cassandra 通信,opscenterd 依赖本机协议,代理依赖本机协议 + jmx。
我正在试验 Datestax OpsCenter 5.2 和 Cassandra 2.1.7。我遇到的一个麻烦是 OpsCenter 守护程序(即服务器)似乎尝试使用 broadcast_rpc_address
连接到 Cassandra 代理,但被安全组阻止了(因为 broadcast_rpc_address
是 public AWS 上的 IP)。
详情
集群有3个节点(10.0.0.0/24是AWS上VPC的子网,52.x.x.x是publicIP)
节点 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
症状
将“10.0.0.100、10.0.0.101、10.0.0.102”添加到 OpsCenter Web 控制台上的 "Add Cluster" window 后,我在 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
?
问题二
如果我将 broadcast_rpc_address
更改为子网 IP,则 OpsCenter 连接正常。但这会阻止我的客户端连接,因为非种子节点会将其子网 IP 由种子节点报告给客户端,客户端无法访问。
我也可以把安全组开放给OpsCenter服务器,但是有风险,需要通过网关
那么这种情况应该怎么解决呢?
想法
这个问题的核心是如何"intelligently"根据客户端是在子网内部还是外部来决定连接到哪个IP。我看到的所有文档都没有说明这是如何工作的。
感谢您的帮助。
加法 1
如果您也能说明客户端和 OpsCenter 如何使用 rpc(thrift) 和 native(binary) 协议,将不胜感激。
我的印象是不推荐使用 rpc,取而代之的是本机协议,但这会影响节点间和客户端节点连接吗?
Question 1
Is this the correct behavior of OpsCenter? Why agent_rpc_broadcast_address is not used?
现在是。 OpsCenter(通过底层 python 驱动程序)从 Cassandra 本身获取 rpc 地址,因此它获取无法访问的 broadcast_rpc_address
的值。 agent_rpc_broadcast_address
用于连接到代理,而不是 Cassandra 节点本身。
我不确定为什么要阻止从同一子网(甚至是同一安全组?)访问广播地址,同时还允许从子网外部访问它。
Would be grateful if you could also clarify how rpc(thrift) and native(binary) protocol are used by client and OpsCenter.
从 5.2 开始,OpsCenter 不使用 thrift 与 Cassandra 通信,opscenterd 依赖本机协议,代理依赖本机协议 + jmx。