Graphite的安装其实是比较复杂的,我们只是使用者,所以用最简单的方法来安装它,把焦点关注在如何配置和使用好它上。

Docker大法:

docker run \  
 --name graphite\
 --restart=always\
 -p 80:80\
 -p 2003-2004:2003-2004\
 -p 2023-2024:2023-2024\
 -p 8125:8125/udp\
 -p 8126:8126\
 -d hopsoft/graphite-statsd
  • 注意上面端口:
    • 80是nginx
    • 2003是carbon
    • 2004是carbon aggregator
    • 2023是carbon pickle
    • 2024是carbon aggregator pickle
    • 8125是statsd
    • 8126是statsd admin

集大成版啊,不愧是在github上有400多颗星的软件啊,自带了statsd,收集软件都有了。

缺省用户:

username: root  
password: root  
email: root.graphite@mailinator.com  
第一次登陆: http://localhost/account/login 
更新Admin: http://localhost/admin/auth/user/1/

ok,首先我们要配一下statsd,务必保证Statsd的收集频率是最快的那个。比如:我们会每5分钟收集一次所有机器的负载,我们还会每1分钟都收集一次我们的交易量,还会每6小时扫描全体机器的bios。这种情况下,Statsd的收集频率就必须设置成1分钟,设置成5分钟的话就会丢数据。flushInterval的单位是毫秒,10000就是10秒,缺省这个值已经很高了。

# vi /opt/statsd/config.js 
...
flushInterval: 10000  
...

收集频率够了,下面就要说说数据库了。ghaphite的架构很复杂,我们不去关注,只要知道它本质也是需要数据库来存收到的数据即可,只不过这个数据库是rrd格式的。

定义数据库,我们必然是要用graphite来画图,首先就要定义数据库,数据库的定义都放在storage-schemas.conf里,举上面的例子,如果flushInterval是10000, 10秒,下面的5s:12h就是错的:

[all]
pattern = .*  
retentions = 5s:12h # 这个是错的,5秒行不通  
retentions = 10s:12h # 这个是可以的  
retentions = 60s:12h # 这个也没问题  

再给个实际例子:

[server_load]
priority = 100  
pattern = ^servers\.  
retentions = 60:43200,900:350400  

定义了一个名字叫做server_load

  • priority 优先级是100,会按优先级从高到低的顺序处理
  • pattern 格式,匹配收到的metric的格式
    • ^servers. 表示以server.打头的metric, 以下都符合
      • server.a
      • server.b
    • ^servers.www.*.workers.busyWorkers$,这个复杂,表示以servers.www开头,中间任意,最后以.workers.busyWorkers结尾的。以下都符合
      • server.www.idc01.ok.workers.busyWorkers
      • server.www.idc02.ccc.workers.busyWorkers
      • server.wwwakfjadsalfj.workers.busyWorkers
  • retentions 数据保留方式,怎样保存收到的metric数据。基本格式为是,secondsperdatapoint:datapointstostore(数据隔多长时间收集一次:保留多少数据)。如果有多个精度的要求,比如最详细数据保留7天,然后次详细数据保留21天,模糊数据保留5年,这样的话就用逗号隔开即可,比如15s:7d,1m:21d,15m:5y。
    • s - second
    • m - minute
    • h - hour
    • d - day
    • y - year
      • 上面的60:43200,900:350400是最土鳖的算法,60是60秒,一分钟,43200=30×24×60,30天;900是60*15, 15分钟,350400=10×365×24×4,10年。所以上面其实可以写成1m:30d,15m:10y的。
      • 来个复杂的,15s:7d,1m:21d,15m:5y;意思是15秒的数据保存7天,1分钟的数据保存21天,15分钟的数据保存5年,数据会一层一层聚合上去。比如8天前的数据就只能在1m:21d的数据中找到,精度从15秒变成了1分钟,精度损失了;21天之后精度更是从1分钟损失到了15分钟。
      • 当然也可以简单了。60s:1d;这样也可以,就保留一天之内每分钟的数据。

查看数据库,如果我们的metric叫做"servers.prod.server1.metric",那么数据的文件名就是/opt/graphite/storage/whisper/server/prod/server1/metric.wsp:

/whisper-info.py /opt/graphite/storage/whisper/servers/prod/server1/metric.wsp

结果如下:

[root@server1 ~] /usr/local/bin/whisper-info.py /opt/graphite/storage/whisper/servers/prod/server1/metric.wsp

maxRetention: 315360000  
xFilesFactor: 0.5  
aggregationMethod: average  
fileSize: 4723240

Archive 0  
retention: 2592000  
secondsPerPoint: 60  
points: 43200  
size: 518400  
offset: 40

Archive 1  
retention: 315360000  
secondsPerPoint: 900  
points: 350400  
size: 4204800  
offset: 518440  

有两个Archive档案,0对应的是60:43200,1对应的是900:350400,看明白了吧。

如果要修改策略:

[root@server1 ~] /usr/local/bin/whisper-resize.py /opt/graphite/storage/whisper/servers/prod/server1/metric.wsp 60:525600

好的,收集频率和数据库都有了,那就开始发送吧:

例子一:客户端每10秒发送一次数据(10秒内的交易数),数据库是1m:1d,那么一分钟会发送6次,这6次结果累加,就是一分钟内的总交易数:

echo "server.db.trans:555|c" | nc -w 1 -u 172.16.8.1 8125  

数据格式是metric|c,metric名是server.db.trans.all,跟pattern = ^servers.这个匹配哦,当然数据库1m:1d要定义好。c表示counter.

例子二:客户端每10秒发送一次数据(10秒内的系统平均负载),数据库是1m:1d,那么一分钟会发送6次,这6次结果累加,然后除以6,就是一分钟内的平均负载:

echo "server.db.load:0.12|c" | nc -w 1 -u 172.16.8.1 8125  

g表示gauge

其实发送数据的类型除了counter、gauge,还有Timer、Set,详细的文档大家可以看statsd文档。

查看所有的counter

echo counters | nc localhost 8126  

现在就可以开心的作图了。

comments powered by Disqus