喜欢冬天的飘雪 發表於 2023-12-9 00:00:00

GaussDB T分布式集群数据库每日维护必做必知

<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/593746415aa48f5d284904000004c3d4.jpg" width="auto"></p>
<p>
        继《GaussDB T分布式集群这样安装部署不踩坑》,我们开始GaussDB T每日维护必做的事情。新的一天从开启主机开始,把虚拟机打开后发现上次安装的数据库没有自启动,所有节点启动的相关进程仅cm_agent进程:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/79dc66ed8a90d7243f86ad81b630c105.jpg" width="auto"></p>
<p>
        这个时候我们先要拉起ETCD:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/a058e2556f5b81a198401446c71923a3.jpg" width="auto"></p>
<p>
        OK,ETCD成功拉起,接下来我们拉起整个集群:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/6cc086a5856e7f14149367efcc4320cb.jpg" width="auto"></p>
<p>
        集群拉起成功。</p>
<p>
        后面我们会将ETCD及集群自动拉起加入自启动,下面开始回到开篇的主题,每日维护开始。</p>
<p>
        <span><strong>一、集群状态检查</strong></span></p>
<p>
        第一件事当然是检查集群各节点资源状态情况啦,至于看啥,我们用一张图来了解要点:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" src="https://zhuji.jb51.net/uploads/img/202305/a1b9babaee2b36775037acf46ed04810.jpg"></p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" src="https://zhuji.jb51.net/uploads/img/202305/ca5bc020de422872493f568e563f687d.jpg"></p>
<p>
        1、查看各节点资源是否是ON LINE,其中包括CM,CN,DN,ETCD等,如果不是,需进一步核查原因了。</p>
<p>
        2、查看各节点对比昨日是否涉及节点切换情况,查看节点对应的HOST即可。如有则异常,需进一步核查原因了。</p>
<p>
        <span><strong>二、检查主机资源使用情况(所有主机)</strong></span></p>
<p>
        1、主机目录使用率</p>
<p>
        df -h</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/8a759fdbf1b148bcff9d733e030106a3.jpg" width="auto"></p>
<p>
        2、CPU、内存及IO使用情况</p>
<p>
        这个检查的方法很多,这里使用了vmstat,iostat,free,请重点关注以下红框标示的位置。</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/84a70326432ae17e1075813fb32793b9.jpg" width="auto"></p>
<p>
        释:id列代表的是CPU空闲率,free列代表的是空闲内存,单位为页。</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/f450d43884dd2403fda9224de9022f7f.jpg" width="auto"></p>
<p>
        释:rMB/s及wMB/s的是每秒读写情况,%util在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/5f1cdeeaaba1f5f9de38bdf86cb5d2a4.jpg" width="auto"></p>
<p>
        释:重点关注free及available。</p>
<p>
        注:本节资源检查需与基线进行比对,如出入过大需进一步核查原因。</p>
<p>
        <span><strong>三、核查各节点数据库状态</strong></span></p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" src="https://zhuji.jb51.net/uploads/img/202305/936c5453175e4f659e85c421f78d446a.jpg"></p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/719470d2d3dce3236a4e517544f20872.jpg" width="auto"></p>
<p>
        确认CN及DN都处于open状态,注意备DN是mount状态。</p>
<p>
        <span><strong>四、表空间使用率检查</strong></span></p>
<p>
        当在进行使用率检查之前,先说下表空间如何创建。</p>
<p>
        1、连接到cn</p>
<p>
        zsql omm/gaussdb_123@127.0.0.1:8000 –q</p>
<p>
         </p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" src="https://zhuji.jb51.net/uploads/img/202305/3b3d3e30e0b40464a5debeb690975148.jpg"></p>
<p>
        2、创建表空间</p>
<p>
        CREATE TABLESPACE tbs_test1 DATAFILE 'tbs_test1' size 100m SHARD;</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/a0c8a40c63a9494f7835a17f6ada9aa1.jpg" width="auto"></p>
<p>
        注:创建表空间时,使用SHARD关键字则支持将创建表空间语句自动下发至CN和DN节点且仅支持使用相对路径;若不使用SHARD关键字,则可使用绝对路径,同时需要在所有CN和主DN节点上都创建这个表空间后,才能正常在这个表空间下创建表。</p>
<p>
        3、检查数据文件,我们会发现在CN及DN都创建了对应的表空间及数据文件</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/c7380a2f12f68ff07b0c9d45eec72078.jpg" width="auto"></p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/de14a666578cd14689ec2203e1d35674.jpg" width="auto"></p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/1f825727a9d93fc9d4e02f9f9bdb5d30.jpg" width="auto"></p>
<p>
        注:连接主DN使用如下命令连接。</p>
<p>
        zsql / as sysdba -D /gaussdb/data/data_dn1 -q</p>
<p>
        4、检查表空间的使用率</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">set</span><span> line 300 </span></span>
</li>
        <li>
                <span><span class="keyword">set</span><span> pages 2000 </span></span>
