Skip to content

Commit cb73fb0

Browse files
authored
Backport remote proxy mode stats and naming (#50402)
* Update remote cluster stats to support simple mode (#49961) Remote cluster stats API currently only returns useful information if the strategy in use is the SNIFF mode. This PR modifies the API to provide relevant information if the user is in the SIMPLE mode. This information is the configured addresses, max socket connections, and open socket connections. * Send hostname in SNI header in simple remote mode (#50247) Currently an intermediate proxy must route conncctions to the appropriate remote cluster when using simple mode. This commit offers a additional mechanism for the proxy to route the connections by including the hostname in the TLS SNI header. * Rename the remote connection mode simple to proxy (#50291) This commit renames the simple connection mode to the proxy connection mode for remote cluster connections. In order to do this, the mode specific settings which we namespaced by their mode (ex: sniff.seed and proxy.addresses) have been reverted. * Modify proxy mode to support a single address (#50391) Currently, the remote proxy connection mode uses a list setting for the proxy address. This commit modifies this so that the setting is proxy_address and only supports a single remote proxy address.
1 parent 8788523 commit cb73fb0

File tree

29 files changed

+728
-517
lines changed

29 files changed

+728
-517
lines changed

client/rest-high-level/src/test/java/org/elasticsearch/client/CCRIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void setupRemoteClusterConfig() throws Exception {
8383
String transportAddress = (String) nodesResponse.get("transport_address");
8484

8585
ClusterUpdateSettingsRequest updateSettingsRequest = new ClusterUpdateSettingsRequest();
86-
updateSettingsRequest.transientSettings(Collections.singletonMap("cluster.remote.local_cluster.sniff.seeds", transportAddress));
86+
updateSettingsRequest.transientSettings(Collections.singletonMap("cluster.remote.local_cluster.seeds", transportAddress));
8787
ClusterUpdateSettingsResponse updateSettingsResponse =
8888
highLevelClient().cluster().putSettings(updateSettingsRequest, RequestOptions.DEFAULT);
8989
assertThat(updateSettingsResponse.isAcknowledged(), is(true));

client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CCRDocumentationIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void setupRemoteClusterConfig() throws IOException {
8787
String transportAddress = (String) nodesResponse.get("transport_address");
8888

8989
ClusterUpdateSettingsRequest updateSettingsRequest = new ClusterUpdateSettingsRequest();
90-
updateSettingsRequest.transientSettings(Collections.singletonMap("cluster.remote.local.sniff.seeds", transportAddress));
90+
updateSettingsRequest.transientSettings(Collections.singletonMap("cluster.remote.local.seeds", transportAddress));
9191
ClusterUpdateSettingsResponse updateSettingsResponse =
9292
client.cluster().putSettings(updateSettingsRequest, RequestOptions.DEFAULT);
9393
assertThat(updateSettingsResponse.isAcknowledged(), is(true));

docs/reference/ccr/getting-started.asciidoc

+3-2
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ remote cluster.
135135
"num_nodes_connected" : 1, <2>
136136
"max_connections_per_cluster" : 3,
137137
"initial_connect_timeout" : "30s",
138-
"skip_unavailable" : false
138+
"skip_unavailable" : false,
139+
"mode" : "sniff"
139140
}
140141
}
141142
--------------------------------------------------
@@ -146,7 +147,7 @@ remote cluster.
146147
alias `leader`
147148
<2> This shows the number of nodes in the remote cluster the local cluster is
148149
connected to.
149-
150+
150151
Alternatively, you can manage remote clusters on the
151152
*Management / Elasticsearch / Remote Clusters* page in {kib}:
152153

qa/ccs-unavailable-clusters/src/test/java/org/elasticsearch/search/CrossClusterSearchUnavailableClusterIT.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public void testSearchSkipUnavailable() throws IOException {
144144
try (MockTransportService remoteTransport = startTransport("node0", new CopyOnWriteArrayList<>(), Version.CURRENT, threadPool)) {
145145
DiscoveryNode remoteNode = remoteTransport.getLocalDiscoNode();
146146

147-
updateRemoteClusterSettings(Collections.singletonMap("sniff.seeds", remoteNode.getAddress().toString()));
147+
updateRemoteClusterSettings(Collections.singletonMap("seeds", remoteNode.getAddress().toString()));
148148

149149
for (int i = 0; i < 10; i++) {
150150
restHighLevelClient.index(
@@ -229,7 +229,7 @@ public void testSearchSkipUnavailable() throws IOException {
229229
assertSearchConnectFailure();
230230

231231
Map<String, Object> map = new HashMap<>();
232-
map.put("sniff.seeds", null);
232+
map.put("seeds", null);
233233
map.put("skip_unavailable", null);
234234
updateRemoteClusterSettings(map);
235235
}
@@ -248,32 +248,32 @@ public void testSkipUnavailableDependsOnSeeds() throws IOException {
248248
() -> client().performRequest(request));
249249
assertEquals(400, responseException.getResponse().getStatusLine().getStatusCode());
250250
assertThat(responseException.getMessage(),
251-
containsString("missing required setting [cluster.remote.remote1.sniff.seeds] " +
251+
containsString("missing required setting [cluster.remote.remote1.seeds] " +
252252
"for setting [cluster.remote.remote1.skip_unavailable]"));
253253
}
254254

255255
Map<String, Object> settingsMap = new HashMap<>();
256-
settingsMap.put("sniff.seeds", remoteNode.getAddress().toString());
256+
settingsMap.put("seeds", remoteNode.getAddress().toString());
257257
settingsMap.put("skip_unavailable", randomBoolean());
258258
updateRemoteClusterSettings(settingsMap);
259259

260260
{
261261
//check that seeds cannot be reset alone if skip_unavailable is set
262262
Request request = new Request("PUT", "/_cluster/settings");
263-
request.setEntity(buildUpdateSettingsRequestBody(Collections.singletonMap("sniff.seeds", null)));
263+
request.setEntity(buildUpdateSettingsRequestBody(Collections.singletonMap("seeds", null)));
264264
ResponseException responseException = expectThrows(ResponseException.class,
265265
() -> client().performRequest(request));
266266
assertEquals(400, responseException.getResponse().getStatusLine().getStatusCode());
267-
assertThat(responseException.getMessage(), containsString("missing required setting [cluster.remote.remote1.sniff.seeds] " +
267+
assertThat(responseException.getMessage(), containsString("missing required setting [cluster.remote.remote1.seeds] " +
268268
"for setting [cluster.remote.remote1.skip_unavailable]"));
269269
}
270270

271271
if (randomBoolean()) {
272272
updateRemoteClusterSettings(Collections.singletonMap("skip_unavailable", null));
273-
updateRemoteClusterSettings(Collections.singletonMap("sniff.seeds", null));
273+
updateRemoteClusterSettings(Collections.singletonMap("seeds", null));
274274
} else {
275275
Map<String, Object> nullMap = new HashMap<>();
276-
nullMap.put("sniff.seeds", null);
276+
nullMap.put("seeds", null);
277277
nullMap.put("skip_unavailable", null);
278278
updateRemoteClusterSettings(nullMap);
279279
}

qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartSettingsUpgradeIT.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,10 @@ public void testRemoteClusterSettingsUpgraded() throws IOException {
9292
RemoteClusterService.REMOTE_CLUSTER_SKIP_UNAVAILABLE.getConcreteSettingForNamespace("foo").exists(settings));
9393
assertTrue(RemoteClusterService.REMOTE_CLUSTER_SKIP_UNAVAILABLE.getConcreteSettingForNamespace("foo").get(settings));
9494
assertFalse(SEARCH_REMOTE_CLUSTERS_SEEDS.getConcreteSettingForNamespace("foo").exists(settings));
95-
assertTrue(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS_OLD.getConcreteSettingForNamespace("foo").exists(settings));
96-
assertFalse(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace("foo").exists(settings));
97-
assertTrue(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace("foo")
98-
.existsOrFallbackExists(settings));
95+
assertTrue(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace("foo").exists(settings));
9996
assertThat(
10097
SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace("foo").get(settings),
10198
equalTo(Collections.singletonList("localhost:9200")));
102-
assertThat(
103-
SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS_OLD.getConcreteSettingForNamespace("foo").get(settings),
104-
equalTo(Collections.singletonList("localhost:9200")));
10599
}
106100
}
107101
}
+42-42
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
"Add transient remote cluster in simple mode with invalid sniff settings":
2+
"Add transient remote cluster in proxy mode with invalid sniff settings":
33
- do:
44
cluster.get_settings:
55
include_defaults: true
@@ -12,32 +12,32 @@
1212
flat_settings: true
1313
body:
1414
transient:
15-
cluster.remote.test_remote_cluster.mode: "simple"
16-
cluster.remote.test_remote_cluster.sniff.node_connections: "5"
17-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
15+
cluster.remote.test_remote_cluster.mode: "proxy"
16+
cluster.remote.test_remote_cluster.node_connections: "5"
17+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
1818

1919
- match: { status: 400 }
2020
- match: { error.root_cause.0.type: "illegal_argument_exception" }
21-
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.sniff.node_connections\" cannot be
22-
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=SIMPLE]" }
21+
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.node_connections\" cannot be
22+
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=PROXY]" }
2323

2424
- do:
2525
catch: bad_request
2626
cluster.put_settings:
2727
flat_settings: true
2828
body:
2929
transient:
30-
cluster.remote.test_remote_cluster.mode: "simple"
31-
cluster.remote.test_remote_cluster.sniff.seeds: $remote_ip
32-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
30+
cluster.remote.test_remote_cluster.mode: "proxy"
31+
cluster.remote.test_remote_cluster.seeds: $remote_ip
32+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
3333

3434
- match: { status: 400 }
3535
- match: { error.root_cause.0.type: "illegal_argument_exception" }
36-
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.sniff.seeds\" cannot be
37-
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=SIMPLE]" }
36+
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.seeds\" cannot be
37+
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=PROXY]" }
3838

3939
---
40-
"Add transient remote cluster in sniff mode with invalid simple settings":
40+
"Add transient remote cluster in sniff mode with invalid proxy settings":
4141
- do:
4242
cluster.get_settings:
4343
include_defaults: true
@@ -50,30 +50,30 @@
5050
flat_settings: true
5151
body:
5252
transient:
53-
cluster.remote.test_remote_cluster.simple.socket_connections: "20"
54-
cluster.remote.test_remote_cluster.sniff.seeds: $remote_ip
53+
cluster.remote.test_remote_cluster.proxy_socket_connections: "20"
54+
cluster.remote.test_remote_cluster.seeds: $remote_ip
5555

5656
- match: { status: 400 }
5757
- match: { error.root_cause.0.type: "illegal_argument_exception" }
58-
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.simple.socket_connections\" cannot be
59-
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SIMPLE, configured=SNIFF]" }
58+
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.proxy_socket_connections\" cannot be
59+
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=PROXY, configured=SNIFF]" }
6060

