DB2 HADR 监控详解2

心跳丢失数量(HeartBeatMissed):主机会不断地向备机发送心跳,以确认仍然可以和对方通信。这个值表明了有多少心跳信号没有发送成功或者没有接收成功。

日志 LSN 差异(LogGapRunAvg):这个值表示一段时间以内,主机和备机日志差异的平均值。如果这个值一直很大,可能表明网络状况比较差,或者备机的性能和主机差异太大,以至于日志不能及时的从主机传到备机。

连接状态(ConnectStatus):包括三种 CONNECTED, DISCONNECTED, CONGESTED。CONNECTED 表示连接状况良好;DISCONNECTED 表示主机和备机已经断开连接;CONGESTED 表示当前的网络状况不太好,日志或者消息的发送遇到拥塞。

连接时间(ConnectTime):如果主机和备机是连接的,表示连接建立起来的时间;如果连接时断开的,表示的是连接断开的时间;如果发生了网络拥塞,则表示上次网络拥塞的时间。

超时时间(Timeout):如果 HADR 在这段时间内没有收到来自同伴的任何消息,它就会断开网络连接。需要注意的是,这个时间并一定是网络出现错误以后的等待时间。HADR 可以发现网络上的大部分错误,当这些错误发生时,HADR 会立刻断开和对方的连接,而并不会等待。另外,这项配置还有另外两个作用:

1. 心跳的时间间隔为 HADR_TIMEOUT/4 和 30 秒钟两者之间的较小的那个值

2. 如果首先在主机上执行启动 HADR 的操作,如果主机没有在 HADR_TIMEOUT 时间以内没有收到备机的连接,主机上的数据库就会停掉,以防止两台主数据库的存在而导致脑裂。

同伴窗口(PeerWindow):相对应 DB2 配置文件中的 HADR_PEER_WINDOW,该参数只对 SYNC 和 NEARSYNC 两种同步模式有效。如果该参数不为零,当主机和备机断开连接时,在 HADR_PEER_WINDOW 这段时间以内,数据库处于 DISCONNECTED PEER 状态。主机在这段时间内不能提交任何事务。所以,这段时间内,如果备机做了接管,备机不会丢失任何事务。这个参数通对于在 TSA 对 HADR 自动做接管的环境中特别重要,因为 TSA 执行”takeover hard on db dbname by force peer window only”这个命令进行接管。

同伴窗口结束时间(PeerWindowEnd):显示了同伴窗口的结束时间。过了这个时间以后,HADR 将处于 DISCONNECTED 状态。

本地主机名(LocalHost):本地 HADR 所在的主机名或者 IP 地址。

本地服务名(LocalService):本地 HADR 所使用的服务名称或者端口号。

远程主机名(RemoteHost):对端 HADR 所在机器的的主机名或者 IP 地址。

远程服务名(RemoteService):对端 HADR 使用的服务名称或者端口号。

远程实例(RemoteInstance):对端 HADR 数据库所在的实例的名字。

主机日志文件(PrimaryFile):主机目前正在写的日志文件。

主机日志页号(PrimaryPg):主机目前正在写的日志文件中的页号。

主机日志序号(PrimaryLSN):主机正在处理的日志记录的序列号。

备机日志文件(StandByFile):备机目前正在写的日志文件。

备机日志页号(StandByPg):备机目前正在写的日志文件中的页号。

备机日志序号(StandByLSN):备机正在处理的日志记录的序列号。

对于很多 DBA 来说,知道主机和备机的同步情况很重要。从主机日志序号和备机日志序号里面,我们可以判断出来主机还有多少日志没有传输到备机。例如以下图 7 的 db2pd 的结果:


图 7. DB2PD 输出

我们可以看出来主机和备机的日志相差 0x0000000000FA179C-0x0000000000FA16E6 = 0xB6。也就是十进制的 182 个字节。



通过 db2trace 来计算 HADR 对交易性能的影响

db2trc 命令是 DB2 提供的跟踪工具。该跟踪工具记录有关操作的信息并将此信息格式化为可读格式。需要注意的是,运行跟踪时会增加开销,所以启用跟踪工具可能会影响系统性能。

db2trace 可以跟踪每个函数以及该函数的执行时间。利用这一性质,我们可以计算出来每次写日志花费的时间以及 HADR 带来的开销。

首先,我们需要找到主机上的写日志的 EDU(Engine Dispatchable Unit),即 db2loggw 的线程号(或进程号)。对于 v91 及以前的版本,我们使用 db2procs,如图 8:


图 8. 通过 DB2PROCS 查看 EDU 的进程号

对于 v95 及以后版本,db2 基于线程模型,使用 db2pd – edus,如图 9:


图 9. 通过 DB2PD 查看 EDU 的线程号

找到 HADR 的 EDU 以后,我们可以通过 db2trc 去跟踪 loggw 这个进程(或者线程)。例如对于图 8,使用命令:

                db2trc on -t -p 32567 -f trace.dump

            

 

等主机上运行过了需要写日志的交易(例如插入,删除,修改)以后,将 db2trc 关掉,然后格式化 db2trace 的 dump 文件:

db2trc off;

db2trc flow -t trace.dump trace.flow

 

打开文件 trace.flow,以图 10 为例。


图 9. 格式化以后的 TRACE 文件

注意标记红线和红色框里面的内容,计算 hadr 的方法如下:

1.    找到 sqlpgwlp 函数, 

2.    找到这个函数内的 sqloWaitEDUWaitPost 

3.    计算 sqlpgwlp 的执行时间。T1 = 0.196988000 – 0.192810000 = 0.004178000 

4.    计算 sqloWaitEDUWaitPost 的执行时间。T2 = 0.196951000 – 0.196946000 = 0.000005000

T1 是完成这次写日志的总时间,T2 就是这次写日志时,HADR 带来的开销

如果我们跟踪了多次写日志的操作,就跟得到多个上面的片段。可以根据所有的片段计算平均值,从而得到更精确地开销比例。



以下文章点击率最高

Loading…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注