Paulo Motta commented on CASSANDRA-12673:

It seems the hidden {{cassandra.yaml}} property {{outboundBindAny}} was added 
on CASSANDRA-3839 to avoid problems on streaming due to the use of 
{{socket.getRemoteSocketAddress()}} to identify the remote peer:

bq. allowing override might be better in this case. Because if we change this, 
cassandra's stream might get confused in some cases... in the constructor of 
IncomingStreamReader, as we do socket.getRemoteSocketAddress() to see where the 
stream comes from. if we dont bind it to the right address there may be some 
edge cases where it might not work. 

Since the new streaming protocol no longer uses 
{{socket.getRemoteSocketAddress()}} to identify the peer, I don't see a reason 
to keep that option. A simple workaround for the time being is to basically set 
{{outboundBindAny: true}} on {{cassandra.yaml}}, but moving forward on trunk I 
think we can remove this option since it will probably cause problems for folks 
using multiple network cards/dual stacks. WDYT [~brandon.williams], [~yukim]?

> Nodes cannot see each other in multi-DC, non-EC2 environment with 
> two-interface nodes due to outbound node-to-node connection binding to 
> private interface
> ----------------------------------------------------------------------------------------------------------------------------------------------------------
>                 Key: CASSANDRA-12673
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12673
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: Core
>         Environment: Multi-DC, non-EC2 environment with two-interface nodes
>            Reporter: Milan Majercik
>            Priority: Minor
> We have a two-DC cluster in non-EC2 environment with each node containing two 
> interfaces, one using private addresses for intra-DC communication and the 
> other using public addresses for inter-DC communication. After proper 
> configuration setup needed for this kind of environment we observed nodes 
> cannot see each other.
> The configuration changes made for this purpose are as follows:
> *listen_address*: bound to private interface
> *broadcast_address*: bound to public address
> *listen_on_broadcast_address*: true
> *endpoint_snitch*: GossipingPropertyFileSnitch
> *prefer_local*=true (in cassandra-rackdc.properties)
> Upon restart, cassandra node contacts other nodes with their public addresses 
> which is essential for making contacts to foreign data centers. After 
> exhaustive investigation we found cassandra binds outbound node-to-node 
> connections to private interface (the one specified in listen_address) that 
> poses a problem for our environment as these data centers _do not allow 
> connections from private interface to public network_.
> A portion of cassandra code responsible for local binding of outbound 
> connections can be found in method 
> {{org.apache.cassandra.net.OutboundTcpConnectionPool.newSocket}}:
> {code}
>             if (!Config.getOutboundBindAny())
>                 channel.bind(new 
> InetSocketAddress(FBUtilities.getLocalAddress(), 0));
> {code}
> After we commented out these two lines and deployed cassandra.jar across the 
> cluster, the nodes were able to see each other and everything appears to be 
> working fine, including two-DC setup.
> Do you think it's possible to remove these two lines without negative 
> consequences? Alternatively, if the local binding serves some specific 
> purpose of which I'm ignorant would it be possible to make it configurable?

This message was sent by Atlassian JIRA

Reply via email to