如何诊断和解决high version count

本文探讨了Oracle数据库10g以上版本中高版本计数(high version count)问题的成因及解决方案,包括如何定义高版本计数、诊断工具、配置调整及常见BUG的规避策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Oracle 10g以上的版本,High version count可谓是一个臭名昭著的问题。Hight version count不仅仅产生的原因多种多样,并且会导致各种令人头痛的问题,轻导致数据库的性能急剧下降,CPU利用率剧增,重则导致数据库挂起,触发ORA-04031或者其它bug导致宕机。

什么是verion count,什么是high?

在弄清楚诊断和解决这个问题之前,首先需要清楚什么是version count,什么是high?换而言之就是产生version count的原因,多高的version count才算high。

一个SQL 第一次执行时,会进行硬解析,同时创建parent cursor 和child cursor。

当再次执行这个SQL时,那么首先会对SQL 语句进行特殊的hash 运算,对应生成一个hash value。Hash value存放在parent cursor中,然后会用这个hash value到paranet cursor的bucket中匹配,如果相同的hash value 已存在parent cursor里,则继续遍历这个child cursor,如果可重用,那么就沿用child cursor的信息,如果不能重用,就会重新生成一个新的child cursor。

一个parent cursor下child cursor 的总数,就是这个SQL的version count。

事实上,我们很难去准确定义一个high version count的值,只能根据不同的系统来判断是否为high verison count。在AWR报告中,默认verion count超过20的SQL就会显示在order by version count一栏中。根据经验version count如果超过100,可能就需要引起注意了。

我们可以通过查看v$sqlarea视图的loaded_versions来判断当前这个SQL的version count是多少,然后再通过address的值来查询v$sql_shared_cursor视图看那些字段的返回值为Y,Y代表mismatch。Mismatch是引起产生version count的直接原因。通常我们可以综合:

v$sqlarea, v$sql_shared_cursor, v$sql_bind_metadata, v$sql_bind_captures来诊断这类问题,但是手工去查这些表往往过于繁琐,  Abel Macias 开发了一个小工具叫做version_rpt,这个工具可以用来诊断导致是那个模块出现mismatch,从而导致了high version count。我们可以到High SQL Version Counts – Script to determine reason(s) (DOC ID 438755.1)上下载这个小工具。

Cursortrace和cursordump

当然有时候我们会遇到某些SQL的$sql_shared_cursor所有的字段的结果都为N,但是其version count还是很高的情况,那么这些查询这些视图就不管用了,主要的原因是存在部分bug,可能导致v$sql_shared_cursor的信息不准确。例如:

Bug 12539487 – gv$sql_shared_cursor may not show all reasons to not share a cursor (Doc ID 12539487.8)

所以在10g以上版本可以使用cursortrace来查找high version count的原因。

可以使用以下方式打开cursortrace:

SQL>alter system set events

'immediate trace name cursortrace level 577, address <hash_value>';

其中可以使用三个level,level 1为577, level 2为578, level 3为580(实际上还有其它level,只是没有文档记载)

如需关闭cursortrace,则可以使用以下方式进行关闭:

SQL>alter system set events

'immediate trace name cursortrace level 2147483648, address 1';

或者使用以下方式关闭:

SQL>alter session set events 'immediate trace name cursortrace level 128 , address <address>';

当然也可以通过oradebug的方式来进行cursortrace,这里就不详述了。

注意在10.2.0.4以下版本存在Bug 5555371导致cursortrace无法彻底关闭的情况,最终导致其trace文件不停的增长,从而可能导致oracle文件系统被撑爆的现象。

在实际帮助客户处理查找high version count的原因时,我们发现即使在10.2.0.5以上的版本也可能会出现cursortrace无法彻底关闭的现象。

如果数据库版本在10.2.0.4 以下,生产系统上不建议使用cursortrace ,

生产环境在10.2.0.4 以上版本,建议谨慎使用cursortrace 。例如注意观察,如果无法关闭则通过修改MAX_DUMP_FILE_SIZE 参数限制cursortrace trace 文件的最大大小,或者写一个crontab 的job 定期清理其trace 文件。

在11g中引入cursordump,我们可以使用如下方式进行cursor dump:

