oracle dataguard redo 网络最佳实践(简译)

oracle dataguard好处:

1 对系统性能影响最小

这里有两个最高可用架构(MAA)场景配置,在有足够带宽的情况下,得出如下结论:

1 DG在纽约和蒙特利尔(300英里的距离,10MS的往返延迟),使用实时模式,在redo 4MB/s生成速率下,可以做到对生产系统5%的性能影响和零数据丢失;

2 在波士顿和伦敦之间(3300英里,100MS往返延迟),使用异步模式,在20MB/s的日志生成速率下,可以做到对系统5%以下的影响;

2 最高级别数据保护模式:

1  同步模式,0数据丢失,两者的距离建议在百公里左右;

2  异步传输模式,适用远距离,高延迟的环境,例如:从香港到新加坡,超过1600英里,有50MS的延迟,2MB/s的日志生成速率,可以接受3s内的数据失失环境。

3 增强的归档日志传输:在发生网络或standby系统故障时,需要重同步时可以被加速。例如:1GB的日志文件需要用归档进程传输,可以减少至55%的传输时间,在快速重同步的过程中,关键数据是处于一种保护模式的;

3 快速的switchover/failover,秒级切换

REDO传送最佳实践

DG提供了三种传输方式:arch,lgwr async,lgwr sync,下面描述这几种方式对网络需求和最佳配置。

1 带宽选择

 根据awr reports:3MB/s的在高峰期,需要3*8*1024*1024/1000/1000=25.2Mbps,通常来说53KM增加1ms的延迟,同时还得考虑网络中继器,系统性能,网络自有的包流量。为了测试RTT的延迟,可以用traceroute跟踪一下;

2 DATAGuard的保护模式设置

如果用LGWR SYNC同步模式,如果网络不足以处理redo的生成量,将会影响生产机的性能;相反,用LGWR ASYNC模式,还是使用online redolog传输,在redo生成高峰期超过了网络流量却不会对生产系统造成影响。使用ARCH传输本地归档文件,也不会对生产系统产生影响(但是和lgwr async比,丢失数据的风险的可能性将大大增加)所以一旦网络间的传输方式确定,自行选择下面的最佳实践方式:

2.1 ARCH传输模式

 增加ARCN的进程数量,初始数量为2;log_archive_max_processes控制最大归档进程数;在oracle 10.2以后的版本中,这个值最大为30,以前的版本最大为10;ARCn进程可以加快处理archive gap。当主机端设置了MAX_CONNECTIONS参数,大量的ARCn进程可以加快并行处理,

注意:

a) log_archive_max_Processes会和其它程序争夺相同的网络资源,建议根据实际网络和ARCHIVE GAP场景设置最优的log_archive_max_processes; 

b)

源端max_connections设置大于等于2,这样可以减少archive log的传输时间,此值最大为5;

2.2 lgwr async传输模式

  从oracle 10.2开始,生产库需保证有足够的I/O带宽用于LNS处理在线事务日志。在性能测试中测出额外的读取量;

2.3 LGWR SYNC Redo传输

  设置NET_TIMEOUT属性(生产库的网络服务对LGWR请求的响应时间等待多少秒,以减少网络丢包对生产库的影响;

  在oracle 10.2里NET_TIMEOUT值为180秒;官方推荐此值的最低值为10秒,当然你可以设成最小值1秒,但是如果网络不稳定延迟会导致数据保护模式的不停切换;

  使用lgwr sync方式,事务提交时会确认本地和远端的数据库;针对两种提交方式:commit wait&commit nowait :commit nowait方式可以只返回给应用程序结果而不用去确认redo是否写到磁盘了;因此commit nowait和默认的wait值相比可以改善应用或事务的响应时间。

除此之外还注意:

1 配置单次1MB 的I/O写满写入请求,详细在见Best practices for creating a low Cost Storage Grid for oracle Databases;

2 standby redlog在快速磁盘上;

3 不要一组多个standby redolog,如果多个的话,会增加额外的写请求;


网络最佳实践

说明:以下所有设置针对Linux,其他平台设置自行参考

1 主备之间的带宽一定要足够

2 配置RECV_BUF_SIZE,SEND_BUF_SIZE等于3倍的BDP(bandwidth delay product,传播时延*网络带宽),这个可以增加网络的带宽流量;

译者注:

RECV_BUF_SIZE:在TCP/IP/SSL协议里,以字节方式指定会话的接受缓冲区

配置:sqlnet.ora

net_service_name= 
 (DESCRIPTION= 
   (ADDRESS_LIST=
     (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)
        (RECV_BUF_SIZE=11784))
     (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521)
        (RECV_BUF_SIZE=11784))
   (CONNECT_DATA=
     (SERVICE_NAME=sales.us.example.com)))

