The replace operation provisions a new Vector Store node in the same availability zone as the dead node, waits for it to fetch all data from ScyllaDB and rebuild its indexes, then decommissions the old node. This is an add-then-remove strategy that ensures zero downtime for vector search queries (assuming other VS nodes in the cluster remain healthy).
The duration of this procedure depends on the data volume and index complexity. Index rebuilding can take anywhere from a few minutes to over an hour.
The ScyllaDB cluster must be healthy and reachable. The new Vector Store node needs to connect to a ScyllaDB node via CQL to fetch data and build indexes.
Collect the following information from the dead Vector Store node (or from your infrastructure records):
- Private IP address of the dead node
- Availability zone / rack the node was running in
- Instance type (e.g.,
i3.xlarge) - Vector Store version (the version of the
vector-storebinary or AMI)
If you have other healthy Vector Store nodes in the cluster, SSH into one and collect:
# View the current configuration
cat /home/ubuntu/.envThis will show the environment variables used by the Vector Store service, including the CQL username, password file path, ScyllaDB connection URI, and TLS settings. You will replicate this configuration (with appropriate IP changes) on the replacement node.
You need the CQL username and password that Vector Store uses to connect to ScyllaDB. On a healthy VS node:
# Username is in the .env file
grep VECTOR_STORE_SCYLLADB_USERNAME /home/ubuntu/.env
# Password is stored on a tmpfs mount
sudo cat /mnt/vector_store/.vector_store_password.txtLaunch a new VM using the same Vector Store AMI/image as the dead node:
- Same instance type as the dead node
- Same availability zone (rack) as the dead node
- Same VPC and subnet as the rest of the cluster
- Enable root volume encryption
Note: The instance name convention used by ScyllaDB Cloud is
Scylla-Cloud-<CLUSTER_ID>-<DC_NAME>-VectorSearch-<NODE_ID>on AWS, andscylla-cloud-<cluster_id>-vectorsearch-<node_id>-<checksum>on GCP. You can use any naming convention that fits your environment.
The following network access is required:
| Direction | From | To | Port | Purpose |
|---|---|---|---|---|
| Inbound | ScyllaDB nodes | New VS node | TCP 6080 | ScyllaDB connects to VS for vector search |
| Inbound | Prometheus / monitoring | New VS node | TCP 6080 | Metrics scraping (/metrics endpoint) |
| Outbound | New VS node | A ScyllaDB node in the same rack | TCP 9042 | CQL native transport |
| Outbound | New VS node | A ScyllaDB node in the same rack | TCP 9142 | CQL native transport (SSL), if encryption is enabled |
On AWS, update the relevant security groups. On GCP, update the firewall rules.
SSH into the new node and perform the following steps.
The CQL password must be stored in memory only (tmpfs) for security:
sudo mkdir -p /mnt/vector_store
sudo mount -t tmpfs -o size=10m tmpfs /mnt/vector_store# Replace <PASSWORD> with the actual CQL password collected earlier
echo -n '<PASSWORD>' | sudo tee /mnt/vector_store/.vector_store_password.txt > /dev/null
sudo chown ubuntu:ubuntu /mnt/vector_store/.vector_store_password.txt
sudo chmod 600 /mnt/vector_store/.vector_store_password.txtCreate /home/ubuntu/.env with the following content. Replace the placeholder values with your actual configuration:
Without client-to-node encryption:
cat > /home/ubuntu/.env << 'EOF'
export VECTOR_STORE_SCYLLADB_URI=<SCYLLA_PRIVATE_IP>:9042
export VECTOR_STORE_URI=0.0.0.0:6080
export VECTOR_STORE_SCYLLADB_USERNAME=<CQL_USERNAME>
export VECTOR_STORE_SCYLLADB_PASSWORD_FILE=/mnt/vector_store/.vector_store_password.txt
EOF
chmod 600 /home/ubuntu/.env
chown ubuntu:ubuntu /home/ubuntu/.envWith client-to-node encryption (SSL CQL):
cat > /home/ubuntu/.env << 'EOF'
export VECTOR_STORE_SCYLLADB_URI=<SCYLLA_PRIVATE_IP>:9142
export VECTOR_STORE_URI=0.0.0.0:6080
export VECTOR_STORE_SCYLLADB_USERNAME=<CQL_USERNAME>
export VECTOR_STORE_SCYLLADB_PASSWORD_FILE=/mnt/vector_store/.vector_store_password.txt
export VECTOR_STORE_SCYLLADB_CERTIFICATE_FILE=/home/ubuntu/vector_store_client.pem
EOF
chmod 600 /home/ubuntu/.env
chown ubuntu:ubuntu /home/ubuntu/.envIf your deployment also uses HTTPS for the Vector Store API (ScyllaDB-to-VS communication), add these lines:
export VECTOR_STORE_TLS_CERT_PATH=/home/ubuntu/server_cert.pem
export VECTOR_STORE_TLS_KEY_PATH=/home/ubuntu/server_key.pem
And provision the corresponding TLS certificate and key files (signed by the same CA used for client-to-node encryption).
Important:
VECTOR_STORE_SCYLLADB_URIshould point to the private IP of a single ScyllaDB node in the same rack/AZ as the Vector Store node. The Vector Store connects to one ScyllaDB node, not the entire cluster.
If client-to-node encryption is enabled, copy the CA certificate to the new VS node:
# Copy the CA certificate used for client-to-node encryption
scp ca-cert.pem ubuntu@<NEW_VS_NODE_IP>:/home/ubuntu/vector_store_client.pem
ssh ubuntu@<NEW_VS_NODE_IP> 'chmod 600 /home/ubuntu/vector_store_client.pem'If HTTPS is enabled for the VS API, generate and provision a server certificate signed by the same CA:
# Generate a server certificate for the VS node's IP
# (use your CA to sign it, with the VS node's private IP as the CN/SAN)
scp server_cert.pem ubuntu@<NEW_VS_NODE_IP>:/home/ubuntu/server_cert.pem
scp server_key.pem ubuntu@<NEW_VS_NODE_IP>:/home/ubuntu/server_key.pem
ssh ubuntu@<NEW_VS_NODE_IP> 'chmod 600 /home/ubuntu/server_cert.pem /home/ubuntu/server_key.pem'If HTTPS is enabled, you must also ensure the CA certificate (truststore) is configured on each ScyllaDB node so that ScyllaDB can verify the VS node's TLS certificate. If this is already set up for the existing VS nodes, no action is needed. If not, upload the CA cert to each ScyllaDB node and configure vector_store_encryption_options in scylla.yaml — this requires a ScyllaDB restart.
sudo systemctl start vector-storeVerify the service is running:
sudo systemctl status vector-storeThe service should show as active (running). If it fails to start, check the logs:
sudo journalctl -u vector-store -fAfter starting, the Vector Store node fetches data from ScyllaDB and builds its indexes. Poll the status endpoint until it returns SERVING:
# Without TLS:
watch -n 30 'curl -s http://localhost:6080/api/v1/status'
# With TLS:
watch -n 30 'curl -sk https://localhost:6080/api/v1/status'The endpoint returns a plain-text string:
- While initializing: a status other than
SERVING(or a connection error) - When ready:
SERVING
This can take up to 1 hour or more depending on the data volume and number of indexes. Do not proceed to the next step until the status is SERVING.
Once the new VS node is ready, update the ScyllaDB nodes so they know about the replacement.
On each ScyllaDB node in the same datacenter, update scylla.yaml with the new Vector Store URIs:
vector_store_primary_uri— Comma-separated list of Vector Store node URIs in the same rack as the ScyllaDB node. Example:http://10.0.1.5:6080(orhttps://...if TLS is enabled).vector_store_secondary_uri— Comma-separated list of Vector Store node URIs in other racks within the same datacenter.
For example, if you have 3 racks (A, B, C) with one VS node each, a ScyllaDB node in rack A would have:
vector_store_primary_uri: "http://10.0.1.5:6080" # VS node in rack A
vector_store_secondary_uri: "http://10.0.2.5:6080,http://10.0.3.5:6080" # VS nodes in racks B and CReplace the dead node's IP with the new node's IP in these URIs.
After updating scylla.yaml, trigger a configuration reload. Setting vector_store_primary_uri triggers an automatic reload in ScyllaDB — alternatively, you can reload explicitly. No ScyllaDB restart is required for URI changes (a restart is only required if you are setting up vector_store_encryption_options for the first time).
- Terminate the old VM instance (or shut it down and delete it).
- Remove the dead node's IP from any security group or firewall rules that referenced it specifically.
- Remove from monitoring — delete the old node's scrape target from Prometheus configuration.
Add the new Vector Store node to your Prometheus scrape configuration:
- targets:
- '<NEW_VS_NODE_IP>:6080'Reload Prometheus and verify metrics are being collected from the new node.
After completing the procedure, verify the replacement was successful:
-
Vector Store status — The new node's status endpoint returns
SERVING:curl -s http://<NEW_VS_NODE_IP>:6080/api/v1/status # Expected: SERVING
-
Vector search queries — Run a vector search query against your ScyllaDB cluster and verify results are correct.
-
Monitoring — Check that the new VS node appears in Prometheus/Grafana with
UP = 1, and thatIndexCountand other metrics match expectations. -
Old node removed — Confirm the dead node's IP no longer appears in any
scylla.yamlconfiguration, security group rules, or monitoring targets.
The Vector Store service supports hot configuration reload via SIGHUP. If you need to change the .env file after the service is running (e.g., to update the ScyllaDB IP or credentials), edit the file and then:
sudo systemctl kill -s SIGHUP vector-storeEach Vector Store node is configured to connect to a single ScyllaDB node in the same rack. If that ScyllaDB node fails, the Vector Store node's configuration must be updated to point to a different ScyllaDB node in the same rack:
- Edit
/home/ubuntu/.envand change theVECTOR_STORE_SCYLLADB_URIto the IP of another healthy ScyllaDB node in the same rack. - Send SIGHUP:
sudo systemctl kill -s SIGHUP vector-store
| Port | Service | Description |
|---|---|---|
| 6080 | Vector Store | API, status, and Prometheus metrics endpoint |
| 9042 | ScyllaDB | CQL native transport |
| 9142 | ScyllaDB | CQL native transport (SSL) |
| Path | Description |
|---|---|
/home/ubuntu/.env |
Vector Store configuration (environment variables) |
/mnt/vector_store/.vector_store_password.txt |
CQL password (on tmpfs, in-memory only) |
/home/ubuntu/vector_store_client.pem |
CA certificate for CQL SSL (if encryption enabled) |
/home/ubuntu/server_cert.pem |
VS API TLS certificate (if HTTPS enabled) |
/home/ubuntu/server_key.pem |
VS API TLS private key (if HTTPS enabled) |
| Variable | Required | Description |
|---|---|---|
VECTOR_STORE_SCYLLADB_URI |
Yes | ScyllaDB CQL endpoint (<IP>:<PORT>) |
VECTOR_STORE_URI |
Yes | Listen address (0.0.0.0:6080) |
VECTOR_STORE_SCYLLADB_USERNAME |
Yes | CQL username |
VECTOR_STORE_SCYLLADB_PASSWORD_FILE |
Yes | Path to CQL password file |
VECTOR_STORE_SCYLLADB_CERTIFICATE_FILE |
No | CA cert for CQL SSL connections |
VECTOR_STORE_TLS_CERT_PATH |
No | TLS cert for HTTPS API |
VECTOR_STORE_TLS_KEY_PATH |
No | TLS key for HTTPS API |