6161
- do:
6262
catch: bad_request
6363
cluster.put_settings:
6464
flat_settings: true
6565
body:
6666
transient:
67-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
68-
cluster.remote.test_remote_cluster.sniff.seeds: $remote_ip
67+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
68+
cluster.remote.test_remote_cluster.seeds: $remote_ip
6969

7070
- match: { status: 400 }
7171
- match: { error.root_cause.0.type: "illegal_argument_exception" }
72-
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.simple.addresses\" cannot be
73-
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SIMPLE, configured=SNIFF]" }
72+
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.proxy_address\" cannot be
73+
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=PROXY, configured=SNIFF]" }
7474

7575
---
76-
"Add transient remote cluster using simple connection mode using valid settings":
76+
"Add transient remote cluster using proxy connection mode using valid settings":
7777
- do:
7878
cluster.get_settings:
7979
include_defaults: true
@@ -85,13 +85,13 @@
8585
flat_settings: true
8686
body:
8787
transient:
88-
cluster.remote.test_remote_cluster.mode: "simple"
89-
cluster.remote.test_remote_cluster.simple.socket_connections: "3"
90-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
88+
cluster.remote.test_remote_cluster.mode: "proxy"
89+
cluster.remote.test_remote_cluster.proxy_socket_connections: "3"
90+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
9191

