Skip to content

Commit 646d519

Browse files
committed
CBPS-1529, CBPS-1645: Set up Enterprise Analytics cluster
+ Update "is_columnar" condition in ServerInfo to include EA + Add blob storage settings for EA + Add cloud EA test configs + Update blob storage configuration methods to support Azure Change-Id: I685e0f305c942874cb9eefd6e439a85fee6e6411 Reviewed-on: https://review.couchbase.org/c/perfrunner/+/234988 Tested-by: Build Bot <build@couchbase.com> Reviewed-by: <sean.corrigan@couchbase.com>
1 parent 901c6de commit 646d519

7 files changed

Lines changed: 145 additions & 40 deletions

File tree

perfrunner/helpers/cluster.py

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,19 @@ def set_auth(self):
267267
def set_mem_quotas(self):
268268
for master in self.cluster_spec.masters:
269269
self.rest.set_kv_mem_quota(master, self.test_config.cluster.mem_quota)
270+
if self.test_config.cluster.analytics_mem_quota:
271+
self.rest.set_analytics_mem_quota(
272+
master, self.test_config.cluster.analytics_mem_quota
273+
)
274+
275+
if ServerInfoManager().get_server_info_by_master_node(master).is_columnar:
276+
continue
277+
270278
self.rest.set_index_mem_quota(master, self.test_config.cluster.index_mem_quota)
271279
if self.test_config.cluster.fts_index_mem_quota:
272280
self.rest.set_fts_index_mem_quota(
273281
master, self.test_config.cluster.fts_index_mem_quota
274282
)
275-
if self.test_config.cluster.analytics_mem_quota:
276-
self.rest.set_analytics_mem_quota(
277-
master, self.test_config.cluster.analytics_mem_quota
278-
)
279283
if self.test_config.cluster.eventing_mem_quota:
280284
self.rest.set_eventing_mem_quota(
281285
master, self.test_config.cluster.eventing_mem_quota
@@ -815,22 +819,51 @@ def set_indexer_systemd_mem_limits(self):
815819
self.remote.set_indexer_systemd_mem_limits()
816820
self._restart_clusters()
817821

818-
def set_columnar_cloud_storage(self):
819-
scheme, bucket_name = self.cluster_spec.backup.split("://")
820-
region = self.cluster_spec.cloud_region
821-
self.remote.configure_columnar_cloud_storage(bucket_name, scheme, region)
822-
823-
def add_columnar_cloud_storage_creds(self):
824-
if self.cluster_spec.cloud_provider == "aws":
822+
def set_columnar_blob_storage(self):
823+
endpoint = self.test_config.columnar_settings.blob_storage_endpoint
824+
scheme = self.test_config.columnar_settings.blob_storage_scheme
825+
bucket_name = self.test_config.columnar_settings.blob_storage_bucket
826+
region = self.test_config.columnar_settings.blob_storage_region
827+
828+
if self.cluster_spec.cloud_provider:
829+
if self.cluster_spec.backup:
830+
protocol, _bucket_name = self.cluster_spec.backup.split("://")
831+
_scheme = protocol if protocol != "az" else "azblob"
832+
833+
scheme = scheme or _scheme
834+
bucket_name = bucket_name or _bucket_name
835+
region = self.cluster_spec.cloud_region or region
836+
if scheme == "azblob":
837+
storage_acc_name = self.cluster_spec.infrastructure_section("storage")[
838+
"storage_acc"
839+
]
840+
endpoint = endpoint or f"https://{storage_acc_name}.blob.core.windows.net"
841+
842+
self.remote.configure_columnar_blob_storage(bucket_name, scheme, region, endpoint)
843+
844+
def add_columnar_blob_storage_creds(self):
845+
csp = self.cluster_spec.cloud_provider
846+
scheme = self.test_config.columnar_settings.blob_storage_scheme
847+
848+
if csp == "aws" or scheme == "s3":
825849
access_key_id, secret_access_key = local.get_aws_credential(
826-
self.test_config.backup_settings.aws_credential_path, False
850+
self.test_config.analytics_settings.aws_credential_path,
851+
False,
827852
)
828-
self.remote.store_analytics_aws_creds(access_key_id, secret_access_key)
829-
elif self.cluster_spec.cloud_provider == "gcp":
853+
self.remote.store_analytics_blob_storage_creds(access_key_id, secret_access_key)
854+
elif csp == "gcp" or scheme == "gcs":
830855
run_local_shell_command(
831856
f"gcloud storage buckets add-iam-policy-binding {self.cluster_spec.backup} "
832857
"--member=allUsers --role=roles/storage.objectAdmin"
833858
)
859+
elif csp == "azure" or scheme == "azblob":
860+
storage_acc_name = self.cluster_spec.infrastructure_section("storage")["storage_acc"]
861+
stdout, _, _ = run_local_shell_command(
862+
f"az storage account keys list --account-name {storage_acc_name} "
863+
"--query '[0].value' --output tsv"
864+
)
865+
storage_acc_key = stdout.strip()
866+
self.remote.store_analytics_blob_storage_creds(storage_acc_name, storage_acc_key)
834867

835868
def set_columnar_storage_partitions(self):
836869
storage_partitions = self.test_config.analytics_settings.columnar_storage_partitions

perfrunner/helpers/server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,13 @@ def _initialise_server_info(self, master_node: str, rest_helper: RestType) -> Se
9494
.replace("-enterprise", "")
9595
.replace("-community", "")
9696
.replace("-columnar", "")
97+
.replace("-analytics", "")
9798
)
9899
return ServerInfo(
99100
build=version,
100101
raw_version=raw_version,
101102
build_tuple=create_build_tuple(version),
102-
is_columnar="columnar" in raw_version,
103+
is_columnar="columnar" in raw_version or "enterprise-analytics" in raw_version,
103104
master_node=master_node,
104105
is_community="community" in raw_version,
105106
)