SEND_BUF_SIZE类似;

参考:http://docs.oracle.com/cd/E11882_01/network.112/e10835/tnsnames.htm#NETRF274

3 配置SDU(Session data unit)=32767

4 增加网络设备的队列大小。如linux增加TXQUEUELENGTH,NET_DEV_MAX_BACKLOG

TXQUEUELENGTH在linux用ifconfig配置网卡时可配:ifconfig eth1 TXQUEUELENGTH 5000,

启动时就设置

vi /etc/rc.local
/sbin/ifconfig eth0 txqueuelen 5000

NET_DEV_MAX_BACKLOG属于内核参数,

vi /etc/sysctl.conf
net.core.netdev_max_backlog = 32768

5  配置orcle Net TCP_NODELAY=yes

oracle SDU(session data unit)大小说明

通过网络传送数据时,oracle的网络组件会缓冲SDU。当大量的或者连续的数据需要传送时,增加SDU缓冲区可以提高网络的利用率。

SDU的配置

vi sqlnet.ora
default_sdu_size=32767
在配置tnsnames.ora也可以:
sales.us.acme.com= 
(DESCRIPTION=  
    (SDU=32767)  
      (ADDRESS=(PROTOCOL=tcp) 
      (HOST=sales-server) 
      (PORT=1521)) 
    (CONNECT_DATA= 
     (SID=sales.us.acme.com)) 
)

配置listener.ora

SID_LIST_listener_name= 
 (SID_LIST=  
   (SID_DESC= 
    (SDU=32767) 
    (GLOBAL_DBNAME=sales.us.acme.com) 
    (SID_NAME=sales) 
    (ORACLE_HOME=/usr/oracle)))

TCP套接字缓冲区大小

TCP套接字区缓冲区控制网络带宽的可用量,其并不考虑网络中可使用的实际带宽。当网络延迟比较高时,较大的套接字缓冲区可更有效的利用网络带宽;

BDP大小测算:

BDP= 1,000 Mbps * 25msec (.025 sec) 

  1,000,000,000 * .025 

  25,000,000 Megabits / 8 = 3,125,000 bytes 

套接字区缓冲区=3*BDP

socket buffer size = 3 * bandwidth * delay 

  = 3,125,000 * 3 

  = 9,375,000 bytes   

套接字区缓冲区由应用程序控制,这里是oracle 的网络服务控制;编辑sqlnet.ora

 RECV_BUF_SIZE=9375000 

 SEND_BUF_SIZE=9375000 

或者配置服务名:

vi tnsnames.ora
standby = 
 (DESCRIPTION=  
   (SEND_BUF_SIZE=9375000) 
   (RECV_BUF_SIZE=9375000) 
     (ADDRESS=(PROTOCOL=tcp) 
     (HOST=hr1-server)(PORT=1521)) 
   (CONNECT_DATA= 
     (SERVICE_NAME=standby)))

配置监听文件listener.ora

 LISTENER= 
  (DESCRIPTION= 
    (ADDRESS=(PROTOCOL=tcp) 
    (HOST=sales-server)(PORT=1521
    (SEND_BUF_SIZE=9375000) 
    (RECV_BUF_SIZE=9375000)))

未完......