92-
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "simple"}
93-
- match: {transient.cluster\.remote\.test_remote_cluster\.simple\.socket_connections: "3"}
94-
- match: {transient.cluster\.remote\.test_remote_cluster\.simple\.addresses: $remote_ip}
92+
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "proxy"}
93+
- match: {transient.cluster\.remote\.test_remote_cluster\.proxy_socket_connections: "3"}
94+
- match: {transient.cluster\.remote\.test_remote_cluster\.proxy_address: $remote_ip}
9595

9696
- do:
9797
search:
@@ -120,12 +120,12 @@
120120
body:
121121
transient:
122122
cluster.remote.test_remote_cluster.mode: "sniff"
123-
cluster.remote.test_remote_cluster.sniff.node_connections: "3"
124-
cluster.remote.test_remote_cluster.sniff.seeds: $remote_ip
123+
cluster.remote.test_remote_cluster.node_connections: "3"
124+
cluster.remote.test_remote_cluster.seeds: $remote_ip
125125

126126
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "sniff"}
127-
- match: {transient.cluster\.remote\.test_remote_cluster\.sniff\.node_connections: "3"}
128-
- match: {transient.cluster\.remote\.test_remote_cluster\.sniff\.seeds: $remote_ip}
127+
- match: {transient.cluster\.remote\.test_remote_cluster\.node_connections: "3"}
128+
- match: {transient.cluster\.remote\.test_remote_cluster\.seeds: $remote_ip}
129129