perfrunner/remote/linux.py

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,43 +1499,57 @@ def enable_resource_management_with_cgroup(self):
14991499
run("systemctl daemon-reload")
15001500

15011501
@master_server
1502-
def configure_columnar_cloud_storage(
1503-
self, bucket_name: str = "cb-perf-columnar", scheme: str = "s3", region: str = "us-east-1"
1502+
def configure_columnar_blob_storage(
1503+
self, bucket_name: str, scheme: str, region: str, endpoint: Optional[str]
15041504
):
15051505
logger.info(
1506-
"Configuring Columnar cloud storage bucket. "
1507-
f"Bucket name: {bucket_name}, region: {region}, scheme: {scheme}"
1506+
"Configuring Columnar blob storage bucket. "
1507+
f"Bucket name: {bucket_name}, region: {region}, scheme: {scheme}, endpoint: {endpoint}"
15081508
)
1509+
1510+
if not (bucket_name and scheme and region):
1511+
logger.interrupt("Bucket name, scheme, and region must all be provided.")
1512+
1513+
force_path_style = "true"
1514+
if not endpoint:
1515+
endpoint = ""
1516+
force_path_style = "false"
1517+
15091518
command = (
1510-
"curl --max-time 3 --retry 3 --retry-connrefused "
1519+
"curl --max-time 3 --retry 3 --retry-connrefused -i "
15111520
"--request POST "
15121521
"--url http://localhost:8091/settings/analytics "
15131522
"--header 'Content-Type: application/x-www-form-urlencoded' "
15141523
f"--data blobStorageRegion={region} "
15151524
"--data blobStoragePrefix= "
15161525
f"--data blobStorageBucket={bucket_name} "
15171526
f"--data blobStorageScheme={scheme} "
1527+
f"--data blobStorageEndpoint='{endpoint}' "
1528+
f"--data blobStorageForcePathStyle={force_path_style} "
15181529
f"--data blobStorageAnonymousAuth=false"
15191530
)
1520-
run(command)
1531+
output = run(command, warn_only=True)
1532+
http_code = output.stdout.splitlines()[0].split()[1]
1533+
if output.return_code != 0 or not http_code.startswith("2"):
1534+
logger.interrupt(
1535+
f"Failed to configure columnar blob storage.\n"
1536+
f"Stdout: {output.stdout}\n"
1537+
f"Stderr: {output.stderr}"
1538+
)
15211539

15221540
@all_servers
1523-
def store_analytics_aws_creds(self, access_key_id: str, secret_access_key: str):
1524-
access_key_url = \
1525-
"http://localhost:8091/_metakv/cbas/debug/settings/blob_storage_access_key_id"
1526-
secret_access_key_url = \
1527-
"http://localhost:8091/_metakv/cbas/debug/settings/blob_storage_secret_access_key"
1528-
1529-
logger.info('Add AWS access key')
1530-
command = ("curl --max-time 3 --retry 3 --retry-connrefused -v "
1531-
"-X PUT {} --data-urlencode value={}"
1532-
.format(access_key_url, access_key_id))
1533-
run(command)
1534-
1535-
logger.info('Add AWS secret access key')
1536-
command = ("curl -v -X PUT {} --data-urlencode value={}"
1537-
.format(secret_access_key_url, secret_access_key))
1538-
run(command)
1541+
def store_analytics_blob_storage_creds(self, access_key_id: str, secret_access_key: str):
1542+
base_url = "http://localhost:8091/_metakv/cbas/debug/settings"
1543+
1544+
for setting, value in [
1545+
("blob_storage_access_key_id", access_key_id),
1546+
("blob_storage_secret_access_key", secret_access_key),
1547+
]:
1548+
logger.info(f"Setting {setting}")
1549+
run(
1550+
"curl --max-time 3 --retry 3 --retry-connrefused -v "
1551+
f"-X PUT {base_url}/{setting} --data-urlencode value={value}"
1552+
)
15391553

15401554
@all_servers
15411555
def set_columnar_storage_partitions(self, num_partitions: int):

perfrunner/settings.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2780,7 +2780,7 @@ class AnalyticsSettings:
27802780
INDEX_CONF_FILE = ""
27812781
DROP_DATASET = ""
27822782
ANALYTICS_LINK = "Local"
2783-
EXTERNAL_DATASET_TYPE = "s3"
2783+
EXTERNAL_DATASET_TYPE = "s3" # alt: gcs, azblob
27842784
EXTERNAL_DATASET_REGION = "us-east-1"
27852785
EXTERNAL_BUCKET = None
27862786
EXTERNAL_FILE_INCLUDE = None
@@ -2981,6 +2981,12 @@ def __init__(self, options: dict):
29812981
if (s := dataset.split(":"))
29822982
]
29832983