</li>
        <li class="alt">
                <span><span class="keyword">set</span><span> timing </span><span class="keyword">off</span><span> </span></span>
</li>
        <li>
                <span>col tablespace_name <span class="keyword">for</span><span> a25 </span></span>
</li>
        <li class="alt">
                <span>col sum_GB <span class="keyword">for</span><span> a15 </span></span>
</li>
        <li>
                <span>col free_GB <span class="keyword">for</span><span> a15 </span></span>
</li>
        <li class="alt">
                <span>col use_precent <span class="keyword">for</span><span> a15 </span></span>
</li>
        <li>
                <span><span class="keyword">select</span><span> b.tablespace_name, </span></span>
</li>
        <li class="alt">
                <span>       round(<span class="func">sum</span><span>(b.bytes) / 1024 / 1024 / 1024, 0) sum_GB, </span></span>
</li>
        <li>
                <span>       round(<span class="func">sum</span><span>(nvl(a.bytes, 0)) / 1024 / 1024 / 1024, 0) free_GB, </span></span>
</li>
        <li class="alt">
                <span>       round((<span class="func">sum</span><span>(b.bytes) - </span><span class="func">sum</span><span>(nvl(a.bytes, 0))) / </span><span class="func">sum</span><span>(b.bytes), 4) * 100 use_precent, </span></span>
</li>
        <li>
                <span>       <span class="func">count</span><span>(*) </span></span>
</li>
        <li class="alt">
                <span>  <span class="keyword">from</span><span> (</span><span class="keyword">select</span><span> tablespace_name, file_id, </span><span class="func">sum</span><span>(bytes) bytes </span></span>
</li>
        <li>
                <span>          <span class="keyword">from</span><span> adm_free_space </span></span>
</li>
        <li class="alt">
                <span>         <span class="keyword">group</span><span> </span><span class="keyword">by</span><span> tablespace_name, file_id) a, </span></span>
</li>
        <li>
                <span>       adm_data_files b </span>
</li>
        <li class="alt">
                <span> <span class="keyword">where</span><span> a.file_id(+) = b.file_id </span></span>
</li>
        <li>
                <span>   <span class="op">and</span><span> a.tablespace_name(+) = b.tablespace_name </span></span>
</li>
        <li class="alt">
                <span> <span class="keyword">group</span><span> </span><span class="keyword">by</span><span> b.tablespace_name </span></span>
</li>
        <li>
                <span><span class="keyword">having</span><span> round((</span><span class="func">sum</span><span>(b.bytes) - </span><span class="func">sum</span><span>(nvl(a.bytes, 0))) / </span><span class="func">sum</span><span>(b.bytes), 4) * 100 &gt;= 0 </span></span>
</li>
        <li class="alt">
                <span> <span class="keyword">order</span><span> </span><span class="keyword">by</span><span> 4 </span><span class="keyword">desc</span><span>; </span></span>
</li>
</ol>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" src="https://zhuji.jb51.net/uploads/img/202305/e38b669b9c698a61076a620a6a788026.jpg"></p>
<p>
        注:表空间使用率检查需在所有的主CN及主DN运行。</p>
<p>
        <span><strong>五、异常等待事件检查</strong></span></p>
<p>
        col event form a38</p>
<p>
        select event,count(*) from DV_SESSIONS where LOCK_WAIT = 'Y' group by event order by 2 desc;</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/a05a7a4325166bcaef0345182de3f3df.jpg" width="auto"></p>
<p>
        注:在所有主DN核查是否存在异常等待事件。</p>
<p>
        如图所示存在TX等待,我们可以通过以下SQL查看下锁源在干啥:</p>
<ol class="dp-sql">
<li class="alt">
                <span><span class="keyword">select</span><span> SID,SERIAL#,USERNAME,CURR_SCHEMA,CLIENT_IP,CLIENT_PORT,OSUSER,MACHINE,PROGRAM, </span></span>
</li>
        <li>
                <span>STATUS,LOCK_WAIT,EVENT,MODULE,CURRENT_SQL <span class="keyword">from</span><span> dv_sessions </span></span>
</li>
        <li class="alt">
                <span><span class="keyword">where</span><span> sid </span><span class="op">in</span><span> (</span><span class="keyword">select</span><span> WAIT_SID </span><span class="keyword">from</span><span> v$session </span><span class="keyword">where</span><span> event </span><span class="op">like</span><span> </span><span class="string">'%TX%'</span><span>); </span></span>
</li>
</ol>
<p>
        如发现会话状态是非活动且是应用程序连上来的,可以联系应用核查是否正常,如可以kill我们可以运行ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; 杀会话。</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/868f25c7631418e56020c59e7c2e89f6.jpg" width="auto"></p>
<p>
        <span><strong>六、日志检查</strong></span></p>
<p>
        在数据库运行过程中,会产生大量用于数据库日常维护的运行、审计、 DEBUG、告警等日志。在数据库发生故障时,可以使用这些日志进行问题定位和数据库恢复的操作。</p>
