阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

优化Zabbix表结构的一些思考

426次阅读
没有评论

共计 10757 个字符,预计需要花费 27 分钟才能阅读完成。

刚过完年, 在日常检查服务器备份数据的时候发现 zabbix 的 MySQL 备份文件异常庞大, 考虑到 zabbix 会在日常监控服务器状态时定期发送一些告警信息以及监控时保存的 SQL 记录, 所以查看了下 zabbix 的数据库表, 发现 mysql 系统库文件下 zabbix 的数据库目录本身并不是很大, 也就几百 M, 但发现同目录下的 ibdata1 文件异常庞大, 达到了 4.7G. 

zabbix 本身日常的监控数据量很大是事实, 但为什么感觉没保存在 zabbix 目录下? 且 ibdata1 为什么这么巨大? 

网上查阅了 zabbix 的数据库存储原理, 发现 zabbix 库是使用的 innodb 引擎的共享表空间,innodb 把数据和索引都放在 ibdata1 下, 随着数据增长,ibdata1 会越来越大。性能方面会有影响。

然后就很好奇 zabbix 为什么会使用 innodb 的共享表空间存储数据, 网上查看到一段资料写到

—————————————————————————————-

使用过 MySQL 的同学,刚开始接触最多的莫过于 MyISAM 表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。

然而当你使用 InnoDB 的时候,一切都变了。InnoDB 默认会将所有的数据库 InnoDB 引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1 文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用 mysqldump 导出,然后再导入解决这个问题。

在 MySQL 的配置文件 [mysqld] 部分,增加 innodb_file_per_table 参数,可以修改 InnoDB 为独立表空间模式,每个数据库的每个表都会生成一个数据空间。 

独立表空间

优点:

1. 每个表都有自已独立的表空间。

2. 每个表的数据和索引都会存在自已的表空间中。

3. 可以实现单表在不同的数据库中移动。

4. 空间可以回收(drop/truncate table 方式操作表空间不能自动回收)

5. 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 

缺点:

单表增加比共享空间方式更大。 

结论:

共享表空间在 Insert 操作上有一些优势,但在其它都没独立表空间表现好。

当启用独立表空间时,请合理调整一下 innodb_open_files 参数。

—————————————————————————————-

原来默认情况下 innodb 会将所有的数据库 InnoDB 引擎的表数据存储在一个共享空间中 ibdata1, 而且增删数据库的时候,ibdata1 文件不会自动收缩,单个数据库的备份也将成为问题。

所以决定将 innodb 的共享表空间改成独立表空间, 然后以后单独备份 zabbix 数据库时就不会备份整个数据库文件, 导致系统资源浪费, 最后再做一个定期的清理 zabbix 历史记录脚本, 这样就不会担心以后备份文件过大, 导致服务器硬盘容量紧张. 

OK, 开始干活 …. 

系统环境:

——————————-

SYSYTEM: CentOS 6.3 x64

APACHE: httpd-2.4.4

MYSQL: mysql-5.6.10

PHP: php-5.4.13

ZABBIX: Zabbix 2.2.0rc2

——————————-

 

1. 查看 bdata1 文件大小

# cd /usr/local/mysql/data

# du -sh *

————————————-

4.0K file-test.xxx.cn.pid

4.0K file-test-relay-bin.000001

4.0K file-test-relay-bin.index

4.7G ibdata1

5.0M ib_logfile0

5.0M ib_logfile1

780K mysql

146M Syslog

4.0K webserver01.xxx.cn.pid

43M zabbix

————————————–

 

共享表数据空间文件 ibdata1 大小已经达到了 4.7G

 

登陆 MySQL 查看哪些表占用了空间

# mysql -uroot -p

—————————————–

> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema=’zabbix’;

—————————————–

 

+———————–+—————+————+

| table_name | total_mb | table_rows |

+———————–+—————+————+

| acknowledges | 0.06250000 | 0 |

….

| help_items | 0.04687500 | 103 |

| history | 2841.00000000 | 34957883 |

| history_log | 0.04687500 | 0 |

| history_text | 0.04687500 | 0 |

| history_uint | 1563.98437500 | 23940661 |

| history_uint_sync | 0.04687500 | 0 |

| timeperiods | 0.01562500 | 0 |

| trends | 17.89564700 | 145780 |

| trends_uint | 25.567894000 | 271256 |

103 rows in set (1.46 sec)

 

