Disaster Recovery Strategy for MongoDB and VictoriaDB
Prerequisites
- A minimum of three nodes to enable High Availability are required
- MongoDB Version 6 is required for this setup
Steps to Deploy Pulse on New Node
- Set the MongoDB URI:
export MONGO_URI="<paste previous command output here>"
- Enable MongoDB Encryption:
export MONGO_ENCRYPTED=true
- Configure Pulse as a Standalone Node:
export PULSE_SA_NODE=true
- Create necessary directory structure:
mkdir -p /data01/acceldata/
- Move the Pulse executable to the designated directory:
mv accelo.linux /data01/acceldata/accelo
- Navigate to the Pulse directory:
cd /data01/acceldata/
- Initialize Pulse:
./accelo init
- Source the environment variables:
source /etc/profile.d/ad.sh
- Reinitialize Pulse:
accelo init
- Retrieve Pulse information:
accelo info
- Log in to Pulse Docker:
accelo login docker
Add Host Entries
Add the following entries to the /etc/hosts file of all the MongoDB nodes, including the Pulse server:
<Pulse-Server-IP> ad-db
<Second-Node-IP> ad-db2
<Third-Node-IP> ad-db3
Set New MongoDB Nodes
- Retrieve the accelo binary and initiate it with the same version tag as the Pulse version on the primary node.
accelo init
- Login to the Pulse Registry:
Docker
docker network create ad-default
- Create a new Docker network:
Docker
docker network create ad-default
- Manually download the Mongo image:
Docker
docker pull 191579300362.dkr.ecr.us-east-1.amazonaws.com/acceldata/ad-database:<PULSE-VERSION>
Configuring the Primary Node (Pulse Server)
- Edit Configuration File: In the config/docker/ad-core.yaml file, add the following new fields to the ad-db service section:
- Add the following fields to the environment block:
ENABLE_MONGODB_RS=true
MONGODB_RS_NAME=addb0
IS_MONGODB_PRIMARY=true
- Add the following fields to the volumes block:
/etc/localtime:/etc/localtime:ro
/root/acceldata/data/db:/data/db
/root/acceldata/config/db/mongokey:/mongokey
Add the following fields to the extra_hosts block:
- Add the following fields to the extra_hosts block:
ad-db2:<Second-Node-IP>
ad-db3:<Third-Node-IP>
- Run Secondary Data Replica: Replace <Pulse-Server-IP>, <Third-Node-IP>, and <PULSE-VERSION> with the appropriate values and execute:
docker run -d --name ad-db3_default -p 27017:27017 -e MONGO_DATA_DIR=/data/db -e MONGO_LOG_DIR=/dev/null -e ENABLE_MONGODB_RS=true -e MONGODB_RS_NAME=addb0 -v /data01/acceldata/config/db/mongokey:/mongokey -v /etc/localtime:/etc/localtime:ro -v /data01/acceldata/data/db:/data/db --restart=unless-stopped --net=ad-default --network-alias=ad-db3 --add-host ad-db:<Pulse-Server-IP> --add-host ad-db2:<Second-Node-IP> 191579300362.dkr.ecr.us-east-1.amazonaws.com/acceldata/ad-database:<PULSE-VERSION>
- Run Third Data Replica: Replace <Pulse-Server-IP>, <Second-Node-IP>, and <PULSE-VERSION> with the appropriate values and execute:
docker run -d --name ad-db3_default -p 27017:27017 -e MONGO_DATA_DIR=/data/db -e MONGO_LOG_DIR=/dev/null -e ENABLE_MONGODB_RS=true -e MONGODB_RS_NAME=addb0 -v /data01/acceldata/config/db/mongokey:/mongokey -v /etc/localtime:/etc/localtime:ro -v /data01/acceldata/data/db:/data/db --restart=unless-stopped --net=ad-default --network-alias=ad-db3 --add-host ad-db:<Pulse-Server-IP> --add-host ad-db2:<Second-Node-IP> 191579300362.dkr.ecr.us-east-1.amazonaws.com/acceldata/ad-database:<PULSE-VERSION>
- Login to Primary Node's MongoDB Shell & Add Replica Members:
chown 1000:1000 /data01/acceldata/config/db/mongokey
docker exec -it ad-db_default bash
mongosh mongodb://admin:ACCELROOT_01082018@localhost:27017/admin
db.adminCommand({"replSetReconfig":{_id: "addb0",version: 2,members: [{ _id : 0, host : "ad-db:27017" },{ _id : 1, host : "ad-db2:27017" },{ _id : 2, host : "ad-db3:27017" }]}})
- Check Replica Status: Run rs.status() to check the status of the replica.
- Wait for Stable State: Wait for the MongoDB cluster to stabilize.
- Update Mongodb Encrypted URI: Replace the MongoDB encrypted URI in all YAML files under config/docker/ and acceldata_acceluster.conf file with the provided value.
Unencrypted string for reference:
mongodb://accel:ACCELUSER_01082018@ad-db:27017,ad-db2:27017,ad-db3:27017/admin?replicaSet=addb0
VictoriaDB Setup for Backup and Restoration
Info
This is specifically aimed at addressing disk failures; hence, the destination path will reside on a distinct mounted disk.
To setup Victoria database for backup and restore, perform the following:
- Navigate to the Acceldata directory.
- Fetch the binaries you want to backup and restore using the below command:
wget "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.97.1/vmutils-linux-amd64-v1.97.1.tar.gz "
- Extract the contents of the above tar file:
tar -xvf vmutils-linux-amd64-v1.97.1.tar.gz
- Remove unnecessary binaries, except vmbackup and vmrestore.
- Execute the shell script:
source /etc/profile.d/ad.sh
- Create a new directory for vmdbbackup as below:
mkdir $AcceloHome/data/vmdbbackup
chown 1000:1000 $AcceloHome/data/vmdbbackup
su - $(id -un 1000)
- Open up access to the ad-vmstorage port by modifying the ad-core.yml file as shown below.
ad-vmstorage:
image: ad-vmstorage
container_name: ""
environment:
- ARGS=--storageDataPath=/storage
volumes:
- /etc/localtime:/etc/localtime:ro
- /data01/acceldata/data/vmdb:/storage
ulimits: {}
ports:
- 19099:8482
depends_on: []
opts: {}
restart: always
extra_hosts: []
network_alias: []
- Restart vmstorage container using:
accelo restart ad-vmstorage
- Execute the following command. This command initiates an incremental backup process. Incremental backups are conducted when the destination (-dst) parameter refers to an existing backup directory. After the initial backup is completed, subsequent backups will always target this existing backup directory.
vmbackup-prod -storageDataPath=/data01/acceldata/data/vmdb -snapshot.createURL=http://localhost:19099/snapshot/create -dst=fs:///data01/acceldata/data/vmdbbackup
- Configure the crontab to execute this task once daily, preferably in the morning:
crontab -u user -e
0 1 * * * /data01/acceldata/vmbackup-prod -storageDataPath=/data01/acceldata/data/vmdb -snapshot.createURL=http://localhost:19099/snapshot/create -dst=fs:///data01/acceldata/data/vmdbbackup
Steps to Restore
To restore from backup, perform the following:
- Stop the vmstorage container, if it already running, and run the restore command:
docker stop ad-vmstorage_default
vmrestore-prod -src=fs:///data01/acceldata/data/vmdbbackup -storageDataPath=/data01/acceldata/data/vmdb
- Run accelo deploy core
- Check the logs of the container using docker logs -f ad-vmstorage_default
Troubleshooting
- If the backup process is slow, consider adjusting the value of the -concurrency flag to a higher setting. This will boost the number of simultaneous workers responsible for uploading data to the backup storage.
- If vmrestore or vmbackup encounters an interruption due to a temporary error, simply restart it using the same arguments. The process will resume from where it left off, continuing the restore or backup operation.