2984+
# Enterprise Analytics settings
2985+
self.blob_storage_endpoint = options.get("blob_storage_endpoint")
2986+
self.blob_storage_bucket = options.get("blob_storage_bucket")
2987+
self.blob_storage_scheme = options.get("blob_storage_scheme")
2988+
self.blob_storage_region = options.get("blob_storage_region")
2989+
29842990

29852991
class AuditSettings:
29862992

perfrunner/utils/cluster.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ def main():
108108
if cm.cluster_spec.columnar_infrastructure:
109109
if cm.cluster_spec.infrastructure_kafka_clusters:
110110
cm.set_kafka_links_settings()
111-
cm.set_columnar_cloud_storage()
112-
cm.add_columnar_cloud_storage_creds()
111+
cm.add_columnar_blob_storage_creds()
112+
cm.set_columnar_blob_storage()
113113
cm.set_columnar_storage_partitions()
114114

115115
cm.disable_wan()
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[cluster]
2+
mem_quota = 51200
3+
initial_nodes = 4
4+
num_buckets = 1
5+
6+
[bucket]
7+
backend_storage = magma
8+
eviction_policy = fullEviction
9+
10+
[collection]
11+
config = collections/1bucket_1scope_3collections_analytics.json
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
[test_case]
2+
test = perfrunner.tests.analytics.BigFunIncrSyncTest
3+
4+
[showfast]
5+
title = 4 nodes, BigFUN 20M users (320M docs), no indexes, s=1 c=3, Remote Link, Enterprise Analytics
6+
component = analyticscloud
7+
category = sync
8+
sub_category = {provider}
9+
orderby = _ssd_4n_3
10+
11+
[stats]
12+
server_processes = java
13+
14+
[cluster]
15+
mem_quota = 100
16+
analytics_mem_quota = 25600
17+
initial_nodes = 4 4
18+
num_buckets = 1
19+
20+
[bucket]
21+
eviction_policy = fullEviction
22+
23+
[collection]
24+
config = collections/1bucket_1scope_3collections_analytics.json
25+
26+
[analytics]
27+
num_io_devices = 1
28+
dataset_conf_file = tests/analytics/config/bigfun_3_to_3_datasets.json
29+
analytics_link = RemoteLink
30+
31+
[backup]
32+
obj_staging_dir = /stage
33+
obj_region = us-east-1
34+
aws_credential_path = /root/.ssh
35+
36+
[restore]
37+
backup_storage = s3://analytics-bigfun20m-3collections
38+
backup_repo = default
39+
map_data = bucket-1.scope-1=bucket-1.scope-1
40+
threads = 8

0 commit comments

Comments
 (0)