Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.
Replicas and Sentinel keep a deployment running when a node or a pod fails. They don’t help when you lose the whole Kubernetes cluster or its region. To recover from that, you need a copy of the data outside the region and a second FalkorDB Enterprise installation that can load it.This page describes a recovery plan built on scheduled RDB exports. The exports go to object storage that survives the outage. If the region is lost, you create the deployments in the recovery region and import the newest export into them.
Runs a standby FalkorDB Enterprise installation, with its own license
Object storage
Receives scheduled RDB exports
Holds a copy of the exports: a replicated bucket, or a repository of its own
On a regional outage
Lost
You create the deployments and import the newest export
How much data you can lose (RPO) depends on the age of the newest complete export in the recovery region: how often exports run, how long each takes, any replication delay in the storage, and any run that failed or was skipped. How long recovery takes (RTO) depends on how fast you can create the deployments and import the data. Run a recovery drill to measure it.
Backups (datafile, aof and volume-snapshot) can’t be restored in a different Kubernetes cluster through the Admin UI or API. A restore clones the deployment the backup was taken from, and both that deployment and the backup’s records live in the lost cluster. Volume snapshots never leave the cluster’s storage. Use backups for recovery inside the cluster, and RDB exports for recovery in another region. To restore a lost cluster’s backups, contact FalkorDB support.
A Kubernetes cluster in the recovery region, with FalkorDB Enterprise installed and its own license. A license is bound to one Kubernetes cluster, so register the recovery cluster in the Enterprise Portal. See Disaster recovery into a replacement cluster.
Object storage reachable from both regions.
In both installations, a backup repository on object storage: s3, s3-compatible, gcs-s3comp, minio, azureblob, oss, obs or cos. Either access method works. RDB exports and imports read and write the bucket directly, so they don’t need the csi-s3 driver.
A recovery installation running the same FalkorDB version as the primary, or a newer one. An export written by a newer FalkorDB can’t be imported into an older one.
The repository’s credentials in a Secret the Admin Server can read. The chart grants it read access to Secrets in kb-system and default, which covers credentials created by KubeBlocks and by the Admin UI. To keep them elsewhere, add the namespace to adminServer.rdbTransfer.credentialNamespaces. Credentials limited to the repository’s path prefix are enough; the export list then leaves out exports taken by earlier releases, which are stored outside the prefix. Repositories that rely on cloud IAM roles instead of keys aren’t supported for RDB exports.
The primary installation writes exports to one bucket, and the cloud provider copies them to the recovery region.
Cloud
Storage
Repository in the recovery region
AWS
S3 bucket with Cross-Region Replication to a bucket in the recovery region
Points at the replica bucket
Google Cloud
Dual-region or multi-region Cloud Storage bucket
Points at the same bucket
For Azure Blob Storage, replicate the container with object replication to an account in the recovery region, or use a geo-redundant account and fail it over.You only manage one export schedule per deployment. Replication is asynchronous, though, so the newest export may not have fully reached the recovery region when the primary region fails. Check what your provider guarantees for replication delay, and add it to your RPO.S3 replication doesn’t copy deletions unless you turn on delete marker replication in the replication rule. Without it, the exports that retention deletes in the primary bucket stay in the replica. Replication needs versioning on both buckets, so a deletion, replicated or made by a lifecycle rule, only hides an object: its earlier version is still stored. To keep the replica’s storage from growing:
Turn on delete marker replication, or add a lifecycle rule that expires current objects older than the exports you keep.
Add a NoncurrentVersionExpiration rule to the replica bucket. Keep noncurrent versions long enough to cover the recovery history you need, so that an export deleted by mistake can still be restored.
In a replica, a manifest.json alone doesn’t prove that an export is complete: replication can deliver it before the RDB files, and an expiration rule can remove a file the manifest lists. The export list in the recovery installation checks every listed file for you, and marks an export that is missing one as incomplete.
The primary installation writes exports to a separate repository in each region, for example exports-us-east and exports-eu-west. Each repository gets its own export schedule.This doesn’t depend on provider replication, and each repository is written directly. The trade-offs:
Every export is written twice, which doubles the storage and the traffic between regions.
Each schedule reads its own snapshot from the deployment. Set the schedules at different times so they don’t add load at the same time.
In the Admin UI, open Backup Repositories and select New Backup Repository. Choose the provider, then enter the bucket, region and credentials. To use a repository in each region, create one repository per region. Note each repository’s path prefix, if you set one.
2
Schedule exports for each deployment
In each deployment, open Data transfer and click Add schedule. Choose the repository, and set how often exports run and how many to keep.
A deployment's Data transfer tab, with a nightly export schedule to an S3 repository.
How often exports run is only the lower bound of your RPO. Each export also takes time to run and, with a replicated bucket, to reach the recovery region, and a failed or skipped run leaves the previous export as the newest. Pick an interval with room for these, and monitor the age of the newest complete export in the recovery region.
With a repository in each region, create one schedule per repository, each with its own name.
3
Keep each deployment's settings outside the region
Recovery creates new deployments, so keep a record of each deployment’s topology, shard count, CPU, memory, storage and FalkorDB version. One way is to store each deployment’s YAML manifest in version control.
Each export is written to its own folder, from the root of the bucket:
The folder holds one <shard>.rdb file per shard and a manifest.json that lists them. manifest.json is written last, and a failed export deletes its folder. Every installation whose repository points at the bucket, or at a replica of it, sees the same folders.
Exports taken by earlier releases went through a mounted volume, so they are under that volume’s folder in the bucket: pvc-<id>/<path prefix>/falkordb-rdb/.... The export list finds them there too, and an import reads them from where they are.
Install FalkorDB Enterprise in the recovery cluster with its own license. Keep it on the same release as the primary installation when you upgrade.
2
Choose a recovery domain
If clients connect through external DNS, give the recovery installation a domain of its own, different from the primary’s: for example dr.db.internal.example.com next to db.internal.example.com. Set it as the installation’s default, and point the recovery region’s ExternalDNS at that zone:
# values.yaml of the recovery installationadminServer: env: clusterExternalDomain: dr.db.internal.example.com
Clients have to be reconfigured after a recovery anyway, because a recovered deployment has its own password and certificate, so they change hostnames at the same time. The recovery names are predictable, <deployment>.dr.db.internal.example.com, so they can be written into client failover configuration ahead of time.With a domain of its own, a recovered deployment publishes its names as soon as it’s created, and nothing in the recovery region ever publishes the primary’s names. Records left behind in the primary’s zone can’t send clients to a copy whose data isn’t imported yet.
3
Create the repository
Create a backup repository that reads the exports: the replica bucket, the same multi-region bucket, or this region’s own repository. Use the same path prefix as the primary installation’s repository. The repository can have any name.
4
Check that the exports are readable
Use your cloud provider’s tools to list the exports in the bucket, and confirm the newest ones are there:
aws s3 ls s3://<bucket>/ --recursive | grep 'falkordb-rdb/prod/my-graph/dr-hourly/.*/manifest.json$'
Don’t create export schedules in the recovery installation that write to the same repository under the same namespace, deployment and schedule names as the primary. After each run, a schedule deletes all but its newest folders under falkordb-rdb/<namespace>/<deployment>/<schedule>/, and that would include the primary’s exports.
The license must be active. You can’t create deployments on an invalid license.
2
Make the storage available
With S3 replication, a Google Cloud dual-region or multi-region bucket, or a repository in each region, the exports are already in storage the recovery region can reach. Check that the recovery installation’s repository shows Ready.
3
Create the deployments
Create each deployment from the settings you recorded, with the same name. It needs at least as much memory as the original, and persistent storage even if the original had none, so that a pod restart doesn’t lose the imported data. The topology and shard count can differ, because an import routes each key to the shard that owns it.It gets the recovery domain by default. Don’t give it the primary’s domain: its names would be published before its data is imported.
4
Import the newest complete export
Open the new deployment, select Data transfer, and click Import. Choose Repository file, then the repository. Export lists every export in the bucket, newest first, including the ones the primary installation wrote. Choose the newest one of the deployment’s schedule.
The exports in the repository, read from the bucket: those of the lost installation included.
An export marked incomplete is missing a file its manifest lists, for example because replication hadn’t finished. Choose an older one.
An incomplete export: its manifest hasn't arrived yet.
Choosing an export fills in its Path. The new deployment is empty, so clear Snapshot before importing, then click Start Import.
Ready to import the newest complete export, without a snapshot of the empty deployment.
With the Admin CLI, list the exports and import one by its path:
Before writing anything, the import checks every file with the new deployment’s own server. It stops if a file is incomplete or was written by a newer FalkorDB.
5
Check the data
When the import succeeds, compare its key count with the keys listed in manifest.json. Then run a query whose answer you know, for example counting the nodes of a graph.
6
Move clients to the new deployment
The new deployment has its own service names, its own generated password and, with external DNS, names under the recovery domain. Copy them from Connection Details on the deployment’s General tab, and point clients at them.With TLS, the new deployment also has its own certificate, issued for its own names. With the FalkorDB Enterprise issuer it gets a new CA too, so clients that trust the original deployment’s CA can’t connect to it. Give clients the new CA, shown under Connection Details. Issuers you control, such as cert-manager or your own certificates, can sign the new deployment with the CA clients already trust. A certificate you provide yourself must cover the recovery names. Before you send production traffic, connect with hostname verification through a recovery name.The records the lost region published under the primary’s domain stay until ExternalDNS there can clean them up. Remove them by hand if clients that weren’t moved should fail fast instead of timing out.
7
Protect the recovered deployment
Set up backups and an export schedule for the recovered deployment. For the export schedule, use a schedule name that is different from the primary’s (see the warning in Prepare the recovery region).
A recovery plan you haven’t run is a guess. Run a drill regularly:
In the recovery installation, create a deployment in a scratch namespace. Give it a name that no production deployment uses, and keep the recovery domain, or use a domain set aside for drills.
External DNS names are built from the deployment name and its external domain, not its namespace. Never give a drill deployment the primary’s domain: with the same name as a production deployment, it publishes records for production’s names, and clients can be sent to the drill copy.
Check the data, and note how long the whole run took. That is the database part of your RTO. Your full RTO also includes deciding to fail over, making the storage available and moving clients over, so add those, or extend the drill until a client request succeeds against the recovered deployment.
Delete the scratch deployment.
A drill also shows that the recovery installation’s license, repository, credentials and FalkorDB version are still in order.
Writes made after the newest export that reached the recovery region are lost.
Exports of a sharded deployment are taken shard by shard. They aren’t a consistent copy across shards at one point in time.
The recovery region has no standby deployments, so recovery takes as long as creating the deployments plus importing the data. There is no automatic failover.
Backups and point-in-time restore can’t be used across Kubernetes clusters. See the warning at the top of this page.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"FalkorDB Docs","description":"Official FalkorDB documentation — the high-performance graph database for GraphRAG, Cypher queries, and knowledge graphs powering accurate GenAI applications.","colors":{"primary":"#FF8101","light":"#FDE900","dark":"#FF8101"},"logo":{"light":"https://mintcdn.com/falkordb-core/UsHkXui7FITcReVh/images/falkordb-logo-color.svg?fit=max\u0026auto=format\u0026n=UsHkXui7FITcReVh\u0026q=85\u0026s=d6cd14615384aaf1873f14dcebd7da7f","dark":"https://mintcdn.com/falkordb-core/4RKo-4HTPunDsB0h/images/falkordb-logo.svg?fit=max\u0026auto=format\u0026n=4RKo-4HTPunDsB0h\u0026q=85\u0026s=9fd7d3e195a0bf8907a119804e3f0694","href":"https://www.falkordb.com"},"favicon":"https://mintcdn.com/falkordb-core/4RKo-4HTPunDsB0h/images/favicon.ico?fit=max\u0026auto=format\u0026n=4RKo-4HTPunDsB0h\u0026q=85\u0026s=01ae535e76349bd2047c3da2475b1356","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://github.com/FalkorDB/FalkorDB","label":"Github"},{"href":"https://support.falkordb.com","label":"Support"},{"href":"https://discord.com/invite/6M4QwDXn2w","label":"Discord"}],"primary":{"type":"button","label":"Try FalkorDB Cloud","href":"https://app.falkordb.cloud"}},"footer":{"socials":{"github":"https://github.com/FalkorDB/FalkorDB","x":"https://x.com/FalkorDB","linkedin":"https://www.linkedin.com/company/falkordb","discord":"https://discord.com/invite/6M4QwDXn2w","youtube":"https://www.youtube.com/@falkordb","reddit":"https://www.reddit.com/r/falkordb"}},"seo":{"metatags":{"og:image":"https://docs.falkordb.com/images/falkor-logo.png","og:image:alt":"FalkorDB — the high-performance graph database for GraphRAG and GenAI","og:locale":"en_US","twitter:image":"https://docs.falkordb.com/images/falkor-logo.png","twitter:image:alt":"FalkorDB — the high-performance graph database for GraphRAG and GenAI","twitter:card":"summary_large_image","twitter:site":"@FalkorDB","twitter:creator":"@FalkorDB","author":"FalkorDB","publisher":"FalkorDB","application-name":"FalkorDB Docs","robots":"index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1","googlebot":"index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1","keywords":"FalkorDB, graph database, GraphRAG, knowledge graph, Cypher, OpenCypher, vector search, GenAI, RAG, RedisGraph, RedisGraph alternative, RedisGraph successor, RedisGraph migration, RedisGraph end of life, sparse matrix, linear algebra"},"organization":{"id":"https://www.falkordb.com/#organization","name":"FalkorDB","legalName":"FalkorDB Inc.","url":"https://www.falkordb.com","logo":"https://docs.falkordb.com/images/falkor-logo.png","sameAs":["https://github.com/FalkorDB/FalkorDB","https://x.com/FalkorDB","https://www.linkedin.com/company/falkordb","https://discord.com/invite/6M4QwDXn2w","https://www.youtube.com/@falkordb","https://www.reddit.com/r/falkordb/"]}},"integrations":{"gtm":{"tagId":"GTM-MBWB627H"}},"contextual":{"options":["copy","view","assistant","chatgpt","claude","perplexity","mcp","add-mcp","cursor","vscode","download-spec"],"display":"header"},"markdown":{"instructions":["FalkorDB is a graph database that speaks the Redis protocol. Queries are issued as OpenCypher through the GRAPH.QUERY and GRAPH.RO_QUERY commands, not over Bolt or a SQL connection.","FalkorDB implements a subset of OpenCypher with proprietary extensions. Do not assume Neo4j-only syntax or procedures are available — check /cypher/cypher-support and /cypher/known-limitations before using a clause.","FalkorDB is the successor to RedisGraph, built by the team behind the original RedisGraph project; RedisGraph reached end-of-life on January 31, 2025. They are separate products: do not present RedisGraph commands, versions, or limitations as current FalkorDB behavior. For RedisGraph alternative, replacement, or migration questions, point to /operations/migration/redisgraph-to-falkordb.","Use the official clients listed in /getting-started/clients rather than generic Redis or Neo4j drivers, and prefer the language the user is already working in.","Configuration parameters are set with GRAPH.CONFIG SET or at startup; cite the exact parameter name from /getting-started/configuration rather than inventing one.","This site covers four products: FalkorDB (core), FalkorDB Cloud, FalkorDB Enterprise, and the GraphRAG SDK. Name which one an answer applies to, since setup and operations differ."]},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"falkordb-core","hasAudioNarration":false,"actualSubdomain":"falkordb-core","customDomains":["docs.falkordb.com"],"gitSource":{"type":"github","owner":"falkordb","repo":"docs","deployBranch":"docs-site","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae867a5de528214ed1fa03b","collectionId":"e8720102-a4dc-4b3b-aee9-64135f71a27f","liveDeploymentHistoryId":"6ae867a5de528214ed1fa03b","schemaVersion":"v3"},"feedback":{"edits":true,"issues":true,"thumbs":true},"entitlements":{},"buildId":"6ae867a5de528214ed1fa03b","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"FalkorDB Cloud","count":227},{"language":"default","tag":"API Reference","count":209},{"language":"default","tag":"Documentation","count":193},{"language":"default","tag":"FalkorDB Enterprise","count":183},{"language":"default","tag":"FalkorDB","count":171},{"language":"default","tag":"API reference","count":125},{"language":"default","tag":"Admin Server API","count":122},{"language":"default","tag":"Enterprise BYOA","count":55},{"language":"default","tag":"Enterprise","count":55},{"language":"default","tag":"Browser","count":44}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#sidebar-content .sidebar-group{margin-top:.5rem}#sidebar-content .sidebar-group:first-child{margin-top:0}"}],"page":{"pagePath":"enterprise/operations/disaster-recovery","slug":"/enterprise/operations/disaster-recovery","pageMetadata":{"title":"Recover FalkorDB deployments in another region","sidebarTitle":"Disaster recovery","description":"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.","icon":"life-ring","href":"/enterprise/operations/disaster-recovery"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Replicas and Sentinel keep a deployment running when a node or a pod fails. They don’t help when you lose the whole Kubernetes cluster or its region. To recover from that, you need a copy of the data outside the region and a second FalkorDB Enterprise installation that can load it.`}),`\n`,_jsxs(_components.p,{children:[`This page describes a recovery plan built on scheduled `,_jsx(_components.a,{href:`/enterprise/operations/rdb-export-import`,children:`RDB exports`}),`. The exports go to object storage that survives the outage. If the region is lost, you create the deployments in the recovery region and import the newest export into them.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-the-plan-works`,children:`How the plan works`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:`Primary region`}),_jsx(_components.th,{children:`Recovery region`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Kubernetes cluster`}),_jsx(_components.td,{children:`Runs your deployments`}),_jsx(_components.td,{children:`Runs a standby FalkorDB Enterprise installation, with its own license`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Object storage`}),_jsx(_components.td,{children:`Receives scheduled RDB exports`}),_jsx(_components.td,{children:`Holds a copy of the exports: a replicated bucket, or a repository of its own`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`On a regional outage`}),_jsx(_components.td,{children:`Lost`}),_jsx(_components.td,{children:`You create the deployments and import the newest export`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`How much data you can lose (RPO) depends on the age of the newest complete export in the recovery region: how often exports run, how long each takes, any replication delay in the storage, and any run that failed or was skipped. How long recovery takes (RTO) depends on how fast you can create the deployments and import the data. Run a `,_jsx(_components.a,{href:`#test-the-plan`,children:`recovery drill`}),` to measure it.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/enterprise/operations/backups`,children:`Backups`}),` (`,_jsx(_components.code,{children:`datafile`}),`, `,_jsx(_components.code,{children:`aof`}),` and `,_jsx(_components.code,{children:`volume-snapshot`}),`) can’t be restored in a different Kubernetes cluster through the Admin UI or API. A restore `,_jsx(_components.a,{href:`/enterprise/operations/restore-new-database`,children:`clones the deployment`}),` the backup was taken from, and both that deployment and the backup’s records live in the lost cluster. Volume snapshots never leave the cluster’s storage. Use backups for recovery inside the cluster, and RDB exports for recovery in another region. To restore a lost cluster’s backups, contact FalkorDB support.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`requirements`,children:`Requirements`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A Kubernetes cluster in the recovery region, with FalkorDB Enterprise installed and its own license. A license is bound to one Kubernetes cluster, so register the recovery cluster in the `,_jsx(_components.a,{href:`/enterprise/get-started/enterprise-portal`,children:`Enterprise Portal`}),`. See `,_jsx(_components.a,{href:`/enterprise/licensing#disaster-recovery-into-a-replacement-cluster`,children:`Disaster recovery into a replacement cluster`}),`.`]}),`\n`,_jsx(_components.li,{children:`Object storage reachable from both regions.`}),`\n`,_jsxs(_components.li,{children:[`In both installations, a `,_jsx(_components.a,{href:`/enterprise/operations/backups`,children:`backup repository`}),` on object storage: `,_jsx(_components.code,{children:`s3`}),`, `,_jsx(_components.code,{children:`s3-compatible`}),`, `,_jsx(_components.code,{children:`gcs-s3comp`}),`, `,_jsx(_components.code,{children:`minio`}),`, `,_jsx(_components.code,{children:`azureblob`}),`, `,_jsx(_components.code,{children:`oss`}),`, `,_jsx(_components.code,{children:`obs`}),` or `,_jsx(_components.code,{children:`cos`}),`. Either access method works. RDB exports and imports read and write the bucket directly, so they don’t need the `,_jsx(_components.code,{children:`csi-s3`}),` driver.`]}),`\n`,_jsx(_components.li,{children:`A recovery installation running the same FalkorDB version as the primary, or a newer one. An export written by a newer FalkorDB can’t be imported into an older one.`}),`\n`,_jsxs(_components.li,{children:[`The repository’s credentials in a Secret the Admin Server can read. The chart grants it read access to Secrets in `,_jsx(_components.code,{children:`kb-system`}),` and `,_jsx(_components.code,{children:`default`}),`, which covers credentials created by KubeBlocks and by the Admin UI. To keep them elsewhere, add the namespace to `,_jsx(_components.code,{children:`adminServer.rdbTransfer.credentialNamespaces`}),`. Credentials limited to the repository’s path prefix are enough; the export list then leaves out exports taken by earlier releases, which are stored outside the prefix. Repositories that rely on cloud IAM roles instead of keys aren’t supported for RDB exports.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-where-exports-are-stored`,children:`Choose where exports are stored`}),`\n`,_jsx(_components.p,{children:`You have two ways to keep exports outside the primary region. You can also use both.`}),`\n`,_jsx(Heading,{level:`3`,id:`one-bucket-replicated-by-your-cloud-provider`,children:`One bucket replicated by your cloud provider`}),`\n`,_jsx(_components.p,{children:`The primary installation writes exports to one bucket, and the cloud provider copies them to the recovery region.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Cloud`}),_jsx(_components.th,{children:`Storage`}),_jsx(_components.th,{children:`Repository in the recovery region`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AWS`}),_jsx(_components.td,{children:`S3 bucket with Cross-Region Replication to a bucket in the recovery region`}),_jsx(_components.td,{children:`Points at the replica bucket`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Google Cloud`}),_jsx(_components.td,{children:`Dual-region or multi-region Cloud Storage bucket`}),_jsx(_components.td,{children:`Points at the same bucket`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`For Azure Blob Storage, replicate the container with `,_jsx(_components.a,{href:`https://learn.microsoft.com/azure/storage/blobs/object-replication-overview`,children:`object replication`}),` to an account in the recovery region, or use a geo-redundant account and fail it over.`]}),`\n`,_jsx(_components.p,{children:`You only manage one export schedule per deployment. Replication is asynchronous, though, so the newest export may not have fully reached the recovery region when the primary region fails. Check what your provider guarantees for replication delay, and add it to your RPO.`}),`\n`,_jsx(_components.p,{children:`S3 replication doesn’t copy deletions unless you turn on delete marker replication in the replication rule. Without it, the exports that retention deletes in the primary bucket stay in the replica. Replication needs versioning on both buckets, so a deletion, replicated or made by a lifecycle rule, only hides an object: its earlier version is still stored. To keep the replica’s storage from growing:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Turn on delete marker replication, or add a lifecycle rule that expires current objects older than the exports you keep.`}),`\n`,_jsxs(_components.li,{children:[`Add a `,_jsx(_components.code,{children:`NoncurrentVersionExpiration`}),` rule to the replica bucket. Keep noncurrent versions long enough to cover the recovery history you need, so that an export deleted by mistake can still be restored.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`In a replica, a `,_jsx(_components.code,{children:`manifest.json`}),` alone doesn’t prove that an export is complete: replication can deliver it before the RDB files, and an expiration rule can remove a file the manifest lists. The export list in the recovery installation checks every listed file for you, and marks an export that is missing one as incomplete.`]}),`\n`,_jsx(Heading,{level:`3`,id:`a-repository-in-each-region`,children:`A repository in each region`}),`\n`,_jsxs(_components.p,{children:[`The primary installation writes exports to a separate repository in each region, for example `,_jsx(_components.code,{children:`exports-us-east`}),` and `,_jsx(_components.code,{children:`exports-eu-west`}),`. Each repository gets its own export schedule.`]}),`\n`,_jsx(_components.p,{children:`This doesn’t depend on provider replication, and each repository is written directly. The trade-offs:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Every export is written twice, which doubles the storage and the traffic between regions.`}),`\n`,_jsx(_components.li,{children:`Each schedule reads its own snapshot from the deployment. Set the schedules at different times so they don’t add load at the same time.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`set-up-the-primary-region`,children:`Set up the primary region`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create the repository`,children:_jsxs(_components.p,{children:[`In the Admin UI, open `,_jsx(_components.strong,{children:`Backup Repositories`}),` and select `,_jsx(_components.strong,{children:`New Backup Repository`}),`. Choose the provider, then enter the bucket, region and credentials. To use `,_jsx(_components.a,{href:`#a-repository-in-each-region`,children:`a repository in each region`}),`, create one repository per region. Note each repository’s path prefix, if you set one.`]})}),_jsxs(Step,{title:`Schedule exports for each deployment`,children:[_jsxs(_components.p,{children:[`In each deployment, open `,_jsx(_components.strong,{children:`Data transfer`}),` and click `,_jsx(_components.strong,{children:`Add schedule`}),`. Choose the repository, and set how often exports run and how many to keep.`]}),_jsx(Frame,{caption:`A deployment's Data transfer tab, with a nightly export schedule to an S3 repository.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=b84250f67261555538a2f037efac97ba`,alt:`The Data transfer tab of falkordb-prod, showing the Import and Export buttons and a nightly export schedule that keeps 7 exports in aws-s3-prod`,\"data-og-width\":`2720`,width:`2720`,\"data-og-height\":`1720`,height:`1720`,\"data-path\":`enterprise/images/disaster-recovery/data-transfer-tab.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=84fef28e44257ce8f7ecb96f182ceeaa 280w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=b99749585320bb673207670642999396 560w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=1493ec02105be1d619fa51c5e0c55107 840w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=471cf59a4d1a8726e8795ae94cf0696d 1100w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=f526f6172b9ca016fd70d1b69e80a198 1650w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/data-transfer-tab.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=171bbf2a846d9d7ab37fe9a20618e211 2500w`})}),_jsx(_components.p,{children:`How often exports run is only the lower bound of your RPO. Each export also takes time to run and, with a replicated bucket, to reach the recovery region, and a failed or skipped run leaves the previous export as the newest. Pick an interval with room for these, and monitor the age of the newest complete export in the recovery region.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`falkordb-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rdb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` schedules`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-graph`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` dr-hourly`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --namespace`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` prod`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --schedule`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"0 * * * *\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --retention`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --repository`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` exports-us-east`})]}),`\n`]})})}),_jsx(_components.p,{children:`With a repository in each region, create one schedule per repository, each with its own name.`})]}),_jsx(Step,{title:`Keep each deployment's settings outside the region`,children:_jsxs(_components.p,{children:[`Recovery creates new deployments, so keep a record of each deployment’s topology, shard count, CPU, memory, storage and FalkorDB version. One way is to store each deployment’s `,_jsx(_components.a,{href:`/enterprise/databases/yaml`,children:`YAML manifest`}),` in version control.`]})})]}),`\n`,_jsx(_components.p,{children:`Each export is written to its own folder, from the root of the bucket:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\u003cpath prefix>/falkordb-rdb/\u003cnamespace>/\u003cdeployment>/\u003cschedule>/\u003cexport name>/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The folder holds one `,_jsx(_components.code,{children:`\u003cshard>.rdb`}),` file per shard and a `,_jsx(_components.code,{children:`manifest.json`}),` that lists them. `,_jsx(_components.code,{children:`manifest.json`}),` is written last, and a failed export deletes its folder. Every installation whose repository points at the bucket, or at a replica of it, sees the same folders.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Exports taken by earlier releases went through a mounted volume, so they are under that volume’s folder in the bucket: `,_jsx(_components.code,{children:`pvc-\u003cid>/\u003cpath prefix>/falkordb-rdb/...`}),`. The export list finds them there too, and an import reads them from where they are.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`prepare-the-recovery-region`,children:`Prepare the recovery region`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Install FalkorDB Enterprise`,children:_jsx(_components.p,{children:`Install FalkorDB Enterprise in the recovery cluster with its own license. Keep it on the same release as the primary installation when you upgrade.`})}),_jsxs(Step,{title:`Choose a recovery domain`,children:[_jsxs(_components.p,{children:[`If clients connect through `,_jsx(_components.a,{href:`/enterprise/deployment/external-dns`,children:`external DNS`}),`, give the recovery installation a domain of its own, different from the primary’s: for example `,_jsx(_components.code,{children:`dr.db.internal.example.com`}),` next to `,_jsx(_components.code,{children:`db.internal.example.com`}),`. Set it as the installation’s default, and point the recovery region’s ExternalDNS at that zone:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# values.yaml of the recovery installation`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`adminServer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` clusterExternalDomain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dr.db.internal.example.com`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Clients have to be reconfigured after a recovery anyway, because a recovered deployment has its own password and certificate, so they change hostnames at the same time. The recovery names are predictable, `,_jsx(_components.code,{children:`\u003cdeployment>.dr.db.internal.example.com`}),`, so they can be written into client failover configuration ahead of time.`]}),_jsx(_components.p,{children:`With a domain of its own, a recovered deployment publishes its names as soon as it’s created, and nothing in the recovery region ever publishes the primary’s names. Records left behind in the primary’s zone can’t send clients to a copy whose data isn’t imported yet.`})]}),_jsx(Step,{title:`Create the repository`,children:_jsx(_components.p,{children:`Create a backup repository that reads the exports: the replica bucket, the same multi-region bucket, or this region’s own repository. Use the same path prefix as the primary installation’s repository. The repository can have any name.`})}),_jsxs(Step,{title:`Check that the exports are readable`,children:[_jsx(_components.p,{children:`Use your cloud provider’s tools to list the exports in the bucket, and confirm the newest ones are there:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`aws`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` s3`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ls`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` s3://`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`bucke`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`t`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --recursive`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` grep`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'falkordb-rdb/prod/my-graph/dr-hourly/.*/manifest.json$'`})]}),`\n`]})})})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Don’t create export schedules in the recovery installation that write to the same repository under the same namespace, deployment and schedule names as the primary. After each run, a schedule deletes all but its newest folders under `,_jsx(_components.code,{children:`falkordb-rdb/\u003cnamespace>/\u003cdeployment>/\u003cschedule>/`}),`, and that would include the primary’s exports.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`recover-after-a-regional-outage`,children:`Recover after a regional outage`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Confirm the license`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`falkordb-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` license`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` status`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`The license must be `,_jsx(_components.code,{children:`active`}),`. You can’t create deployments on an `,_jsx(_components.code,{children:`invalid`}),` license.`]})]}),_jsx(Step,{title:`Make the storage available`,children:_jsxs(_components.p,{children:[`With S3 replication, a Google Cloud dual-region or multi-region bucket, or a repository in each region, the exports are already in storage the recovery region can reach. Check that the recovery installation’s repository shows `,_jsx(_components.code,{children:`Ready`}),`.`]})}),_jsxs(Step,{title:`Create the deployments`,children:[_jsx(_components.p,{children:`Create each deployment from the settings you recorded, with the same name. It needs at least as much memory as the original, and persistent storage even if the original had none, so that a pod restart doesn’t lose the imported data. The topology and shard count can differ, because an import routes each key to the shard that owns it.`}),_jsxs(_components.p,{children:[`It gets the `,_jsx(_components.a,{href:`#prepare-the-recovery-region`,children:`recovery domain`}),` by default. Don’t give it the primary’s domain: its names would be published before its data is imported.`]})]}),_jsxs(Step,{title:`Import the newest complete export`,children:[_jsxs(_components.p,{children:[`Open the new deployment, select `,_jsx(_components.strong,{children:`Data transfer`}),`, and click `,_jsx(_components.strong,{children:`Import`}),`. Choose `,_jsx(_components.strong,{children:`Repository file`}),`, then the repository. `,_jsx(_components.strong,{children:`Export`}),` lists every export in the bucket, newest first, including the ones the primary installation wrote. Choose the newest one of the deployment’s schedule.`]}),_jsx(Frame,{caption:`The exports in the repository, read from the bucket: those of the lost installation included.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=5a95251893018c3102098d22bcf51c30`,alt:`The Import RDB dialog with Repository file selected and the Export list open, showing three nightly exports of production/falkordb-prod with their date and size`,\"data-og-width\":`2720`,width:`2720`,\"data-og-height\":`1720`,height:`1720`,\"data-path\":`enterprise/images/disaster-recovery/import-export-list.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=b9e397738e91b43093da509782860cab 280w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=fd0716b2cb6c3326e3ea68f86f8f6b70 560w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=14e82848a835152b7bafce50f1347f8f 840w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=3e7ecaaed65de88fd8df79efe942eb95 1100w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=ecc24ee38b9b37ea03e59e315a7f652e 1650w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-export-list.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=15c1d7d8644a761c39e74bf73901a24b 2500w`})}),_jsx(_components.p,{children:`An export marked incomplete is missing a file its manifest lists, for example because replication hadn’t finished. Choose an older one.`}),_jsx(Frame,{caption:`An incomplete export: its manifest hasn't arrived yet.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=ce0280b54164b3f619c989bc0a687b86`,alt:`The Import RDB dialog with an incomplete export chosen, and a warning that it has no manifest.json and an older export should be chosen`,\"data-og-width\":`1152`,width:`1152`,\"data-og-height\":`1548`,height:`1548`,\"data-path\":`enterprise/images/disaster-recovery/import-incomplete-export.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=13fb515bd1ba39945b83985aa5ce7681 280w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=29560177191efb9bbc8927a7a3f876cd 560w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=220e305ece625dd6b19d801d5808b180 840w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=c663c075e9657767e4413cd0b75e08ac 1100w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=3a40060839479ac3b0cacf021e650f55 1650w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-incomplete-export.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=30fab5f689f99d0133ada5c1cceaa1d5 2500w`})}),_jsxs(_components.p,{children:[`Choosing an export fills in its `,_jsx(_components.strong,{children:`Path`}),`. The new deployment is empty, so clear `,_jsx(_components.strong,{children:`Snapshot before importing`}),`, then click `,_jsx(_components.strong,{children:`Start Import`}),`.`]}),_jsx(Frame,{caption:`Ready to import the newest complete export, without a snapshot of the empty deployment.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=30bd78a922ba4addad83a47d035c522e`,alt:`The Import RDB dialog with the newest complete export chosen, its path filled in, Merge selected and the snapshot option cleared`,\"data-og-width\":`1152`,width:`1152`,\"data-og-height\":`1548`,height:`1548`,\"data-path\":`enterprise/images/disaster-recovery/import-ready.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=280\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=d912dcb17347c54ed83b20bbed72f65b 280w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=560\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=d36bc1f4333d201609d093f6d8b0f30c 560w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=840\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=100994274847c3cc97c9dc512c211210 840w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=1100\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=248b491892f1969595d412b901ac809c 1100w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=1650\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=e7ace58f8135d4f5e11bde095365439f 1650w, https://mintcdn.com/falkordb-core/b4BheRIIAB7vElqA/enterprise/images/disaster-recovery/import-ready.png?w=2500\u0026fit=max\u0026auto=format\u0026n=b4BheRIIAB7vElqA\u0026q=85\u0026s=f4605a7f9c1ca161042beae0906af58c 2500w`})}),_jsx(_components.p,{children:`With the Admin CLI, list the exports and import one by its path:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`falkordb-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rdb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` repository-exports`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-graph`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --namespace`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` prod`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --repository`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` exports-eu-west`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`falkordb-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rdb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` import`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-graph`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --namespace`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` prod`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --from-repository`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` exports-eu-west`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --path`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`path`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` prefi`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`x`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/falkordb-rdb/prod/my-graph/dr-hourly/`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`export`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` nam`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`e`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --rollback`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` none`})]}),`\n`]})})}),_jsx(_components.p,{children:`Before writing anything, the import checks every file with the new deployment’s own server. It stops if a file is incomplete or was written by a newer FalkorDB.`})]}),_jsx(Step,{title:`Check the data`,children:_jsxs(_components.p,{children:[`When the import succeeds, compare its key count with the `,_jsx(_components.code,{children:`keys`}),` listed in `,_jsx(_components.code,{children:`manifest.json`}),`. Then run a query whose answer you know, for example counting the nodes of a graph.`]})}),_jsxs(Step,{title:`Move clients to the new deployment`,children:[_jsxs(_components.p,{children:[`The new deployment has its own service names, its own generated password and, with external DNS, names under the recovery domain. Copy them from `,_jsx(_components.strong,{children:`Connection Details`}),` on the deployment’s `,_jsx(_components.strong,{children:`General`}),` tab, and point clients at them.`]}),_jsxs(_components.p,{children:[`With `,_jsx(_components.a,{href:`/enterprise/databases/tls`,children:`TLS`}),`, the new deployment also has its own certificate, issued for its own names. With the `,_jsx(_components.strong,{children:`FalkorDB Enterprise`}),` issuer it gets a new CA too, so clients that trust the original deployment’s CA can’t connect to it. Give clients the new CA, shown under `,_jsx(_components.strong,{children:`Connection Details`}),`. Issuers you control, such as cert-manager or your own certificates, can sign the new deployment with the CA clients already trust. A certificate you provide yourself must cover the recovery names. Before you send production traffic, connect with hostname verification through a recovery name.`]}),_jsx(_components.p,{children:`The records the lost region published under the primary’s domain stay until ExternalDNS there can clean them up. Remove them by hand if clients that weren’t moved should fail fast instead of timing out.`})]}),_jsx(Step,{title:`Protect the recovered deployment`,children:_jsxs(_components.p,{children:[`Set up backups and an export schedule for the recovered deployment. For the export schedule, use a schedule name that is different from the primary’s (see the warning in `,_jsx(_components.a,{href:`#prepare-the-recovery-region`,children:`Prepare the recovery region`}),`).`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`test-the-plan`,children:`Test the plan`}),`\n`,_jsx(_components.p,{children:`A recovery plan you haven’t run is a guess. Run a drill regularly:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`In the recovery installation, create a deployment in a scratch namespace. Give it a name that no production deployment uses, and keep the recovery domain, or use a domain set aside for drills.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/enterprise/deployment/external-dns`,children:`External DNS`}),` names are built from the deployment name and its external domain, not its namespace. Never give a drill deployment the primary’s domain: with the same name as a production deployment, it publishes records for production’s names, and clients can be sent to the drill copy.`]})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Import the newest export into it, as in `,_jsx(_components.a,{href:`#recover-after-a-regional-outage`,children:`Recover after a regional outage`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Check the data, and note how long the whole run took. That is the database part of your RTO. Your full RTO also includes deciding to fail over, making the storage available and moving clients over, so add those, or extend the drill until a client request succeeds against the recovered deployment.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Delete the scratch deployment.`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`A drill also shows that the recovery installation’s license, repository, credentials and FalkorDB version are still in order.`}),`\n`,_jsx(Heading,{level:`2`,id:`limitations`,children:`Limitations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Writes made after the newest export that reached the recovery region are lost.`}),`\n`,_jsx(_components.li,{children:`Exports of a sharded deployment are taken shard by shard. They aren’t a consistent copy across shards at one point in time.`}),`\n`,_jsx(_components.li,{children:`The recovery region has no standby deployments, so recovery takes as long as creating the deployments plus importing the data. There is no automatic failover.`}),`\n`,_jsx(_components.li,{children:`Backups and point-in-time restore can’t be used across Kubernetes clusters. See the warning at the top of this page.`}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Recover FalkorDB deployments in another region","sidebarTitle":"Disaster recovery","description":"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.","icon":"life-ring","href":"/enterprise/operations/disaster-recovery"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How the plan works","slug":"how-the-plan-works","depth":2,"children":[]},{"title":"Requirements","slug":"requirements","depth":2,"children":[]},{"title":"Choose where exports are stored","slug":"choose-where-exports-are-stored","depth":2,"children":[{"title":"One bucket replicated by your cloud provider","slug":"one-bucket-replicated-by-your-cloud-provider","depth":3,"children":[]},{"title":"A repository in each region","slug":"a-repository-in-each-region","depth":3,"children":[]}]},{"title":"Set up the primary region","slug":"set-up-the-primary-region","depth":2,"children":[]},{"title":"Prepare the recovery region","slug":"prepare-the-recovery-region","depth":2,"children":[]},{"title":"Recover after a regional outage","slug":"recover-after-a-regional-outage","depth":2,"children":[]},{"title":"Test the plan","slug":"test-the-plan","depth":2,"children":[]},{"title":"Limitations","slug":"limitations","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"falkordb-core","siteName":"FalkorDB Docs","title":"Recover FalkorDB deployments in another region - FalkorDB Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T10:36:39.463Z","originalFileLocation":"enterprise/operations/disaster-recovery.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\">\u003cmeta data-mint-head name=\"keywords\" content=\"FalkorDB, graph database, GraphRAG, knowledge graph, Cypher, OpenCypher, vector search, GenAI, RAG, RedisGraph, RedisGraph alternative, RedisGraph successor, RedisGraph migration, RedisGraph end of life, sparse matrix, linear algebra\">\u003cmeta data-mint-head name=\"application-name\" content=\"FalkorDB Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Recover FalkorDB deployments in another region - FalkorDB Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"FalkorDB Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.falkordb.com/enterprise/operations/disaster-recovery\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.falkordb.com/images/falkor-logo.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Recover FalkorDB deployments in another region - FalkorDB Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.falkordb.com/images/falkor-logo.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/falkordb-core/mDs9ei6IUGTBvS7e/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"FalkorDB Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF8101\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"FalkorDB — the high-performance graph database for GraphRAG and GenAI\">\u003cmeta data-mint-head name=\"twitter:image:alt\" content=\"FalkorDB — the high-performance graph database for GraphRAG and GenAI\">\u003cmeta data-mint-head name=\"twitter:creator\" content=\"@FalkorDB\">\u003cmeta data-mint-head name=\"author\" content=\"FalkorDB\">\u003cmeta data-mint-head name=\"publisher\" content=\"FalkorDB\">\u003cmeta data-mint-head name=\"application-name\" content=\"FalkorDB Docs\">\u003cmeta data-mint-head name=\"googlebot\" content=\"index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.falkordb.com/enterprise/operations/disaster-recovery\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/enterprise/operations/disaster-recovery.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.falkordb.com/#organization\",\"name\":\"FalkorDB\",\"legalName\":\"FalkorDB Inc.\",\"url\":\"https://www.falkordb.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.falkordb.com/images/falkor-logo.png\"},\"sameAs\":[\"https://github.com/FalkorDB/FalkorDB\",\"https://x.com/FalkorDB\",\"https://www.linkedin.com/company/falkordb\",\"https://discord.com/invite/6M4QwDXn2w\",\"https://www.youtube.com/@falkordb\",\"https://www.reddit.com/r/falkordb/\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.falkordb.com#website\",\"name\":\"FalkorDB Docs\",\"url\":\"https://docs.falkordb.com\",\"publisher\":{\"@id\":\"https://www.falkordb.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery#webpage\",\"url\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery\",\"name\":\"Recover FalkorDB deployments in another region\",\"description\":\"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\",\"dateModified\":\"2026-11-02T10:36:39.463Z\",\"isPartOf\":{\"@id\":\"https://docs.falkordb.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Operations\",\"item\":\"https://docs.falkordb.com/enterprise/operations/scaling\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Recover FalkorDB deployments in another region\",\"item\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery#article\",\"headline\":\"Recover FalkorDB deployments in another region\",\"name\":\"Recover FalkorDB deployments in another region\",\"description\":\"Keep FalkorDB data in object storage that survives a regional outage, and recover it into a FalkorDB Enterprise installation in another region.\",\"url\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery\",\"mainEntityOfPage\":{\"@id\":\"https://docs.falkordb.com/enterprise/operations/disaster-recovery#webpage\"},\"image\":\"https://docs.falkordb.com/images/falkor-logo.png\",\"dateModified\":\"2026-11-02T10:36:39.463Z\",\"publisher\":{\"@id\":\"https://www.falkordb.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.falkordb.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"FalkorDB Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"FalkorDB Docs","nav":{"global":null,"products":[{"product":"FalkorDB","icon":"database","description":"The open source graph database, Cypher language, and tooling.","pages":[{"title":"FalkorDB","href":""}]},{"product":"FalkorDB Cloud","icon":"cloud","description":"The managed FalkorDB service and its provisioning API.","pages":[{"title":"FalkorDB Cloud","href":"/cloud"}]},{"product":"FalkorDB Enterprise","icon":"building","description":"Self-managed FalkorDB on your own Kubernetes clusters.","tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"FalkorDB Enterprise documentation: self-managed graph database on Kubernetes","sidebarTitle":"Home","mode":"wide","icon":"house","href":"/enterprise"},{"title":"FalkorDB Enterprise platform overview and architecture","sidebarTitle":"Overview","icon":"layer-group","href":"/enterprise/get-started/overview"},{"title":"Prerequisites and system requirements for FalkorDB Enterprise","sidebarTitle":"Requirements","icon":"list-check","href":"/enterprise/get-started/requirements"},{"title":"Use the FalkorDB Enterprise Portal","sidebarTitle":"Enterprise Portal","icon":"id-card","href":"/enterprise/get-started/enterprise-portal"},{"title":"Quickstart: install FalkorDB Enterprise on Kubernetes","sidebarTitle":"Quickstart","icon":"rocket","href":"/enterprise/get-started/quickstart"}]},{"group":"Install","pages":[{"title":"Production installation guide for FalkorDB Enterprise","sidebarTitle":"Production install","icon":"shield-check","href":"/enterprise/deployment/production"},{"title":"Deploy FalkorDB Enterprise with private registries and air-gapped mirrors","sidebarTitle":"Private registries","icon":"box","href":"/enterprise/deployment/private-images"},{"title":"Configure external DNS access for FalkorDB deployments","sidebarTitle":"External DNS access","icon":"globe","href":"/enterprise/deployment/external-dns"},{"title":"Set up network infrastructure for FalkorDB access from your VPC","sidebarTitle":"VPC access","icon":"route","href":"/enterprise/deployment/vpc-access"},{"group":"Platform guides","icon":"server","pages":[{"title":"Deploy FalkorDB Enterprise on Azure Kubernetes Service (AKS)","sidebarTitle":"Azure (AKS)","icon":"microsoft","href":"/enterprise/deployment/aks"},{"title":"Private AKS deployment with internal load balancers and TLS","sidebarTitle":"Private AKS","icon":"lock","href":"/enterprise/deployment/aks-internal"},{"title":"Deploy FalkorDB Enterprise on Amazon Elastic Kubernetes Service (EKS)","sidebarTitle":"AWS (EKS)","icon":"aws","href":"/enterprise/deployment/eks"},{"title":"Deploy FalkorDB Enterprise on Google Kubernetes Engine (GKE)","sidebarTitle":"Google (GKE)","icon":"google","href":"/enterprise/deployment/gke"},{"title":"Deploy FalkorDB Enterprise on K3s","sidebarTitle":"K3s","icon":"cube","href":"/enterprise/deployment/k3s"},{"title":"Deploy FalkorDB Enterprise on Red Hat OpenShift with SCC and ODF","sidebarTitle":"OpenShift","icon":"red-hat","href":"/enterprise/deployment/openshift"},{"title":"Deploy FalkorDB Enterprise on Rancher (RKE2 and K3s)","sidebarTitle":"Rancher","icon":"cow","href":"/enterprise/deployment/rancher"}]}]},{"group":"Authentication","pages":[{"title":"Configure Google OAuth and Google Workspace group mapping in FalkorDB Enterprise","sidebarTitle":"Google OAuth","icon":"google","href":"/enterprise/authentication/google-oauth"},{"title":"Configure Microsoft Entra ID (Azure AD) OAuth and role mapping","sidebarTitle":"Microsoft Entra ID","icon":"microsoft","href":"/enterprise/authentication/azure-ad-oauth"}]},{"group":"Deploy databases","pages":[{"title":"Kubernetes networking and service connectivity for FalkorDB deployments","sidebarTitle":"Networking","icon":"network-wired","href":"/enterprise/databases/networking"},{"title":"TLS encryption for FalkorDB deployments","sidebarTitle":"TLS","icon":"lock","href":"/enterprise/databases/tls"},{"title":"Deploy a standalone FalkorDB instance on Kubernetes","sidebarTitle":"Standalone","icon":"database","href":"/enterprise/databases/standalone"},{"title":"Deploy a replicated multi-node FalkorDB instance on Kubernetes","sidebarTitle":"Replicated","icon":"copy","href":"/enterprise/databases/replicated"},{"title":"Deploy high-availability FalkorDB with Redis Sentinel on Kubernetes","sidebarTitle":"Sentinel","icon":"shield","href":"/enterprise/databases/sentinel"},{"title":"Deploy a sharded distributed FalkorDB deployment on Kubernetes","sidebarTitle":"Sharded","icon":"grid-2","href":"/enterprise/databases/sharded"},{"title":"Deploy FalkorDB from raw KubeBlocks YAML manifests","sidebarTitle":"Deploy from YAML","icon":"file-code","href":"/enterprise/databases/yaml"}]},{"group":"Operations","pages":[{"title":"Scale FalkorDB deployments horizontally and vertically on Kubernetes","sidebarTitle":"Scaling","icon":"arrow-up-right-dots","href":"/enterprise/operations/scaling"},{"title":"Reduce FalkorDB memory by offloading idle graphs to disk","sidebarTitle":"Graph offloading","icon":"box-archive","href":"/enterprise/operations/graph-offloading"},{"title":"Configure FalkorDB engine parameters and Kubernetes pod resources","sidebarTitle":"Parameters \u0026 resources","icon":"gear","href":"/enterprise/operations/parameters"},{"title":"Configure automated backups and schedules in FalkorDB Enterprise","sidebarTitle":"Backups \u0026 schedules","icon":"floppy-disk","href":"/enterprise/operations/backups"},{"title":"Restoring a FalkorDB backup over an existing deployment","sidebarTitle":"Restore in place","icon":"clock-rotate-left","href":"/enterprise/operations/restore-same-database"},{"title":"Restore a FalkorDB backup to a new Kubernetes deployment","sidebarTitle":"Restore to new","icon":"clone","href":"/enterprise/operations/restore-new-database"},{"title":"Export and import RDB files","sidebarTitle":"RDB export and import","description":"Export a deployment to portable RDB files, and import RDB data into an existing deployment from an export, another deployment, or any Redis-protocol server.","icon":"right-left","href":"/enterprise/operations/rdb-export-import"},{"title":"Recover FalkorDB deployments in another region","sidebarTitle":"Disaster recovery","icon":"life-ring","href":"/enterprise/operations/disaster-recovery"},{"title":"Monitor FalkorDB with Prometheus, Grafana, and Admin UI metrics","sidebarTitle":"Monitoring \u0026 Grafana","description":"View logs, live metrics, and optional Grafana dashboards.","icon":"chart-line","href":"/enterprise/operations/monitoring"},{"title":"Track Kubernetes infrastructure spend with Cost Showback","sidebarTitle":"Cost Showback","icon":"dollar-sign","href":"/enterprise/operations/cost-showback"},{"title":"Reset FalkorDB Enterprise admin password via Kubernetes secrets","sidebarTitle":"Reset admin password","icon":"key","href":"/enterprise/operations/reset-admin-password"}]},{"group":"Licensing","pages":[{"title":"FalkorDB Enterprise licensing, quotas, and cluster activation","sidebarTitle":"Licensing","icon":"key","href":"/enterprise/licensing"}]},{"group":"Security","pages":[{"title":"FalkorDB Enterprise security architecture, hardening, and RBAC","sidebarTitle":"Security","icon":"shield","href":"/enterprise/security"}]},{"group":"Releases","pages":[{"title":"What's new in FalkorDB Enterprise 1.0: security, hardening, and verification","sidebarTitle":"1.0","icon":"sparkles","href":"/enterprise/releases/1-0"}]},{"group":"Upgrade and uninstall","pages":[{"title":"Upgrade FalkorDB Enterprise control plane and Helm release","sidebarTitle":"Upgrade Enterprise","icon":"arrow-up","href":"/enterprise/upgrades/enterprise"},{"title":"FalkorDB Enterprise release notes and changelog","sidebarTitle":"Changelog","icon":"list","href":"/enterprise/upgrades/changelog"},{"group":"Migration guides","pages":[{"title":"Migration guide: upgrade FalkorDB Enterprise 0.3 to 0.4","sidebarTitle":"0.3 to 0.4","icon":"right-left","href":"/enterprise/upgrades/migrations/0.3-to-0.4"},{"title":"Migration guide: upgrade FalkorDB Enterprise 0.3 directly to 1.0","sidebarTitle":"0.3 to 1.0","icon":"right-left","href":"/enterprise/upgrades/migrations/0.3-to-1.0"}]},{"title":"Move FalkorDB deployments to a newer addon release","sidebarTitle":"Upgrade the addon","icon":"puzzle-piece","href":"/enterprise/upgrades/addon"},{"title":"Upgrade KubeBlocks operator for FalkorDB Enterprise","sidebarTitle":"Upgrade KubeBlocks","icon":"cubes","href":"/enterprise/upgrades/kubeblocks"},{"title":"Upgrade database engine version for FalkorDB deployments","sidebarTitle":"Upgrade FalkorDB version","icon":"code-branch","href":"/enterprise/upgrades/falkordb-version"},{"title":"Uninstall FalkorDB Enterprise and clean up Kubernetes resources","sidebarTitle":"Uninstall","icon":"trash","href":"/enterprise/upgrades/uninstall"}]},{"group":"Troubleshooting","pages":[{"title":"Troubleshoot FalkorDB deployments, pods, and KubeBlocks","sidebarTitle":"Troubleshoot deployments","icon":"stethoscope","href":"/enterprise/troubleshooting/deployments"},{"title":"Collect FalkorDB diagnostics and support packages","sidebarTitle":"Support packages","icon":"life-ring","href":"/enterprise/troubleshooting/support-package"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/enterprise/reference/helm-values"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/enterprise/api-reference/introduction"}]}]},{"product":"GraphRAG SDK","icon":"share-nodes","description":"Build knowledge graphs from documents and query them with natural language.","pages":[{"title":"GraphRAG SDK","href":"/graphrag"}]}]},"basePath":"","title":"Recover FalkorDB deployments in another region - FalkorDB Docs","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}