alter system set events 'immediate trace name cursordump level 16'

这种方式收集的信息比较全:例如它可以采集到部分别的方式无法看到的px_mismatch以及它会进一步展开optimizer_mismatch的信息等。

在10gR2版本中, 我们更倾向于使用processstate dump和errorstack的信息来替代cursordump,因为processstate dump中也存在cursordump的信息:

先找到high version count SQL对应的spid,然后执行以下SQL:

SQL>oradebug setospid

SQL>oradebug ulimit

SQL>oradebug dump processstate 10

SQL>oradebug dump errorstack 3

一些可能导致问题的SQL和配置

我们通常可以使用AWR和ASH来找出这些可能存在问题的SQL。根据以往的经验,最容易导致出现version count的SQL包括以下类型:(只是列出最常见的写法,并不是很全)

1.       Insert 语句使用绑定变量

Insert into table(column1, column2, column128, …) values (:1,  :2, :3, … :128, …)

尤其是对于某些表字段类型特别多的,并且把这个表所有字段都写到insert语句里面的表现得尤为明显。

2.       select into 语句使用绑定变量

select a, b, c, … into :1,:2,:3 from table1

3.       使用insert … returning 语句

4.       使用一个很长的inlist ,并且里面都是绑定变量

select * from table where column1 in (1,  :2, :3, … :128, …)

5.       SQL 非常长并且里面带有多个绑定变量

如果一个SQL语句特别长,并且使用了绑定变量,那么这样的SQL更倾向于出现high version count。

6.       Dblink 调用SQL 语句,最好不要使用绑定变量

Bug 12320556  High version count for child cursors referencing a remote object due to AUTH_CHECK_MISMATCH

这一类语句其实从应用的层面都比较好改写,改写的思路如下:

  1. 对于insert into 或者select into可以考虑不要使用绑定变量。
  2. 对于一个字段很多的表,在insert的时候不要把所有字段都列出来
  3. 尽量不要使用insert into这样生僻的写法
  4. 对于inlist 应该控制其内部绑定变量的个数,如果无法控制,则可以将这些变量存入到一张临时表中,去掉inlist,要用的时候再从临时表获取。
  5. 尽量不要写特别长的SQL语句,这种SQL不仅易读性差难于维护,并且很容易导致shared pool的一些争用。
  6. 尽量避免在dblink调用的SQL语句中使用绑定变量。

在配置方面, cursor_sharing和Adaptive cursor sharing的设置不当容易导致high version count的问题。

请不要使用cursor_sharing=similar ,这句话再怎么强调都不过分。

ANNOUNCEMENT: Deprecating the cursor_sharing = ‘SIMILAR’ setting (Doc ID 1169017.1)  

在10gR2以上版本,cursor_sharing设置为similar可能会导致各种各样的bug,其中之一就是可能会导致出现大量的不可共享的child cursor,从而引发出high version count的问题。

Oracle在12c已经不支持cursor_sharing=similar, 在11.2.0.3版本,cursor_sharing设置为similar与设置为force的效果相同。

另外cursor_sharing最好设置为exact,在没有经过充分的测试下,不要将其设置为force。因为设置为force同样有一定的几率可能导致high version count。

参见: High Version Count with CURSOR_SHARING = SIMILAR or FORCE (Doc ID 261020.1)

如果SQL 语句的共享性很差,首先要做的应该是对SQL 进行调整,而不是调整cursor_sharing 参数。

在11g中引入的adaptive cursor sharing(ACS)特性。在没有经过充分测试之前,请关闭此特性,这个特性很容易导致high version count的问题。

Bug 12334286  High version counts with CURSOR_SHARING=FORCE (BIND_MISMATCH and INCOMP_LTRL_MISMATCH)

Bug 7213010 – Adaptive cursor sharing generates lots of child cursors

Bug 8491399 – Adaptive Cursor Sharing does not match the correct cursor version for queries using CHAR datatype

常见的bug和workaround

在10gR2版本中存在一个臭名昭著并且隐匿得很深的Bug,它们曾经折磨过无数DBA:

Patch 6795880: BATCH JOBS HANG WAITING ON ‘KKSFBC CHILD COMPLETION’