130130
- do:
131131
search:
@@ -154,10 +154,10 @@
154154
body:
155155
transient:
156156
cluster.remote.test_remote_cluster.mode: "sniff"
157-
cluster.remote.test_remote_cluster.sniff.seeds: $remote_ip
157+
cluster.remote.test_remote_cluster.seeds: $remote_ip
158158

159159
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "sniff"}
160-
- match: {transient.cluster\.remote\.test_remote_cluster\.sniff\.seeds: $remote_ip}
160+
- match: {transient.cluster\.remote\.test_remote_cluster\.seeds: $remote_ip}
161161

162162
- do:
163163
search:
@@ -178,25 +178,25 @@
178178
flat_settings: true
179179
body:
180180
transient:
181-
cluster.remote.test_remote_cluster.mode: "simple"
182-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
181+
cluster.remote.test_remote_cluster.mode: "proxy"
182+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
183183

184184
- match: { status: 400 }
185185
- match: { error.root_cause.0.type: "illegal_argument_exception" }
186-
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.sniff.seeds\" cannot be
187-
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=SIMPLE]" }
186+
- match: { error.root_cause.0.reason: "Setting \"cluster.remote.test_remote_cluster.seeds\" cannot be
187+
used with the configured \"cluster.remote.test_remote_cluster.mode\" [required=SNIFF, configured=PROXY]" }
188188

189189
- do:
190190
cluster.put_settings:
191191
flat_settings: true
192192
body:
193193
transient:
194-
cluster.remote.test_remote_cluster.mode: "simple"
195-
cluster.remote.test_remote_cluster.sniff.seeds: null
196-
cluster.remote.test_remote_cluster.simple.addresses: $remote_ip
194+
cluster.remote.test_remote_cluster.mode: "proxy"
195+
cluster.remote.test_remote_cluster.seeds: null
196+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
197197

198-
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "simple"}
199-
- match: {transient.cluster\.remote\.test_remote_cluster\.simple\.addresses: $remote_ip}
198+
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "proxy"}
199+
- match: {transient.cluster\.remote\.test_remote_cluster\.proxy_address: $remote_ip}
200200

201201
- do:
202202
search:

