What a failover test proves, and what it does not
A controlled failover, where you tell the active unit to step down, proves that the standby can take the active role, that configuration and session state were synchronized, and that the network around the pair follows the move: switch ports, VLANs, routing neighbors and VPN peers. It is the test that finds a standby that stopped synchronizing, a VLAN missing from the standby’s switch port, a routing adjacency that takes too long to form again, or a software or content mismatch between the two units.
It does not prove failure detection. A unit told to step down does not exercise link monitoring, path monitoring or heartbeat timers. Test those separately, by taking down a monitored interface or path in a lab or a later window, once the controlled failover passes.
Treat the test as a change: an approved maintenance window, a written plan, a rollback path and named people. A test designed to cause no outage can still cause one if the standby is not ready. Finding that out is the point of the test.
Prerequisites
- An approved maintenance window and a change record, with application owners told what they might see.
- Console or out-of-band access to both units. If the failover goes wrong, in-band management may go with it.
- A configuration backup of both units taken the same day.
- Matching software on both units and, on platforms with content updates (application, threat and antivirus signatures), matching content versions.
- Known preemption behavior. With preemption enabled, the preferred unit takes the active role back when it returns: a second transition you must plan and measure. Without it, the pair stays on the other unit until you move it.
- Probes running before you start: one probe per second, with timestamps, across every path that matters (inside to outside, through NAT, through each VPN tunnel, to key applications). On Linux,
ping -D -O ADDRESSprints a timestamp on every line and reports each missed reply. - At least one long-lived TCP session through the pair, such as an SSH session running a continuous command, to show whether established sessions survive.
- Success criteria agreed in advance, for example: “no established TCP session lost, no more than 3 consecutive probes lost on any path, every BGP neighbor established again within 60 seconds.”
- Synchronized clocks (NTP) on both units and on the probe hosts, so the timestamps line up.
Pre-checks: HA state, configuration sync, session sync, link and path monitoring
Run these on both units and stop if any fails. A failed pre-check makes the test Blocked, and the finding alone is worth the window.
- HA state. One unit active and the other in a ready standby state (passive, Standby Ready or secondary, depending on the platform), with no unexplained transitions in the recent HA history.
- Configuration sync. The pair reports its configuration as synchronized, or its checksums match.
- Session sync. The state-synchronization link is up and its counters rise between two reads; where the platform shows it, the standby’s session count is in line with the active unit’s.
- Link and path monitoring. Every monitored interface and path target is up and reachable from both units. A monitored interface that is down on the standby can make it ineligible, and the failover will either not happen or bounce back.
- The network around the pair. The switch ports facing the standby carry the same VLANs as those facing the active unit, and every routing neighbor and VPN peer that must form again after the move is known and watched.
The controlled failover and the fallback
- Announce the start on the bridge or channel and note the time. Start the probes and the long-lived session.
- Capture the pre-state on both units: HA status, session counts, routing neighbors, VPN tunnels.
- Trigger the failover on the active unit with the platform command in the tables below. This is state-changing: run it only in the approved maintenance window, with the rollback decision owner on the call.
- Watch both units change state, and watch the probes. Note the time of the first lost probe and of the first successful probe after the last loss, per path.
- Hold on the new active unit for an agreed soak time, 15 to 30 minutes, and run the application checks while it carries real traffic: user access, NAT, VPN, authentication, logging to your collector, management access.
- Fall back. Return the original unit to service and move the active role back, through preemption or with a second controlled failover. Measure the fallback exactly as you measured the failover; it can behave differently.
- Run the post-checks on both units and record the results.
Write the abort rule before the test, for example: “if any critical application check fails and has not recovered 2 minutes after the failover, move the active role back immediately.” Name who makes that call. If the fallback also fails, the next step in the plan is console access to both units and the escalation path, not improvisation.
What to measure
- Convergence time: from the moment you triggered the failover to the first successful probe after the last lost one, per path. Report the slowest path, not the average.
- Dropped probes: lost probes per path. At one probe per second, the count is roughly the seconds of loss.
- Session loss: whether the long-lived TCP sessions survived, and the active session count on the new active unit compared with the count before. Stateful failover is designed to keep established TCP sessions; applications that reconnect on their own can hide losses, so check their logs too.
- Routing convergence: when each BGP or OSPF neighbor of the pair was established again, from the neighbor’s view as well as the firewall’s.
- VPN recovery: whether tunnels stayed up or had to negotiate again, and how long that took.
- The same numbers for the fallback, recorded separately.
Put the numbers next to the success criteria. A failover and fallback that met every criterion is Verified. One that worked with a gap, such as a tunnel that took 4 minutes to return, is Degraded, with an owner for the fix.
Post-checks and the record
- Both units in the roles you intended to end with, with configuration and session sync healthy again.
- No monitored interface or path left failed, and no new alarms or log errors on either unit.
- Routing tables, VPN tunnels and session counts back in line with the pre-test capture.
- Any manual-failover flag cleared (a Juniper (opens in a new tab) SRX chassis cluster keeps one until you reset it).
- The record in the change ticket: timestamps, probes lost per path, convergence times, sessions that survived, issues found and the verdict (Verified, Degraded, Rolled back, Inconclusive or Blocked).
Palo Alto Networks PAN-OS HA
In an active/passive pair, suspending the active firewall hands the active role to the passive one. request high-availability state functional returns the suspended firewall to service. It comes back passive, unless preemption is enabled on both firewalls and it has the higher priority; then it takes the active role back. On PAN-OS, the lower device priority value is preferred.
The routing command below applies to the legacy routing engine; with the Advanced Routing Engine enabled, use the routing commands for your release.
| Check | Command | What good looks like |
|---|---|---|
| HA state (both firewalls) | show high-availability state | One firewall active and the other passive; running configuration synchronized; neither suspended nor non-functional |
| Full HA status | show high-availability all | Peer connected; HA1 and HA2 links up; build and content compatibility shown as matching |
| Session synchronization | show high-availability state-synchronization | Synchronization counters rise between two reads; error counters do not |
| Link monitoring | show high-availability link-monitoring | Every monitored link up on both firewalls |
| Path monitoring | show high-availability path-monitoring | Every monitored destination reachable from both firewalls |
| Release and content versions | show system info | Same PAN-OS and content versions on both firewalls |
| Sessions | show session info | Active session count noted before the test and in line after the move |
| Drop counters | show counter global filter delta yes severity drop | No drop reason keeps rising after the moment of the move |
| BGP (legacy routing engine) | show routing protocol bgp summary | Peers established again on the new active firewall |
| IPsec tunnels | show vpn ipsec-sa | Security associations present for every tunnel in scope |
| Push configuration to the peer: STATE-CHANGING, approved maintenance window only | request high-availability sync-to-remote running-config | Use only when the pre-check shows configuration out of sync and you have confirmed which firewall holds the correct configuration |
| Force failover: STATE-CHANGING, approved maintenance window only | request high-availability state suspend | Run on the active firewall; the peer becomes active and this firewall shows suspended |
| Return to service: STATE-CHANGING, approved maintenance window only | request high-availability state functional | Run on the suspended firewall; it returns as passive, or takes the active role back if preemption is enabled on both and it has priority |
Syntax varies by platform and software version; test in a lab first.
Cisco Secure Firewall ASA failover
Active/standby failover on the ASA does not preempt: after a failover, the new active unit stays active until you move the role back. The standby unit reaches Standby Ready only after it has synchronized the configuration from the active unit, so a unit stuck in an earlier state is itself a finding. failover exec mate, followed by a show command, runs that command on the peer, so you can read both units from one session.
| Check | Command | What good looks like |
|---|---|---|
| Failover status and stateful link | show failover | Failover On; this host Active and the other host Standby Ready; failover and stateful links up; monitored interfaces Normal on both; logical update error counters (xerr, rerr) not rising |
| State and last failure reason | show failover state | Both units in the expected state; no recent unexplained failure reason |
| Failover history | show failover history | No unexplained transitions since the last planned event |
| Monitored interfaces | show monitor-interface | Every monitored interface Normal on both units |
| Failover configuration | show running-config failover | Failover and state links and polling settings as documented |
| Connections on the active unit | show conn count | Count noted before the test and in line after the move |
| Connections on the standby unit | failover exec mate show conn count | Replicated count in line with the active unit |
| Dropped packets | show asp drop | No drop reason keeps rising after the moment of the move |
| Routing | show route | Routes for key prefixes as in the pre-test capture on the new active unit |
| Remote access and site-to-site VPN | show vpn-sessiondb summary | Session counts in line with the pre-test capture |
| Force failover: STATE-CHANGING, approved maintenance window only | no failover active | Run on the active unit; the standby unit becomes active |
| Take the active role: STATE-CHANGING, approved maintenance window only | failover active | Run on the standby unit to make it active; run it on the original unit to fall back |
Syntax varies by platform and software version; test in a lab first.
Juniper SRX chassis cluster
Test the data-plane redundancy groups (1 and above) first. Redundancy group 0 holds the two Routing Engines, so failing it over moves the control plane as well; plan it as a separate step. A manual failover sets the new primary’s priority for that group to 255 and keeps it there until you reset it, and Juniper (opens in a new tab) requires request chassis cluster failover reset before another manual failover. After the reset, a group with preempt enabled can move back to the higher-priority node on its own.
| Check | Command | What good looks like |
|---|---|---|
| Cluster status | show chassis cluster status | For each redundancy group, one node primary and the other secondary, priorities as configured, no manual flag and no monitoring failures |
| Cluster links and interfaces | show chassis cluster interfaces | Control and fabric links up; redundant Ethernet (reth) interfaces up |
| Heartbeats and session sync | show chassis cluster statistics | Control-link heartbeats and fabric probes rising on both nodes; session RTOs sent and received rising |
| Cluster configuration | show configuration chassis cluster | Redundancy groups, priorities, preempt and interface monitoring as documented |
| Software on both nodes | show version | Same Junos (opens in a new tab) release on node0 and node1 |
| Sessions | show security flow session summary | Session counts per node noted before the test and in line after the move |
| Routing | show bgp summary | Peers established again after the move |
| IPsec tunnels | show security ipsec security-associations | Security associations present for every tunnel in scope |
| Force failover of redundancy group 1: STATE-CHANGING, approved maintenance window only | request chassis cluster failover redundancy-group 1 node 1 | Node 1 becomes primary for redundancy group 1 |
| Clear the manual failover: STATE-CHANGING, approved maintenance window only | request chassis cluster failover reset redundancy-group 1 | Manual flag cleared; required before the next manual failover; with preempt enabled, the group can move back to the higher-priority node |
| Fall back: STATE-CHANGING, approved maintenance window only | request chassis cluster failover redundancy-group 1 node 0 | Node 0 primary again for redundancy group 1; then clear the manual failover with the reset command |
Syntax varies by platform and software version; test in a lab first.
Fortinet FortiGate HA (FortiOS)
The checks below confirm the cluster’s state and synchronization. How you move the primary role depends on the FortiOS release and the HA settings. With override disabled, which is the default, FortiOS weighs HA uptime before priority when it chooses the primary, so raising a priority alone may not move the role; with override enabled, priority is weighed before uptime. FortiOS 6.4 and later also document a forced failover for testing: follow Fortinet (opens in a new tab)’s article “Force HA failover for testing and demonstrations” for your release, and treat it as state-changing.
| Check | Command | What good looks like |
|---|---|---|
| Cluster status | get system ha status | HA health OK; both members listed with the expected primary; configuration status in-sync |
| Configuration checksums | diagnose sys ha checksum cluster | Checksums identical on every member, for global and for each VDOM |
| HA settings | show system ha | Mode, group, heartbeat interfaces, session pickup, monitored interfaces, override and priority as documented |
| Firmware on each member | get system status | Same FortiOS version on every member |
| Sessions | diagnose sys session stat | Session count noted on the primary before the test and in line after the move |
Syntax varies by platform and software version; test in a lab first.