Bug 8575528  Missing entries in V$MUTEX_SLEEP.location

这两个bug本质是同一个问题,只是因为前一个问题修复不彻底,反而导致了后一个问题。它存在的缺陷在于如果high version count的SQL,那么去查找child cursor的过程中效率会非常低,从而导致kksSearchChildList/ kqlfMutexClnFetch这些过程会导致挂起。数据库的等待事件上表现为大量的latch,mutex等待,典型的有latch: library cache lock, kksfbc child completion, cursor: mutex pin S, Latch: Row Cache Objects, library cache: mutex X。而这些等待事件基本都是平时难得一见的奇观。

最终的结果往往有两种:

  1. 数据库一直挂起必须手工重启;
  2. 数据库挂起一段时间,然后恢复
  3. 系统资源耗竭导致宕机
  4. 触发出其它的bug例如某ORA-600 [kkssearchchildlist*]或者ORA-07445[kkssearchchildlist*]导致数据库宕机

这个问题号称在10.2.0.5已经修复,但是这个问题在10.2.0.5版本上依然很常见。主要原因有两点:

  1. 10.2.0.5虽然包含了修复这个问题的代码,但是默认情况下是不生效的,需要用户手工将”_cursor_features_enabled” = 10。
  2. 即使设置了”_cursor_features_enabled” = 10,依然还有遇到KKSFBC CHILD COMPLETION的概率,根本原因还是在于child cursor过多,这一系列的函数调用过程依然过于低效。

遗憾的是如果在10.2.0.5以上版本碰到这个问题,除了按照上文的要求调整SQL或者升级到11gR2以外,从数据库现有的手段几乎无解。

另外一个常见的问题是数据表义使用varchar类的变长字符串类型,而应用可能传入的字符串长度为个位数,也可能传入的字符串长度为四位数。换而言之,就是应用程序传入变量的长度范围过大,导致bind mismatch,最终child cursor不能共享从而重新进行hard parse,这样的结果就导致child cursor的急剧膨胀。

根据

This is due to the bind buffer mismatch of the current child cursor. If oracle is unable to bind the current value to the existing child cursors bind buffer, oracle upgrades the existing child cursor with a high bind buffer. This will force the query to do a hard parse and a new child cursor will be created. The previous one will be marked ‘dont use’. 

这个问题可以通过设置固定的字符串buffer的长度来减少其对应的version count。通过level为4000的10503事件来达到此目的,注意这里的4000为字符串buffer的长度。在SQL中可变字符串varchar2最大的长度为4000。

SQL>alter system set events '10503 trace name context forever, level 4000';

还有一个非常有杀伤力的Bug为

Bug 8981059  High Version Count (due to USER_BIND_PEEK_MISMATCH) with bind peeking

这个Bug几乎影响了所有的10gR2的版本。

这个bug典型的cursor dump信息如下:

KKSCS sharing succeed xsc=1106ac818 childno=3370 reason=BND

Checking for already pinned child. fbcflg 1

Object is invalid

No valid child pinned

Parent 70000065e35bb50(70000065f702598) ready for search

kksSearchChildList outside while loop

kksCheckCursor: next child is #3370

kksCheckCursor: pinning child #3370 in shared mode 70000065e35b960

0000065f41e8f0

KSCS sharing succeed xsc=1106ac818 childno=3370 reason=NFP

KSCS sharing succeed xsc=1106ac818 childno=3370 reason=SQT

KSCS sharing succeed xsc=1106ac818 childno=3370 reason=OPT

...

KSCS sharing succeed xsc=1106ac818 childno=3370 reason=BDM

...

KSCS sharing failed xsc=1106ac818 childno=3370 reason=UBP

kksUnlockChild: releasing child

Failed sharing : 8000000

kksCheckCursor: next child is #3402

kksCheckCursor: pinning child #3402 in shared mode 70000065e35b960

0000065e615f88

KKSCS sharing succeed xsc=1106ac818 childno=3402 reason=NFP

KKSCS sharing succeed xsc=1106ac818 childno=3402 reason=SQT

在堆栈信息中还会找到kksfbc以及 kksLoadChild这样的函数。

