Solana Mainnet Validator - Zero Downtime Migration

🚀 Zero Downtime Migration Procedure

This guide explains how to migrate an existing Solana mainnet validator to a new server without downtime.

Prerequisites

Ensure that the following two validator nodes are already set up:
  1. Active Mainnet Validator Node (Source, From)
  2. New Mainnet Validator Node (Destination, To)
⚠️ Both nodes must be set up using the slv v init command.
Make sure you already have a spare server available. If you do not have a spare server, executing this procedure could halt your active validator, causing a system crash.
Both nodes must be fully synchronized to the latest slot (verify with solana catchup command; slot difference must be 0).
In this example, the validator nodes are named as follows:
  • Source (Active, From) Name: main-node
  • Destination (New, To) Name: spare-node
⚠️ Both nodes must have identical configurations, except for IP addresses (ansible_host) and names.
Public keys used for both nodes:
yaml
identity_account: FgYddqZuWLWiHCxWGG3J7VdzD2TGcCzKEZTHWdeHSLV vote_account: oY4zjHQuRE1MQYAnQmfrodoXukBkfGVfYWUZNrn7SLV authority_account: hY9VpH6ahHLS4uhegd16cQ5wNaicejVtv2PxrzRySLV

Setting Up the New Spare Node

Set up the new spare node by executing:
bash
slv v init . . ? Do you want to create a new identity key now? (Y/n) › No ? Please Enter Your Identity Public Key › FgYddqZuWLWiHCxWGG3J7VdzD2TGcCzKEZTHWdeHSLV ? Enter Inventory Name (FgYddqZuWLWiHCxWGG3J7VdzD2TGcCzKEZTHWdeHSLV) › epics-spare-node ? Do you want to create a new vote account key now? (Y/n) › No ? Please Enter Your Vote Account Public Key › oY4zjHQuRE1MQYAnQmfrodoXukBkfGVfYWUZNrn7SLV ? Please Enter Your Vote Account's Authority Key › hY9VpH6ahHLS4uhegd16cQ5wNaicejVtv2PxrzRySLV

Deploying and Synchronizing the Destination Node

Deploy the destination node first:
bash
slv v deploy -n mainnet -p spare-node
Verify synchronization is complete and the slot difference is 0.

Verify Configuration of Source and Destination Nodes

Confirm the configurations for both nodes are identical using:
bash
cat ~/.slv/inventory.mainnet.validators.yml
⚠️ Both nodes must have identical settings, except ansible_host (IP address) and name.
yaml
mainnet_validators: hosts: main-node: name: main-node ansible_host: XXX.XXX.XXX.XXX ansible_user: solv ansible_ssh_private_key_file: ~/.ssh/id_rsa identity_account: FgYddqZuWLWiHCxWGG3J7VdzD2TGcCzKEZTHWdeHSLV vote_account: oY4zjHQuRE1MQYAnQmfrodoXukBkfGVfYWUZNrn7SLV authority_account: hY9VpH6ahHLS4uhegd16cQ5wNaicejVtv2PxrzRySLV validator_type: agave ... spare-node: name: spare-node ansible_host: YYY.YYY.YYY.YYY ansible_user: solv ansible_ssh_private_key_file: ~/.ssh/id_rsa identity_account: FgYddqZuWLWiHCxWGG3J7VdzD2TGcCzKEZTHWdeHSLV vote_account: oY4zjHQuRE1MQYAnQmfrodoXukBkfGVfYWUZNrn7SLV authority_account: hY9VpH6ahHLS4uhegd16cQ5wNaicejVtv2PxrzRySLV validator_type: agave ...

Executing Validator Node Migration

Execute the node migration with the following commands:

1. Select Solana Network

bash
slv v switch ? Select Solana Network (mainnet) testnet ❯ mainnet

2. Enter Source Validator Name

bash
✨ Switching Mainnet Validator Identity... ? From Validator Name › main-node

3. Enter Destination Validator Name

bash
? To Validator Name › spare-node
Upon successful migration, you will see output similar to:
bash
PLAY RECAP ******************************************************************** main-node : ok=3 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 spare-node : ok=4 changed=3 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 Successfully swapped hosts spare-node and main-node in mainnet_validators ✅ Successfully Switched Validator Identity
Your validator node migration is now complete.