qa/multi-cluster-search/src/test/resources/rest-api-spec/test/multi_cluster/20_info.yml

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
---
2-
"Fetch remote cluster info for existing cluster":
2+
"Fetch remote cluster sniff info for existing cluster":
33

44
- do:
55
cluster.remote_info: {}
66
- match: { my_remote_cluster.connected: true }
77
- match: { my_remote_cluster.num_nodes_connected: 1}
88
- match: { my_remote_cluster.max_connections_per_cluster: 1}
99
- match: { my_remote_cluster.initial_connect_timeout: "30s" }
10+
- match: { my_remote_cluster.mode: "sniff" }
1011

1112
---
1213
"Add transient remote cluster based on the preset cluster and check remote info":
@@ -21,9 +22,13 @@
2122
flat_settings: true
2223
body:
2324
transient:
25+
cluster.remote.test_remote_cluster.mode: "sniff"
26+
cluster.remote.test_remote_cluster.node_connections: "2"
2427
cluster.remote.test_remote_cluster.seeds: $remote_ip
2528

26-
- match: {transient: {cluster.remote.test_remote_cluster.seeds: $remote_ip}}
29+
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "sniff"}
30+
- match: {transient.cluster\.remote\.test_remote_cluster\.node_connections: "2"}
31+
- match: {transient.cluster\.remote\.test_remote_cluster\.seeds: $remote_ip}
2732

2833
# we do another search here since this will enforce the connection to be established
2934
# otherwise the cluster might not have been connected yet.
@@ -45,19 +50,49 @@
4550
- match: { my_remote_cluster.seeds.0: $remote_ip }
4651

4752
- match: { my_remote_cluster.num_nodes_connected: 1}
48-
- match: { test_remote_cluster.num_nodes_connected: 1}
53+
- gt: { test_remote_cluster.num_nodes_connected: 0}
4954

5055
- match: { my_remote_cluster.max_connections_per_cluster: 1}
51-
- match: { test_remote_cluster.max_connections_per_cluster: 1}
56+
- match: { test_remote_cluster.max_connections_per_cluster: 2}
5257

5358
- match: { my_remote_cluster.initial_connect_timeout: "30s" }
5459
- match: { test_remote_cluster.initial_connect_timeout: "30s" }
5560

61+
- match: { my_remote_cluster.mode: "sniff" }
62+
- match: { test_remote_cluster.mode: "sniff" }
63+
5664
- do:
5765
cluster.put_settings:
66+
flat_settings: true
5867
body:
5968
transient:
69+
cluster.remote.test_remote_cluster.mode: "proxy"
6070
cluster.remote.test_remote_cluster.seeds: null
71+
cluster.remote.test_remote_cluster.node_connections: null
72+
cluster.remote.test_remote_cluster.proxy_socket_connections: "10"
73+
cluster.remote.test_remote_cluster.proxy_address: $remote_ip
74+
75+
- match: {transient.cluster\.remote\.test_remote_cluster\.mode: "proxy"}
76+
- match: {transient.cluster\.remote\.test_remote_cluster\.proxy_socket_connections: "10"}
77+
- match: {transient.cluster\.remote\.test_remote_cluster\.proxy_address: $remote_ip}
78+
79+
- do:
80+
cluster.remote_info: {}
81+
82+
- match: { test_remote_cluster.connected: true }
83+
- match: { test_remote_cluster.address: $remote_ip }
84+
- gt: { test_remote_cluster.num_sockets_connected: 0}
85+
- match: { test_remote_cluster.max_socket_connections: 10}
86+
- match: { test_remote_cluster.initial_connect_timeout: "30s" }
87+
- match: { test_remote_cluster.mode: "proxy" }
88+
89+
- do:
90+
cluster.put_settings:
91+
body:
92+
transient:
93+
cluster.remote.test_remote_cluster.mode: null
94+
cluster.remote.test_remote_cluster.proxy_socket_connections: null
95+
cluster.remote.test_remote_cluster.proxy_address: null
6196

6297
---
6398
"skip_unavailable is returned as part of _remote/info response":

0 commit comments

Comments
 (0)