这个问题实际上是因为绑定变量窥测导致的child cursor不能共享。并且在某些情况下可能导致查询出来的结果是错误的,也就是我们所说的wrong result。

通常这一类问题在10.2.0.5以上版本可以通过关闭绑定变量窥测来规避:

SQL>alter system set "_optim_peek_user_binds"=false
  • 监控version count特别高的语句,如果到了特定的阈值,就将其从shared pool中踢出去,在10.2.0.4和10.2.0.5通过以下方式清除特定的SQL:
SQL>alter session set events '5614566 trace name context forever';

SQL>exec dbms_shared_pool.purge('&address, &hash_value', c);

前面event 5614566设置的目的是为了规避Bug 5614566导致的使用dbms_shared_pool.purge 无法将parent cursor清除出shared pool的问题。

虽然Bug 5614566在10.2.0.5已经修复,但是在某些情况下,依然会遇到dbms_shared_pool.purge的情况。

  • 使用dbms_shared_pool.keep这个包将特定high version count的SQL进行keep。

此建议为Bug 10157392  High version counts for SQL with binds (BIND_MISMATCH)给出的一个workaround,这种方法大多数情况都不起作用。

  • 定期的对shared pool进行flush。

在某些负载比较低的系统中,可以考虑使用这种方法来防治high version count的问题。在业务繁忙的系统中刷新shared pool存在很大的风险,以来大量被刷出去的SQL需要重新进行硬解析,有可能会导致CPU短时间内的迅速增加。还有就是某些SQL被刷出shared pool以后重新解析其执行计划可能会发生变化,由此容易造成性能的不稳定。

11g的cursor特性的增强

在10gR2中,child cursor的最大上限为32768。Child cursor的数量如果超过了32768,那么这个session就会抛出ORA-600 [17059]的错误,然后这个session就会crash,在10.2.0.4和10.2.0.5上有一个增强补丁:Bug 8946311  Increase max children before reporting ORA-600 [17059]。如果应用了这个patch,那么child cursor的上限就可以提高到65535了。

但是允许child cursor的上限到一个非常大的值并不是什么好主意,只能暂时缓解因为high version count而导致的ORA-00600的错误。但是同时也会引发新的问题,例如最典型的是因为child cursor过多,导致了单个SQL语句占用的shared pool的空间非常大,最终导致ORA-004031.

到了11g,Oracle已经充分意识到high version count是一个很严重的问题,尽管mismatch是客观存在的,但是可以通过其它的一些手段限制child cursor的数量。

Enhancement Request Bug 10187168 : OBSOLETE PARENT CURSORS IF VERSION COUNT EXCEEDS A THRESHOLD   引入了一个隐含参数叫_cursor_obsolete_threshold,此参数用来限制单个parent cursor下child cursor的数量,默认值为100。如果child cursor的数量超过了这个阈值就会cursor obsolescence的特性,也就是说这个时候parent cursor会被废弃,并且同时重新创建一个新的parent cursor。 这样虽然mismatch会继续存在,但是一劳永逸的解决的high version count的问题。这个patch已经集成到11.2.0.3版本。如果低于11.2.0.3版本,除了需要应用这个patch,同时需要设置一下参数:

11.2.0.1:

SQL> alter system set "_cursor_features_enabled"=34 scope=spfile;

SQL> alter system set event='106001 trace name context forever,level 1024' scope=spfile;

11.2.0.2:

SQL> alter system set "_cursor_features_enabled"=1026 scope=spfile;

SQL> alter system set event='106001 trace name context forever,level 1024' scope=spfile;

小结

High version count由于产生原因纷繁多样,并且产生的结果表现形式各不相同,再加上其复杂的诊断方法,往往令很多DBA都束手无策,这不能不说是早期产品设计上的一个缺陷。好在从11gR2开始,通过_cursor_obsolete_threshold这个特性,我们很快可以和high version count说再见了。但是探索的过程永远比结果重要,我们收获到的不仅仅是知识,而是一种钻研的精神。

<think>我们按照用户提供的Zabbix监控系统实操上机项目的任务顺序,逐步提供解决方案。每个任务将包含必要的步骤、命令配置示例。 ## 任务1:Zabbix环境部署(使用Ansible ad-hoc) ### 1.1 安装并配置Zabbix Server、前端数据库(在控制节点执行) #### 步骤1:添加Zabbix仓库 ```bash ansible zabbix_server -m ansible.builtin.shell -a "rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm" ``` #### 步骤2:安装Zabbix Server、前端数据库 ```bash ansible zabbix_server -m ansible.builtin.yum -a "name=zabbix-server-mysql,zabbix-web-mysql,zabbix-nginx-conf,zabbix-sql-scripts,mysql-server state=latest" ``` #### 步骤3:启动并启用MariaDB服务 ```bash ansible zabbix_server -m ansible.builtin.service -a "name=mariadb state=started enabled=yes" ``` #### 步骤4:配置数据库(使用MySQL模块) 创建数据库用户: ```bash ansible zabbix_server -m mysql_db -a "name=zabbix state=present" ansible zabbix_server -m mysql_user -a "name=zabbix host=localhost password='P@ssw0rd' priv='zabbix.*:ALL' state=present" ``` #### 步骤5:导入初始数据 ```bash ansible zabbix_server -m ansible.builtin.shell -a "zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -pP@ssw0rd zabbix" ``` #### 步骤6:配置Zabbix Server 编辑配置文件`/etc/zabbix/zabbix_server.conf`: ```ini DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=P@ssw0rd ``` 使用Ansible修改: ```bash ansible zabbix_server -m ansible.builtin.lineinfile -a "path=/etc/zabbix/zabbix_server.conf regexp='^# DBPassword=' line='DBPassword=P@ssw0rd'" ``` #### 步骤7:配置NginxPHP 修改Nginx配置(默认已由包提供),确保`/etc/nginx/conf.d/zabbix.conf`中配置正确。 #### 步骤8:启动服务 ```bash ansible zabbix_server -m ansible.builtin.service -a "name=zabbix-server state=started enabled=yes" ansible zabbix_server -m ansible.builtin.service -a "name=zabbix-agent state=started enabled=yes" ansible zabbix_server -m ansible.builtin.service -a "name=nginx state=started enabled=yes" ansible zabbix_server -m ansible.builtin.service -a "name=php-fpm state=started enabled=yes" ``` ### 1.2 配置Zabbix Agent在本地至少两台远程主机上 #### 步骤1:在远程主机上安装Zabbix Agent 使用Ansible ad-hoc命令: ```bash # 添加仓库 ansible remote_hosts -m ansible.builtin.shell -a "rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm" # 安装Agent ansible remote_hosts -m ansible.builtin.yum -a "name=zabbix-agent state=latest" # 配置Agent(假设Zabbix Server IP为192.168.1.25) ansible remote_hosts -m ansible.builtin.lineinfile -a "path=/etc/zabbix/zabbix_agentd.conf regexp='^Server=' line='Server=192.168.1.25'" ansible remote_hosts -m ansible.builtin.lineinfile -a "path=/etc/zabbix/zabbix_agentd.conf regexp='^ServerActive=' line='ServerActive=192.168.1.25'" # 启动Agent ansible remote_hosts -m ansible.builtin.service -a "name=zabbix-agent state=started enabled=yes" ``` ### 1.3 验证Zabbix Server与Agent的通信状态 在Zabbix Web界面中: 1. 登录Zabbix前端(http://<server_ip>/zabbix) 2. 进入“配置”->“主机” 3. 检查相关主机的“可用性”列,ZBX图标应为绿色(表示正常) 或者使用zabbix_get命令在Server上测试: ```bash zabbix_get -s <agent_ip> -k agent.ping # 应返回1 ``` ## 任务2:基础监控配置 ### 2.1 创建主机组 在Zabbix前端: 1. 进入“配置”->“主机组” 2. 点击“创建主机组” 3. 分别创建:Web Servers、Database Servers、Network Devices ### 2.2 为Linux主机配置基础监控项 通常,Zabbix自带“Linux by Zabbix agent”模板已包含基础监控项。我们可以直接链接该模板到主机。 如果需要手动创建,步骤为: 1. 进入“配置”->“主机”,选择主机 2. 在“监控项”标签页,点击“创建监控项” - CPU使用率:键值`system.cpu.util[,idle]`,使用100减去空闲值得到使用率 - 内存使用:键值`vm.memory.size[available]`,可计算使用率 - 磁盘空间:键值`vfs.fs.size[/,pfree]` - 系统负载:键值`system.cpu.load[all,avg1]` - 网络流量:键值`net.if.in[eth0]``net.if.out[eth0]` ### 2.3 创建触发器仪表板 #### 触发器示例(负载): 1. 进入“配置”->“主机”,选择主机的“触发器” 2. 创建触发器: - 名称:`High CPU load on {HOST.NAME}` - 表达式:`{host:system.cpu.load.avg1.last()}>5` - 严重性:警告 #### 创建仪表板: 1. 进入“仪表板”->“仪表板” 2. 创建新仪表板,添加“问题”小部件“图形”小部件 3. 选择需要展示的主机监控项 ## 任务3:模板应用与自定义 ### 3.1 创建自定义模板“MyApp Template” 1. 进入“配置”->“模板”,点击“创建模板” - 名称:MyApp Template - 群组:Templates 2. 创建监控项(以监控特定进程数为例): - 名称:`MyApp process count` - 键值:`proc.num[,,,myapp]` # 根据进程名监控 3. 创建触发器: - 名称:`MyApp process down on {HOST.NAME}` - 表达式:`{MyApp Template:proc.num[,,,myapp].last()}<1` - 严重性:严重 4. 创建图形: - 进入“图形”标签页,创建图形 - 添加监控项“MyApp process count” ### 3.2 将模板应用到测试主机 1. 进入“配置”->“主机”,选择测试主机 2. 在“模板”标签页,链接模板“MyApp Template” ## 任务4:网络设备监控 ### 4.1 配置SNMP监控 1. 在网络设备上启用SNMP(以Cisco为例): ```cisco snmp-server community public RO ``` 2. 在Zabbix中创建SNMP主机: - 进入“配置”->“主机”,创建主机 - 选择群组“Network Devices” - 添加SNMP接口(设备IP,端口161) 3. 添加监控项(使用SNMP OID): - 接口状态:OID `1.3.6.1.2.1.2.2.1.8.<接口号>`(1表示up,2表示down) - 接口流量:OID `1.3.6.1.2.1.2.2.1.10.<接口号>`(入流量)`1.3.6.1.2.1.2.2.1.16.<接口号>`(出流量) ### 4.2 配置触发器 1. 接口宕机: - 表达式:`{host:snmptrap["IF-MIB::linkDown"].last()}=1` 或 使用监控项值=2 2. 流量(假设超过100Mbps): - 表达式:`{host:net.if.in[eth0].avg(5m)}>100000000` # 单位bps ## 任务5:Web应用监控 ### 5.1 配置Web场景 1. 进入“配置”->“主机”,选择Web服务器主机 2. 进入“Web监测”,创建Web场景 - 名称:Homepage Check - 添加步骤: - 名称:Access Homepage - URL:http://{HOST.CONN}/index.html - 必要状态码:200 - 检查内容:包含字符串“Welcome” - 测量响应时间 ### 5.2 创建触发器 1. 服务不可用: - 表达式:`{host:web.test.fail[Homepage Check].last()}>0` 2. 响应时间过长(如超过2秒): - 表达式:`{host:web.test.time[Homepage Check,Access Homepage].last()}>2` ## 任务6:日志监控与告警 ### 6.1 配置日志监控 1. 在Agent上配置日志文件监控(修改agent配置文件): ```ini # 在/etc/zabbix/zabbix_agentd.conf中添加 UserParameter=log[/var/log/messages],grep -c 'ERROR' /var/log/messages ``` 或者使用Zabbix内置的日志监控: ```ini # 启用日志监控 EnableRemoteCommands=1 LogFileSize=0 ``` 2. 在Zabbix前端创建监控项: - 类型:Zabbix agent - 键值:`log[/var/log/messages,"ERROR",,,skip]` # 监控ERROR关键字 ### 6.2 创建触发器 - 表达式:`{host:log[/var/log/messages,"ERROR"].strlen()}>0` ## 任务7:告警与通知配置 ### 7.1 配置邮件通知 1. 进入“管理”->“报警媒介类型”,创建邮件媒介: - 名称:Email - 类型:电子邮件 - SMTP服务器配置 - 消息模板配置 ### 7.2 创建告警升级策略 1. 创建动作: - 进入“配置”->“动作”,创建动作 - 条件:触发器名称包含特定关键字 - 操作: - 第1步:发送给用户组“初级运维”,持续1小时 - 第2步:升级到“级运维”,持续2小时 - 第3步:升级到“运维经理” ### 7.3 测试告警 手动停止一个被监控的服务(如httpd),检查告警流程。 ## 任务8:级监控场景 ### 8.1 主动式Agent自动注册 1. 在Agent配置中设置: ```ini ServerActive=192.168.1.25 HostMetadata=linux ``` 2. 在Zabbix前端创建自动注册动作: - 条件:`HostMetadata`包含`linux` - 操作:链接到模板“Linux by Zabbix agent” ### 8.2 低级别发现(LLD) 1. 磁盘自动发现: - 使用内置的“Mounted filesystem discovery”规则 - 自动创建监控项原型(如磁盘空间) 2. 网络接口发现: - 使用“Network interface discovery” - 创建监控项原型(如入流量、出流量) ### 8.3 配置依赖关系 例如:Web服务依赖数据库服务 1. 创建Web主机的触发器,并设置依赖条件为数据库服务的触发器 --- ## 项目交付资料 1. **配置文档**:记录所有配置步骤参数 2. **截图**:仪表板、告警通知等 3. **自定义模板脚本**:导出模板(XML格式)脚本文件 4. **总结报告**:包括遇到的问题及解决方案 --- ## 相关问题 1. Zabbix Agent如何监控Windows主机的性能指标? 2. 如何配置Zabbix Proxy以分担Server压力? 3. Zabbix如何监控Docker容器? 4. 如何实现Zabbix的分布式监控架构? 5. 如何备份恢复Zabbix配置及历史数据? 6. Zabbix如何与Prometheus集成? > 提示:所有操作均需录屏,注意记录关键步骤配置界面。</think>## Zabbix监控系统实操上机项目分步骤解决方案 ### 任务1:Zabbix环境部署(使用Ansible ad-hoc) #### 1.1 安装并配置Zabbix Server ```bash # 添加Zabbix仓库 ansible zabbix_server -m rpm -a "name=https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm state=present" # 安装核心组件 ansible zabbix_server -m yum -a "name=zabbix-server-mysql,zabbix-web-mysql,zabbix-nginx-conf,zabbix-sql-scripts state=latest" # 配置数据库 ansible zabbix_server -m mysql_db -a "name=zabbix state=present" ansible zabbix_server -m mysql_user -a "name=zabbix host=localhost password='P@ssw0rd' priv='zabbix.*:ALL' state=present" # 导入初始数据 ansible zabbix_server -m shell -a "zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -pP@ssw0rd zabbix" # 修改Zabbix配置文件 ansible zabbix_server -m lineinfile -a "path=/etc/zabbix/zabbix_server.conf regexp='^# DBPassword=' line='DBPassword=P@ssw0rd'" ``` #### 1.2 配置Zabbix Agent ```bash # 在远程主机安装Agent ansible remote_hosts -m rpm -a "name=https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm state=present" ansible remote_hosts -m yum -a "name=zabbix-agent state=latest" # 配置Agent连接Server ansible all -m lineinfile -a "path=/etc/zabbix/zabbix_agentd.conf regexp='^Server=' line='Server=192.168.1.25'" ansible all -m lineinfile -a "path=/etc/zabbix/zabbix_agentd.conf regexp='^Hostname=' line='Hostname={{ ansible_hostname }}'" # 启动服务 ansible all -m service -a "name=zabbix-agent state=started enabled=yes" ``` #### 1.3 验证通信状态 ```bash # 在Server端测试Agent连接 ansible zabbix_server -m shell -a "zabbix_get -s 192.168.1.100 -k agent.ping" # 返回1表示成功[^1] ``` ### 任务2:基础监控配置 #### 2.1 创建主机组 在Zabbix前端: 1. 导航至 **配置 → 主机组** 2. 创建:Web Servers、Database Servers、Network Devices #### 2.2 配置Linux基础监控项 ```ini # 监控项配置示例(CPU使用率) 类型:Zabbix agent 键值:system.cpu.util[,idle] 公式:100-last("system.cpu.util[,idle]") 单位:% ``` #### 2.3 创建触发器仪表板 ```text # CPU使用率触发器 名称: High CPU usage on {HOST.NAME} 表达式: {host:system.cpu.util[,idle].avg(5m)}>90 严重性: ``` ### 任务3:模板应用与自定义 #### 3.1 创建自定义模板 1. **监控项**: - 名称: MyApp Process Count - 键值: proc.num[,,,myapp] 2. **触发器**: ```text 名称: MyApp process down 表达式: {MyApp Template:proc.num[,,,myapp].last()}<1 ``` 3. **图形**: - 添加监控项:MyApp Process Count #### 3.2 应用模板 在主机配置界面: 1. 选择 **模板** 标签页 2. 添加"MyApp Template"到 **链接的模板** ### 任务4:网络设备监控 #### 4.1 配置SNMP监控 ```ini # 交换机SNMP配置(Cisco示例) snmp-server community public RO snmp-server host 192.168.1.25 version 2c public ``` #### 4.2 创建监控项 ```text 接口状态监控项: 键值: snmp.discovery 类型: SNMP agent OID: 1.3.6.1.2.1.2.2.1.8 ``` #### 4.3 配置触发器 ```text # 接口宕机触发器 名称: Interface {#IFNAME} down on {HOST.NAME} 表达式: {host:snmptrap["IF-MIB::linkDown"].last()}=1 ``` ### 任务5:Web应用监控 #### 5.1 配置Web场景 1. 导航至 **配置 → 主机 → Web监测** 2. 创建场景: - URL: http://{HOST.CONN}/index.html - 响应时间超过200ms告警 - 验证内容包含"Welcome" #### 5.2 创建触发器 ```text 名称: Web service unavailable 表达式: {host:web.test.fail[Homepage Check].last()}>0 ``` ### 任务6:日志监控与告警 #### 6.1 配置日志监控 ```ini # 在agent配置中添加 LogFile=/var/log/messages LogFileSize=0 ``` #### 6.2 创建触发器 ```text 名称: Critical error in system log 表达式: {host:log[/var/log/messages,,,1000,"CRITICAL"].strlen()}>0 ``` ### 任务7:告警与通知配置 #### 7.1 配置邮件通知 ```bash # 邮件脚本 /usr/lib/zabbix/alertscripts/mail.sh #!/bin/bash echo "$3" | mail -s "$2" $1 ``` #### 7.2 告警升级策略 ```text 操作步骤: 1. 发送给初级运维组(立即) 2. 等待1小时 → 未解决 → 发送给级运维组 3. 等待3小时 → 未解决 → 发送给运维经理 ``` ### 任务8:级监控场景 #### 8.1 主动式Agent自动注册 ```ini # Agent配置 ServerActive=192.168.1.25 HostMetadata=linux ``` #### 8.2 低级别发现(LLD) ```text # 自动发现挂载点 发现键值: vfs.fs.discovery 监控项原型: vfs.fs.size[{#FSNAME},pfree] ``` #### 8.3 配置依赖关系 ```text 示例: 应用服务 → 依赖 → 网络连通性 数据库服务 → 依赖 → 存储可用性 ``` --- ## 项目交付资料 1. **配置文档**:包含所有Ansible命令、配置文件修改记录 2. **截图**:仪表板、告警通知、拓扑图等 3. **模板源码**:导出自定义模板XML文件 4. **问题总结**:记录安装过程中的报错及解决方案 --- ## 相关问题 1. 如何验证Zabbix Agent与Server的通信状态? 2. SNMPv3相比SNMPv2c有哪些安全优势? 3. 如何在Zabbix中实现微信告警通知? 4. LLD自动发现网络接口的具体配置步骤是什么? 5. 如何监控SSL证书过期时间? 6. Zabbix Proxy在分布式监控中起什么作用? 7. 如何优化Zabbix的历史数据存储策略? > 提示:所有配置变更后需重启服务生效,Web操作需在Zabbix前端执行。建议按任务顺序操作并全程录屏[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值