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 eth2 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)))
未完......