在做服务器负载状态监控的时候,为了避免负载峰值而造成无用报警的问题,我用的办法是取最近10次负载的平均值。之前这个需求直接在django中用程序解决,不过运行一段时间后速度不是很理想。现在解决的思路是先在插入新数据的时候让数据库把负载计算好放在另外一个字段,然后在django中删除计算每台服务器负载平均值的代码,负载值改成直接读取平均值。因为数据库服务器现在压力不大,增加触发器后对性能的影响这些就没怎么考虑。
计算平均值
PostgreSQL计算平均值的sql类似如下:
withsas(selectcast(load_15asfloat)fromasset_serverstatuswheresid_id=10orderbyiddesclimit10)selectavg(load_15)froms
触发器函数
CREATEORREPLACEFUNCTIONfn_status_loadavg_insert() RETURNStriggerAS $BODY$ BEGIN updateasset_serverstatussetload_avg=( withsas(selectcast(load_15asfloat)fromasset_serverstatuswheresid_id=new.sid_idorderbyiddesclimit10)selectavg(load_15)froms )whereid=new.id; returnnew; END; $BODY$ LANGUAGEplpgsqlVOLATILE COST100;
用pgsql写了个触发器的函数,基本思路其实就是更新。
为表添加触发器
CREATETRIGGERtrg_status_loadavg_insert AFTERINSERT ONasset_serverstatus FOREACHROW EXECUTEPROCEDUREfn_status_loadavg_insert();
这样PostgreSQL数据库中根据某条件,取某字段的平均值,然后插入到另外一个字段的实现就完成了。
记录下。
原文地址:http://www.sijitao.net/2030.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。