MongoDB Atlas 提供完全托管和可定制的备份,以确保数据保留和恢复:
云备份:支持完整副本快照,并使用云提供商的原生快照功能进行本地化快照存储。这些快照始终以增量方式保存,从而降低成本并加快恢复速度。您选择一个备份策略来指定每小时、每天、每周、每月和每年快照的频率和保留期。
持续云备份:通过提供时间点 (PIT) 恢复来增强标准云备份。此附加功能将快照与集群的 oplog 一起存储,以捕获快照之间的数据变化,使您能够将数据恢复到故障或事件发生前的确切时刻(时间点)。这支持恢复点目标 (RPO) 低至 1 分钟。
我们不建议为开发和测试环境启用备份。对于预发布和生产环境,建议您开发包含本页所述备份策略建议的自动化部署模板。
Atlas 备份功能
Atlas 提供完全托管的数据备份,包括时间点数据恢复和所有集群(包括分片集群)的一致的集群范围快照。在 Atlas 中,您可以从五种快照频率中进行选择,每种频率都有其自己的保留期:每小时、每天、每周、每月和每年。
云备份 | 该功能使用集群云服务提供商的原生快照功能提供本地化备份存储。优势包括 12 个月的强大的默认备份保留安排,具备完全灵活的自定义快照及保留方案,并且能够设置不同的快照频率(例如,每小时快照用于快速恢复,每周或每月快照用于长期保留),以满足行业法规要求。您可以即时访问您的备份数据,这对于 Atlas 审核、合规或数据恢复目的非常有用。 |
持续的云备份 | 可以在云备份的基础上启用此功能,以提供时间点 (PIT) 恢复。持续云备份通过将快照与集群的 oplog 一起存储在一个可自定义的时点还原 (PITr) 窗口中工作,使您能够恢复到最后一个快照,然后重放自快照拍摄以来的所有操作。这使您可以将数据恢复到任何故障或数据丢失事件(例如网络攻击)发生之前的精确时刻(给定时间点)。 |
多区域快照分发 | 此功能允许您通过在默认主区域之外的地理区域分发备份快照和 oplog 的副本来增强韧性。此配置满足将备份存储在不同地理区域的合规要求,以确保在发生区域性中断时能够实现灾难恢复。 要了解更多信息,请参阅 快照分发。 |
备份合规策略 | 此功能通过防止存储在 Atlas 中的所有快照和 oplog 被修改或删除,进一步保护关键业务数据,确保您的备份完全符合 WORM(一次写入,多次读取)要求。只有指定的授权用户在完成与 MongoDB 支持的验证过程后,才能关闭此保护功能。有一个强制冷却期来禁用此功能,以便攻击者无法更改备份策略并导出数据。 要了解更多信息,请参阅配置备份合规策略。 |
Atlas 备份的建议
备份策略的建议
您必须将备份策略与特定的恢复点目标 (RPO) 和恢复时间目标 (RTO) 保持一致,以满足业务连续性要求,尤其是对于关键应用程序,其中接近于零的 RPO 和快速恢复时间至关重要。RPO 定义了故障或中断期间可接受的最大数据丢失量,而 RTO 定义了集群或服务恢复所需的最长时间。您必须根据应用程序的关键性来计算 RPO 和 RTO 的标准。示例,关键任务数据通常需要比点击流分析更低的 RPO。
您的灾难场景的性质和恢复方法会影响您可实现的 RPO 和 RTO。MongoDB 的默认高可用性架构支持自动故障转移,以便从云提供商的临时服务中断中恢复,RTO 和 RPO 几乎为零,具体取决于服务中断的范围和您选择的部署范式。要学习更多关于支持自动故障转移的部署配置的信息,请参阅 Atlas 高可用性指南。对于需要从备份恢复的灾难场景,例如导致整个数据库损坏的代码错误或意外删除集群,您的部署的 RTO 和 RPO 取决于以下因素:
RPO 取决于您备份策略中定义的快照间隔。当禁用连续云备份时,您的 RPO 直接与快照之间的时间间隔相对应。如果您每四个小时进行一次备份快照,例如,那么在故障事件中,您可能会丢失最多四个小时的数据。如果您启用持续云备份,则可以在可自定义的 PITr 窗口中执行 PIT 恢复,从而保证 RPO 低至一分钟。
RTO 取决于备份的大小和恢复操作的效率。恢复大型副本集(和分片)需要更长的时间。为了加快恢复速度,Atlas 会自动对位于同一项目和存储快照副本的区域的集群执行优化的直接附加恢复。如果没有可用的本地快照,或者集群使用 NVMe 存储而不是标准的通用或低 CPU 存储,那么 Atlas 会默认使用较慢的流媒体恢复。此外,如果您启用持续云备份,则 Atlas 必须在恢复到最后一个快照后重播操作,以完成 PIT 恢复。快照之间的时间间隔越短,重放的操作就越少。因此,您可以通过优先考虑优化的恢复和在备份策略中要求更频繁的快照来降低 RTO。
为了制定全面的备份策略,我们建议使用以下默认备份策略。您应该根据贵公司的数据保留和灾难恢复需求调整此策略。
策略类型 | 层级 | 持续的云备份 | 拍摄的快照 | 保留的快照 |
|---|---|---|---|---|
每小时 | NVMe | 已启用 | 每 12 小时 | 7 天 |
每小时 | 非 NVMe | 已启用 | 每 6 小时 | 7 天 |
每日 | 所有 | 你可以: | 每天 | 7 天 |
每周 | 所有 | 你可以: | 每周六 | 4 周 |
每月 | 所有 | 你可以: | 每月最后一天 | 12个月 |
每年 | 所有 | 你可以: | 每年 12 月 1 日 | 1 年 |
备份分发建议
为了进一步增强单区域部署的韧性,我们建议您配置 Atlas 将快照从主区域复制到次要备份区域,以确保在主节点区域出现故障时,您仍然可以恢复到上一个版本。要了解更多信息,请参阅配置 Atlas 以自动将快照复制到其他区域。
备份合规策略的建议
我们建议实施 Atlas 的备份合规策略,以防止未经授权的备份修改或删除,从而确保数据保护和强大的灾难恢复。
PIT 恢复的建议
持续云备份能够实现精确的给定时间点 (PIT) 恢复,从而最大限度地减少故障期间的数据丢失。Atlas 可以快速恢复到故障事件发生前的确切时间戳,确保至少一分钟的 RPO。这是因为 Atlas 会恢复所需给定时间点之前的最新快照,然后重放 oplog 更改以恢复到该特定点。恢复时间可能会因云提供商磁盘预热以及恢复过程中必须重放 oplog 的数量而有所不同。在云提供商的磁盘预热完成之前,恢复后的集群性能可能会较慢。如果您能够灵活地满足恢复需求,我们建议设计模板,在合理的恢复选项和成本之间找到最佳折中方案。
备份成本的建议
为了优化 Atlas 备份成本,您可以根据数据的重要性调整备份频率和保留策略,从而减少不必要的存储费用。示例,我们建议您在较低的环境中禁用备份,例如数据恢复不重要的开发或测试集群。对于高级环境,我们建议在跨区域分发备份快照时,平衡跨区域数据传输成本与高可用性要求。
自动化示例:Atlas 备份
以下示例使用 Atlas 自动化工具启用备份和还原操作。
这些示例仅适用于启用了备份的集群的预发布环境和生产环境。
运行以下命令,为名为 myDemo 的集群拍摄备份快照,并将该快照保留 7 天:
atlas backups snapshots create myDemo --desc "my backup snapshot" --retention 7
为您的项目启用备份合规性策略,指定的授权用户 (governance@example.org) 在完成与 MongoDB 支持的验证过程后,才可以关闭此保护。
atlas backups compliancePolicy enable \ --projectId 67212db237c5766221eb6ad9 \ --authorizedEmail governance@example.org \ --authorizedUserFirstName john \ --authorizedUserLastName doe
运行以下命令,为计划的备份快照创建合规策略,该策略强制执行必须拍摄快照的次数(设立为每 6 小时)和保留快照的持续时间(设立为 1 个月) 。
atlas backups compliancePolicy policies scheduled create \ --projectId 67212db237c5766221eb6ad9 \ --frequencyInterval 6 \ --frequencyType hourly \ --retentionValue 1 \ --retentionUnit months
以下示例演示如何在部署过程中配置备份。在使用 Terraform 创建资源之前,您必须:
创建您的付款组织并为该付款组织创建一个 API 密钥。请在终端中运行以下命令,将您的 API 密钥存储为环境变量:
export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>" export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
常见文件
您必须为每个示例创建以下文件。将每个示例的文件放在各自的目录中。更改 ID 和名称以使用您的值。然后运行命令以初始化 Terraform、查看 Terraform 计划并应用更改。
variables.tf
variable "org_id" { description = "Atlas organization ID" type = string } variable "project_name" { description = "Atlas project name" type = string } variable "cluster_name" { description = "Atlas Cluster Name" type = string } variable "point_in_time_utc_seconds" { description = "PIT in UTC" default = 0 type = number }
配置集群的备份计划
使用以下内容为集群配置备份计划,具有以下快照频率和保留时间:
每小时:每12小时,保留7天
每日:每天一次,保留7天
每周:周六,保留 4 周
每月:每月的最后一天,保留3个月
main.tf
locals { atlas_clusters = { "cluster_1" = { name = "m10-aws-1e", region = "US_EAST_1" }, "cluster_2" = { name = "m10-aws-2e", region = "US_EAST_2" }, } } resource "mongodbatlas_project" "atlas-project" { org_id = var.org_id name = var.project_name } resource "mongodbatlas_advanced_cluster" "automated_backup_test_cluster" { for_each = local.atlas_clusters project_id = mongodbatlas_project.atlas-project.id name = each.value.name cluster_type = "REPLICASET" replication_specs { region_configs { electable_specs { instance_size = "M10" node_count = 3 } analytics_specs { instance_size = "M10" node_count = 1 } provider_name = "AWS" region_name = each.value.region priority = 7 } } backup_enabled = true # enable cloud backup snapshots pit_enabled = true } resource "mongodbatlas_cloud_backup_schedule" "test" { for_each = local.atlas_clusters project_id = mongodbatlas_project.atlas-project.id cluster_name = mongodbatlas_advanced_cluster.automated_backup_test_cluster[each.key].name reference_hour_of_day = 3 # backup start hour in UTC reference_minute_of_hour = 45 # backup start minute in UTC restore_window_days = 7 # Restore window for near-zero RPO copy_settings { cloud_provider = "AWS" frequencies = ["HOURLY", "DAILY", "WEEKLY", "MONTHLY", "YEARLY", "ON_DEMAND"] region_name = "US_WEST_1" zone_id = mongodbatlas_advanced_cluster.automated_backup_test_cluster[each.key].replication_specs.*.zone_id[0] should_copy_oplogs = true } policy_item_hourly { frequency_interval = 12 # backup every 12 hours, accepted values = 1, 2, 4, 6, 8, 12 -> every n hours retention_unit = "days" retention_value = 7 # retain for 7 days } policy_item_daily { frequency_interval = 1 # backup every day, accepted values = 1 -> every 1 day retention_unit = "days" retention_value = 7 # retain for 7 days } policy_item_weekly { frequency_interval = 7 # every Sunday, accepted values = 1 to 7 -> every 1=Monday,2=Tuesday,3=Wednesday,4=Thursday,5=Friday,6=Saturday,7=Sunday day of the week retention_unit = "weeks" retention_value = 4 # retain for 4 weeks } policy_item_monthly { frequency_interval = 28 # accepted values = 1 to 28 -> 1 to 28 every nth day of the month retention_unit = "months" retention_value = 3 # retain for 3 months } depends_on = [ mongodbatlas_advanced_cluster.automated_backup_test_cluster ] }
为集群配置备份和 PIT 恢复
使用以下内容配置云备份快照和 PIT 恢复作业。
main.tf
Create a project resource "mongodbatlas_project" "project_test" { name = var.project_name org_id = var.org_id } Create a cluster with 3 nodes resource "mongodbatlas_advanced_cluster" "cluster_test" { project_id = mongodbatlas_project.project_test.id name = var.cluster_name cluster_type = "REPLICASET" backup_enabled = true # enable cloud provider snapshots pit_enabled = true retain_backups_enabled = true # keep the backup snapshopts once the cluster is deleted replication_specs { region_configs { priority = 7 provider_name = "AWS" region_name = "US_EAST_1" electable_specs { instance_size = "M10" node_count = 3 } } } } Specify number of days to retain backup snapshots resource "mongodbatlas_cloud_backup_snapshot" "test" { project_id = mongodbatlas_advanced_cluster.cluster_test.project_id cluster_name = mongodbatlas_advanced_cluster.cluster_test.name description = "My description" retention_in_days = "1" } Specify the snapshot ID to use to restore resource "mongodbatlas_cloud_backup_snapshot_restore_job" "test" { count = (var.point_in_time_utc_seconds == 0 ? 0 : 1) project_id = mongodbatlas_cloud_backup_snapshot.test.project_id cluster_name = mongodbatlas_cloud_backup_snapshot.test.cluster_name snapshot_id = mongodbatlas_cloud_backup_snapshot.test.id delivery_type_config { point_in_time = true target_cluster_name = mongodbatlas_advanced_cluster.cluster_test.name target_project_id = mongodbatlas_advanced_cluster.cluster_test.project_id point_in_time_utc_seconds = var.point_in_time_utc_seconds } }