设为首页 收藏本站
查看: 2509|回复: 0

[经验分享] ndo入mysql的一些优化

[复制链接]

尚未签到

发表于 2015-11-23 14:42:36 | 显示全部楼层 |阅读模式
ndo+mysql用的人还是挺多的,当监控节点多的时候,mysql经常先成为瓶颈,一旦它挂在那里,那整个nagios会因为等待ndo2db返回结果而挂住。所以,如果有必要的话,还是要对它进行一些优化。(http://blog.iyunv.com/uid-17196076-id-2817707.html)

一、是ndomod配置的优化

   ndo 把乱七八糟很多没用的数据都入库了,很多东西其实我们并不需要,所以需要在源头上做一个筛选,在平时我只留了4个内容,nagios_servicechecks,nagios_hostchecks,nagios_servicestatus,nagios_hoststatus, 后两个是centreon用来展示用的,前两个是用来查历史检查记录用的。

   如果需要记log的话,那也可以记log,不过ndo本身的log入库不是很喜欢,信息很不全,也不好查,所以log的入库建议单独搞。

   选择ndomod的入库内容,是在ndomod.cfg里的一个叫data_processing_options的配置项,这个配置项默认是-1,那就是所有东西都入,如果想做一些筛选,那就需要到源码里查看,文件是include/ndomod.h

#define NDOMOD_PROCESS_PROCESS_DATA                   1
#define NDOMOD_PROCESS_TIMED_EVENT_DATA               2
#define NDOMOD_PROCESS_LOG_DATA                       4
#define NDOMOD_PROCESS_SYSTEM_COMMAND_DATA            8
#define NDOMOD_PROCESS_EVENT_HANDLER_DATA             16
#define NDOMOD_PROCESS_NOTIFICATION_DATA              32
#define NDOMOD_PROCESS_SERVICE_CHECK_DATA             64
#define NDOMOD_PROCESS_HOST_CHECK_DATA                128
#define NDOMOD_PROCESS_COMMENT_DATA                   256
#define NDOMOD_PROCESS_DOWNTIME_DATA                  512
#define NDOMOD_PROCESS_FLAPPING_DATA                  1024
#define NDOMOD_PROCESS_PROGRAM_STATUS_DATA            2048
#define NDOMOD_PROCESS_HOST_STATUS_DATA               4096
#define NDOMOD_PROCESS_SERVICE_STATUS_DATA            8192
#define NDOMOD_PROCESS_ADAPTIVE_PROGRAM_DATA          16384
#define NDOMOD_PROCESS_ADAPTIVE_HOST_DATA             32768
#define NDOMOD_PROCESS_ADAPTIVE_SERVICE_DATA          65536
#define NDOMOD_PROCESS_EXTERNAL_COMMAND_DATA          131072
#define NDOMOD_PROCESS_OBJECT_CONFIG_DATA             262144
#define NDOMOD_PROCESS_MAIN_CONFIG_DATA               524288
#define NDOMOD_PROCESS_AGGREGATED_STATUS_DATA         1048576
#define NDOMOD_PROCESS_RETENTION_DATA                 2097152
#define NDOMOD_PROCESS_ACKNOWLEDGEMENT_DATA           4194304
#define NDOMOD_PROCESS_STATECHANGE_DATA               8388608
#define NDOMOD_PROCESS_CONTACT_STATUS_DATA            16777216
#define NDOMOD_PROCESS_ADAPTIVE_CONTACT_DATA          33554432

   可以选择自己需要的入库信息,然后把自己所选择的行右边的数字加起来,写到配置文件里去。
我选择的是如下几项

#define NDOMOD_PROCESS_SERVICE_CHECK_DATA             64
#define NDOMOD_PROCESS_HOST_CHECK_DATA                128
#define NDOMOD_PROCESS_PROGRAM_STATUS_DATA            2048
#define NDOMOD_PROCESS_HOST_STATUS_DATA               4096
#define NDOMOD_PROCESS_SERVICE_STATUS_DATA            8192
#define NDOMOD_PROCESS_OBJECT_CONFIG_DATA             262144
#define NDOMOD_PROCESS_MAIN_CONFIG_DATA               524288
#define NDOMOD_PROCESS_STATECHANGE_DATA               8388608

   加起来的结果是data_processing_options = 9189568

   这样一来,通过mysql的监控我发现,我的insert的数量减少了一半左右,从80 insert/s降到40 insert/s

二、mysql的优化

   1、因为nagios_servicechecks和nagios_hostchecks这两个表基本上是插入,而且select也比较少,所以考虑把它切换成myisam的引擎,这样可以带来更快的插入速度。

alter table nagios_servicechecks engine=myisam;
alter table nagios_hostchecks engine=myisam;

   nagios_servicestatus和hoststatus表因为更新比较快,所以用innodb

   2、我把nagios全加上以后,就发现基本上没什么延迟了,但是过了两天,就出现了问题,检查后发现了有大量慢sql语句,这些慢sql语句居然都是delete语句。
   原来,是ndo2db在删除过期的数据,但是我的表太大了,每次删除都要全表扫描,所以会很慢,insert语句得不到锁,就一直挂着,nagios等不到ndo返回结果,也一直挂着。

   当时考虑的办法是加索引,delete语句加的条件是instance_id和start_time,所以直接对这两个做索引

create index ind_nagios_sc_ins_stime on nagios_serviceschecks(instance_id,start_time);
create index ind_nagios_hc_ins_stime on nagios_hostchecks(instance_id,start_time);

   3、装好了centreon以后,在量很大的时候,有些表也是需要加索引的,这个看实际情况而定了

   4、进一步的优化

   三个方案:
   a、 如果发现插入太多,mysql顶不住了,那可以考虑把insert换成insert delayed,具体要修改的源码在src/dbhandlers.c中,函数是ndo2db_handle_servicecheckdata和 ndo2db_handle_hostcheckdata。
   b、servicechecks和hostchecks表因为是myisam的引擎, 所以时间长了文件会越来越大,插入也会越来越慢;而且我的servicechecks数据保存一周,竟然有3000w条还多,查询起来也不方便,所以考虑 用merge引擎替换,把它分为7张表,分别命名为nagios_servicechecks_1到nagios_servicechecks_7,代表周一到周日,前端做merge,然后每天插一张表,每天凌晨,就把自己今天要插的相应的表truncate掉,然后把merge表alter一下,改变下 顺序即可。

CREATE TABLE `nagios_servicechecks` (
  `servicecheck_id` int(11) NOT NULL AUTO_INCREMENT,
  `instance_id` smallint(6) NOT NULL DEFAULT '0',
  `service_object_id` int(11) NOT NULL DEFAULT '0',
  `check_type` smallint(6) NOT NULL DEFAULT '0',
  `current_check_attempt` smallint(6) NOT NULL DEFAULT '0',
  `max_check_attempts` smallint(6) NOT NULL DEFAULT '0',
  `state` smallint(6) NOT NULL DEFAULT '0',
  `state_type` smallint(6) NOT NULL DEFAULT '0',
  `start_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `start_time_usec` int(11) NOT NULL DEFAULT '0',
  `end_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end_time_usec` int(11) NOT NULL DEFAULT '0',
  `command_object_id` int(11) NOT NULL DEFAULT '0',
  `command_args` varchar(255) NOT NULL DEFAULT '',
  `command_line` varchar(255) NOT NULL DEFAULT '',
  `timeout` smallint(6) NOT NULL DEFAULT '0',
  `early_timeout` smallint(6) NOT NULL DEFAULT '0',
  `execution_time` double NOT NULL DEFAULT '0',
  `latency` double NOT NULL DEFAULT '0',
  `return_code` smallint(6) NOT NULL DEFAULT '0',
  `output` varchar(255) NOT NULL DEFAULT '',
  `perfdata` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`servicecheck_id`),
  UNIQUE KEY `instance_id` (`instance_id`,`service_object_id`,`start_time`,`start_time_usec`),
  KEY `idx_serche_ins_start` (`instance_id`,`start_time`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=gbk INSERT_METHOD=LAST UNION=(`nagios_servicechecks_2`,`nagios_servicechecks_1`,`nagios_servicechecks_7`,`nagios_servicechecks_6`,`nagios_servicechecks_5`,`nagios_servicechecks_4`,`nagios_servicechecks_3`)COMMENT='Historical service checks'

CREATE TABLE `nagios_hostchecks` (
  `hostcheck_id` int(11) NOT NULL AUTO_INCREMENT,
  `instance_id` smallint(6) NOT NULL DEFAULT '0',
  `host_object_id` int(11) NOT NULL DEFAULT '0',
  `check_type` smallint(6) NOT NULL DEFAULT '0',
  `is_raw_check` smallint(6) NOT NULL DEFAULT '0',
  `current_check_attempt` smallint(6) NOT NULL DEFAULT '0',
  `max_check_attempts` smallint(6) NOT NULL DEFAULT '0',
  `state` smallint(6) NOT NULL DEFAULT '0',
  `state_type` smallint(6) NOT NULL DEFAULT '0',
  `start_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `start_time_usec` int(11) NOT NULL DEFAULT '0',
  `end_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end_time_usec` int(11) NOT NULL DEFAULT '0',
  `command_object_id` int(11) NOT NULL DEFAULT '0',
  `command_args` varchar(255) NOT NULL DEFAULT '',
  `command_line` varchar(255) NOT NULL DEFAULT '',
  `timeout` smallint(6) NOT NULL DEFAULT '0',
  `early_timeout` smallint(6) NOT NULL DEFAULT '0',
  `execution_time` double NOT NULL DEFAULT '0',
  `latency` double NOT NULL DEFAULT '0',
  `return_code` smallint(6) NOT NULL DEFAULT '0',
  `output` varchar(255) NOT NULL DEFAULT '',
  `perfdata` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`hostcheck_id`),
  UNIQUE KEY `instance_id` (`instance_id`,`host_object_id`,`start_time`,`start_time_usec`),
  KEY `idx_hostche__ins_start` (`instance_id`,`start_time`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=gbk INSERT_METHOD=LAST UNION=(`nagios_hostchecks_2`,`nagios_hostchecks_1`,`nagios_hostchecks_7`,`nagios_hostchecks_6`,`nagios_hostchecks_5`,`nagios_hostchecks_4`,`nagios_hostchecks_3`)COMMENT='Historical host checks'

   每天凌晨执行的sql为

flush tables;
truncate table nagios_servicechecks_2;  // nagios_servicechecks_2为当天要插的表
truncate table nagios_hostchecks_2;
alter table union = (......,`nagios_servicechecks_2`);
alter table union = (.........,`nagios_hostchecks_2`);  // 把当天要插的表放到最后

   这个可以放到crontab里用脚本实现。
   这样的话,就用不着delete了,省下大批锁
   做法是在源码中把delete的函数注释掉,源码在src/ndo2db.c中,具体位置在函数ndo2db_end_input_data的最后
   把ndo2db_db_perform_maintenance(idi);这个函数的调用注释掉即可。

   把这个去掉以后,相比以前性能还是提升了不少

+-----------------------+-----------+
| Variable_name         | Value     |
+-----------------------+-----------+
| Table_locks_immediate | 130032279 |
| Table_locks_waited    | 112021    |
+-----------------------+-----------+

   现在我的ndo库每秒300左右的insert,在删掉delete语句之前,从锁上来看,两个数字相差两个数量级,现在相差了3个数量级,说明还是有点作用的,呵呵。

   c、两个status的表,nagios_servicestatus,nagios_hoststatus,如果允许的话,可以考虑换到memory引擎,速度上那个是飞快,不过前提你的内存要足够大。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-142723-1-1.html 上篇帖子: Nagios configuration Tools (Web frontends or GUI) 下篇帖子: 解决PEAR connection problems问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表