可以看到,history 表的记录已经达到了 3G,34957883 条,即 3 千多万条,同时 history_unit 也比较大,达到了 1G,约 2 百多万条;

另外就是 trends,trends_uint 中也存在一些数据。

由于数据量太大,按照普通的方式 delete 数据的话基本上不太可能。

因为我们每天会自动发送数据报表,所以决定直接采用 truncate table 的方式来快速清空这些表的数据,再使用 mysqldump 导出数据,删除共享表空间数据文件,重新导入数据。

 

2. 停止相关服务,避免改造时写入数据

# /etc/init.d/zabbix_server stop

# /usr/local/apache2/bin/apachectl stop

 

3. 清空历史数据

# mysql -uroot -p123456

———————————————

mysql > use zabbix;

mysql > truncate table history;

mysql > optimize table history;

mysql > truncate table history_uint;

mysql > optimize table history_uint;

mysql > truncate table trends;

mysql > optimize table trends;

mysql > truncate table trends_uint;

mysql > optimize table trends_uint;

ZABBIX 的详细介绍:请点这里
ZABBIX 的下载地址:请点这里

相关阅读:

安装部署分布式监控系统 Zabbix 2.06 http://www.linuxidc.com/Linux/2013-07/86942.htm

《安装部署分布式监控系统 Zabbix 2.06》http://www.linuxidc.com/Linux/2013-07/86942.htm

CentOS 6.3 下 Zabbix 安装部署 http://www.linuxidc.com/Linux/2013-05/83786.htm

Zabbix 分布式监控系统实践 http://www.linuxidc.com/Linux/2013-06/85758.htm

CentOS 6.3 下 Zabbix 监控 apache server-status http://www.linuxidc.com/Linux/2013-05/84740.htm

CentOS 6.3 下 Zabbix 监控 MySQL 数据库参数 http://www.linuxidc.com/Linux/2013-05/84800.htm

4. 备份数据

# MySQLdump -uroot -p123456 zabbix > ~/zabbix_bak.sql

 

5. 停止数据库

# service mysqld stop

 

6. 删除共享表空间数据文件

# cd /usr/local/mysql/data

# rm -rf ibdata1 ib_logfile0 ib_logfile1

 

7. 增加 innodb_file_per_table 独立表空间参数

# vi /etc/my.cnf

在 [mysqld] 下添加一行

——————————-

innodb_file_per_table=1

——————————-

 

8. 启动 MySQL

# service mysqld start

 

9. 查看参数是否生效

# mysql -uroot -p123456

———————————————-

mysql> show variables like ‘%per_table%’;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| innodb_file_per_table | ON |

+———————–+——-+

1 row in set (0.00 sec)

————————————————

 

10. 重新导入数据

# mysql -uroot -p123456 zabbix < ~/zabbix.sql

 

11. 编写 zabbix 自动清理历史数据的脚本,保留 30 天的数据

# vi /etc/rc.d/zabbix_olddata_clean.sh

———————————————

#!/bin/bash

 

DATE=`date -d “30 days ago”`

CLOCK=`date +%s -d “${DATE}”`

USER=”root”

PW=”123456″

DB=”zabbix”

MYSQL=”mysql -u$USER -p$PW”

 

function zabbix_olddata_clean(){

for TABLE in history trends

do

${MYSQL} <<EOF

USE ${DB};

DELETE FROM ${TABLE} WHERE clock < ${CLOCK};

OPTIMIZE TABLE ${TABLE};

DELETE FROM ${TABLE}_uint WHERE clock < ${CLOCK};

OPTIMIZE TABLE ${TABLE}_uint;

EOF

done

}

 

zabbix_olddata_clean

———————————————

 

12. 将该脚本加入计划任务

# crontab -e

加入一条规则, 每个月 1 号凌晨 3 点 35 执行此脚本

———————————

35 03 1 * * /bin/sh /etc/rc.d/zabbix_olddata_clean.sh

———————————

 

13. 重启相关服务进程

# /etc/init.d/zabbix_server restart

# /usr/local/apache2/bin/apachectl start

# service crond restart

 

14. 验证

我们首先监控下 mysql 的数据库记录日志

# tail -f /usr/local/mysql/log/mysql.log

 

手动执行下此脚本

# sh /etc/rc.d/clean_zabbix_olddata.sh

———————————————

Table Op Msg_type Msg_text

zabbix.history optimize status OK

Table Op Msg_type Msg_text

zabbix.history_uint optimize status OK

Table Op Msg_type Msg_text

zabbix.trends optimize status OK

Table Op Msg_type Msg_text

zabbix.trends_uint optimize status OK

———————————————-

 

查看到相关数据库清理语句

—————————————————-

……

6390 Query SELECT DATABASE()

6390 Init DB zabbix

6390 Query DELETE FROM history WHERE clock < 1391861640

6390 Query OPTIMIZE TABLE history

140208 10:40:34 6390 Query DELETE FROM history_uint WHERE clock < 1391861640

6390 Query OPTIMIZE TABLE history_uint

6391 Connect root@localhost on

6391 Query select @@version_comment limit 1

6391 Query SELECT DATABASE()

6391 Init DB zabbix

6391 Query DELETE FROM trends WHERE clock < 1391861640

6390 Quit

6391 Query OPTIMIZE TABLE trends

6391 Query DELETE FROM trends_uint WHERE clock < 1391861640

6391 Query OPTIMIZE TABLE trends_uint

6391 Quit

…….

—————————————————-

 

最后我们查看下系统数据库文件

# cd /usr/local/mysql/data/

# du -sh *

————————————

4.0K file-test.iscard.cn.pid

4.0K file-test-relay-bin.000001

4.0K file-test-relay-bin.index

10M ibdata1

5.0M ib_logfile0

5.0M ib_logfile1

780K mysql

146M Syslog

4.0K webserver01.iscard.cn.pid

42M zabbix

————————————

# ls -lh

—————————————-

总用量 21M

-rw-rw—- 1 mysql mysql 6 2 月 8 08:30 file-test.xxx.cn.pid

-rw-rw—- 1 mysql mysql 117 9 月 9 14:09 file-test-relay-bin.000001

-rw-rw—- 1 mysql mysql 29 9 月 9 14:09 file-test-relay-bin.index

-rw-rw—- 1 mysql mysql 10M 2 月 8 10:44 ibdata1

-rw-rw—- 1 mysql mysql 5.0M 2 月 8 10:44 ib_logfile0

-rw-rw—- 1 mysql mysql 5.0M 2 月 8 10:44 ib_logfile1

drwxr-x—. 2 mysql root 4.0K 9 月 9 08:32 mysql

drwxr-x— 2 mysql mysql 4.0K 2 月 7 18:22 Syslog

-rwxr-x— 1 mysql mysql 5 5 月 27 2013 webserver01.xxx.cn.pid

drwxr-x— 2 mysql mysql 12K 2 月 8 10:40 zabbix

——————————————

zabbix 库文件已经独立到 zabbix 数据库目录下,ibdata1 经过清理和瘦身, 终于不会显得太臃肿.

刚过完年, 在日常检查服务器备份数据的时候发现 zabbix 的 MySQL 备份文件异常庞大, 考虑到 zabbix 会在日常监控服务器状态时定期发送一些告警信息以及监控时保存的 SQL 记录, 所以查看了下 zabbix 的数据库表, 发现 mysql 系统库文件下 zabbix 的数据库目录本身并不是很大, 也就几百 M, 但发现同目录下的 ibdata1 文件异常庞大, 达到了 4.7G. 

zabbix 本身日常的监控数据量很大是事实, 但为什么感觉没保存在 zabbix 目录下? 且 ibdata1 为什么这么巨大? 

网上查阅了 zabbix 的数据库存储原理, 发现 zabbix 库是使用的 innodb 引擎的共享表空间,innodb 把数据和索引都放在 ibdata1 下, 随着数据增长,ibdata1 会越来越大。性能方面会有影响。

然后就很好奇 zabbix 为什么会使用 innodb 的共享表空间存储数据, 网上查看到一段资料写到

—————————————————————————————-

使用过 MySQL 的同学,刚开始接触最多的莫过于 MyISAM 表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。

然而当你使用 InnoDB 的时候,一切都变了。InnoDB 默认会将所有的数据库 InnoDB 引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1 文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用 mysqldump 导出,然后再导入解决这个问题。

在 MySQL 的配置文件 [mysqld] 部分,增加 innodb_file_per_table 参数,可以修改 InnoDB 为独立表空间模式,每个数据库的每个表都会生成一个数据空间。 

独立表空间

优点:

1. 每个表都有自已独立的表空间。

2. 每个表的数据和索引都会存在自已的表空间中。

3. 可以实现单表在不同的数据库中移动。