<p>
        下面就常用的日志类型做下简介:</p>
<p>
        <span>1、运行日志</span></p>
<p>
        打印GaussDB T数据库运行信息,如果数据库出现故障,请查看zengine.rlog。</p>
<p>
        日志目录:默认为“ $GSDB_DATA/log/run/zengine.rlog”或参数log_home对应的路径run子目录下,如果想修改其路径重启生效。</p>
<p>
        CN节点:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/01927bf8d66c9682bba736e8ee62446f.jpg" width="auto"></p>
<p>
        DN节点:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/ecce6c5cf5c5febd7b33cc610194e6b0.jpg" width="auto"></p>
<p>
        查看运行日志如下:</p>
<p>
        <img title="GaussDB T分布式集群数据库每日维护必做必知" alt="GaussDB T分布式集群数据库每日维护必做必知" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/576a7651a91cdd9e2318f337e7f997a6.jpg" width="auto"></p>
<p>
        2、慢查询日志</p>
<p>
        打印GaussDB 100数据库执行时间超过阈值(由LONGSQL_TIMEOUT参数控制)的SQL信息到zengine.lsql日志文件中。</p>
<p>
        日志目录:默认为“ $GSDB_DATA/log/longsql/zengine.lsql”。</p>
<p>
        3、告警日志</p>
<p>
        打印GaussDB 100数据库运行告警信息。如需了解告警信息,请查看zenith_alarm.log。</p>
<p>
        日志目录:“ $GSDB_DATA/log/zenith_alarm.log”。</p>
<p>
        4、操作日志</p>
<p>
        记录用户通过ZSQL工具对GaussDB 100数据库的操作信息。如果需要了解操作记录,请查看zsql.olog。</p>
<p>
        日志目录:“ $GSDB_DATA/log/oper/zsql.olog”。</p>
<p>
        5、TRACE日志</p>
<p>
        记录数据库会话死锁的信息。如需查看会话死锁信息,请查看zengine_00003_xxxxxx.trc。</p>
<p>
        日志目录:“ $GSDB_DATA/trc/zengine_00003_xxxxxx.trc”。</p>
<p>
        常见错误码:</p>
<p>
        GS-00716:Found %s deadlock in session (%u)</p>
<p>
        错误原因:不同会话中并发交叉操作了同一批数据,造成死锁。</p>
<p>
        解决办法:</p>
<ul>
<li>
                查看trace log 或者 run log (根据数据库版本不同,死锁日志位置不同);</li>
        <li>
                根据日志里记录的具体信息,包括死锁类型,SQL语句等,排查业务语句。</li>
</ul>
<p>
        GS-00715:The snapshot was outdated.</p>
<p>
        错误原因:快照过旧。</p>
<p>
        解决办法:</p>
<ul>
<li>
                重新运行SQL;</li>
        <li>
                将长时间运行的高耗SQL优化或拆分。</li>
</ul>
<p>
        GS-00713:No free undo page</p>
<p>
        错误原因:UNDO表空间不足。</p>
<p>
        解决办法:</p>
<ul>
<li>
                增大UNDO表空间大小;</li>
        <li>
                将大事务kill释放UNDO。</li>
</ul>
<p>
        GS-00305:%s timeout</p>
<p>
        错误原因:网络api超时。</p>
<p>
        解决办法:</p>
<ul>
<li>
                请确保主机网络正常。</li>
</ul>
<p>
        GS-00774:Failover in progress, can not be connected</p>
<p>
        错误原因:备机正在做failover时,主机的日志发送线程来连接备机。</p>
<p>
        解决办法:</p>
<ul>
<li>
                将主机停止掉,待备机升主后,将原主降备。</li>
</ul>
<p>
        GS-00839:Flush redo file:%s, offset:%u, size:%lu failed</p>
<p>
        错误原因:写redo日志文件的时候失败了,一般是文件系统或者磁盘有问题。</p>
<p>
        解决办法:</p>
<ul>
<li>
                检查操作系统或磁盘。</li>
</ul>
<p>
        GaussDB T数据库维护的工作很多,除了以上每日必做的事情之外,还有会话连接失败、缓冲区刷盘失败、CN/DN节点状态异常、CM Server节点状态异常、主备DN节点日志同步延迟过大等等问题核查。其中很多我们可以通过使用Database Manager分析处理告警或者使用自己开发脚本实现告警。</p>
<p>
        维护的目的是让系统更稳定,维护工作越简单,维护人员就越不容易出错。尽可能的把维护工作脚本化、工具化、自动化,将人员解放出来做更有价值的事情是我们的目标。路漫漫其修远兮,一起加油吧!</p>
<p>
        原文链接:https://mp.weixin.qq.com/s/XLfwEeh2HUVVOKPMIdDddg</p>
頁: [1]
查看完整版本: GaussDB T分布式集群数据库每日维护必做必知