数据库分表分库是一个不错的解决方案,但是非常考验运维的技术能力(1方面涉及当前数据的分表分库操作,可能导致一段时间内无法查询到历史数据;另一方面如果按月分表,每个月新表的建立和检查需要具备一段的数据库运维能力)。在规模不是很大的情况下(监控主机500台以内)可以考虑以下的优化方式:
1、升级数据库到更高版本,如果是新部署可以考虑时序数据库(PGSQL 其实性能也不错)
2、服务器硬盘升级到SSD,配置更多的内存资源
3、调整监控模板中(如果监控项较多的话)监控项目的取值时间(例如由每10秒取值调整为每分钟或每5分钟取值,有些变化较小的指标,例如硬盘空间监控项可以调整为5分钟)
4、修改历史数据的保存时间(例如历史数据保留90天,趋势数据保留365天)
5、对数据库的配置文件调优
如果上述调整后还是无法满足性能要求,再考虑数据库分开部署以及分表分库的操作(有如此规模的主机,肯定会配置DBA)
1.zabbix部分历史数据表,在创建的时候可以采用分区表的方式
诸如一下为oracle部分表:
-- Create table
create table ZABBIX.HISTORY_TEXT
(
itemid NUMBER(20) not null,
clock NUMBER(10) default '0' not null,
value NCLOB default '',
ns NUMBER(10) default '0' not null,
upd_time TIMESTAMP(6) default SYSTIMESTAMP not null,
ins_time as ("ZABBIX"."UNIX_TO_ORACLE"("CLOCK"))
) tablespace ZABBIX_SCHE_DATA_TBS
partition by range(UPD_TIME) interval (numtoyminterval(1,'month'))
(partition P_20230301 values less than (TIMESTAMP' 2023-03-01 00:00:00')
);
alter table ZABBIX.HISTORY_TEXT add CONSTRAINT PK_HISTORY_TEXT primary key (ITEMID, CLOCK, NS, UPD_TIME) using index local tablespace ZABBIX_SCHE_DATA_TBS;
create table ZABBIX.HISTORY_LOG
(
itemid NUMBER(20) not null,
clock NUMBER(10) default '0' not null,
timestamp NUMBER(10) default '0' not null,
source NVARCHAR2(64) default '',
severity NUMBER(10) default '0' not null,
value NCLOB default '',
logeventid NUMBER(10) default '0' not null,
ns NUMBER(10) default '0' not null,
upd_time TIMESTAMP(6) default SYSTIMESTAMP not null,
ins_time as ("ZABBIX"."UNIX_TO_ORACLE"("CLOCK"))
) tablespace ZABBIX_SCHE_DATA_TBS
partition by range(UPD_TIME) interval (numtoyminterval(1,'month'))
(partition P_20230301 values less than (TIMESTAMP' 2023-03-01 00:00:00')
);
alter table ZABBIX.HISTORY_LOG add CONSTRAINT PK_HISTORY_LOG primary key (ITEMID, CLOCK, NS, UPD_TIME) using index local tablespace ZABBIX_SCHE_DATA_TBS;
create table ZABBIX.HISTORY_STR
(
itemid NUMBER(20) not null,
clock NUMBER(10) default '0' not null,
value NVARCHAR2(255) default '',
ns NUMBER(10) default '0' not null,
upd_time TIMESTAMP(6) default SYSTIMESTAMP not null,
ins_time as ("ZABBIX"."UNIX_TO_ORACLE"("CLOCK"))
) tablespace ZABBIX_SCHE_DATA_TBS
partition by range(UPD_TIME) interval (numtoyminterval(1,'month'))
(partition P_20230301 values less than (TIMESTAMP' 2023-03-01 00:00:00')
);
alter table ZABBIX.HISTORY_STR add CONSTRAINT PK_HISTORY_STR primary key (ITEMID, CLOCK, NS, UPD_TIME) using index local tablespace ZABBIX_SCHE_DATA_TBS;
Mysql和oracle都可以,按照时间,定期删除分区数据,更新统计信息。
收起如果Zabbix 6.0运行一段时间后变得比较慢,可能是由于数据库方面的问题引起的。以下是一些可能的解决方案:
总之,要解决Zabbix 6.0运行变慢的问题,需要对数据库进行优化和清理,并考虑增加硬件资源或调整Zabbix配置。