mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
Tremor delete test scripts (#1974)
- terraform scripts to set up cluster - cloud-formation scripts to set up cluster - set up ingest node with kafka server and datagen - set up second ingest node with molecula-consumer-kafka-static - set up datadog in all nodes (ingest + featurebase) - set up script to execute different queries - only run delete test on schedule
This commit is contained in:
parent
a093099a8c
commit
b82375bca2
32 changed files with 1671 additions and 30 deletions
|
|
@ -455,7 +455,85 @@ smoke test:
|
|||
- report.xml
|
||||
reports:
|
||||
junit: report.xml
|
||||
|
||||
|
||||
tremor-delete-test:
|
||||
stage: integration
|
||||
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
|
||||
timeout: 6h
|
||||
variables:
|
||||
PROFILE: "service-terraform"
|
||||
AWS_SSH_PRIVATE_KEY: $AWS_FBCI_SSH_KEY
|
||||
AWS_ACCESS_KEY_ID: $AWS_FBCI_ACCESS_KEY_ID
|
||||
AWS_SECRET_ACCESS_KEY: $AWS_FBCI_SECRET_ACCESS_KEY
|
||||
STACK_PREFIX: $CI_JOB_NAME
|
||||
FB_INSTANCE_COUNT: 5
|
||||
REPLICA_COUNT: 1
|
||||
tags:
|
||||
- aws
|
||||
- docker
|
||||
- fbsmoke
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web")'
|
||||
before_script:
|
||||
- apt-get update && apt-get install -y gnupg software-properties-common curl git
|
||||
- curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add -
|
||||
- apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
|
||||
- apt-get update && apt-get install terraform
|
||||
- aws configure set aws_access_key_id $AWS_FBCI_ACCESS_KEY_ID --profile $PROFILE
|
||||
- aws configure set aws_secret_access_key $AWS_FBCI_SECRET_ACCESS_KEY --profile $PROFILE
|
||||
- aws configure set region "us-east-2" --profile $PROFILE
|
||||
- aws configure set aws_profile $PROFILE
|
||||
- echo $AWS_FBCI_SSH_KEY > gitlab-featurebase-ci.pem
|
||||
- chmod 400 gitlab-featurebase-ci.pem
|
||||
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
|
||||
- eval $(ssh-agent -s)
|
||||
- mkdir -p ~/.ssh
|
||||
- echo $AWS_FBCI_SSH_KEY > /root/.ssh/gitlab-featurebase-ci.pem
|
||||
- chmod 400 /root/.ssh/gitlab-featurebase-ci.pem
|
||||
- echo "$AWS_FBCI_SSH_KEY" | ssh-add -
|
||||
- chmod 700 /root/.ssh
|
||||
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
||||
- apt update && apt -y install jq wget
|
||||
- wget -q https://go.dev/dl/go$GOVERSION.linux-amd64.tar.gz
|
||||
- tar -C /usr/local -xzf go$GOVERSION.linux-amd64.tar.gz
|
||||
- export PATH=$PATH:/usr/local/go/bin
|
||||
- CF_STACK_NAME="${STACK_PREFIX}-$(openssl rand -base64 12 | tr -d /=+ | cut -c -16)"
|
||||
- echo "Cloudformation Stack Name --> $CF_STACK_NAME"
|
||||
- echo $CF_STACK_NAME > /tmp/stackname-{$CI_JOB_ID}
|
||||
script:
|
||||
- echo "Start CloudFormation deploy..."
|
||||
- >
|
||||
aws cloudformation deploy
|
||||
--stack-name $CF_STACK_NAME
|
||||
--template-file ./qa/cft/FeatureBaseClusterCFTTremor.yaml
|
||||
--parameter-overrides
|
||||
FBInstanceCount=$FB_INSTANCE_COUNT
|
||||
EBSVolumeSize=1200
|
||||
TestName=$CI_JOB_NAME
|
||||
TestID=$CI_JOB_ID
|
||||
TestCommitSHA=$CI_COMMIT_SHA
|
||||
--capabilities CAPABILITY_NAMED_IAM
|
||||
--profile $PROFILE
|
||||
- echo "CloudFormation deploy done."
|
||||
- echo "Start configuring and start featurebase..."
|
||||
- ./qa/scripts/setupTremorDeleteCFT.sh $CF_STACK_NAME $PROFILE $REPLICA_COUNT $FB_INSTANCE_COUNT $CI_COMMIT_BRANCH
|
||||
# producer.log, consumer.log, queries.log are generated when runTremorDeleteCFT.sh is ran
|
||||
- ./qa/scripts/runTremorDeleteCFT.sh $CF_STACK_NAME $PROFILE > tremor-delete-test.log 2>&1
|
||||
- echo "Featurebase configuration done."
|
||||
- echo "Start running tests..."
|
||||
- echo "Done with tests!"
|
||||
artifacts:
|
||||
when: always
|
||||
paths:
|
||||
- tremor-delete-test.log
|
||||
after_script:
|
||||
# note that we have to read the file to get the $CF_STACK_NAME
|
||||
# because variables from the previous script & before_script do not get passed to after_script
|
||||
- CF_STACK_NAME=$(cat /tmp/stackname-{$CI_JOB_ID})
|
||||
- echo "Deleting stack after test, stack name = ${CF_STACK_NAME}"
|
||||
- aws cloudformation delete-stack --stack-name $CF_STACK_NAME --profile $PROFILE
|
||||
- echo "Delete stack complete!"
|
||||
|
||||
samsung-gauntlet:
|
||||
stage: gauntlet
|
||||
|
|
@ -715,4 +793,4 @@ s3 dump tag:
|
|||
- job: build for darwin amd64
|
||||
- job: build for darwin arm64
|
||||
- job: build for linux amd64
|
||||
- job: build for linux arm64
|
||||
- job: build for linux arm64
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
variables:
|
||||
GOVERSION: "1.17.8"
|
||||
|
||||
stages:
|
||||
- performance
|
||||
|
||||
|
|
@ -40,8 +43,8 @@ perf_able:
|
|||
- chmod 700 /root/.ssh
|
||||
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
||||
- apt update && apt -y install jq wget
|
||||
- wget -q https://go.dev/dl/go1.17.5.linux-amd64.tar.gz
|
||||
- tar -C /usr/local -xzf go1.17.5.linux-amd64.tar.gz
|
||||
- wget -q https://go.dev/dl/go$GOVERSION.linux-amd64.tar.gz
|
||||
- tar -C /usr/local -xzf go$GOVERSION.linux-amd64.tar.gz
|
||||
- export PATH=$PATH:/usr/local/go/bin
|
||||
- TF_VAR_cluster_prefix="able-$(openssl rand -base64 12 | tr -d /=+ | cut -c -16)"
|
||||
- echo "Cluster Prefix --> $TF_VAR_cluster_prefix"
|
||||
|
|
|
|||
309
qa/cft/FeatureBaseClusterCFTTremor.yaml
Normal file
309
qa/cft/FeatureBaseClusterCFTTremor.yaml
Normal file
|
|
@ -0,0 +1,309 @@
|
|||
AWSTemplateFormatVersion: 2010-09-09
|
||||
Description: FeatureBase Cluster for testing
|
||||
|
||||
Parameters:
|
||||
# Network params
|
||||
PrivateSubnetIds:
|
||||
Type: String
|
||||
Default: 'subnet-0319dde319380326f,subnet-0517ca9a646d80f88,subnet-05a7b685ed27eb1cf'
|
||||
Description: private subnet provisioned for integration test.
|
||||
PublicSubnetIds:
|
||||
Type: String
|
||||
Default: 'subnet-066b4b922b54e51a2,subnet-037b8884269a69025,subnet-08482631514426210'
|
||||
Description: public subnet provisioned for integration test.
|
||||
FeatureBasePort:
|
||||
Type: Number
|
||||
Default: 10101
|
||||
Description: The port where FeatureBase is listening on.
|
||||
# basic ec2 instance params
|
||||
SecurityGroupID:
|
||||
Type: String
|
||||
Default: sg-000ac63a3e020c470
|
||||
Description: security group id
|
||||
KeyPairName:
|
||||
Type: String
|
||||
Default: smoke-0fjLX8lrTQpONO2-gitlab-ci
|
||||
Description: key pair for ec2 instances
|
||||
InstanceImageId:
|
||||
Type: 'AWS::SSM::Parameter::Value<String>'
|
||||
Description: The ID of the AMI to use for the deployment EC2 instances.
|
||||
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
|
||||
# basic root device volume params
|
||||
VolumeSize:
|
||||
Type: Number
|
||||
Default: 20
|
||||
Description: The volume size in gigabytes for the root volume of deployment instances.
|
||||
Iops:
|
||||
Type: Number
|
||||
Default: 3000
|
||||
Description: The IOPS for the root EBS volume of deployment instances.
|
||||
# FeatureBase Params
|
||||
FBInstanceCount:
|
||||
Type: Number
|
||||
Default: 5
|
||||
Description: The number of EC2 instances for the FeatureBase cluster
|
||||
FBInstanceSize:
|
||||
Type: String
|
||||
Default: m5ad.16xlarge
|
||||
Description: Class of EC2 instance used to host the deployment.
|
||||
# note that we are using a producer, which is also the kafka host
|
||||
# and the consumer uses the kafka-static binary for ingesting data
|
||||
# to featurebase
|
||||
# producer/consumer related params
|
||||
ProducerInstanceSize:
|
||||
Type: String
|
||||
Default: m4.16xlarge
|
||||
ConsumerInstanceSize:
|
||||
Type: String
|
||||
Default: m4.16xlarge
|
||||
ProducerInstanceCount:
|
||||
Type: Number
|
||||
Default: 1
|
||||
Description: number of producer instances.
|
||||
ConsumerInstanceCount:
|
||||
Type: Number
|
||||
Default: 1
|
||||
Description: number of consumer instances.
|
||||
# producer/consumer ebs volume params
|
||||
EBSVolumeSize:
|
||||
Type: Number
|
||||
Default: 1200
|
||||
EBSIops:
|
||||
Type: Number
|
||||
Default: 3000
|
||||
# test info
|
||||
TestCommitSHA:
|
||||
Type: String
|
||||
Default: the-current-featurebase-commit-sha
|
||||
Description: FeatureBase repo gitlab commit SHA.
|
||||
TestName:
|
||||
Type: String
|
||||
Default: some-test-name
|
||||
Description: Test name (gitlab job name).
|
||||
TestID:
|
||||
Type: String
|
||||
Default: some-test-id
|
||||
Description: Test run id (gitlab CI job id).
|
||||
|
||||
Resources:
|
||||
|
||||
####################### For provisioning the Featurebase Cluster #########################
|
||||
# Autoscaling group. This launches the actual EC2 instances containing FeatureBase
|
||||
# we are not really auto scaling anything. this is just a way to launch multiple instances
|
||||
DeploymentAutoScalingGroup:
|
||||
Type: AWS::AutoScaling::AutoScalingGroup
|
||||
Properties:
|
||||
AutoScalingGroupName: !Sub '${AWS::StackName}-asg'
|
||||
VPCZoneIdentifier:
|
||||
!Split [ ",", !Ref PrivateSubnetIds ]
|
||||
LaunchConfigurationName: !Ref 'DeploymentInstances'
|
||||
MinSize: !Ref 'FBInstanceCount'
|
||||
MaxSize: !Ref 'FBInstanceCount'
|
||||
DesiredCapacity: !Ref 'FBInstanceCount'
|
||||
HealthCheckGracePeriod: 120
|
||||
Tags:
|
||||
- Key: TestCommitSHA
|
||||
Value: !Ref TestCommitSHA
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestName
|
||||
Value: !Sub '${TestName}-featurebase-cluster'
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestID
|
||||
Value: !Ref TestID
|
||||
PropagateAtLaunch: "true"
|
||||
UpdatePolicy:
|
||||
AutoScalingRollingUpdate:
|
||||
MaxBatchSize: 1
|
||||
|
||||
# Metadata describing the EC2 instance
|
||||
DeploymentInstances:
|
||||
Type: AWS::AutoScaling::LaunchConfiguration
|
||||
Properties:
|
||||
LaunchConfigurationName: !Sub '${AWS::StackName}-launch-cfg'
|
||||
KeyName: !Ref KeyPairName
|
||||
ImageId: !Ref InstanceImageId
|
||||
SecurityGroups:
|
||||
- !Ref SecurityGroupID
|
||||
InstanceType: !Ref FBInstanceSize
|
||||
BlockDeviceMappings:
|
||||
- DeviceName: /dev/xvda
|
||||
Ebs:
|
||||
Encrypted: true
|
||||
VolumeSize: !Ref 'VolumeSize'
|
||||
VolumeType: "gp3"
|
||||
Iops: !Ref 'Iops'
|
||||
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
||||
UserData:
|
||||
Fn::Base64: !Sub |
|
||||
#!/bin/bash
|
||||
set +x
|
||||
set -e
|
||||
sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 /dev/nvme4n1
|
||||
sudo mkfs.ext4 /dev/md0
|
||||
sudo mkdir data
|
||||
sudo mount /dev/md0 /data
|
||||
sudo chown -R ec2-user:ec2-user /data
|
||||
|
||||
####################### For provisioning the Producer Cluster #########################
|
||||
ProducerAutoScalingGroup:
|
||||
Type: AWS::AutoScaling::AutoScalingGroup
|
||||
Properties:
|
||||
AutoScalingGroupName: !Sub '${AWS::StackName}-producer-asg'
|
||||
VPCZoneIdentifier:
|
||||
!Split [ ",", !Ref PrivateSubnetIds ]
|
||||
LaunchConfigurationName: !Ref 'ProducerInstances'
|
||||
MinSize: !Ref 'ProducerInstanceCount'
|
||||
MaxSize: !Ref 'ProducerInstanceCount'
|
||||
DesiredCapacity: !Ref 'ProducerInstanceCount'
|
||||
HealthCheckGracePeriod: 120
|
||||
Tags:
|
||||
- Key: TestCommitSHA
|
||||
Value: !Ref TestCommitSHA
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestName
|
||||
Value: !Sub '${TestName}-ingest-producer'
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestID
|
||||
Value: !Ref TestID
|
||||
PropagateAtLaunch: "true"
|
||||
UpdatePolicy:
|
||||
AutoScalingRollingUpdate:
|
||||
MaxBatchSize: 1
|
||||
|
||||
# Metadata describing the EC2 instance
|
||||
ProducerInstances:
|
||||
Type: AWS::AutoScaling::LaunchConfiguration
|
||||
Properties:
|
||||
LaunchConfigurationName: !Sub '${AWS::StackName}-producer-launch-cfg'
|
||||
KeyName: !Ref KeyPairName
|
||||
ImageId: !Ref InstanceImageId
|
||||
SecurityGroups:
|
||||
- !Ref SecurityGroupID
|
||||
InstanceType: !Ref ProducerInstanceSize
|
||||
BlockDeviceMappings:
|
||||
# root device volume
|
||||
- DeviceName: /dev/xvda
|
||||
Ebs:
|
||||
Encrypted: true
|
||||
VolumeSize: !Ref 'VolumeSize'
|
||||
VolumeType: "gp3"
|
||||
Iops: !Ref 'Iops'
|
||||
- DeviceName: /dev/sdb
|
||||
Ebs:
|
||||
Encrypted: true
|
||||
VolumeSize: !Ref 'EBSVolumeSize'
|
||||
VolumeType: "gp3"
|
||||
Iops: !Ref 'EBSIops'
|
||||
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
||||
|
||||
####################### For provisioning the Consumer Cluster #########################
|
||||
ConsumerAutoScalingGroup:
|
||||
Type: AWS::AutoScaling::AutoScalingGroup
|
||||
Properties:
|
||||
AutoScalingGroupName: !Sub '${AWS::StackName}-consumer-asg'
|
||||
VPCZoneIdentifier:
|
||||
!Split [ ",", !Ref PrivateSubnetIds ]
|
||||
LaunchConfigurationName: !Ref 'ConsumerInstances'
|
||||
MinSize: !Ref 'ConsumerInstanceCount'
|
||||
MaxSize: !Ref 'ConsumerInstanceCount'
|
||||
DesiredCapacity: !Ref 'ConsumerInstanceCount'
|
||||
HealthCheckGracePeriod: 120
|
||||
Tags:
|
||||
- Key: TestCommitSHA
|
||||
Value: !Ref TestCommitSHA
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestName
|
||||
Value: !Sub '${TestName}-ingest-consumer'
|
||||
PropagateAtLaunch: "true"
|
||||
- Key: TestID
|
||||
Value: !Ref TestID
|
||||
PropagateAtLaunch: "true"
|
||||
UpdatePolicy:
|
||||
AutoScalingRollingUpdate:
|
||||
MaxBatchSize: 1
|
||||
|
||||
# Metadata describing the EC2 instance
|
||||
ConsumerInstances:
|
||||
Type: AWS::AutoScaling::LaunchConfiguration
|
||||
Properties:
|
||||
LaunchConfigurationName: !Sub '${AWS::StackName}-consumer-launch-cfg'
|
||||
KeyName: !Ref KeyPairName
|
||||
ImageId: !Ref InstanceImageId
|
||||
SecurityGroups:
|
||||
- !Ref SecurityGroupID
|
||||
InstanceType: !Ref ConsumerInstanceSize
|
||||
BlockDeviceMappings:
|
||||
# root device volume
|
||||
- DeviceName: /dev/xvda
|
||||
Ebs:
|
||||
Encrypted: true
|
||||
VolumeSize: !Ref 'VolumeSize'
|
||||
VolumeType: "gp3"
|
||||
Iops: !Ref 'Iops'
|
||||
- DeviceName: /dev/sdb
|
||||
Ebs:
|
||||
Encrypted: true
|
||||
VolumeSize: !Ref 'EBSVolumeSize'
|
||||
VolumeType: "gp3"
|
||||
Iops: !Ref 'EBSIops'
|
||||
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
||||
|
||||
####################### IAM roles and policies #################################
|
||||
# Role for the deployment's EC2 hosts. Adds policies for SSM-based access and CloudWatchAgent.
|
||||
DeploymentEC2Role:
|
||||
Type: AWS::IAM::Role
|
||||
Properties:
|
||||
RoleName: !Sub '${AWS::StackName}'
|
||||
AssumeRolePolicyDocument:
|
||||
Statement:
|
||||
- Effect: Allow
|
||||
Principal:
|
||||
Service: [ec2.amazonaws.com]
|
||||
Action: ['sts:AssumeRole']
|
||||
Path: /
|
||||
ManagedPolicyArns:
|
||||
- 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
|
||||
- 'arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy'
|
||||
- !Ref EC2InstanceS3PermissionsPolicy
|
||||
|
||||
# Attach roles to the deployment instances
|
||||
DeploymentInstanceProfile:
|
||||
Type: AWS::IAM::InstanceProfile
|
||||
Properties:
|
||||
InstanceProfileName: !Sub '${AWS::StackName}'
|
||||
Path: /
|
||||
Roles: [!Ref 'DeploymentEC2Role']
|
||||
|
||||
EC2InstanceS3PermissionsPolicy:
|
||||
Type: AWS::IAM::ManagedPolicy
|
||||
Properties:
|
||||
PolicyDocument:
|
||||
Version: 2012-10-17
|
||||
Statement:
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- 's3:GetObject'
|
||||
- 's3:PutObject*'
|
||||
Resource:
|
||||
- !Sub 'arn:aws:s3:::*/*'
|
||||
- Effect: Allow
|
||||
Action: 's3:ListBucket'
|
||||
Resource:
|
||||
- !Sub 'arn:aws:s3:::*'
|
||||
|
||||
# "Action": [
|
||||
# "s3:PutObject",
|
||||
# "s3:GetObject"
|
||||
# ],
|
||||
# "Resource": "arn:aws:s3:::tremor-data-backup/*"
|
||||
|
||||
Outputs:
|
||||
DeploymentAutoscalingGroupName:
|
||||
Description: Deployment Auto Scaling Group
|
||||
Value: !Ref DeploymentAutoScalingGroup
|
||||
ProducerAutoscalingGroupName:
|
||||
Description: Producer Auto Scaling Group
|
||||
Value: !Ref ProducerAutoScalingGroup
|
||||
ConsumerAutoscalingGroupName:
|
||||
Description: Consumer Auto Scaling Group
|
||||
Value: !Ref ConsumerAutoScalingGroup
|
||||
135
qa/cft/README.md
Normal file
135
qa/cft/README.md
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
# How to deploy featurebase cluster with cloudformation?
|
||||
|
||||
- first login to your AWS profile for the FeatureBase-CI AWS account and then cd to featurebase repo root directory. here we assume that your profile is called `fb-ci`
|
||||
```
|
||||
aws sso login --profile fb-ci
|
||||
cd <feature base repo root dir>
|
||||
```
|
||||
- then run cloudformation deploy. You can customize stuff by overriding the parameters using the `--parameter-overrides` flag. Please see the `FeatureBaseClusterCFT.yaml` for the complete list of parameters that can be customized.
|
||||
```
|
||||
aws cloudformation deploy \
|
||||
--stack-name jon-test-stack \
|
||||
--template-file qa/cft/FeatureBaseClusterCFTTremor.yaml \
|
||||
--parameter-overrides \
|
||||
FBInstanceCount=1 \
|
||||
ConsumerInstanceCount=1 \
|
||||
ProducerEBSVolumeSize=2400 \
|
||||
ProducerEBSIops=3000 \
|
||||
TestName=some-test-name \
|
||||
--capabilities CAPABILITY_NAMED_IAM \
|
||||
--profile fb-ci
|
||||
```
|
||||
|
||||
## How to manually ssh to the FeatureBase Cluster, Consumer, or Producer nodes?
|
||||
|
||||
You will need to setup the aws profile with the credentials to access the FeatureBase-CI AWS account in the job, and then call the above cloudformation command in the job.
|
||||
|
||||
After deploying you will need to get one of the ips of the featurebase nodes for ssh. The script `getASGInstanceIPs.sh` takes 2 arguments:
|
||||
- auto scaling group name, which is
|
||||
- for featurebase nodes: `${STACK_NAME}-asg`
|
||||
- for producer nodes: `${STACK_NAME}-producer-asg` (given our current architecture, we can only have 1 producer node, which also serves as the kafka host)
|
||||
- for consumer nodes: `${STACK_NAME}-consumer-asg`
|
||||
- aws profile name
|
||||
|
||||
The output of the script is the list of ips of the instances in the auto scaling group
|
||||
```
|
||||
.qa/scriptsgetASGInstanceIPs.sh jon-test-stack2-asg fb-ci
|
||||
```
|
||||
Now you will need to use VPN to ssh to one of the nodes. To setup VPN, follow this [link](https://molecula.atlassian.net/wiki/spaces/EN/pages/697892918/How+to+Setup+VPN+Acccess+to+MCloud).
|
||||
After setting up the VPN, you can then ssh to the ec2 instance with its private IPv4 address
|
||||
```
|
||||
ssh -i <the "gitlab-featurebase-ci AWS key" pem file in 1Password> ec2-user@<the private IPv4 address of the ec2 instance>
|
||||
```
|
||||
|
||||
## How to setup producer (& kafka) and consumers?
|
||||
go to the top level directory of this featurebase repo
|
||||
run the following command (assuming you have already run the previous cloudformation command)
|
||||
- arguments for setupFeatureBaseClusterCFTTremor.sh:
|
||||
1) stack name
|
||||
2) aws profile name
|
||||
3) feature base replica count
|
||||
4) feature base instance count
|
||||
5) datadog tag for the ticket
|
||||
example use of the script:
|
||||
```
|
||||
./qa/scripts/setupFeatureBaseClusterCFTTremor.sh some-test-stack fb-ci 3 5 some-datadog-tag
|
||||
```
|
||||
|
||||
|
||||
|
||||
## How to restore data from the ebs volume?
|
||||
As of now 4/25/2022, i made an ebs volume (vol-0f9af1a7bc5dd63e0, tremor-integration-test-restore-records) in *us-east-2a* and backed up ~1B tremor records in the /tremor_backup directory. FYI, you cannot attach this ebs volume outside of us-east-2a.
|
||||
|
||||
After setting up featurebase, and ensuring that there is a featurebase data node in the us-east-2a AZ, then we can start the following process to restore those billions of tremor records stored in ebs volume to featurebase for testing.
|
||||
- First, attach the ebs volume to the us-east-2a featurebase data node. Note that this ebs volume must be available (not attached to any other instances) for the following command to work.
|
||||
```
|
||||
aws ec2 attach-volume --instance-id <instance in us-east-2a> --volume-id vol-0f9af1a7bc5dd63e0 --device /dev/sdf --region us-east-2 --profile fb-ci
|
||||
```
|
||||
- then, ssh to the featurebase data node and mount the ebs volume to the directory /restore, like so:
|
||||
```
|
||||
sudo mkdir /restore
|
||||
sudo mount /dev/sdf /restore
|
||||
sudo chown -R ec2-user:ec2-user /restore
|
||||
```
|
||||
- now we can perform the featurebase restore, this may take ~20min for 1B tremor records
|
||||
```
|
||||
featurebase restore --concurrency 64 --source /restore/tremor_backup
|
||||
```
|
||||
- after restore, please unmount the ebs device
|
||||
```
|
||||
sudo umount /restore
|
||||
```
|
||||
- Exit your ssh session, and then Please detach the ebs volume, so that other processes can use it!!!
|
||||
```
|
||||
aws ec2 detach-volume --instance-id i-015fca53e6a50c5bf --volume-id vol-0f9af1a7bc5dd63e0 --region us-east-2 --profile fb-ci
|
||||
```
|
||||
|
||||
## How to destroy old backup and create new backup data to this ebs volume
|
||||
In the future, we may want to remove the obsolete back up data and store a new dataset in the ebs volume, we can do the following steps:
|
||||
- First, attach the ebs volume to the us-east-2a featurebase data node. Note that this ebs volume must be available (not attached to any other instances) for the following command to work.
|
||||
```
|
||||
aws ec2 attach-volume --instance-id <instance in us-east-2a> --volume-id vol-0f9af1a7bc5dd63e0 --device /dev/sdf --region us-east-2 --profile fb-ci
|
||||
```
|
||||
- then, ssh to the featurebase data node and mount the ebs volume to the directory /restore, like so: (note that the `mkfs.ext4` command will destroy all data in the ebs volume!)
|
||||
```
|
||||
sudo mkdir /restore
|
||||
sudo mkfs.ext4 /dev/sdf
|
||||
sudo mount /dev/sdf /restore
|
||||
sudo chown -R ec2-user:ec2-user /restore
|
||||
```
|
||||
- now we can perform the featurebase backup, this may take ~56min for 1B tremor records & a 3 node cluster
|
||||
```
|
||||
featurebase backup --index tremor -o /restore/tremor-backup --concurrency 64
|
||||
```
|
||||
- after backup, please unmount the ebs device
|
||||
```
|
||||
sudo umount /restore
|
||||
```
|
||||
- Exit your ssh session, and then Please detach the ebs volume, so that other processes can use it!!!
|
||||
```
|
||||
aws ec2 detach-volume --instance-id i-015fca53e6a50c5bf --volume-id vol-0f9af1a7bc5dd63e0 --region us-east-2 --profile fb-ci
|
||||
```
|
||||
|
||||
## How to launch multiple consumers?
|
||||
You can just specify ConsumerInstanceCount to be 2 when you run cloudformation deploy, like so:
|
||||
```
|
||||
aws cloudformation deploy \
|
||||
--stack-name jon-test-stack \
|
||||
--template-file qa/cft/FeatureBaseClusterCFTTremor.yaml \
|
||||
--parameter-overrides \
|
||||
FBInstanceCount=1 \
|
||||
ConsumerInstanceCount=1 \
|
||||
ProducerEBSVolumeSize=2400 \
|
||||
ProducerEBSIops=3000 \
|
||||
TestName=some-test-name \
|
||||
--capabilities CAPABILITY_NAMED_IAM \
|
||||
--profile fb-ci
|
||||
```
|
||||
The setup scripts are written to support multiple consumers, so you can just run the same setup script as mentioned previously.
|
||||
But the performance is not better than just using 1 consumer as of now, so some fine tuning is required i think...
|
||||
|
||||
## Other things to be mindful of:
|
||||
- If you are creating multiple featurebase clusters to parallelize testing, make sure you give them different stack names!
|
||||
- Note that this cloudformation template FeatureBaseClusterCFT.yaml is still using the same smoke vpc and subnets.
|
||||
|
||||
|
||||
|
|
@ -18,6 +18,12 @@ terraform apply -input=false -auto-approve
|
|||
terraform output -json > outputs.json
|
||||
popd
|
||||
|
||||
# path for ebs device
|
||||
EBS_DEVICE_NAME=/dev/nvme1n1
|
||||
|
||||
# featurebase architecture
|
||||
FB_BINARY=featurebase_linux_arm64
|
||||
|
||||
# get the first ingest host
|
||||
INGESTNODE0=$(cat ./qa/tf/ci/auth-smoke/outputs.json | jq -r '[.ingest_ips][0]["value"][0]')
|
||||
echo "using INGESTNODE0 ${INGESTNODE0}"
|
||||
|
|
|
|||
7
qa/scripts/delete/README.md
Normal file
7
qa/scripts/delete/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
|
||||
# backup command
|
||||
featurebase backup --index tremor -o tremor-backup --concurrency 64
|
||||
|
||||
# data was tar in parallel with this command
|
||||
time tar cfv - ./tremor-backup/ | pigz -1 -p 64 > tremor.tar.gz
|
||||
52
qa/scripts/delete/runConsumer.sh
Executable file
52
qa/scripts/delete/runConsumer.sh
Executable file
|
|
@ -0,0 +1,52 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
set +x
|
||||
|
||||
runConsumer(){
|
||||
echo "Started running molecula-consumer-kafka-static on consumer node"
|
||||
START_CONSUMER=$(date +%s%N) # in nano seconds
|
||||
|
||||
# start molecula consumer kafka static - read messages from kafka server and ingest into FeatureBase
|
||||
./molecula-consumer-kafka-static --pilosa-hosts=$DATANODE --kafka-hosts $INGESTNODE0:9092 --index $INDEX --primary-key-fields uuid --header ./schema.json --batch-size $BATCH_SIZE --topics $TOPIC --max-msgs $INGEST_COUNT --concurrency $CONCURRENCY &
|
||||
|
||||
# wait for all background processes to finish
|
||||
for job in `jobs -p`
|
||||
do
|
||||
wait $job
|
||||
done
|
||||
|
||||
END_CONSUMER=$(date +%s%N) # in nano seconds
|
||||
DURATION_CONSUMER=$(($(($END_CONSUMER-$START_CONSUMER))/1000000000/60)) # convert from ns to min
|
||||
|
||||
# send metrics to featurebase
|
||||
echo -n "consumer_duration_min:$DURATION_CONSUMER|g|#test_name:$TEST_NAME" | nc -4u -w1 127.0.0.1 8125
|
||||
|
||||
echo "finished consumer - duration: $DURATION_CONSUMER min"
|
||||
}
|
||||
|
||||
|
||||
DATANODE=$1
|
||||
shift
|
||||
|
||||
INGESTNODE0=$1
|
||||
shift
|
||||
|
||||
INGEST_COUNT=$1
|
||||
shift
|
||||
|
||||
BATCH_SIZE=$1
|
||||
shift
|
||||
|
||||
CONCURRENCY=$1
|
||||
shift
|
||||
|
||||
INDEX=$1
|
||||
shift
|
||||
|
||||
TOPIC=$1
|
||||
shift
|
||||
|
||||
TEST_NAME=$1
|
||||
shift
|
||||
|
||||
runConsumer
|
||||
71
qa/scripts/delete/runDeleteTest.sh
Executable file
71
qa/scripts/delete/runDeleteTest.sh
Executable file
|
|
@ -0,0 +1,71 @@
|
|||
#!/bin/bash
|
||||
|
||||
# before running make sure runQueries.sh script is in the same directory as runTremorDeleteTest.sh
|
||||
# and ./runProducer.sh is copied to the producer node, ./runConsumer.sh copied to the consumer node
|
||||
# assumes setupTremorDeleteTestCFT.sh has been run to set up data nodes in the cluster and producer/consumer nodes
|
||||
# To run script: ./runTremorDeleteTest.sh <IP for data node> <IP for consumer node> <IP for producer node>
|
||||
|
||||
INGEST_COUNT=1000000000
|
||||
MAX_MSGS=5000000000
|
||||
BATCH_SIZE=500000
|
||||
CONCURRENCY=128
|
||||
PARTITIONS=128
|
||||
INDEX=tremor
|
||||
TOPIC=tremor
|
||||
TEST_NAME="tremor-delete-ci"
|
||||
|
||||
producer(){
|
||||
SEED=$1
|
||||
|
||||
# run kafka ingest in the first ingest node - kafka was installed and started in this node
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${PRODUCER0} "bash runProducer.sh ${DATANODE0} ${PRODUCER0} ${INGEST_COUNT} ${BATCH_SIZE} ${PARTITIONS} ${INDEX} ${TOPIC} ${TEST_NAME} ${SEED}"
|
||||
}
|
||||
|
||||
consumer(){
|
||||
sleep 120 # sleep 2min, allow enough messages to be generated in kafka
|
||||
|
||||
# run ingest to featurebase in the second ingest node
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${CONSUMER0} "bash runConsumer.sh ${DATANODE0} ${PRODUCER0} ${MAX_MSGS} ${BATCH_SIZE} ${CONCURRENCY} ${INDEX} ${TOPIC} ${TEST_NAME}"
|
||||
|
||||
}
|
||||
|
||||
ingest(){
|
||||
# many producers - produce messages to kafka
|
||||
for i in {1..5}
|
||||
do
|
||||
echo "launching producer with seed $i"
|
||||
( producer $i & )
|
||||
done
|
||||
|
||||
# 1 consumer - consume messages from kafka to featurebase
|
||||
echo "launching consumer"
|
||||
consumer &
|
||||
}
|
||||
|
||||
runQueries() {
|
||||
echo "running queries"
|
||||
# run ingest to featurebase in the second ingest node
|
||||
ssh -A -o StrictHostKeyChecking=no ec2-user@${DATANODE0} "bash runQueries.sh ${DATANODE0} ${INDEX} ${TEST_NAME} ${DEPLOYED_DATA_IPS[@]}"
|
||||
}
|
||||
|
||||
runIngestAndQueries() {
|
||||
DATANODE0=$1
|
||||
PRODUCER0=$2 # producer node is expected to have kafka running
|
||||
CONSUMER0=$3
|
||||
DEPLOYED_DATA_IPS=("${@:4}")
|
||||
|
||||
echo "Producer Node: ${PRODUCER0}, Consumer Node: ${CONSUMER0}, Data Node: ${DATANODE0}"
|
||||
echo "DEPLOYED_DATA_IPS: ${DEPLOYED_DATA_IPS[@]}"
|
||||
|
||||
# perform ingest
|
||||
ingest
|
||||
|
||||
# wait for all background processes to finish
|
||||
for job in `jobs -p`
|
||||
do
|
||||
wait $job
|
||||
done
|
||||
|
||||
# perform queries
|
||||
runQueries
|
||||
}
|
||||
56
qa/scripts/delete/runProducer.sh
Executable file
56
qa/scripts/delete/runProducer.sh
Executable file
|
|
@ -0,0 +1,56 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
set +x
|
||||
|
||||
runDatagen(){
|
||||
echo "Started datagen on producer node"
|
||||
START_DATAGEN=$(date +%s%N) # in nano seconds
|
||||
|
||||
# start datagen - produce messages to kafka server
|
||||
./datagen --kafka.confluent-command.kafka-bootstrap-servers $INGESTNODE0:9092 --source custom --custom-config ./tremor_keys.yaml --pilosa.index $INDEX --pilosa.hosts=$DATANODE --target kafkastatic --kafka.topic $TOPIC --end-at $INGEST_COUNT --kafka.num-partitions $PARTITIONS --track-progress --seed $SEED
|
||||
|
||||
# wait for all background processes to finish
|
||||
for job in `jobs -p`
|
||||
do
|
||||
wait $job
|
||||
done
|
||||
|
||||
END_DATAGEN=$(date +%s%N) # in nano seconds
|
||||
|
||||
# compute duration for ingest
|
||||
DURATION_DATAGEN=$(($(($END_DATAGEN-$START_DATAGEN))/1000000000/60)) # convert from ns to min
|
||||
|
||||
# send metrics to datagen
|
||||
echo -n "datagen_duration_min:$DURATION_DATAGEN|g|#test_name:$TEST_NAME" | nc -4u -w1 127.0.0.1 8125
|
||||
|
||||
echo "finished datagen - duration: $DURATION_DATAGEN min"
|
||||
}
|
||||
|
||||
DATANODE=$1
|
||||
shift
|
||||
|
||||
INGESTNODE0=$1
|
||||
shift
|
||||
|
||||
INGEST_COUNT=$1
|
||||
shift
|
||||
|
||||
BATCH_SIZE=$1
|
||||
shift
|
||||
|
||||
PARTITIONS=$1
|
||||
shift
|
||||
|
||||
INDEX=$1
|
||||
shift
|
||||
|
||||
TOPIC=$1
|
||||
shift
|
||||
|
||||
TEST_NAME=$1
|
||||
shift
|
||||
|
||||
SEED=$1
|
||||
shift
|
||||
|
||||
runDatagen
|
||||
179
qa/scripts/delete/runQueries.sh
Executable file
179
qa/scripts/delete/runQueries.sh
Executable file
|
|
@ -0,0 +1,179 @@
|
|||
#!/bin/bash
|
||||
|
||||
# To run script: ./runQueries.sh <IP for data node> <index name> <test name for datadog tag>
|
||||
|
||||
DATANODE0=""
|
||||
INDEX=""
|
||||
TEST_NAME=""
|
||||
|
||||
getEpochTime() {
|
||||
DATE=$1
|
||||
# epoch time since Jan 1, 1970 in days
|
||||
# DATE format is expected to be %Y%M%D
|
||||
EPOCH_DATE=$(echo $(( ($(date --date="$DATE" +%s) - $(date --date="700101" +%s)) /(60*60*24))))
|
||||
}
|
||||
|
||||
|
||||
delete(){
|
||||
# get shards for index
|
||||
SHARDS=$(curl -s ${DATANODE0}:10101/internal/index/${INDEX}/shards | jq '.shards[]')
|
||||
|
||||
OLDEST_DATE="220102"
|
||||
getEpochTime $OLDEST_DATE
|
||||
|
||||
echo "running delete query for data older than ${OLDEST_DATE} - epoch in days: ${EPOCH_DATE}"
|
||||
|
||||
# increment epoch by 1 before creating query string to exclude oldest date
|
||||
((EPOCH_DATE=$EPOCH_DATE+1))
|
||||
|
||||
UNION_STRING=""
|
||||
for day in {0..29}
|
||||
do
|
||||
CURR_STRING="Row(lastupdated=$EPOCH_DATE)"
|
||||
|
||||
# concatenate row query string
|
||||
UNION_STRING="$UNION_STRING$CURR_STRING,"
|
||||
|
||||
# increment date by 1
|
||||
((EPOCH_DATE=$EPOCH_DATE+1))
|
||||
done
|
||||
|
||||
# perform delete per shard - get all records that have not been updated in the last 30 days
|
||||
for SHARD in ${SHARDS}
|
||||
do
|
||||
SHARD_COUNT=$(curl -s ${DATANODE0}:10101/index/${INDEX}/query -d "Options(Count(Not(Union($UNION_STRING))), shards=[${SHARD}])" | jq -r '.results[0]')
|
||||
if [[ $SHARD_COUNT -gt "0" ]]; then
|
||||
START=$(date +%s%N) # in nano seconds
|
||||
RES=$(curl -s ${DATANODE0}:10101/index/${INDEX}/query -d "Options(Delete(Not(Union($UNION_STRING))), shards=[${SHARD}])")
|
||||
END=$(date +%s%N) # in nano seconds
|
||||
DURATION=$(($(($END-$START))/1000000)) # convert from ns to ms
|
||||
echo "deleting records older than ${OLDEST_DATE} from shard ${SHARD}, count: ${SHARD_COUNT}, duration: ${DURATION}ms, result: ${RES}"
|
||||
echo -n "delete_count_per_shard:$SHARD_COUNT|g|#shard:$SHARD,test_name:$TEST_NAME,delete_cycle:$DELETE_CYCLE" | nc -4u -w1 127.0.0.1 8125
|
||||
echo -n "delete_duration_per_shard_ms:$DURATION|g|#shard:$SHARD,test_name:$TEST_NAME,delete_cycle:$DELETE_CYCLE" | nc -4u -w1 127.0.0.1 8125
|
||||
# commented since it was spamming the logs, only needed for debugging
|
||||
# else
|
||||
# echo "no records found to delete for index $INDEX for query: Options(Count(Not(Union($UNION_STRING))),shards=[${SHARD}])"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
countAll(){
|
||||
echo "running countAll query: $i"
|
||||
QUERY_STRING=countAll
|
||||
START_COUNT=$(date +%s%N) # in nano seconds
|
||||
TOTAL_COUNT=$(curl -s "${DATANODE0}:10101/index/${INDEX}/query" -d "Count(all())" | jq -r '.results[0]')
|
||||
END_COUNT=$(date +%s%N) # in nano seconds
|
||||
DURATION_COUNT=$(($(($END_COUNT-$START_COUNT))/1000000)) # convert from ns to ms
|
||||
|
||||
echo "count for $QUERY_STRING is ${TOTAL_COUNT}, query duration is ${DURATION_COUNT}s"
|
||||
|
||||
echo -n "featurebase_count:$TOTAL_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo -n "featurebase_count_duration_ms:$DURATION_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
}
|
||||
|
||||
countIntersect(){
|
||||
echo "running countIntersect query: $i"
|
||||
SEGID_1=34999
|
||||
SEGID_2=33999
|
||||
QUERY_STRING=countIntersect_segid\(${SEGID_1}_${SEGID_2}\)
|
||||
START_COUNT=$(date +%s%N) # in nano seconds
|
||||
TOTAL_COUNT=$(curl -s "${DATANODE0}:10101/index/${INDEX}/query" -d"Count(Intersect(Row(segid=$SEGID_1), Row(segid=$SEGID_2)))" | jq -r '.results[0]')
|
||||
END_COUNT=$(date +%s%N) # in nano seconds
|
||||
DURATION_COUNT=$(($(($END_COUNT-$START_COUNT))/1000000)) # convert from ns to ms
|
||||
|
||||
|
||||
echo -n "featurebase_count:$TOTAL_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo -n "featurebase_count_duration_ms:$DURATION_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo "count for $QUERY_STRING is ${TOTAL_COUNT}, query duration is ${DURATION_COUNT}s"
|
||||
}
|
||||
|
||||
countRowDate(){
|
||||
echo "running countRowDate query: $i"
|
||||
SEGID=34999
|
||||
DATE_FROM=2022-01-15
|
||||
DATE_TO=2022-02-02
|
||||
QUERY_STRING=countRowDate_segid\(${SEGID}\)_date\(${DATE_FROM}_${DATE_TO}\)
|
||||
START_COUNT=$(date +%s%N) # in nano seconds
|
||||
TOTAL_COUNT=$(curl -s "${DATANODE0}:10101/index/${INDEX}/query" -d"Count(Row(segid=$SEGID, from='$DATE_FROM', to='$DATE_TO'))" | jq -r '.results[0]')
|
||||
END_COUNT=$(date +%s%N) # in nano seconds
|
||||
DURATION_COUNT=$(($(($END_COUNT-$START_COUNT))/1000000)) # convert from ns to ms
|
||||
|
||||
echo -n "featurebase_count:$TOTAL_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo -n "featurebase_count_duration_ms:$DURATION_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo "count for $QUERY_STRING is ${TOTAL_COUNT}, query duration is ${DURATION_COUNT}s"
|
||||
}
|
||||
|
||||
extract(){
|
||||
echo "running extract query: $i"
|
||||
FIELD=lastupdated
|
||||
LIMIT=3
|
||||
QUERY_STRING=extract_row\(${FIELD}\)_limit\(${LIMIT}\)
|
||||
START_COUNT=$(date +%s%N) # in nano seconds
|
||||
TOTAL_COUNT=$(curl -s "${DATANODE0}:10101/index/${INDEX}/query" -d"Extract(Limit(All( ), limit=$LIMIT), Rows(lastupdated))"| jq -r '[..|scalars]|length')
|
||||
END_COUNT=$(date +%s%N) # in nano seconds
|
||||
DURATION_COUNT=$(($(($END_COUNT-$START_COUNT))/1000000000)) # convert from ns to s
|
||||
|
||||
echo -n "featurebase_extract:$TOTAL_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo -n "featurebase_extract_duration_s:$DURATION_COUNT|g|#test_name:$TEST_NAME,query_string:$QUERY_STRING" | nc -4u -w1 127.0.0.1 8125
|
||||
echo "count for $QUERY_STRING is ${TOTAL_COUNT}, query duration is ${DURATION_COUNT}s"
|
||||
}
|
||||
|
||||
disk_usage() {
|
||||
TOTAL_DISK=0
|
||||
for IP in ${DEPLOYED_DATA_IPS[@]}
|
||||
do
|
||||
DISK_PER_NODE=$(curl -s $IP:10101/internal/disk-usage | jq -r '.usage')
|
||||
DISK_PER_NODE=$(($DISK_PER_NODE/1000000000)) # conver to GB
|
||||
echo "disk usage is ${DISK_PER_NODE}GB for data node ${IP}"
|
||||
TOTAL_DISK=$(($TOTAL_DISK+$DISK_PER_NODE))
|
||||
done
|
||||
echo -n "featurebase_disk_usage_GB:$TOTAL_DISK|g|#test_name:$TEST_NAME" | nc -4u -w1 127.0.0.1 8125
|
||||
echo "total disk usage for all nodes is ${TOTAL_DISK}GB"
|
||||
}
|
||||
|
||||
memory_usage() {
|
||||
TOTAL_MEMORY=0
|
||||
for IP in ${DEPLOYED_DATA_IPS[@]}
|
||||
do
|
||||
MEMORY_PER_NODE=$(curl -s localhost:10101/internal/mem-usage | jq -r '.totalUsed')
|
||||
MEMORY_PER_NODE=$(($MEMORY_PER_NODE/1000000000)) # conver to GB
|
||||
echo "memory usage is ${MEMORY_PER_NODE}GB for data node ${IP}"
|
||||
TOTAL_MEMORY=$(($TOTAL_MEMORY+$MEMORY_PER_NODE))
|
||||
done
|
||||
echo -n "featurebase_memory_usage_GB:$TOTAL_MEMORY|g|#test_name:$TEST_NAME" | nc -4u -w1 127.0.0.1 8125
|
||||
echo "total memory usage for all nodes is ${TOTAL_MEMORY}GB"
|
||||
}
|
||||
|
||||
runAllQueries(){
|
||||
echo "Start running queries"
|
||||
echo "run multiple queries 10 times"
|
||||
for i in {1..10}
|
||||
do
|
||||
countAll
|
||||
countIntersect
|
||||
countRowDate
|
||||
extract
|
||||
done
|
||||
|
||||
# get count, disk and memory prior to delete
|
||||
countAll
|
||||
disk_usage
|
||||
memory_usage
|
||||
|
||||
# perform delete
|
||||
delete
|
||||
|
||||
# get count, disk and memory after delete
|
||||
countAll
|
||||
disk_usage
|
||||
memory_usage
|
||||
}
|
||||
|
||||
DATANODE0=$1
|
||||
INDEX=$2
|
||||
TEST_NAME=$3
|
||||
DEPLOYED_DATA_IPS=("${@:4}")
|
||||
|
||||
echo "Data node IPs: ${DEPLOYED_DATA_IPS[@]}"
|
||||
|
||||
runAllQueries
|
||||
44
qa/scripts/delete/schema.json
Normal file
44
qa/scripts/delete/schema.json
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
[
|
||||
{
|
||||
"name": "uuid",
|
||||
"path": [
|
||||
"uuid"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "type",
|
||||
"path": [
|
||||
"type"
|
||||
],
|
||||
"type": "id"
|
||||
},
|
||||
{
|
||||
"name": "segid",
|
||||
"path": [
|
||||
"slice"
|
||||
],
|
||||
"type": "ids",
|
||||
"config": {
|
||||
"quantum": "D"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "timestamp",
|
||||
"path": [
|
||||
"ts"
|
||||
],
|
||||
"type": "recordTime",
|
||||
"config": {
|
||||
"granularity": "s",
|
||||
"unit": "ms"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "lastupdated",
|
||||
"path": [
|
||||
"lastupdated"
|
||||
],
|
||||
"type": "id"
|
||||
}
|
||||
]
|
||||
65
qa/scripts/delete/tremor_keys.yaml
Normal file
65
qa/scripts/delete/tremor_keys.yaml
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
fields:
|
||||
- name: "uuid"
|
||||
type: string
|
||||
distribution: "shifting" # zipfian distruction and shifting the window over time.
|
||||
step: 2 # step for "shifting" distribution means how often do we shift. Every time we generate a value, we'll add an amount to it, every <step> generations, we'll increase the amount by one.
|
||||
cardinality: 4000000000
|
||||
max_len: 32
|
||||
s: 1.0001
|
||||
v: 1
|
||||
null_chance: 0
|
||||
- name: "type"
|
||||
type: "int" # (default IntField)
|
||||
min: 0
|
||||
max: 3
|
||||
distribution: "zipfian"
|
||||
s: 1.1
|
||||
v: 5.1
|
||||
- name: "ts"
|
||||
type: "timestamp"
|
||||
min_date: 2022-01-02T15:04:05.001Z # RFC3339Nano
|
||||
max_date: 2022-02-02T15:04:05.001Z # RFC3339Nano
|
||||
distribution: "increasing" # only "increasing" is supported right now
|
||||
min_step_duration: "1ns"
|
||||
max_step_duration: "2.50ms"
|
||||
time_format: "unix"
|
||||
time_unit: "ms"
|
||||
- name: "lastupdated"
|
||||
type: "timestamp"
|
||||
min_date: 2022-01-02T15:04:05.001Z # RFC3339Nano
|
||||
max_date: 2022-02-02T15:04:05.001Z # RFC3339Nano
|
||||
distribution: "increasing" # only "increasing" is supported right now
|
||||
min_step_duration: "1ns"
|
||||
max_step_duration: "2.50ms"
|
||||
time_format: "unix"
|
||||
time_unit: "d"
|
||||
- name: "slice"
|
||||
type: "uint-set" # (default IDArrayField)
|
||||
min: 0
|
||||
max: 35000
|
||||
distribution: "zipfian"
|
||||
s: 1.1
|
||||
v: 5.1
|
||||
min_num: 1
|
||||
max_num: 50
|
||||
|
||||
# idk_params describe how data from "fields" should be ingested by IDK
|
||||
idk_params:
|
||||
primary_key_config:
|
||||
field: "uuid" # if this is a single field named "id" then we'll use uint IDs, if it's empty we'll autogen ids, and if it's anything else we'll do string keys... yes this is a bit hacky, needs to be cleaned up.
|
||||
# fields is keyed by names of fields from top level "fields". It is
|
||||
# not required that all fields appear here, those that don't will
|
||||
# use the default ingestion.
|
||||
fields:
|
||||
lastupdated:
|
||||
- type: "ID"
|
||||
ts:
|
||||
- type: "RecordTime"
|
||||
unit: "ms"
|
||||
name: "timestamp"
|
||||
slice:
|
||||
- type: "IDArray"
|
||||
quantum: "D"
|
||||
name: "segid"
|
||||
type:
|
||||
- type: "ID"
|
||||
21
qa/scripts/getASGInstanceIPs.sh
Executable file
21
qa/scripts/getASGInstanceIPs.sh
Executable file
|
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash
|
||||
|
||||
# usage of this script:
|
||||
# ./getInstanceIPs.sh my-asg-name my-aws-profile-name
|
||||
|
||||
# if you have used the FeatureBaseCLusterCFTTremor.yaml cloudoformation template,
|
||||
# then you can do the following to save the IPs of the auto scaling groups:
|
||||
|
||||
# for the featurebase data nodes ips:
|
||||
# DEPLOYED_DATA_IPS=$(./getASGInstanceIPs.sh ${STACK_NAME}-asg ${AWS_PROFILE})
|
||||
|
||||
# for the producer nodes:
|
||||
# PRODUCER_IPS=$(./getASGInstanceIPs.sh ${STACK_NAME}-producer-asg ${AWS_PROFILE})
|
||||
|
||||
# for the consumer nodes:
|
||||
# CONSUMER_IPS=$(./getASGInstanceIPs.sh ${STACK_NAME}-consumer-asg ${AWS_PROFILE})
|
||||
|
||||
for i in `aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name $1 --profile $2 --output=json | grep -i instanceid | awk '{ print $2}' | cut -d',' -f1| sed -e 's/"//g'`
|
||||
do
|
||||
aws ec2 describe-instances --output=json --instance-ids $i --profile $2 | grep -i PrivateIpAddress | awk '{ print $2 }' | head -1 | cut -d"," -f1| sed -e 's/"//g'
|
||||
done;
|
||||
35
qa/scripts/runTremorDeleteCFT.sh
Executable file
35
qa/scripts/runTremorDeleteCFT.sh
Executable file
|
|
@ -0,0 +1,35 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
set +x
|
||||
|
||||
# before running, it is expected that ./setupTremorDeleteTestCFT.sh has been run in a running cluster
|
||||
# To run script: ./runTremorDeleteTestCFT.sh <10.0.105.100-name> <aws profile>
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
|
||||
STACK_NAME=$1
|
||||
AWS_PROFILE=$2
|
||||
|
||||
# get the data node ips
|
||||
DEPLOYED_DATA_IPS=($($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-asg ${AWS_PROFILE}))
|
||||
echo "DEPLOYED_DATA_IPS: {"
|
||||
echo "${DEPLOYED_DATA_IPS[@]}"
|
||||
echo "}"
|
||||
|
||||
DATANODE0=${DEPLOYED_DATA_IPS[0]}
|
||||
echo "using DATANODE0 ${DATANODE0}"
|
||||
|
||||
# get producer node IP
|
||||
PRODUCER_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-producer-asg ${AWS_PROFILE})
|
||||
PRODUCER0=$(echo $PRODUCER_IPS | head -n1 | cut -d " " -f1)
|
||||
|
||||
# get consumer node IP
|
||||
CONSUMER_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-consumer-asg ${AWS_PROFILE})
|
||||
CONSUMER0=$(echo $CONSUMER_IPS | head -n1 | cut -d " " -f1)
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
source $SCRIPT_DIR/delete/runDeleteTest.sh
|
||||
|
||||
# run test
|
||||
runIngestAndQueries ${DATANODE0} ${PRODUCER0} ${CONSUMER0} "${DEPLOYED_DATA_IPS[@]}"
|
||||
|
||||
|
|
@ -15,6 +15,12 @@ terraform apply -input=false -auto-approve
|
|||
terraform output -json > outputs.json
|
||||
popd
|
||||
|
||||
# path for ebs device
|
||||
EBS_DEVICE_NAME=/dev/nvme1n1
|
||||
|
||||
# featurebase architecture
|
||||
FB_BINARY=featurebase_linux_arm64
|
||||
|
||||
# get the first ingest host
|
||||
INGESTNODE0=$(cat ./qa/tf/ci/smoketest/outputs.json | jq -r '[.ingest_ips][0]["value"][0]')
|
||||
echo "using INGESTNODE0 ${INGESTNODE0}"
|
||||
|
|
|
|||
|
|
@ -20,6 +20,9 @@ echo "installing go"
|
|||
sudo yum install wget -y
|
||||
ifErr "installing wget"
|
||||
|
||||
sudo yum install git -y
|
||||
ifErr "installing git"
|
||||
|
||||
sudo wget -q https://go.dev/dl/go1.17.8.linux-arm64.tar.gz
|
||||
ifErr "downloading golang"
|
||||
|
||||
|
|
|
|||
116
qa/scripts/setupTremorDeleteCFT.sh
Executable file
116
qa/scripts/setupTremorDeleteCFT.sh
Executable file
|
|
@ -0,0 +1,116 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Make sure you have already deployed your cloudformation stack
|
||||
# before you run this script
|
||||
# To run script: ./setupTremorDeleteTestCFT.sh <stack-name> <aws profile> <replica count> <fb instance count> <branch-name>
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
source $SCRIPT_DIR/utilCluster.sh
|
||||
|
||||
# store arguments
|
||||
STACK_NAME=$1
|
||||
AWS_PROFILE=$2
|
||||
DEPLOYED_CLUSTER_REPLICA_COUNT=$3
|
||||
DEPLOYED_CLUSTER_INSTANCE_COUNT=$4
|
||||
BRANCH_NAME=$5
|
||||
|
||||
# update ebs device name for ingest nodes
|
||||
EBS_DEVICE_NAME="/dev/sdb"
|
||||
|
||||
# get producer ip (assume only 1 instance for now)
|
||||
PRODUCER_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-producer-asg ${AWS_PROFILE})
|
||||
PRODUCER0=$(echo $PRODUCER_IPS | head -n1 | cut -d " " -f1)
|
||||
echo "setting up producer node, producer_ip: $PRODUCER0, EBS device: $EBS_DEVICE_NAME"
|
||||
setupProducerNode $PRODUCER0
|
||||
|
||||
# setup consumer
|
||||
CONSUMER_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-consumer-asg ${AWS_PROFILE})
|
||||
CONSUMER0=$(echo $CONSUMER_IPS | head -n1 | cut -d " " -f1)
|
||||
echo "setting up consumer node, consumer_ip: $CONSUMER0, EBS device: $EBS_DEVICE_NAME"
|
||||
setupConsumerNode $CONSUMER0
|
||||
|
||||
# no ebs device, using nvme instead, we can skip ebs mount in executeGeneralNodeConfigCommands()
|
||||
# nvme is used for data nodes
|
||||
EBS_DEVICE_NAME="nvme"
|
||||
|
||||
# get featurebase binary from the current branch
|
||||
FB_BINARY=featurebase_linux_amd64
|
||||
echo "Downloading FeatureBase binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/featurebase/${BRANCH_NAME}/_latest/featurebase_linux_amd64 ./ --profile=$AWS_PROFILE
|
||||
|
||||
# get the data node ips
|
||||
DEPLOYED_DATA_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-asg ${AWS_PROFILE})
|
||||
echo "DEPLOYED_DATA_IPS: {"
|
||||
echo "${DEPLOYED_DATA_IPS}"
|
||||
echo "}"
|
||||
DEPLOYED_DATA_IPS_LEN=`echo "$DEPLOYED_DATA_IPS" | wc -l`
|
||||
|
||||
# poll for autoscaling instance counts, until it matches the desired count
|
||||
ASG_NOT_STABLE="true"
|
||||
for i in {0..24}
|
||||
do
|
||||
if [ $DEPLOYED_DATA_IPS_LEN -eq $DEPLOYED_CLUSTER_INSTANCE_COUNT ]
|
||||
then
|
||||
echo "Autoscaling group is ready after ${i} tries."
|
||||
ASG_NOT_STABLE="false"
|
||||
break
|
||||
fi
|
||||
echo "waiting for autoscaling group to reach steady state..."
|
||||
sleep 10
|
||||
DEPLOYED_DATA_IPS=$($SCRIPT_DIR/getASGInstanceIPs.sh ${STACK_NAME}-asg ${AWS_PROFILE})
|
||||
echo "DEPLOYED_DATA_IPS: {"
|
||||
echo "${DEPLOYED_DATA_IPS}"
|
||||
echo "}"
|
||||
DEPLOYED_DATA_IPS_LEN=`echo "$DEPLOYED_DATA_IPS" | wc -l`
|
||||
done
|
||||
|
||||
if [[ "$ASG_NOT_STABLE" == "true" ]]
|
||||
then
|
||||
echo "Autoscaling group still unstable - giving up"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATANODE0=$(echo $DEPLOYED_DATA_IPS | head -n1 | cut -d " " -f1)
|
||||
echo "using DATANODE0 ${DATANODE0}"
|
||||
|
||||
# define some env var and print them
|
||||
DEPLOYED_CLUSTER_PREFIX=${STACK_NAME}
|
||||
echo "Using DEPLOYED_CLUSTER_PREFIX: ${DEPLOYED_CLUSTER_PREFIX}"
|
||||
echo "Using DEPLOYED_CLUSTER_REPLICA_COUNT: ${DEPLOYED_CLUSTER_REPLICA_COUNT}"
|
||||
|
||||
#wait until we can connect to one of the hosts
|
||||
for i in {0..24}
|
||||
do
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 ec2-user@${DATANODE0} "pwd"
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo "Cluster is up after ${i} tries."
|
||||
break
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 ec2-user@${DATANODE0} "pwd"
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Unable to connect to cluster - giving up"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#setup data nodes
|
||||
generateInitialClusterString
|
||||
setupDataNodes
|
||||
startDataNodes
|
||||
|
||||
# copy script for test
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ./qa/scripts/delete/runQueries.sh ec2-user@${DATANODE0}:
|
||||
|
||||
# verify featurebase running
|
||||
echo "Verifying featurebase cluster running..."
|
||||
curl -s http://${DATANODE0}:10101/status
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
echo "Featurebase cluster not running"
|
||||
exit 1
|
||||
fi
|
||||
echo "FeatureBase Cluster running."
|
||||
120
qa/scripts/setupTremorDeleteTest.sh
Executable file
120
qa/scripts/setupTremorDeleteTest.sh
Executable file
|
|
@ -0,0 +1,120 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
set +x
|
||||
|
||||
# To run script: ./setupTremorDeleteTest.sh
|
||||
export TF_IN_AUTOMATION=1
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
source $SCRIPT_DIR/utilCluster.sh
|
||||
|
||||
# path for ebs device
|
||||
EBS_DEVICE_NAME=nvme
|
||||
|
||||
# featurebase architecture
|
||||
FB_BINARY=featurebase_linux_amd64
|
||||
echo "Downloading FeatureBase binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/featurebase/master/_latest/featurebase_linux_amd64 ./ --profile=$TF_VAR_profile
|
||||
|
||||
# datagen binary
|
||||
DATAGEN_BINARY=datagen
|
||||
echo "Downloading Datagen binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/idk/master/_latest/idk-linux-amd64/datagen $DATAGEN_BINARY --profile=$TF_VAR_profile
|
||||
|
||||
KAFKA_STATIC=molecula-consumer-kafka-static
|
||||
echo "Downloading Molecular Consumer Kafka Static binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/idk/master/_latest/idk-linux-amd64/molecula-consumer-kafka-static ./$KAFKA_STATIC --profile=$TF_VAR_profile
|
||||
|
||||
# get the first ingest host
|
||||
INGESTNODE0=$(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.ingest_ips][0]["value"][0]')
|
||||
echo "using INGESTNODE0 ${INGESTNODE0}"
|
||||
|
||||
# get the first data host
|
||||
DATANODE0=$(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.data_node_ips][0]["value"][0]')
|
||||
echo "using DATANODE0 ${DATANODE0}"
|
||||
|
||||
DEPLOYED_CLUSTER_PREFIX=$(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.cluster_prefix][0]["value"]')
|
||||
echo "Using DEPLOYED_CLUSTER_PREFIX: ${DEPLOYED_CLUSTER_PREFIX}"
|
||||
|
||||
DEPLOYED_CLUSTER_REPLICA_COUNT=$(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.fb_cluster_replica_count][0]["value"]')
|
||||
echo "Using DEPLOYED_CLUSTER_REPLICA_COUNT: ${DEPLOYED_CLUSTER_REPLICA_COUNT}"
|
||||
|
||||
DEPLOYED_DATA_IPS=($(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.data_node_ips][0]["value"][]'))
|
||||
echo "DEPLOYED_DATA_IPS: {"
|
||||
echo "${DEPLOYED_DATA_IPS[@]}"
|
||||
echo "}"
|
||||
|
||||
DEPLOYED_DATA_IPS_LEN=${#DEPLOYED_DATA_IPS[@]}
|
||||
|
||||
DEPLOYED_INGEST_IPS=($(cat ./qa/tf/ci/deletetest/outputs.json | jq -r '[.ingest_ips][0]["value"][]'))
|
||||
echo "DEPLOYED_INGEST_IPS: {"
|
||||
echo "${DEPLOYED_INGEST_IPS[@]}"
|
||||
echo "}"
|
||||
|
||||
DEPLOYED_INGEST_IPS_LEN=${#DEPLOYED_INGEST_IPS[@]}
|
||||
|
||||
|
||||
#wait until we can connect to one of the hosts
|
||||
for i in {0..24}
|
||||
do
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 ec2-user@${DATANODE0} "pwd"
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo "Cluster is up after ${i} tries."
|
||||
break
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 ec2-user@${DATANODE0} "pwd"
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Unable to connect to cluster - giving up"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
setupClusterNodes
|
||||
rm $FB_BINARY
|
||||
|
||||
# verify featurebase running
|
||||
echo "Verifying featurebase cluster running..."
|
||||
curl -s http://${DATANODE0}:10101/status
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
echo "Featurebase cluster not running"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Cluster running."
|
||||
|
||||
# path for ebs device
|
||||
EBS_DEVICE_NAME=/dev/sdb
|
||||
|
||||
# copy datagen to ingest nodes
|
||||
setupIngestNode1(){
|
||||
IP=$1
|
||||
echo "Setting up first ingest node: ${IP}"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ${DATAGEN_BINARY} ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "chmod ugo+x /home/ec2-user/${DATAGEN_BINARY}"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ./qa/scripts/delete/tremor_keys.yaml ./qa/scripts/delete/kafkaIngest.sh ec2-user@${IP}:
|
||||
setupKafkaServer ${IP}
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install jq htop tmux -y"
|
||||
}
|
||||
|
||||
setupIngestNode2(){
|
||||
IP=$1
|
||||
echo "Setting up second ingest node: ${IP}"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ./qa/scripts/delete/schema.json ./qa/scripts/delete/featurebaseIngest.sh ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install librdkafka -y"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ${KAFKA_STATIC} ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "chmod ugo+x /home/ec2-user/${KAFKA_STATIC}"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install jq htop tmux nc -y"
|
||||
}
|
||||
|
||||
if [[ $DEPLOYED_INGEST_IPS_LEN -ne "2" ]]; then
|
||||
echo "error expected 2 ingest nodes, got $DEPLOYED_INGEST_IPS_LEN"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
setupIngestNode1 ${DEPLOYED_INGEST_IPS[0]}
|
||||
setupIngestNode2 ${DEPLOYED_INGEST_IPS[1]}
|
||||
7
qa/scripts/teardownTremorDeleteTest.sh
Executable file
7
qa/scripts/teardownTremorDeleteTest.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
# To run script: ./teardownTremorDeleteTest.sh
|
||||
|
||||
cd qa/tf/ci/deletetest
|
||||
export TF_IN_AUTOMATION=1
|
||||
terraform destroy -auto-approve
|
||||
|
|
@ -22,6 +22,17 @@ DEPLOYED_INGEST_IPS_LEN=0
|
|||
#Initial cluster string
|
||||
INITIAL_CLUSTER=""
|
||||
|
||||
# ebs device name
|
||||
EBS_DEVICE_NAME=""
|
||||
|
||||
# featurebase binary
|
||||
FB_BINARY=""
|
||||
|
||||
# branch name
|
||||
BRANCH_NAME=""
|
||||
|
||||
# AWS Profile
|
||||
AWS_PROFILE=""
|
||||
ifErr() {
|
||||
res=$?
|
||||
if (( res != 0 )); then
|
||||
|
|
@ -55,13 +66,14 @@ EOT
|
|||
#echo "featurebase.service <<"
|
||||
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" featurebase.service ec2-user@${NODEIP}:
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
echo "featurebase.service copy failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -f featurebase.service
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mv featurebase.service ${SERVICE_FILE_PATH}"
|
||||
}
|
||||
|
||||
|
|
@ -155,6 +167,7 @@ long-query-time = "10s"
|
|||
|
||||
[metric]
|
||||
service = "prometheus"
|
||||
|
||||
EOT
|
||||
fi
|
||||
|
||||
|
|
@ -210,14 +223,26 @@ setupTLS() {
|
|||
ifErr "error setting up TLS"
|
||||
}
|
||||
|
||||
mountEBSVolume() {
|
||||
NODEIP=$1
|
||||
echo "in mountEBSVolume, EBS_DEVICE_NAME = $EBS_DEVICE_NAME, NODEIP = $NODEIP"
|
||||
# if it is nvme, then skip the following 3 lines, because we mount the device in UserData
|
||||
# in the CloudFormation template
|
||||
if [[ "$EBS_DEVICE_NAME" != "nvme" ]]; then
|
||||
echo "mounting EBS device"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mkdir /data"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mkfs.ext4 ${EBS_DEVICE_NAME}"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mount ${EBS_DEVICE_NAME} /data"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo chown -R ec2-user:ec2-user /data"
|
||||
fi
|
||||
}
|
||||
|
||||
executeGeneralNodeConfigCommands() {
|
||||
echo "Executing node config...index: $1, ip:$2"
|
||||
NODEIDX=$1
|
||||
NODEIP=$2
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mkdir -p /data"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mkfs.ext4 /dev/nvme1n1"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mount /dev/nvme1n1 /data"
|
||||
mountEBSVolume $NODEIP
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo adduser molecula"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mkdir /var/log/molecula"
|
||||
|
|
@ -226,18 +251,17 @@ executeGeneralNodeConfigCommands() {
|
|||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo chown molecula /data/featurebase"
|
||||
|
||||
# TODO handle different archs
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" featurebase_linux_arm64 ec2-user@${NODEIP}:
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ${FB_BINARY} ec2-user@${NODEIP}:
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
echo "featurebase binary copy failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "chown ec2-user:ec2-user /home/ec2-user/featurebase_linux_arm64"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "chmod ugo+x /home/ec2-user/featurebase_linux_arm64"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mv /home/ec2-user/featurebase_linux_arm64 /usr/local/bin/featurebase"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo yum install git -y"
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "chown ec2-user:ec2-user /home/ec2-user/${FB_BINARY}"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "chmod ugo+x /home/ec2-user/${FB_BINARY}"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mv /home/ec2-user/${FB_BINARY} /usr/local/bin/featurebase"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo yum install jq htop tmux nc -y"
|
||||
echo "featurebase binary copied."
|
||||
|
||||
if [[ "$AUTH_ENABLED" = "1" ]]; then
|
||||
|
|
@ -272,7 +296,7 @@ executeDataStartCommands() {
|
|||
startDataNodes() {
|
||||
#now go thru loop again to start up each node
|
||||
cnt=0
|
||||
for ip in $DEPLOYED_DATA_IPS
|
||||
for ip in ${DEPLOYED_DATA_IPS[@]}
|
||||
do
|
||||
executeDataStartCommands $cnt $ip
|
||||
cnt=$((cnt+1))
|
||||
|
|
@ -294,7 +318,6 @@ setupIngestNode() {
|
|||
|
||||
executeGeneralNodeConfigCommands $1 $2
|
||||
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo chown -R ec2-user /data"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "pip3 install -U pytest"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "pip3 install -U requests"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "pip3 install -U json"
|
||||
|
|
@ -304,18 +327,21 @@ setupIngestNode() {
|
|||
|
||||
setupDataNodes() {
|
||||
cnt=0
|
||||
for ip in $DEPLOYED_DATA_IPS
|
||||
for ip in ${DEPLOYED_DATA_IPS[@]}
|
||||
do
|
||||
setupDataNode $cnt $ip
|
||||
setupDatadog $ip "featurebase"
|
||||
cnt=$((cnt+1))
|
||||
done
|
||||
}
|
||||
|
||||
setupIngestNodes() {
|
||||
cnt=0
|
||||
for ip in $DEPLOYED_INGEST_IPS
|
||||
echo "setupIngestNodes: " ${DEPLOYED_INGEST_IPS[@]}
|
||||
for ip in ${DEPLOYED_INGEST_IPS[@]}
|
||||
do
|
||||
setupIngestNode $cnt $ip
|
||||
setupDatadog $ip "ingest"
|
||||
cnt=$((cnt+1))
|
||||
done
|
||||
}
|
||||
|
|
@ -323,7 +349,7 @@ setupIngestNodes() {
|
|||
generateInitialClusterString() {
|
||||
IFS=$'\n'
|
||||
cnt=0
|
||||
for ip in $DEPLOYED_DATA_IPS
|
||||
for ip in ${DEPLOYED_DATA_IPS[@]}
|
||||
do
|
||||
if (($cnt + 1 != $DEPLOYED_DATA_IPS_LEN))
|
||||
then
|
||||
|
|
@ -355,6 +381,166 @@ setupClusterNodes() {
|
|||
|
||||
}
|
||||
|
||||
writeKafkaServerConfig() {
|
||||
echo "Writing server.properties file"
|
||||
NODEIP=$1
|
||||
|
||||
cat << EOT > server.properties
|
||||
process.roles=broker,controller
|
||||
node.id=1
|
||||
controller.quorum.voters=1@localhost:9093
|
||||
listeners=PLAINTEXT://${NODEIP}:9092,CONTROLLER://:9093
|
||||
inter.broker.listener.name=PLAINTEXT
|
||||
advertised.listeners=PLAINTEXT://${NODEIP}:9092
|
||||
controller.listener.names=CONTROLLER
|
||||
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
|
||||
num.network.threads=3
|
||||
num.io.threads=8
|
||||
socket.send.buffer.bytes=102400
|
||||
socket.receive.buffer.bytes=102400
|
||||
socket.request.max.bytes=104857600
|
||||
log.dirs=/data/kraft-combined-logs
|
||||
num.partitions=1
|
||||
num.recovery.threads.per.data.dir=1
|
||||
offsets.topic.replication.factor=1
|
||||
transaction.state.log.replication.factor=1
|
||||
transaction.state.log.min.isr=1
|
||||
log.retention.hours=168
|
||||
log.segment.bytes=1073741824
|
||||
log.retention.check.interval.ms=300000
|
||||
group.initial.rebalance.delay.ms=0
|
||||
confluent.license.topic.replication.factor=1
|
||||
confluent.metadata.topic.replication.factor=1
|
||||
confluent.security.event.logger.exporter.kafka.topic.replicas=1
|
||||
confluent.balancer.enable=true
|
||||
confluent.balancer.topic.replication.factor=1
|
||||
EOT
|
||||
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" server.properties ec2-user@${NODEIP}:/home/ec2-user/kafka/etc/kafka/kraft/server.properties
|
||||
if (( $? != 0 ))
|
||||
then
|
||||
echo "kafka config file: server.properties copy failed"
|
||||
exit 1
|
||||
fi
|
||||
rm -f server.properties
|
||||
}
|
||||
|
||||
setupKafkaServer() {
|
||||
NODEIP=$1
|
||||
|
||||
# install kafka
|
||||
echo "setting up kafka server for: $NODEIP"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo yum install java-1.8.0-openjdk nc -y"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "mkdir kafka && cd kafka && curl https://packages.confluent.io/archive/7.0/confluent-community-7.0.1.tar.gz -o kafka.tgz && tar -xvzf kafka.tgz --strip 1"
|
||||
|
||||
# update kafka config
|
||||
writeKafkaServerConfig $NODEIP
|
||||
|
||||
cat << 'EOF' >> runKafka.sh
|
||||
/home/ec2-user/kafka/bin/kafka-storage format --config /home/ec2-user/kafka/etc/kafka/kraft/server.properties --cluster-id $(/home/ec2-user/kafka/bin/kafka-storage random-uuid)
|
||||
sudo /home/ec2-user/kafka/bin/kafka-server-start /home/ec2-user/kafka/etc/kafka/kraft/server.properties > /tmp/kafka.log &
|
||||
echo "checking kafka server status"
|
||||
EOF
|
||||
|
||||
cat runKafka.sh
|
||||
# start zookeeper and kafka server
|
||||
echo "starting kafka server"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ./runKafka.sh ec2-user@${NODEIP}:.
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "bash runKafka.sh"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "timeout 60s nc -z ${NODEIP} 9092"
|
||||
# rm ./runKafka.sh
|
||||
}
|
||||
|
||||
writeDatadogConfigForIngest() {
|
||||
# general datadog config
|
||||
cat << EOT > datadog.yaml
|
||||
api_key: 6ab706d12de9cb46db25a0aabab6a004
|
||||
site: datadoghq.com
|
||||
tags:
|
||||
- team:core
|
||||
- app:${NODE_TYPE}
|
||||
- branch_name:${BRANCH_NAME}
|
||||
process_config:
|
||||
enabled: "true"
|
||||
EOT
|
||||
|
||||
# openmetrics config
|
||||
cat << EOT > conf.yaml
|
||||
# The prometheus endpoint to query from
|
||||
instances:
|
||||
- openmetrics_endpoint: "http://localhost:9093/metrics"
|
||||
namespace: "ingest"
|
||||
metrics:
|
||||
- "ingester_kafka_static_.+"
|
||||
- go*
|
||||
EOT
|
||||
}
|
||||
|
||||
writeDatadogConfigForFeaturebase() {
|
||||
# general datadog config
|
||||
cat << EOT > datadog.yaml
|
||||
api_key: 6ab706d12de9cb46db25a0aabab6a004
|
||||
site: datadoghq.com
|
||||
tags:
|
||||
- team:core
|
||||
- app:${NODE_TYPE}
|
||||
- branch_name:${BRANCH_NAME}
|
||||
process_config:
|
||||
enabled: "true"
|
||||
EOT
|
||||
|
||||
# openmetrics config
|
||||
cat << EOT > conf.yaml
|
||||
# The prometheus endpoint to query from
|
||||
instances:
|
||||
- prometheus_url: http://localhost:10101/metrics
|
||||
namespace: "featurebase"
|
||||
metrics:
|
||||
- prometheus_target_interval_length_seconds: target_interval_length
|
||||
- http_requests_total
|
||||
- http*
|
||||
- etcd*
|
||||
- pilosa*
|
||||
- go*
|
||||
- process*
|
||||
- os*
|
||||
EOT
|
||||
}
|
||||
|
||||
setupDatadog() {
|
||||
NODEIP=$1
|
||||
NODE_TYPE=$2
|
||||
cat << 'EOF' > runDatadog.sh
|
||||
DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=6ab706d12de9cb46db25a0aabab6a004 DD_SITE="datadoghq.com" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)"
|
||||
EOF
|
||||
|
||||
if [[ "$NODE_TYPE" == "featurebase" ]]
|
||||
then
|
||||
echo "writing datadog config for featurebase node: $NODEIP, $NODE_TYPE, $BRANCH_NAME"
|
||||
writeDatadogConfigForFeaturebase
|
||||
else
|
||||
echo "writing datadog config for ingest node: $NODEIP, $NODE_TYPE, $BRANCH_NAME"
|
||||
writeDatadogConfigForIngest
|
||||
fi
|
||||
|
||||
echo "setting up datadog for $NODE_TYPE node: $NODEIP"
|
||||
echo "copying datadog config"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ./runDatadog.sh ./datadog.yaml ./conf.yaml ec2-user@${NODEIP}:.
|
||||
echo "installing datadog"
|
||||
cat ./runDatadog.sh
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "bash ./runDatadog.sh"
|
||||
echo "restarting datadog and updating config"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo systemctl stop datadog-agent"
|
||||
# update configuration and openmetrics for datadog
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mv ./datadog.yaml /etc/datadog-agent/datadog.yaml"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo mv ./conf.yaml /etc/datadog-agent/conf.d/openmetrics.d/conf.yaml"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo systemctl start datadog-agent"
|
||||
echo "checking datadog status"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo systemctl status datadog-agent"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${NODEIP} "sudo yum install nc htop -y"
|
||||
rm runDatadog.sh datadog.yaml conf.yaml
|
||||
}
|
||||
|
||||
installDatagen() {
|
||||
INGESTNODE0=$1
|
||||
# download datagen
|
||||
|
|
@ -406,3 +592,39 @@ installDatagen() {
|
|||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# copy datagen to ingest nodes
|
||||
setupProducerNode(){
|
||||
IP=$1
|
||||
|
||||
# download producer(datagen binary) from S3
|
||||
DATAGEN_BINARY=datagen
|
||||
echo "Downloading Datagen binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/idk/master/_latest/idk-linux-amd64/datagen $DATAGEN_BINARY --profile $AWS_PROFILE
|
||||
|
||||
mountEBSVolume $IP
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ${DATAGEN_BINARY} ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "chmod ugo+x /home/ec2-user/${DATAGEN_BINARY}"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ./qa/scripts/delete/tremor_keys.yaml ./qa/scripts/delete/runProducer.sh ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install jq htop tmux -y"
|
||||
setupKafkaServer ${IP}
|
||||
setupDatadog $IP "ingest"
|
||||
}
|
||||
|
||||
setupConsumerNode(){
|
||||
IP=$1
|
||||
|
||||
# download consumer(kafka-static binary) from S3
|
||||
KAFKA_STATIC=molecula-consumer-kafka-static
|
||||
echo "Downloading Molecular Consumer Kafka Static binary"
|
||||
aws s3 cp s3://molecula-artifact-storage/idk/master/_latest/idk-linux-amd64/molecula-consumer-kafka-static ./$KAFKA_STATIC --profile $AWS_PROFILE
|
||||
|
||||
mountEBSVolume $IP
|
||||
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ./qa/scripts/delete/schema.json ./qa/scripts/delete/runConsumer.sh ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install librdkafka -y"
|
||||
scp -i ~/.ssh/gitlab-featurebase-ci.pem -o "StrictHostKeyChecking no" ${KAFKA_STATIC} ec2-user@${IP}:
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "chmod ugo+x /home/ec2-user/${KAFKA_STATIC}"
|
||||
ssh -A -i ~/.ssh/gitlab-featurebase-ci.pem -o StrictHostKeyChecking=no ec2-user@${IP} "sudo yum install jq htop tmux nc -y"
|
||||
setupDatadog $IP "ingest"
|
||||
}
|
||||
4
qa/tf/.modules/featurebase-cluster/cloud-init.sh
Normal file
4
qa/tf/.modules/featurebase-cluster/cloud-init.sh
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
set +x # get debug log
|
||||
set -e # exit on errors
|
||||
|
||||
|
|
@ -27,18 +27,22 @@ resource "aws_instance" "fb_cluster_nodes" {
|
|||
subnet_id = var.subnet != "" ? var.subnet : var.vpc_private_subnets[count.index % length(var.vpc_private_subnets)]
|
||||
availability_zone = var.zone != "" ? var.zone : var.azs[count.index % length(var.azs)]
|
||||
iam_instance_profile = "${aws_iam_instance_profile.fb_cluster_node_profile.name}"
|
||||
|
||||
user_data = var.user_data != "" ? file("${var.user_data}") : file("${path.module}/cloud-init.sh")
|
||||
|
||||
root_block_device {
|
||||
volume_type = "gp3"
|
||||
volume_size = 20
|
||||
}
|
||||
|
||||
ebs_block_device {
|
||||
device_name = "/dev/sdb"
|
||||
volume_type = var.fb_data_disk_type
|
||||
volume_size = var.fb_data_disk_size_gb
|
||||
iops = var.fb_data_disk_iops
|
||||
encrypted = true
|
||||
dynamic "ebs_block_device" {
|
||||
for_each = var.ebs_volumes
|
||||
content {
|
||||
device_name = "/dev/sdb"
|
||||
volume_type = var.fb_data_disk_type
|
||||
volume_size = var.fb_data_disk_size_gb
|
||||
iops = var.fb_data_disk_iops
|
||||
encrypted = true
|
||||
}
|
||||
}
|
||||
|
||||
tags = {
|
||||
|
|
@ -46,7 +50,6 @@ resource "aws_instance" "fb_cluster_nodes" {
|
|||
Name = "${var.cluster_prefix}-featurebase-cluster-${count.index}"
|
||||
Role = "cluster_node"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
resource "aws_instance" "fb_ingest" {
|
||||
|
|
@ -191,6 +194,14 @@ resource "aws_security_group" "ingest" {
|
|||
ipv6_cidr_blocks = ["::/0"]
|
||||
}
|
||||
|
||||
ingress {
|
||||
description = "HTTP from Internal"
|
||||
from_port = 9092
|
||||
to_port = 9092
|
||||
protocol = "tcp"
|
||||
cidr_blocks = ["10.0.0.0/8", "172.31.0.0/16"]
|
||||
}
|
||||
|
||||
ingress {
|
||||
description = "SSH"
|
||||
from_port = 22
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
output "ingest_ips" {
|
||||
value = aws_instance.fb_ingest.*.public_ip
|
||||
value = aws_instance.fb_ingest.*.private_ip
|
||||
}
|
||||
|
||||
output "data_node_ips" {
|
||||
|
|
|
|||
|
|
@ -112,3 +112,14 @@ variable "vpc_private_subnets" {
|
|||
description = "A private net underneath in the VPC in which we will build the cluster"
|
||||
type = list(string)
|
||||
}
|
||||
|
||||
variable "user_data" {
|
||||
description = "Cloud init script"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "ebs_volumes" {
|
||||
type = list(string)
|
||||
default = ["/dev/sdb"]
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,4 +10,5 @@ module "ci-cluster" {
|
|||
vpc_cidr_block = "10.0.0.0/16"
|
||||
vpc_public_subnets = ["subnet-066b4b922b54e51a2", "subnet-037b8884269a69025", "subnet-08482631514426210", ]
|
||||
vpc_private_subnets = ["subnet-0319dde319380326f", "subnet-0517ca9a646d80f88", "subnet-05a7b685ed27eb1cf", ]
|
||||
user_data = "../../.modules/featurebase-cluster/cloud-init.sh"
|
||||
}
|
||||
|
|
|
|||
20
qa/tf/ci/deletetest/delete_cloud_init.sh
Normal file
20
qa/tf/ci/deletetest/delete_cloud_init.sh
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#!/bin/bash
|
||||
set +x # get debug log
|
||||
set -e # exit on errors
|
||||
|
||||
echo "----------------------------"
|
||||
echo "Running delete_cloud_init.sh"
|
||||
|
||||
# create and initialize a raid0 array
|
||||
# for m5ad.16xlarge instance type, there are 4 NVMe SSDs.
|
||||
sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 /dev/nvme4n1
|
||||
|
||||
# format filesystem
|
||||
sudo mkfs.ext4 /dev/md0
|
||||
|
||||
# create a mount directory & mount the raid drive to this directory
|
||||
sudo mkdir data
|
||||
sudo mount /dev/md0 /data
|
||||
|
||||
# change permissions from root to ec2-user for data directory
|
||||
sudo chown -R ec2-user:ec2-user /data
|
||||
18
qa/tf/ci/deletetest/main.tf
Normal file
18
qa/tf/ci/deletetest/main.tf
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
module "ci-cluster" {
|
||||
source = "../../.modules/featurebase-cluster"
|
||||
cluster_prefix = var.cluster_prefix
|
||||
region = var.region
|
||||
profile = var.profile
|
||||
fb_cluster_arch = ["x86_64"]
|
||||
fb_data_node_type = "m5ad.16xlarge"
|
||||
fb_data_node_count = 5
|
||||
ebs_volumes = []
|
||||
fb_ingest_type = "m4.16xlarge"
|
||||
fb_ingest_node_count = 2
|
||||
fb_ingest_disk_size_gb = 1200
|
||||
vpc_id = "vpc-05a26a122f961dc2b"
|
||||
vpc_cidr_block = "10.0.0.0/16"
|
||||
vpc_public_subnets = ["subnet-066b4b922b54e51a2","subnet-037b8884269a69025","subnet-08482631514426210",]
|
||||
vpc_private_subnets = ["subnet-0319dde319380326f","subnet-0517ca9a646d80f88","subnet-05a7b685ed27eb1cf",]
|
||||
user_data = "./delete_cloud_init.sh"
|
||||
}
|
||||
19
qa/tf/ci/deletetest/outputs.tf
Normal file
19
qa/tf/ci/deletetest/outputs.tf
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
output "ingest_ips" {
|
||||
description = "List of ingest IPs"
|
||||
value = module.ci-cluster.ingest_ips
|
||||
}
|
||||
|
||||
output "data_node_ips" {
|
||||
description = "List of data node IPs"
|
||||
value = module.ci-cluster.data_node_ips
|
||||
}
|
||||
|
||||
output "cluster_prefix" {
|
||||
description = "The cluster prefix used"
|
||||
value = module.ci-cluster.cluster_prefix
|
||||
}
|
||||
|
||||
output "fb_cluster_replica_count" {
|
||||
description = "The cluster replica count used"
|
||||
value = module.ci-cluster.fb_cluster_replica_count
|
||||
}
|
||||
4
qa/tf/ci/deletetest/provider.tf
Normal file
4
qa/tf/ci/deletetest/provider.tf
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
provider "aws" {
|
||||
region = var.region
|
||||
profile = var.profile
|
||||
}
|
||||
2
qa/tf/ci/deletetest/tf.auto.tfvars
Normal file
2
qa/tf/ci/deletetest/tf.auto.tfvars
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
region = "us-east-2"
|
||||
profile = "service-terraform"
|
||||
15
qa/tf/ci/deletetest/variables.tf
Normal file
15
qa/tf/ci/deletetest/variables.tf
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
variable "region" {
|
||||
description = "The AWS region in which the VPC should be built"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "profile" {
|
||||
description = "The name of the AWS profile Terraform should use for auth."
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "cluster_prefix" {
|
||||
type = string
|
||||
description = "This is a identifier that will be prefixed to created resources"
|
||||
}
|
||||
|
||||
|
|
@ -11,4 +11,5 @@ module "ci-cluster" {
|
|||
vpc_cidr_block = "10.0.0.0/16"
|
||||
vpc_public_subnets = ["subnet-066b4b922b54e51a2","subnet-037b8884269a69025","subnet-08482631514426210",]
|
||||
vpc_private_subnets = ["subnet-0319dde319380326f","subnet-0517ca9a646d80f88","subnet-05a7b685ed27eb1cf",]
|
||||
user_data = "../../.modules/featurebase-cluster/cloud-init.sh"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue