Grafana high availability starts with a shared database, not only extra servers
An operations or platform team that needs dashboards and alerts to survive a node failure should start with the database, not the server count. Grafana high availability means two or more active-active Grafana servers behind a load balancer, sharing a MySQL 8.0 or later or PostgreSQL 12 or later database, with database-backed auth tokens so any node can serve any user. If one node fails, the load balancer routes sessions to a surviving node and users keep their logins. Adding servers without a shared database does not achieves this, because each node would hold its own configuration, users, folders and sessions.
SQLite is the default store for Grafana configuration, and the Grafana installation documentation states that SQLite does not scale for production. A single-node SQLite deployment is useful for evaluation, but it cannot be the foundation of an HA design. Moving to MySQL or PostgreSQL is therefore a prerequisite, and it should be decided before the first production dashboard is built. The team should confirm which database engine and version its platform standards already support, which backup and restore tooling covers it, and who owns its patching and failover. Those answers determine whether the database itself needs its own high availability design, which is a separate concern from Grafana's.
Three things make Grafana HA harder than it looks. First, some state lives outside the database, such as local plugin directories, file-based provisioning, custom certificates and any image or asset files on disk, so every node must receive the same copies. Second, alert notifications can fire from every node, which produces duplicate pages unless alerting is configured to avoid it; the Grafana HA documentation says this needs additional configuration. Third, Grafana Live has limitations in HA setups, so real-time streaming features should be tested rather than assumed to behave as they do on a single node. Each of these needs an owner and a test before go-live.
Small sizing guidance does not settle HA capacity. The installation documentation sizes small deployments under 25 concurrent users at 2 cores and 2 to 4 GB of RAM, but that figure describes one server. An HA pair or group multiplies the compute and memory footprint, adds load balancer and database capacity, and changes how data source queries are spread across nodes. The team should ask for a sizing estimate based on its real user count, dashboard query load and alert rule count, and should load test the proposed topology with representative dashboards before relying on it.
Before committing to an architecture, the team should confirm four things in its own environment: the database engine and version, the load balancer's session handling for Grafana, where plugins and provisioning files are stored, and how alert notifications will be deduplicated. Each answer should be written down and tested in a non-production copy. Treating the database as the first design decision keeps the rest of the HA plan honest, because it determines what state each node shares and what each node must keep locally.
Which components a Grafana HA design depends on
A Grafana high availability design is only as strong as the weakest component it depends on. The cards below cover the Grafana nodes, the load balancer, the shared database, node-local state, provisioning files, alerting, Grafana Live and the data sources Grafana queries, so each can be checked against the official HA documentation for your version.
Grafana server nodes
Two or more active-active Grafana servers serve the same dashboards, users and configuration, so any node can handle a request. Each node must point at the same database and run a matching version and plugin set. Confirm in the official HA guide which settings must be identical across nodes and how your chosen version handles sessions and auth tokens.
Load balancer in front of nodes
The load balancer distributes user traffic across Grafana nodes and removes unhealthy ones from rotation. If it is a single instance, the whole service is unreachable even when every Grafana node is healthy. Check how it handles TLS termination, session affinity needs for your version, and the health check endpoint you will use to detect a failed node.
Shared MySQL or PostgreSQL database
The shared database holds Grafana configuration, users, dashboards, folders and database-backed auth tokens. Grafana documents SQLite as unsuitable for production, so MySQL 8.0 or later or PostgreSQL 12 or later is required for high availability. A single database instance without replication or failover becomes the one component that stops every node at once.
File and plugin state on each node
Each node keeps local files, including installed plugins and any data stored on disk. Plugin versions and local files that are not shared can differ between nodes and produce inconsistent behavior. Confirm in the HA documentation which state must be kept in sync, how plugins are installed on every node, and whether any local data path needs to be shared storage.
Provisioning files across nodes
Provisioned data sources, dashboards, plugins and alerting resources are loaded from files at startup. If the files differ between nodes, each node can present different data sources or alert rules. Use one source of truth for the provisioning directory, deliver it identically to every node, and confirm how your version reloads provisioned resources after a change.
Alerting engine and duplicate notifications
Grafana Alerting evaluates rules on the nodes, and without extra configuration several nodes can send the same notification. The HA documentation says alerting needs additional configuration to avoid duplicates. Confirm the deduplication approach for your version, how alert state is shared, and how you will test that one contact point receives one notification during a node failure.
Grafana Live limits in HA
Grafana Live provides real-time streaming updates to browsers. The HA documentation lists limitations for Grafana Live when several nodes run behind a load balancer, so live panels may not behave the same on every node. Confirm the current limitations for your version, decide whether teams depend on live streaming, and test those views through the load balancer.
Data sources Grafana queries
Grafana itself is only the query and visualization layer. Prometheus, Loki, SQL databases and other sources hold the data, and a dashboard is unavailable when its source is down even if every Grafana node is healthy. Confirm the high availability design of each data source, its query limits, and the credentials each Grafana node uses to reach it.
Grafana high availability decisions that shape the design
This table compares the main design choices for a highly available Grafana deployment and the operational cost each one adds. Read each row as a decision to settle before build, starting with the database and load balancer, which the rest of the design depends on. The main takeaway is that the identity provider and alerting approach affect feature availability and duplicate notifications, so they should be decided early rather than after go-live.
| Decision | When it fits | What it costs operationally |
|---|---|---|
| Database engine: MySQL 8.0 or later | Teams that already run MySQL with tested backup and failover practices | Schema upgrades run against a shared database, so backups and restore tests must cover it |
| Database engine: PostgreSQL 12 or later | Teams with existing PostgreSQL operations skills or a preference for it | Needs its own backup, failover and version lifecycle alongside Grafana upgrades |
| Managed or self-run database | Managed suits teams without DBA capacity; self-run suits strict data placement rules | Managed adds service fees and provider-defined maintenance windows; self-run adds patching and failover ownership |
| Deployment platform: VM packages | Stable estate of virtual machines managed by configuration tooling | Each node needs patching, service configuration and sync of plugins and provisioning files |
| Deployment platform: Docker images or Helm chart on Kubernetes | Teams already operating Kubernetes with GitOps or standard ingress | Requires cluster skills, persistent storage decisions and chart version tracking |
| Load balancer and session handling | Two or more active nodes where users must reach any node | Health checks must match Grafana's endpoint; confirm the chosen sticky or non-sticky behavior with testing |
| Identity provider and edition features | LDAP, generic OAuth, Entra ID, Okta or GitHub work in open source; SAML and team sync need Enterprise or Cloud | Enterprise adds licensing cost and a license to manage; open source requires role mapping to be designed by hand |
| Alert notification approach across nodes | Any HA setup sending alerts, since each node evaluates rules | Needs extra configuration to avoid duplicate notifications; test with a forced node failure |
| Grafana Live features | Teams relying on live streaming dashboards in production | Grafana documents limitations in HA, so confirm which Live features behave correctly before depending on them |
Build sequence for Grafana high availability
This sequence takes a single Grafana server to two or more active-active nodes behind a load balancer, sharing one MySQL or PostgreSQL database, with each step closed by a check the team can run and record.
Confirm the target Grafana version and support window
Choose the Grafana minor release the environment will run and record its support window before anything is built. Grafana's upgrade guidance says each minor release is supported for 9 months and the last minor release of a major version for 15 months, so the team should check where the chosen version sits in that cycle and plan its next upgrade against it. Confirm the release notes for breaking changes and check that every data source plugin in scope supports that version. The step is done when the version, its end-of-support date from the official upgrade guidance, and the plugin compatibility list are written into the change record and approved by the platform owner.
Provision the shared database and its backups first
Before any Grafana node is installed, the platform team provisions the shared MySQL 8.0 or later, or PostgreSQL 12 or later, instance that all nodes will use. SQLite does not scale for production, so this database is a requirement for high availability, not an option. The team should confirm the database's own high availability design, its network access rules from the planned Grafana subnets, its backup schedule, and a tested restore procedure with the database owner. The step is done when a restore has been rehearsed into a separate instance and the team has confirmed the restored data can be read by a test client.
Move configuration off SQLite on a single node
Start with one Grafana node installed from the chosen package, Docker image or Helm chart. Point its database settings at the shared MySQL or PostgreSQL instance using a dedicated database user with only the privileges Grafana needs, and keep the database credentials in a secrets store, not in plain configuration files. Restart the node and confirm that Grafana migrates its schema without errors in the logs. Then migrate any existing SQLite data if the instance is not new. The step is done when a query against the database shows Grafana's tables and a recent write, and the login page and a test dashboard load from that node.
Build the second node from identical packages
Build the second Grafana node from the same package version, image digest or Helm chart release as the first, using the same configuration file and the same database connection. Copy or synchronize the provisioning files for data sources, dashboards, plugins and alerting resources so that both nodes load the same definitions at startup. Provisioning files are loaded when Grafana starts, so any drift between nodes will persist until someone corrects it. The step is done when a diff of the two nodes' configuration and provisioning directories shows no differences, the installed plugin list and versions match, and both nodes report the same Grafana version on their health endpoints.
Configure load balancer health checks and TLS
Place both nodes behind the chosen load balancer and configure a health check against Grafana's health endpoint, with a check interval and failure threshold agreed with the network team. Terminate TLS at the load balancer or at each node according to the organization's certificate standard, and make sure the secure cookie and proxy settings in Grafana match the public hostname users will see. Confirm that the load balancer removes a node from rotation when its health check fails. The step is done when a request through the load balancer returns a valid certificate and a successful login, and a test that stops one node shows traffic moving to the remaining node without a manual change.
Enable and verify database-backed auth tokens
Confirm that the Grafana configuration stores authentication tokens in the shared database, which is what allows a session started on one node to be accepted by the other. Log in through the load balancer, then force subsequent requests to reach the second node, for example by stopping the first node briefly or by testing each node's address directly with the same session. Repeat with a second user and with the session from a different browser. The step is done when a login made on one node is accepted on the other, and a query against the session or token table in the shared database shows the entries created by that login.
Configure HA alerting and confirm single notifications
Grafana's documentation states that alerting needs additional configuration in an HA setup to avoid duplicate notifications, so follow the official high availability alerting guidance for the installed version and apply it to both nodes. Configure a test alert rule, a contact point and a notification policy, then trigger the alert and watch the receiving channel. The team should record which node sends each notification and confirm that the contact point receives one message per firing alert, not one from each node. The step is done when a controlled test alert produces exactly one notification at the receiver and the alert state is consistent when viewed on either node.
Validate Grafana Live for the team's use
Grafana documents limitations for Grafana Live in high availability setups, so the team should check exactly which live features its users depend on, such as live dashboard updates or streaming panels, and test them through the load balancer with at least two users on different nodes. Compare what users see with what they expect and decide whether any live feature needs a fallback, such as periodic refresh, or a documented limitation for users. Confirm the outcome with the team that will use the dashboards. The step is done when a written list of Grafana Live features in use records the observed behavior on the two-node setup and the accepted limitations have been signed off by the dashboard owners.
Run the failover checks from the verification section
Run the full set of failover tests defined in the verification section of this page against the completed two-node setup. These cover stopping each node under a normal workload, restarting the database connection, rotating a certificate, and confirming alert delivery during a node loss. Record the observed results, any errors in the Grafana and load balancer logs, and the time each test took to recover as measured by the team. Any failed check goes back to the step that owns it, and the sequence is repeated from that step. The step is done when every verification test has a recorded pass with its evidence attached to the change record.
How HA differs on VMs, Kubernetes and air-gapped networks
On virtual machines, Grafana is installed from the vendor's packages for Debian, Ubuntu, RHEL, Fedora, SUSE, macOS or Windows, and each node runs its own service with its own configuration file. Small single-node deployments, under 25 concurrent users at 2 cores and 2 to 4 GB of RAM, are sized differently from HA nodes. In HA, the larger change is the database and load balancer work, not the server install. Shared state lives in MySQL 8.0 or later or PostgreSQL 12 or later, so the database is the shared storage layer.
What changes on VMs:
- Node identity: each host has its own hostname and certificate, but every node must run the same version, plugin set and provisioning files. Verify this with configuration management and a configuration diff check.
- Shared storage: no shared file system holds state, but provisioning files and custom plugins must exist on every node.
- Probes: point the load balancer health check at the health endpoint documented for your version, and confirm the exact path and expected response.
- Load balancing: users must be able to reach any node because auth tokens are database-backed. Confirm the documented Grafana Live limitations before adding session affinity.
- Patching: drain one node from the load balancer, apply the package update, verify it, then return the node to service and repeat.
Confirm with the vendor documentation the supported database versions, the HA configuration settings for your release and how alerting avoids duplicate notifications.
On Kubernetes, Grafana runs from the Docker images and is typically deployed with the Helm chart. Pods are replaceable and receive generated names, so no configuration can depend on a particular node. The chart, the image tag and the values file together define the running version, and each must be pinned. Persistent volumes are not the answer for state: the database should be external, because SQLite does not scale for production or HA.
What changes on Kubernetes:
- Node identity: configuration and secrets come from ConfigMaps and Secrets, so every replica starts from the same source with no per-node edits.
- Shared storage: keep MySQL or PostgreSQL outside the cluster or in a managed service, and confirm how plugins are supplied to each pod.
- Probes: the chart sets liveness and readiness probes. Confirm the paths, timeouts and thresholds it uses, and adjust them for your database latency.
- Load balancing: traffic reaches the replicas through a Service and an Ingress. Confirm what session behavior your ingress controller applies and what Grafana Live limits apply.
- Patching: change the image tag and chart version in version control, roll out with a rolling update, and check plugin compatibility for each release before promotion.
Confirm with the vendor documentation which chart version matches your image tag, the required replica and database settings, and the probe endpoints the chart expects for your release.
In an air-gapped network, Grafana cannot reach public package repositories, plugin catalogs or container registries during install or upgrade. Packages, plugins, container images, Helm charts and the database must all come from an internal mirror or registry. The Grafana installation docs cover packages for Debian, Ubuntu, RHEL, Fedora, SUSE, Windows, plus Docker images and Helm charts, so every one of those artifacts must be mirrored and version-matched before a rollout starts.
What changes in air-gapped networks:
- Node identity: hostnames, certificates and trust chains come from the internal certificate authority, and each node must trust that authority.
- Shared storage: the database, and any internal object storage, must be reachable only inside the enclave and backed up under the same controls as production.
- Probes and load balancing: health checks and load balancer pools use internal addresses only, so test them from inside the enclave.
- Plugins: install plugins from files you have reviewed and stored internally, and confirm that no plugin or update check depends on outbound access.
- Patching: patch releases are issued at least monthly according to the upgrade guidance, so the mirror sync and promotion process must keep pace with that cadence.
Confirm with the vendor documentation which update and telemetry checks can be disabled, how plugins are installed without internet access, and which artifacts your release needs from the mirror.
How alerting avoids duplicate notifications across Grafana nodes
In a Grafana high availability setup, every node runs the alerting engine, so each node can evaluate the same alert rule and send the same notification. The Grafana high availability documentation states that alerting needs additional configuration to avoid duplicate notifications, so treat this as a required build step rather than an optional tuning exercise. Before the first node goes live, confirm for your Grafana version which alerting settings the documentation requires, how the nodes find each other and share alert state, and which network ports must be open between them. Record those answers in the build plan so the team knows what must be configured and verified.
The main decision is how alert evaluation and notification are coordinated across nodes. Ask whether the team must keep one node responsible for each evaluation, or whether the nodes should share state so that each alert instance is notified once. These are different problems. Shared database access and load balancing let any node serve a user request, but they do not, by themselves, stop two nodes from notifying about the same alert. Assign an owner for each alerting setting, and keep those settings in the same infrastructure-as-code repository as the rest of the configuration so that a later change does not quietly reintroduce duplicates. Rule design, contact points and notification policies are covered in the Grafana alerting sibling page.
Test the behavior before relying on it. Create a test alert rule with a condition that you can trigger on demand, and route it to a test contact point that logs every delivery. Trigger the alert and count the notifications per alert instance. Repeat the test with the alert evaluated by each node, and again after restarting one node, so you see the behavior across the full lifecycle. Check resolved notifications as well as firing ones. Illustrative example: if three nodes are running and one firing alert produces three deliveries, the coordination is not working, and the configuration must be corrected before production use. Run these tests in a non-production environment that matches the production database and load balancer layout.
Plan for a node failure explicitly. When a node stops, the remaining nodes should continue to evaluate and notify, but the documentation and your own tests must confirm how quickly responsibilities move and whether an alert can be delayed or duplicated during that transition. Test this by stopping a node while an alert is firing and recording what reaches the contact point. Decide whether your on-call process can tolerate a short delay or an extra notification during failover, and document that expectation for responders. Grafana Live also has limitations in high availability, which apply to live updates in the UI. Those limits are listed in the decisions table on this page.
What drives the effort and cost of a Grafana HA project
This table lists the factors that change how much design, build and ongoing work a Grafana high availability project needs, and what each one asks of your team. Use it to see what a written quote is built from and which decisions you can make early to keep scope predictable. The main takeaway is that the database, the data sources behind Grafana, and alerting design usually matter more than the number of Grafana nodes.
| Driver | Why it matters | How to keep it down |
|---|---|---|
| Concurrent users and dashboards | Load sets the node count, CPU and memory, and how much query traffic reaches data sources. Heavy dashboards with many panels cost more to size and test than their user count suggests. | Confirm peak concurrent users and the top dashboards by panel count. Tune refresh intervals and query caching before adding nodes. |
| Number and type of data sources | Each data source Grafana depends on may also need its own HA design, backups and credentials. Prometheus, Loki and SQL sources differ in how they are made redundant. | List every data source with its owner and existing HA posture. Agree which sources are in scope for this project and which remain with their current owners. |
| Database engine and hosting model | Production and HA require MySQL 8.0 or later or PostgreSQL 12 or later, not SQLite. A managed database shifts patching and failover work to the provider, while a self-run database adds build and operations work to the project. | Confirm the supported engine version and whether a managed service is available in your environment. Decide hosting early, since it changes the scope of the database build. |
| Number of environments | Development, test and production each need Grafana nodes, a database and data source connections. Keeping environments consistent adds build and verification work. | Use one code path for all environments with different variable files. Agree which environments need full HA and which can run a single instance. |
| Identity integration | Sign-in through LDAP, generic OAuth, Entra ID, Okta or other providers needs configuration, testing and role mapping. SAML, team sync and SCIM are available only in Grafana Enterprise and Grafana Cloud, which changes both the build and the licensing decision. | Confirm your identity provider and the required login methods before scoping. Map roles and folders on paper first, and confirm which features your chosen edition includes. |
| Alerting volume and contact points | Alerting in an HA setup needs extra configuration to avoid duplicate notifications. High alert counts, many contact points and complex notification policies increase design, testing and tuning time. | Inventory existing alert rules and contact points. Remove stale rules and consolidate routes before migration, and test duplicate suppression with each node in turn. |
| Provisioning as code versus manual setup | Manual setup in the UI is quick to start but adds rework when environments diverge. File provisioning, Terraform or Git Sync adds up-front build work and then reduces repeated effort across environments. | Decide early which objects are provisioned as code. Keep UI edits to a minimum in production and document the review workflow. |
| Compliance evidence needs | Assessors often ask for backup records, restore tests, access logs and change history. Producing this evidence needs logging, retention and documented procedures built into the design. DeployOpen prepares evidence but does not issue audit reports or certifications. | Ask your assessor or compliance lead which evidence they expect. Define retention, backup schedules and restore tests in the written scope so the quote covers them. |
| Ongoing upgrade cadence | Grafana ships major releases once a year, minor releases about every other month and patch releases at least monthly. Each minor release is supported for 9 months, so the upgrade workload recurs across every node and environment. | Agree a patch and minor upgrade schedule before go-live. Ask whether ongoing support or a retainer covers upgrades, testing and security patch rollout. |
How to test Grafana high availability and confirm it fails safely
The most useful thing a high availability test plan can do is prove that a failure produces a predictable, visible and reversible outcome. For Grafana, that means two or more active-active servers behind a load balancer, sharing a MySQL 8.0 or later or PostgreSQL 12 or later database, with database-backed auth tokens so a user's session survives a move to another node. Each test below names the action, the expected behavior and the evidence to keep. Run them in a staging environment that matches production topology, and record results before any change window is approved.
Test 1: stop one node during active sessions. Start a set of browser sessions and a scripted dashboard refresh loop against the load balancer address, then stop the Grafana service on one node. Expected behavior: sessions routed to the stopped node reconnect through the load balancer, and users are not forced into a repeated sign-in. Keep the load balancer access log, the health check transitions, the Grafana server log from both nodes and a timestamped screen recording of one affected session. Also confirm that the stopped node's removal does not leave a stale alert or session record in the shared database.
Test 2: restart or fail over the database. Restart the database primary, or trigger your managed failover, while dashboards are loading. Expected behavior: Grafana returns errors during the window, then recovers without a manual restart of either node. Confirm that the Grafana database connection pool re-establishes and that dashboard saves made during the window are either committed or clearly rejected, never half-written. Keep the database failover event log, Grafana error logs with timestamps, and a before and after comparison of dashboard versions. Confirm the exact failover behavior of your database platform with its vendor documentation, since recovery timing depends on it.
Test 3: take the load balancer health check path offline. Block or change the path your load balancer checks so that one node is marked unhealthy, then restore it. Expected behavior: traffic drains from the unhealthy node and returns only after the health check passes. Verify that the health check endpoint does not expose version or sensitive detail to unauthenticated callers, in line with the security hardening guidance. Keep the load balancer state history and confirm no user received a sign-in prompt loop during the change.
Test 4: alerts fire once and recover. Create a test alert rule that fires on a synthetic condition, then check the contact point. Expected behavior: one notification per alert transition, one resolved notification when the condition clears, and no duplicates from the second node. The Grafana HA documentation states that alerting needs additional configuration to avoid duplicate notifications, so verify that configuration rather than assuming it. Keep the notification receiver logs, the alert state history and the exact time of each notification.
Test 5: provisioning drift after restart. Edit a provisioned dashboard or data source through the UI, then restart the nodes one at a time. Expected behavior: provisioned resources reload from their files at startup, and the UI edit is either overwritten or flagged according to your provisioning settings. Check that both nodes end with identical provisioned state. Stale provisioned dashboards are a sign of unsafe failure, so keep a diff of the file-defined and live objects from each node. Finally, restore a database backup into a separate environment and confirm it loads, shows the expected dashboards and data sources, and that a test query succeeds. Keep the restore runbook, the timing and the verification checklist signed by the operator who ran it.
What unsafe failure looks like. Treat these as failed tests even if the page loads: duplicate notifications for one alert, users looping between the sign-in page and a dashboard, nodes serving different provisioned dashboard versions, and restores that start but show empty folders or broken data sources. Detect them with the notification receiver counts, load balancer logs showing repeated authentication redirects, a periodic comparison of dashboard JSON across nodes, and a restore check that counts dashboards and data sources against the source inventory. Ask your team to define pass and fail thresholds before testing, and confirm with your auditor or assessor what evidence format they accept.
Access control and secrets for HA nodes
Running two or more active-active Grafana servers multiplies the places where credentials, network paths and configuration can drift or be exposed. The cards below cover the HA-specific controls that sit alongside the wider hardening work in the Grafana security hardening guide, which holds the full checklist.
Database credentials and network paths
Every node connects to the same MySQL or PostgreSQL database, so one leaked credential exposes all Grafana configuration and stored state. Use a dedicated database account for Grafana with only the privileges it needs, and restrict the database listener so that only the Grafana node subnets can reach it. Confirm the database version meets the minimum Grafana documents for production use before you lock the network rules down.
TLS between load balancer and nodes
The load balancer terminates user TLS in most designs, but traffic from it to each Grafana node may cross a network segment you do not fully control. Decide whether that hop must be encrypted under your policy, and if so, configure TLS on each node and trust the certificate chain on the load balancer. Check that health checks still work after the change, since a failed handshake can look like a node outage.
Data source credentials across nodes
Each node needs the same data source connections, but copying passwords into configuration files in Git repositories is the usual leak path. Supply secrets at runtime through environment variables or your secrets manager, and keep only references in provisioning files. Verify that every node resolves the same data source names and that rotating a credential requires one change, not a manual edit on each node.
Who can change nodes, balancer and provisioning
In an HA setup, a single change to the load balancer, a node's configuration file or a provisioning file affects every user at once. List the people and service accounts allowed to change each of these layers, and separate them where possible. Require review for changes to provisioning files, since those can add or alter data sources that every node loads at startup.
Consistent metrics endpoint and version settings
Nodes deployed at different times or by different people can end up with different settings for the metrics endpoint and for version disclosure. An unauthenticated metrics endpoint or a visible version string on one node can expose more than the others. Compare the effective configuration on every node after each deployment, and confirm the endpoint requires authentication and the version is hidden from unauthenticated users as the hardening guide recommends.
What to monitor, back up and upgrade after go-live
Go-live is the start of the operating work, not the end of the project. A two-node or larger Grafana high availability setup has more moving parts than a single server, and each part needs a named owner and a health signal. Monitor three layers separately: each Grafana node (process up, response time, error rate and memory), the shared database (connections, replication or failover state, storage growth and slow queries), and the load balancer pool (which backends are in service, health check failures and session distribution). A healthy Grafana node does not prove the database is healthy, and a healthy pool can hide a node that is quietly failing its health check. Confirm with your load balancer vendor which health check endpoint Grafana exposes and how your pool reacts when it fails.
The database holds the dashboards, data source definitions, users, teams, folders, alert state and the auth tokens that let a user reach any node. Back it up on a schedule that matches how often people change dashboards and alerts, and keep the backup retention policy written down. Equally important, the backups have to be restorable. Schedule restore tests into a separate environment, check that Grafana starts against the restored database, and confirm that a sample of dashboards, data sources and alert rules comes back intact. Your provisioning repository is the second recovery source. If dashboards, data sources and alert rules are defined as files or code, a rebuild from the repository can restore much of the configuration, but it will not restore UI edits that were never committed, so decide which changes must go through review.
Upgrades in an HA cluster should be rolling, with one node taken out of the load balancer pool, upgraded, checked and returned before the next node is touched. Read the release notes for every minor release you apply, not only for major releases, because breaking changes and deprecations are announced there. Grafana's upgrade guidance describes major releases once a year in April or May, minor releases every other month, and patch releases at least monthly. Each minor release is supported for 9 months, and the last minor release of a major version for 15 months. Use those windows to set your own patch and minor review cadence, and confirm the current support dates on the release pages before you plan. The upgrade sequence, rollback steps and plugin checks are covered in more depth in the Grafana upgrades and support topic.
Finally, the topology and the operating model must be written down before the first incident. Record the node inventory, load balancer configuration, database engine and version, backup locations, the provisioning repository, alerting contact points and which node or service sends each notification. Assign an owner for each runbook, including failover of the database, removing and adding a Grafana node, restoring from backup and emergency rollback. Name an owner for the cadence itself, the person who tracks new minor and patch releases and schedules the work. Review the runbooks after each upgrade and after each restore test, because the first real failover is usually when gaps in these documents appear.
Questions teams ask before building Grafana high availability
What does a Grafana high availability project cost?
The cost depends on the scope agreed in writing, and DeployOpen does not publish a price list, so a quote follows from that scope. Cost components: design and sizing of two or more Grafana servers, database setup, load balancer and network configuration, alerting deduplication, failover testing, documentation and handover. One-time versus recurring: the build is one-time, while infrastructure, database licensing or hosting, and any ongoing support or upgrade retainer recur. Drivers: the number of nodes and environments, whether the database and load balancer already exist, how many data sources need their own high availability, identity integration, and how much provisioning as code is in scope. Ask the quote to separate what you pay directly to infrastructure providers from DeployOpen's effort, testing, handover and any retainer.
How long does it take to build Grafana high availability?
No duration figure applies to every environment, so confirm the timeline against your own scope and readiness. DeployOpen's fixed-scope timelines are agreed in writing before work starts. What sets the schedule: whether a MySQL 8.0 or later, or PostgreSQL 12 or later, database is ready with backups and access, whether the load balancer and DNS changes can be made, how quickly identity provider settings are approved, the number of change windows your organization allows, and whether the data sources Grafana depends on also need high availability. Alerting design and Grafana Live testing often take longer than teams expect because they need validation against real failover behavior. Ask for the schedule to list each dependency and the party responsible for it.
Can our internal team build Grafana high availability without a partner?
Often yes, if the team has working knowledge of Linux, database administration, load balancing and Grafana configuration. The Grafana documentation describes the core pattern: two or more active-active Grafana servers behind a load balancer, sharing a MySQL or PostgreSQL database, with database-backed auth tokens so users can reach any node. The gaps usually sit in the details: alerting needs extra configuration to avoid duplicate notifications, Grafana Live has limitations in HA, and the data sources themselves may not be highly available. Before deciding, test each of these areas in a non-production environment. A partner can be useful when skills are thin, when deadlines are fixed, or when your team needs to keep running existing services while the build proceeds.
What must our team provide before a Grafana HA build starts?
Your team must provide the infrastructure and access the build depends on. Database: a MySQL 8.0 or later, or PostgreSQL 12 or later, instance with backup and recovery arrangements. Load balancer: a place to terminate traffic in front of the Grafana nodes, plus DNS control. Identity: a configured provider, such as LDAP, Entra ID, Okta or a generic OAuth source, with a test account and agreed role mapping. Network: routes and firewall rules between the nodes, the database, the data sources and user networks. Hosting: virtual machines, containers or a Kubernetes cluster where the Grafana nodes will run. People and time: a named owner, approvers for production changes, and change windows for cutover and failover testing. Missing any of these usually adds waiting time rather than technical complexity.
Can we keep SQLite for a small Grafana high availability setup?</br>
No. The Grafana installation documentation states that SQLite does not scale for production, and Grafana high availability requires a shared MySQL or PostgreSQL database. SQLite can run a single, small Grafana instance, and the installation docs size small deployments at under 25 concurrent users with 2 cores and 2 to 4 GB of RAM, but that sizing applies to one server, not a cluster. What this means for planning: if you start on SQLite, plan the move to MySQL or PostgreSQL before adding a second node. That move includes exporting configuration and data, validating dashboards, data sources and users after import, and scheduling a cutover. Confirm the current database requirements for your Grafana version in the documentation before finalizing the architecture.
Does Grafana Live work in a high availability setup?
Grafana Live has limitations in high availability setups, according to the Grafana high availability documentation. Confirm the current limitations for your Grafana version before you design around any live streaming behavior in dashboards. What to check: which Live features your dashboards and users depend on, how requests are routed through your load balancer, and whether reconnection after a node failure behaves acceptably for your teams. Test these with two or more nodes behind the real load balancer, not only on a single server. If Live features are central to your use case, record the limitation in the design and agree on the expected behavior with the business owner so the gap is a known decision, not a surprise after go-live.
What stays our responsibility after Grafana high availability handover?
Most of the ongoing work stays with the owning team unless a support retainer is in place. Platform upkeep: applying patch releases, which Grafana's upgrade guidance describes as at least monthly, and planning minor releases, which come every other month. Each minor release is supported for 9 months, and the last minor release of a major version for 15 months, so upgrade planning must keep pace with those windows. Operations: database backups, capacity and failover tests, load balancer configuration, certificate renewal, data source high availability, plugin vetting and user access reviews. Change control: alert rules, provisioning files and identity mappings change over time and need review. DeployOpen offers ongoing support, upgrades and continuous testing as retainers, and the handover documentation should state who owns each item.
How DeployOpen scopes, builds and hands over Grafana high availability
DeployOpen plans and builds Grafana high availability inside your own infrastructure, starting from a written scope that names the Grafana servers, database, load balancer and data sources in play. The work is delivered as a fixed-scope project with documented deliverables, followed by optional retainer support for upgrades and continuous testing.
How we scope
- Confirm the number of Grafana nodes, the load balancer design and where each node runs in your environment.
- Agree the MySQL 8.0 or PostgreSQL 12 or later database that replaces SQLite and holds shared configuration and sessions.
- Record which data sources, alert contact points and identity providers the high availability design must support.
How we build
- Deploy two or more active-active Grafana servers behind your load balancer, all sharing the same database and database-backed auth tokens.
- Configure alerting to avoid duplicate notifications across nodes and test failover of a single node during a live session.
- Document the known Grafana Live limitations in high availability and agree with your team how dashboards relying on live streaming will behave.
How we hand over
- Deliver architecture diagrams, configuration files and runbooks covering node replacement, database failover and certificate rotation.
- Provision data sources, dashboards and alerting resources as files where possible so the setup can be reviewed and rebuilt.
- Walk your platform and on-call teams through failover tests, monitoring of the Grafana nodes and the rollback procedure.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer after handover, covering patch releases and minor upgrades.
- Retest the load balancer, database and alerting behavior after each Grafana upgrade, since high availability changes need re-verification.
- Confirm with your team which support scope, response expectations and service terms apply before any retainer begins.

