在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压力,您可以创建一个或多个只读实例,利用只读实例满足大量的数据库读取需求,增加应用的吞吐量。

简介

创建只读实例时会从备实例复制数据,数据与主实例一致,主实例的数据更新也会自动同步到所有只读实例。
说明
  • 目前仅RDS SQL Server 2017企业集群版和2019企业集群版支持创建只读实例。
  • 只读实例为单节点的架构(没有备节点)。
只读实例拓扑图如下图所示。

应用场景

  • 单个实例负载过大时,可以创建只读实例,将读请求转发至只读实例,用于缓解主实例负载。
  • 主实例因备份或维护等原因暂不可用时,可将读请求转发至只读实例,保证部分业务。
  • 面对报表分析等场景,使用只读实例查询分析大量数据,不影响主实例。
  • 面对紧急容灾场景,使用只读实例作为主实例的容灾备份,但切勿直接切换。

计费

支持包年包月和按量付费两种方式计费。具体费用请参见只读实例规格列表

功能特点

  • 计费方式:按量付费,使用更灵活。长期使用也可以包年包月,费用更便宜
  • 地域和可用区:与主实例在同一地域,可以在不同的可用区。
  • 规格:可以与主实例不一致,并且可以随时更改。建议只读实例规格不小于主实例规格,否则易导致只读实例延迟高、负载高等现象。
  • 网络类型可以与主实例不一致。
  • 账号与数据库管理:不需要维护账号与数据库,全部通过主实例同步。
  • 白名单:只读实例创建时会自动复制其主实例的白名单信息,但只读实例和主实例的白名单是相互独立的。若您需要修改只读实例的白名单,请参见设置白名单
  • 监控与报警:提供近20个系统性能指标的监控视图,如磁盘容量、IOPS、连接数、CPU使用率、网络流量等。

功能限制

  • 最多创建7个只读实例。
  • 因主实例已有备份,只读实例暂不支持备份设置以及手动发起备份。
  • 不支持通过备份文件或任意时间点创建临时实例,不支持通过备份集覆盖实例。
  • 创建只读实例后,主实例将不支持通过备份集直接覆盖实例来恢复数据。
  • 不支持将数据迁移至只读实例。
  • 不支持创建和删除数据库。
  • 不支持创建和删除账号,不支持为账号授权以及修改账号密码功能。

常见问题

  • Q:主实例上创建的账号在只读实例上可以用吗?

    A:主实例创建的账号会同步到只读实例,只读实例无法管理账号。账号在只读实例上只能进行读操作,不能进行写操作。

  • Q:如果主实例出现故障,是否支持把只读实例转变为常规实例?

    A:不支持。

  • Q:只读实例上的数据支持手动备份或自动备份吗?

    A:由于备份在主实例中进行,只读实例暂不支持备份设置以及手动发起备份。

  • Q:只读实例是否支持并行复制?

    A:支持,RDS SQL Server默认为并行复制。

  • Q:事务日志的清除机制是怎样的?
    A:RDS SQL Server事务日志分为两个阶段:
    • 日志截断:通常每次的日志备份会自动做日志截断。但如果出现长事务、同步等待或内核相关问题时,截断会无法生效。
    • 日志收缩:每日的常规备份包括日志收缩,您也可以通过控制台进行日志收缩,具体操作,请参见收缩事务日志
  • Q:如何理解只读实例的复制原理?若出现复制延迟,一般出现原因以及解决方法是什么?如何查看复制延迟?

    A:创建只读实例时会从备实例复制数据,数据与主实例一致,主实例的数据更新也会自动同步到所有只读实例。

    通常出现复制延迟原因如下:
    • 原因:主实例规格大,只读实例规格过小,导致主备延迟过大。只读实例规格过小,大主库拖小只读,导致主备延迟过大。

      解决方法:升级只读实例规格,更多信息,请参见变更配置

    • 原因:存在并发的大事务导致延迟。

      解决方法:检查处理存在的大事务,一般存在大事务原因可能包括锁问题、慢SQL问题以及临时查询未提交问题等。

    • 原因:内核Bug导致的复制异常。

      解决方法:建议升级实例大版本内核小版本解决。

    您可通过SQL Server CloudDBA进行诊断查看或通过如下SQL查看:
    SELECT
        ag.name AS [availability_group_name]
        , d.name AS [database_name]
        , ar.replica_server_name AS [replica_instance_name]
        , drs.truncation_lsn
        , drs.log_send_queue_size
        , drs.redo_queue_size
    FROM
        sys.availability_groups ag
        INNER JOIN sys.availability_replicas ar
            ON ar.group_id = ag.group_id
        INNER JOIN sys.dm_hadr_database_replica_states drs
            ON drs.replica_id = ar.replica_id
        INNER JOIN sys.databases d
            ON d.database_id = drs.database_id
    WHERE drs.is_local=0
    ORDER BY
        ag.name ASC, d.name ASC, drs.truncation_lsn ASC, ar.replica_server_name ASC