HDR是SinoDB集群套件中通过数据复制技术实现数据库级别高可用的方案,在各种关键核心业务系统应用广泛。本文收集了在实际应用中经验,对HDR整体性能提供分析的思路,希望对使用者有所帮助。
首先分析一下HDR的工作过程:在主服务器端,每当有事务提交时,在将逻辑日志缓冲区(Logical Log Buffer)中的内容写到磁盘上之前,先将该缓冲区中的事务记录拷贝到数据复制缓冲区(HDR Buffer)中,然后再通过网络传送到备服务器上的Reception Buffer中。在备服务器一端,数据复制线索将Reception Buffer中的内容放入恢复缓冲区(Recovery Buffer)中,最后,由其他线索将这些事务记录恢复到数据库中。工作原理如下图所示:
HDR的整体性能应包括主服务器、网络和备服务器的恢复性能,只要其中一个环节存在瓶颈,都会影响整体系统的性能。举个例子说明,如果HDR Buffer的内容不能及时传送到备服务器(由于HDR的配置参数、网络或备服务器的恢复性能等原因),就会阻塞Logical Log Buffer中的内容写到HDR Buffer,也会阻塞Logical Log Buffer中的内容写到逻辑日志文件,可通过onstat -l命令捕获到以下统计信息:
Buffer Waiting
Buffer ioproc flags
L-1 c0000000901feee8 0x1 0
L-2 c0000000901fe6c0 0x1 0
表明数据库日志记录在等待Logical Log Buffer的释放,造成数据库事务的阻塞,从而影响整体系统的性能。
HDR的配置参数主要有DRINTERVAL、DRTIMEOUT和OFF_RECVRY_THREADS等,如果是单服务器运行将不会使用这些参数。其中DRINTERVAL是HDR Buffer刷新到备服务器的时间间隔(秒),建议设置为1,目的是尽量加快HDR Buffer的刷新,减少性能的瓶颈。OFF_RECVRY_THREADS是备服务器进行同步恢复的线程数(Recovery thread),该参数影响备服务器恢复事务的性能,我们应尽量使各个Recovery thread的负载达到均衡。 如果各个Recovery thread的负载不均衡,那么备服务器的资源利用率将较低,进一步将影响到主服务器的性能。可通过以下命令监控:
OFF_RECVRY_THREADS的值至少是CPU VPS的数目的3倍 (并且OFF_RECVRY_THREADS的值至少是11),数目最好是较大的质数,可根据实际的CPU VPS的数量进行调整。
还可以通过命令onstat -g ath监控HDR线程状态,获取HDR性能情况,例如监控到以下信息:
468 c000000031196b80 c000000011616df0 2 cond wait drcb_bqe 7cpu dr_secrcv
drcb_bqe状态说明HDR的接收线程一直在等HDR Buffer的清空释放,这样会阻碍主刷新log buffer的性能,说明HDR备服务器存在性能问题,需要检查系统I/O和网络的性能指标。
从应用角度来看,应尽量避免操作大事务。因为HDR Buffer的大小有限,一个大事务要通过多次网络传输才能完成同步,这样会影响主机数据库的性能。例如在一些批处理的场景中,有批量插入的操作,举个例子每累计一万行提交一次,这时可将提交数量降低为一千行左右,HDR的性能会有明显的提升。
另外,其他主要数据库参数也会对HDR的整体性能产生影响,例如,BUFFERS和LOGBUF等。其中BUFFERS是数据缓存区的大小,BUFFERS的值越大,数据的缓存率就越高,数据库的内存换页的次数就越少,IO的开销会降低,HDR的整体性能会相当稳定,逐渐接近单服务器的性能。在OLTP系统中,BUFFERS可调节到物理内存50%-70%。如果BUFFERS的值偏小,会频繁出现数据库的内存换页的现象,对HDR的整体性能产生波动,由于HDR涉及的环节较多,所以影响要比单服务器的较大。
综合上述,HDR的整体性能需要通过以上各个关键参数进行优化组合,才能保持HDR整体性能的稳定性,缩小与单服务器的性能差距。