4. 空间可以回收(drop/truncate table 方式操作表空间不能自动回收)

5. 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 

缺点:

单表增加比共享空间方式更大。 

结论:

共享表空间在 Insert 操作上有一些优势,但在其它都没独立表空间表现好。

当启用独立表空间时,请合理调整一下 innodb_open_files 参数。

—————————————————————————————-

原来默认情况下 innodb 会将所有的数据库 InnoDB 引擎的表数据存储在一个共享空间中 ibdata1, 而且增删数据库的时候,ibdata1 文件不会自动收缩,单个数据库的备份也将成为问题。

所以决定将 innodb 的共享表空间改成独立表空间, 然后以后单独备份 zabbix 数据库时就不会备份整个数据库文件, 导致系统资源浪费, 最后再做一个定期的清理 zabbix 历史记录脚本, 这样就不会担心以后备份文件过大, 导致服务器硬盘容量紧张. 

OK, 开始干活 …. 

系统环境:

——————————-

SYSYTEM: CentOS 6.3 x64

APACHE: httpd-2.4.4

MYSQL: mysql-5.6.10

PHP: php-5.4.13

ZABBIX: Zabbix 2.2.0rc2

——————————-

 

1. 查看 bdata1 文件大小

# cd /usr/local/mysql/data

# du -sh *

————————————-

4.0K file-test.xxx.cn.pid

4.0K file-test-relay-bin.000001

4.0K file-test-relay-bin.index

4.7G ibdata1

5.0M ib_logfile0

5.0M ib_logfile1

780K mysql

146M Syslog

4.0K webserver01.xxx.cn.pid

43M zabbix

————————————–

 

共享表数据空间文件 ibdata1 大小已经达到了 4.7G

 

登陆 MySQL 查看哪些表占用了空间

# mysql -uroot -p

—————————————–

> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema=’zabbix’;

—————————————–

 

+———————–+—————+————+

| table_name | total_mb | table_rows |

+———————–+—————+————+

| acknowledges | 0.06250000 | 0 |

….

| help_items | 0.04687500 | 103 |

| history | 2841.00000000 | 34957883 |

| history_log | 0.04687500 | 0 |

| history_text | 0.04687500 | 0 |

| history_uint | 1563.98437500 | 23940661 |

| history_uint_sync | 0.04687500 | 0 |

| timeperiods | 0.01562500 | 0 |

| trends | 17.89564700 | 145780 |

| trends_uint | 25.567894000 | 271256 |

103 rows in set (1.46 sec)

 

可以看到,history 表的记录已经达到了 3G,34957883 条,即 3 千多万条,同时 history_unit 也比较大,达到了 1G,约 2 百多万条;

另外就是 trends,trends_uint 中也存在一些数据。

由于数据量太大,按照普通的方式 delete 数据的话基本上不太可能。

因为我们每天会自动发送数据报表,所以决定直接采用 truncate table 的方式来快速清空这些表的数据,再使用 mysqldump 导出数据,删除共享表空间数据文件,重新导入数据。

 

2. 停止相关服务,避免改造时写入数据

# /etc/init.d/zabbix_server stop

# /usr/local/apache2/bin/apachectl stop

 

3. 清空历史数据

# mysql -uroot -p123456

———————————————

mysql > use zabbix;

mysql > truncate table history;

mysql > optimize table history;

mysql > truncate table history_uint;

mysql > optimize table history_uint;

mysql > truncate table trends;

mysql > optimize table trends;

mysql > truncate table trends_uint;

mysql > optimize table trends_uint;

ZABBIX 的详细介绍:请点这里
ZABBIX 的下载地址:请点这里

相关阅读:

安装部署分布式监控系统 Zabbix 2.06 http://www.linuxidc.com/Linux/2013-07/86942.htm

《安装部署分布式监控系统 Zabbix 2.06》http://www.linuxidc.com/Linux/2013-07/86942.htm

CentOS 6.3 下 Zabbix 安装部署 http://www.linuxidc.com/Linux/2013-05/83786.htm

Zabbix 分布式监控系统实践 http://www.linuxidc.com/Linux/2013-06/85758.htm

CentOS 6.3 下 Zabbix 监控 apache server-status http://www.linuxidc.com/Linux/2013-05/84740.htm

CentOS 6.3 下 Zabbix 监控 MySQL 数据库参数 http://www.linuxidc.com/Linux/2013-05/84800.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计10757字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7964439
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示 首先来回顾一下 10...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...