Overview
EnvisionSCADA redundancy provides a two-node high-availability setup with a Primary node and a Standby node.
1) Purpose and architecture
The Primary node is the active server that runs the project and is the authoritative source of configuration and historian data.
The Standby node is the passive server that stays synchronized with the Primary and is ready to take over automatically.
The redundancy mechanism continuously determines which node is Primary and which is Standby, keeps configuration and runtime state aligned, keeps historian data aligned, and performs automatic failover if the partner becomes unreachable.
2) What must be configured
Redundancy relies on having two participants configured consistently on both nodes.
- Participant 1: IP address, port
- Participant 2: IP address, port
The IP addresses must be valid and must match the actual network interfaces of the servers.
Each server must match exactly one of the participant IP addresses so the server can identify whether it is Participant 1 or Participant 2.
Both nodes must run the same EnvisionSCADA build/version.
The nodes must be able to reach each other over HTTPS on the configured ports.
Any firewall rules must allow the required traffic between the two nodes.
Each participant may optionally be given a second IP address on a separate network, using the Participant 1 IP Address (LAN 2) and Participant 2 IP Address (LAN 2) fields. LAN 1 (the primary Participant IP Address) carries all redundancy traffic; LAN 2 is a standby path that is used automatically only when the partner cannot be reached on LAN 1. Leave the LAN 2 fields empty for a single-network setup.
Both networks use the same participant port. A node is still recognized as the same participant when only one of its two LAN addresses is reachable, so a single failed cable or switch on one network no longer interrupts synchronization or forces a role change. The partner is treated as offline only when it cannot be reached on either network.
When HTTPS certificates are used on the synchronization channel, include both LAN IP addresses of each node in that node's certificate Subject Alternative Name (SAN). This lets the partner certificate validate on either network, so the fallback path keeps working after a LAN 1 outage. The Certificate Generator page provides an IP Address (LAN 2) field for issuing a certificate with both IP addresses in the SAN.
3) How roles are determined (Primary vs Standby)
At runtime, each node continuously exchanges status information with its partner and assigns roles.
If the partner is reachable, the system ensures that one node is Primary and the other is Standby.
If the partner is not reachable, the local node will promote itself to Primary to keep the system running.
When both nodes start and neither is yet established as Primary, the system selects Primary based on which side appears to have the most up-to-date historian progress.
If both appear equal or empty, the system uses startup timing to settle on one Primary and one Standby.
The goal is a stable pair with exactly one Primary and automatic continuity if one side disappears.
4) Normal operating behavior
In a healthy steady state, the Primary operates the project normally, serves configuration and state updates to the Standby, and receives any historian records that the Standby forwards.
In a healthy steady state, the Standby keeps its configuration aligned with the Primary, keeps historian data aligned, and maintains a small local standby historian buffer that is continuously emptied toward the Primary.
5) Synchronization model (What is synchronized)
Redundancy synchronization covers project configuration and runtime state, plus historian data.
The Standby keeps aligned with the Primary for project configuration, schedules, events configuration, alarms configuration, variables and local variables, and alarm counters with related runtime counters and state.
Configuration and runtime synchronization uses a baseline import when required and incremental updates thereafter.
The Standby keeps historian tables aligned with the Primary for Historic Data, Historic Alarms, and Historic Events.
Historian synchronization uses Backfill, where the Primary sends missing historian ranges to the Standby when it is behind, and Forefill, where the Standby forwards buffered historian rows to the Primary and then deletes them locally before syncing them back.
Project-level operations
Import Project, New Project, and the Git operations Pull & Import to DB and Restore replace the project on the Primary. The Standby receives the new project with its next baseline. Until then it keeps the previous project, so a takeover in that period starts the previous project on the new Primary.
After one of these operations on a redundant pair, restart EnvisionSCADA on the Standby node, for example by recycling its application pool in IIS Manager or by restarting the Standby server. The Standby takes a baseline on startup and returns to Synced with the new project.
6) Standby synchronization states
The Standby typically moves through Baselining, Syncing, and Synced states.
During Baselining, the Standby requests a full project baseline from the Primary, imports it, and uses this process on first sync, after role changes, or if the system detects a baseline mismatch.
During Syncing, the Standby requests incremental changes from the Primary and applies them until it catches up.
During Synced, the Standby is fully aligned with the Primary and only small periodic updates may occur.
If problems occur, the Standby can enter an Error condition.
7) Health rules and conditions that prevent redundancy
Redundancy requires both nodes to be compatible and correctly configured.
If the nodes run different EnvisionSCADA versions, redundancy is considered invalid and synchronization does not proceed normally. Ensure both nodes are deployed from the same build.
If both nodes are configured in such a way that they identify as the same participant, redundancy cannot operate correctly. Ensure each server matches only its own configured participant IP.
If the partner cannot be reached, the remaining node goes Primary to keep service available. When the partner returns, the system stabilizes back into a Primary and Standby pair.
8) Historian data handling in detail (Backfill and Forefill)
If the Standby is behind the Primary in historian progress, the Standby requests missing segments from the Primary and stores these records in its local historian database.
To protect disk space on the Standby, backfill is automatically paused or limited if the Standby historian buffer grows beyond a configured maximum. This ensures the Standby database remains small and does not grow uncontrollably.
The Standby periodically takes a limited batch of the oldest buffered historian rows, sends them to the Primary, and deletes the sent rows locally after the Primary confirms processing.
This keeps the Standby buffer small and ensures the Primary remains the long-term historian store.
If a node becomes Primary during failover or switchover, it may still have historian rows in its local standby buffer. The new Primary drains those remaining rows into its normal historian ingestion path until caught up. This is designed to avoid losing buffered historian records during role transitions.
9) Planned switchover behavior (Controlled role change)
The system supports a controlled switchover mechanism where the Primary can request a role change, the Standby promotes to Primary, and the original Primary yields to Standby.
This is used for planned maintenance where the active role needs to move to the other node with minimal disruption.
Exact operational steps depend on how the deployment exposes switchover request to operators, but the redundancy mechanism supports it.
10) What integrators should monitor
For commissioning, acceptance testing, and ongoing support, verify redundancy status and counters intended for HMI and diagnostic display, including role, sync state, baseline and change tracking, historian progress, and buffer counts.
- Exactly one Primary and one Standby
- Standby reaches and remains Synced in steady state
- Baseline identifiers match and do not oscillate
- Historian last ID indicators converge over time
- Standby buffered historian row counts remain low (forefill working)
- No persistent error state related to version mismatch or participant identity
11) Commissioning checklist
Use this as an integrator checklist during commissioning and acceptance testing.
| Area | Checks |
|---|---|
| Networking | Confirm both nodes can resolve and reach each other’s redundancy IP/port over HTTPS. Confirm firewalls allow bidirectional traffic. |
| Participant configuration | Participant 1 IP/port configured identically on both nodes. Participant 2 IP/port configured identically on both nodes. Each server’s NIC matches exactly one participant IP. |
| Software parity | Same EnvisionSCADA version/build on both nodes. |
| Functional test | Start both nodes: confirm stable Primary/Standby. Confirm Standby reaches Synced. Simulate Primary outage: confirm Standby takes over to Primary. Restore partner: confirm pair stabilizes again. Verify historian continuity by checking that buffered standby data is forwarded and drained. |
No rows match the filter.
13) SYSTEM Variables: Redundancy
The following SYSTEM variables expose redundancy status, participant configuration, synchronization state, baseline tracking, historian progress, and forefill buffer counts.
| SYSTEM Variable | Description |
|---|---|
| SYSTEM.RedundancyServiceExecutionTime | Time required for one redundancy service cycle. Used to monitor redundancy service load and performance. |
| SYSTEM.Participant1IPAddress | Configured IP address for Participant 1. |
| SYSTEM.Participant2IPAddress | Configured IP address for Participant 2. |
| SYSTEM.Participant1Port | Communication port configured for Participant 1. |
| SYSTEM.Participant2Port | Communication port configured for Participant 2. |
| SYSTEM.RedundancyParticipantNumberLocal | Indicates whether this server operates as Participant 1 or Participant 2. |
| SYSTEM.RedundancyIPAddressLocal | IP address used by the local node for redundancy communication. |
| SYSTEM.RedundancyIPAddressPartner | IP address of the partner redundancy node. |
| SYSTEM.Participant1IPAddress2 | Configured second-network (LAN 2) IP address of participant 1. Empty when dual-LAN is not used. |
| SYSTEM.Participant2IPAddress2 | Configured second-network (LAN 2) IP address of participant 2. Empty when dual-LAN is not used. |
| SYSTEM.RedundancyLinkLan1 | True when the partner is reachable on the primary network (LAN 1) in the latest cycle. LAN 1 carries all redundancy traffic. |
| SYSTEM.RedundancyLinkLan2 | True when the partner is reachable on the second network (LAN 2) in the latest cycle. False when no LAN 2 address is configured. Watch this to detect a failed fallback path before it is needed. |
| SYSTEM.RedundancyIPAddressPartner2 | The partner's second-network (LAN 2) address as resolved by this node. |
| SYSTEM.RedundancyRoleLocal | Current redundancy role of this node (Pending, Primary, Standby, or Error). |
| SYSTEM.RedundancyRoleErrorMsgLocal | Error message explaining redundancy issues or misconfiguration. |
| SYSTEM.RedundancySyncStateLocal | Synchronization state of this node (Waiting, Baselining, Syncing, Synced, or Error). |
| SYSTEM.RedundancyRolePartner | Current role reported by the partner node. |
| SYSTEM.RedundancySyncStatePartner | Synchronization state reported by the partner node. |
| SYSTEM.BaselineIdLocal | Project baseline identifier currently applied locally. |
| SYSTEM.BaselineIdPartner | Baseline identifier reported by the partner node. |
| SYSTEM.ChangeLogIdLocal | Last configuration change identifier applied locally. |
| SYSTEM.ChangeLogIdPartner | Last configuration change identifier reported by partner node. |
| SYSTEM.RedundancyLastIdHistoricDataLocal | Last historic data record identifier stored locally. |
| SYSTEM.RedundancyLastIdHistoricAlarmsLocal | Last historic alarm record identifier stored locally. |
| SYSTEM.RedundancyLastIdHistoricEventsLocal | Last historic event record identifier stored locally. |
| SYSTEM.RedundancyLastIdHistoricDataPartner | Last historic data identifier reported by partner node. |
| SYSTEM.RedundancyLastIdHistoricAlarmsPartner | Last historic alarm identifier reported by partner node. |
| SYSTEM.RedundancyLastIdHistoricEventsPartner | Last historic event identifier reported by partner node. |
| SYSTEM.RedundancyForefillDataCountLocal | Number of historic data rows currently buffered locally for forwarding to Primary. |
| SYSTEM.RedundancyForefillAlarmCountLocal | Number of historic alarm rows buffered locally. |
| SYSTEM.RedundancyForefillEventCountLocal | Number of historic event rows buffered locally. |
| SYSTEM.RedundancyForefillDataCountPartner | Number of buffered historic data rows reported by partner node. |
| SYSTEM.RedundancyForefillAlarmCountPartner | Number of buffered historic alarm rows reported by partner node. |
| SYSTEM.RedundancyForefillEventCountPartner | Number of buffered historic event rows reported by partner node. |
No rows match the filter.