• Oracle DataGuard机制在容灾场景下应用


    参考资料:

    Oracle技术网:https://www.oracle.com/technetwork/cn/tutorials/smiley-fsfo-088047-zhs.html

    DataGuard日志传输模式:http://blog.itpub.net/12679300/viewspace-1973194/

    DataGuard自动切换:http://blog.itpub.net/26736162/viewspace-1811944/

    DataGuard传输模式:http://blog.itpub.net/12679300/viewspace-1973194/

    fast-start failover(FSFO):http://blog.itpub.net/28211342/viewspace-2138894/

    TAF:https://blog.csdn.net/wll_1017/article/details/9469063

    TAF:http://blog.itpub.net/26736162/viewspace-1811944/

    ===========================

    Oracle RAC

    ===========================

    Oracle Real Application Clusters (简称RAC)是屡获奖项的 Oracle Database Enterprise Edition 的一个选件。Oracle RAC采用共享缓存体系结构的数据库集群。一组Oracle RAC数据库服务器组成一个集群,他们之间通过高速内网互联,共享缓存。用户通过外部网络连接到数据库集群,当数据库服务器有单点故障时,上层用户不会受到任何影响。数据库集群共享下层的SAN存储。

    Oracle Extended Distance Cluster是 Oracle RAC的一种部署模式,通过将集群中的服务器部署在物理分隔的位置。Oracle Extended Distance Cluster提供更胜于本地Oracle RAC的可用性。Oracle Extended Distance Cluster对距离、时延等都有较严格的要求,因此在现有的网络技术及存储技术的前提下,建议最远的距离不超过100km,两节点之间采用裸光纤。

    Oracle异地RAC不适合于全量灾备恢复,只适合防范停电,空难,洪水等灾难性事故。更推荐的异地高可靠性方式是本地RAC + 异地DataGuard。

    ===========================

    Oracle DataGuard

    ===========================

    1、 DataGuard重做日志同步原理

    主数据库的LGWR进程将重做数据写入到自己的ORL,同时DataGuard的LNS (Log Network Server)进程捕获日志写入器写入的重做数据,并以同步或异步方式将重做数据传输到备用数据库。

    备用数据库Data Guard的RFS(Remote File Server)接收重做数据,然后将其写入一个名为备用重做日志(Standby Redo Log,SRL)文件的顺序文件中。备用数据库端的MRP(Managed Recovery Process)进程或者LSP进程在备用数据库上应用这些日志,进而同步数据。

    DateGuard支持一主多备间通过重做日志方式同步。

    DataGuard的重做日志传输是支持两种方式:

    • 同步重做传输 (SYNC)

      要求主数据库上的日志写入器等待 LNS 确认备用数据库已经接收重做数据并已将其写入备用重做日志,然后才能确认到客户端应用程序的提交。这确保了提交的所有事务都在磁盘上,并在备用位置受到保护;但是影响了主库的性能。

    1. 用户提交一个事务,事务在SGA 中创建一个重做记录。LGWR从日志缓冲区中读取重做记录,写入ORL,然后等待LNS 的确认。
    2. LNS 从日志缓冲区中读取相同的重做记录,通过Oracle Net 服务传给备用数据库。备用数据库上的RFS 接收重做数据,然后将其写入备用重做日志文件中。
    3. 当RFS 从磁盘接收到一个写完消息时,会将一个确认消息传回给主数据库上的LNS进程,LNS 接着通知LGWR 传输完成。LGWR 接着向用户发送提交确认信息。

    • 异步重做传输 (ASYNC)

      不要求主数据库上的日志写入器等待备用数据库确认重做已被写入磁盘。确认到客户端应用程序的提交与重做传输是异步进行的。

      

      异步传输方式会根据场景的不同,调节读取日志的方式不同:

     

    1. LNS的读取速度跟得上重做日志产生的速度,LNS进程从日志缓冲池中读取重做日志,然后通过Oracle Net服务传给备用数据库。
    2. 当LNS赶不上SGA重做日志的产生速度,在将重做数据传给备用数据库前就回收了日志缓冲区,LNS将自行转为从ORL读取和发送重做数据,当LNS赶上进度后,将自行转回到直接从日志缓冲区中读取/发送。
    3. 如果主数据库和备用数据库断开连接(网络故障或备用服务器故障),主数据库将继续处理事务并累积不能传输到备用数据库的重做数据积压并按文件归档,直到能建立新的网络连接为止(称为归档日志差异)。在这种状态下,DataGuard在主数据库上使用ARCH进程连续Ping备用数据库来确定其状态。当还原与备用数据库的通信后,ARCH进程会查询备用控制文件(通过其RFS进程),来确定备用数据库从主数据库收到的最后一个完整日志文件。DataGuard确定需要哪些日志文件来重新同步备用数据库,然后立即开始使用其他ARCH进程传输相应文件。

    DataGuard支持配置三种数据保护模式,以实现成本、可用性、性能和数据保护的平衡:

    保护模式

    主数据库出现故障时的数据丢失风险

    重做传输

    最大保护

    零数据丢失

    • Data Guard 确认事务数据安全保存到至少一台备用服务器的磁盘上之后,主数据库上的日志写入器进程才会确认到客户端应用程序的提交。由于重做传输的同步特性,最大保护模式可能影响主数据库的响应时间。
    • 如果没有任何一台备用数据库能返回重做已被接收并写入磁盘的确认,主数据库将停滞(并最终崩溃)。因此此种方式下,强烈建议至少配置两个备用数据库。

    SYNC

    最高可用性(maximum availability mode)

    零数据丢失 — 假设出现故障之前主数据库提交事务时的同步通信没有中断

    • Data Guard 确认事务数据安全保存到至少一台备用服务器的磁盘上之后,主数据库上的日志写入器进程才会确认到客户端应用程序的提交。由于重做传输的同步特性,最大保护模式可能影响主数据库的响应时间。
    • 如果没有任何一台备用数据库能返回重做已被接收并写入磁盘的确认,主数据库处理将继续进行。当再次建立连接时,Data Guard 将自动重新同步备用数据库和主数据库。

    SYNC

    最高性能(maximum performance mode)

    最小数据丢失 — 只有几秒,具体取决于网络带宽

    • 在这种模式下,当主数据库处理事务时,重做数据通过ASYNC 重做传输异步传输到备用数据库。主数据库上的日志写入器不用等待备用数据库确认即可确认到客户端应用程序的提交。
    • 在正常操作中,可能丢失的数据量只限于在主数据库和备用数据库之间传输的数据量 — 这个量由处理主数据库生成的重做数据量的网络容量决定。如果有足够的带宽,可能丢失的总数据量非常小或为零。

    ASYNC

    2、 DataGuard实现自动切换

    Oracle DataGuard支持使用快速启动故障切换FSFO(fast-start failover)特性来自动将故障数据库Failover到远程容灾节点,数据库RTO与FastStartFailoverLagLimit参数有关,可小于30秒。

    当Primary数据库故障后,FSFO会自动地快速把原Standby数据库切换为为Primary数据库操作。FSFO的触发条件:

    • 当数据库以正常模式(shutdown immediate/normal/transactional)关闭Primaty数据库时,系统不会触发FSFO。
    • 使用非正常方式shutdown abort关闭Primaty数据库时,会触发FSFO。

    FSFO只支持DataGuard配置在最高可用性(maximum availability mode)、最高性能(maximum performance mode)模式下:

    • 最高可用性模式下,在切换时可以保证无数据丢失(切换之前主数据库提交事务时的同步通信没有中断)。
    • 在maximum performance mode下面,会有数据丢失,丢失多少数据由FastStartFailoverLagLimit这个参数来配置。

    3、 TAF实现数据库切换后客户端无缝连接

    TAF(Transparent Application Failover),透明应用程序故障转移,当客户端和Oracle数据库建立连接后,正在执行某个应用,此时客户端连接的某个实例突然宕机,那么客户端的连接就会被转移到其他健康实例上去。对于客户端的TAF,如果执行的是update、insert等事物语句,那么就会回退,如果是select语句,那么会转移到新的实例继续执行,这个过程不需要用户的的介入,是透明的。

    TAF配置参考(http://blog.itpub.net/26736162/viewspace-1811944/):

    1) 在主库上配置一个TAF的Service

      此Service在数据库出现故障时会发送通知给客户端,允许查询语句在故障转移发生后继续运行。

    2) 建立一个存储过程,调度TAF的Service,确保Service只在主库运行

     

    3) 创建一个触发器,确保让数据库在启动和角色转换时运行此存储过程

      重启数据库、或当数据库切换后,执行存储过程,触发主库启动TAF的Service。

     

    4) 在主库手工启动TAF的Service(或重启数据库,重启数据会触发 触发器->存储过程->TAF的Service)

      执行成功后,可以看到TAF的Service

     

    5) 在备库查询,确保备库已经存在触发器和存储过程

     6) 客户端配置

    样例1:

    dg_taf =

        (DESCRIPTION =

            (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.130)(PORT = 1521))

            (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.131)(PORT = 1521))

                (LOAD_BALANCE = yes)

                    (CONNECT_DATA =

                        (SERVER = DEDICATED)

                        (SERVICE_NAME = dg_taf_lhr.lhr.com)

                    (FAILOVER_MODE =

                        (TYPE = session)

                        (METHOD = basic)

                        (RETRIES = 180)

                        (DELAY = 5)

                   )

            )

    )

    样例2:(73/74是主站点主库的RAC、75/76是备站点备库的RAC)

    iccc =

        (DESCRIPTION_LIST=(LOAD_BALANCE=off) (FAILOVER=on)

            (DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)

                (ADDRESS_LIST= (LOAD_BALANCE=on)

                    (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.73)(PORT=1526))

                    (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.74)(PORT=1526))

                )

                (CONNECT_DATA=(SERVICE_NAME=service_ora))

            )

            (DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)

                (ADDRESS_LIST= (LOAD_BALANCE=on)

                    (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.75)(PORT=1526))

                    (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.11.76)(PORT=1526))

                )

                (CONNECT_DATA=(SERVICE_NAME=service_ora))

            )

    )

  • 相关阅读:
    异步、作用域、闭包--setTimeout在for循环中的思考
    C++中*和&的定义和使用
    利用border设置transparent绘制图形
    暑假周记四
    暑假周记三
    win10系统下安装Linux虚拟机以及在虚拟机上安装Ubuntu
    暑假周记二
    暑假周记一
    《浪潮之巅》上——阅读笔记06
    《浪潮之巅》上——阅读笔记05
  • 原文地址:https://www.cnblogs.com/yickel/p/11142799.html
Copyright © 2020-2023  润新知