Muxx


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

graphite学习笔记

发表于 2019-01-14

架构组成

Graphite由三部分组成

  • Carbon: 监听时序数据的高性能服务
  • Whisper: 用于存储时序数据的简单的数据库
  • Graphite-web: 提供Graphite渲染图表及后台的用户数据及API接口

20190114154745709489510.png

如何将指标数据写入Graphite

1
echo "foo.bar 1 `date +%s`" | nc localhost 2003

指标数据将存储在Whisper数据库中,位于Graphite文件系统的<prefix>/storage/whisper/foo/bar.wsp (大多数情况下,Graphite路径前缀是/opt/graphite)。在Graphite Composer中创建新的图表后,你会发现bar以嵌套的形式存在于foo目录下

在Graphite中,指标、图、后台等使用以. 分割的命名空间结构。这对于想使用应用、服务器、数据中心、甚至是提交人等来分组和组织指标信息是极为方便的

以下推荐几种常见的写入graphite的方案

定时shell任务

有时你只是需要一个快捷的方式来记录指标,可以使用定时任务的方式来记录。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
CARBON_HOST="10.10.10.5"
CARBON_PORT="2003"
METRIC_NAME="debug.jdixon.procs.bad_java_app"
TIMESTAMP=`date +%s`
NUMBER_OF_WAYWARD_PROCS=`ps auwx | grep MY_BAD_JAVA_APP | wc -l`
echo ${METRIC_NAME} ${NUMBER_OF_WAYWARD_PROCS} ${TIMESTAMP} | nc ${CARBON_HOST} ${CARBON_PORT}

使用StstsD采集应用指标

记录应用性能信息是很有必有的。多亏了像StatsD这类工具,我们可以异步测量应用非阻塞,不必担心阻塞行为,也不必自行实现收集聚合机制

Etsy在早在2011年发布了最初的StatsD,做为一个开源的指标聚合器。到目前为止,围绕StatsD已经建立了庞大的生态系统。只需几行代码,你便可以将应用的数据以常规非阻塞的形式发往Graphite

1
2
3
4
5
6
7
8
9
gem "statsd-ruby"
# Set up a global Statsd client for a server on localhost:8125
$statsd = Statsd.new 'localhost', 8125
# Send some stats
$statsd.increment 'app.foo.my_counter'
$statsd.timing 'app.foo.my_timer', 320
$statsd.gauge 'app.foo.my_gauge', 100

使用Collectd采集主机指标

监控服务器信息是Graphite作为时间序数据库最常用的用法。Collected是一个非常流行的采集代理,性能好(使用C语言编写),配置简易,并拥有大量的读写库插件。

1
2
sudo apt-get update
sudo apt-get install -y collectd

我们编写一个发送指标数据到Graphite服务器的最小配置实现。修改配置文件(/etc/collected/collectd.conf)并重启collectd

1
2
3
4
5
6
7
8
LoadPlugin write_graphite
<Plugin write_graphite>
<Node "example">
Host "localhost"
Port "2003"
Prefix "collectd"
</Node>
</Plugin>

此时你应该可以在collectd命名空间下看到来自运行collectd的服务器的指标信息

其他可选传输方式

Carbon除了支持纯文本传输外,还支持AMQP、Python的Pickle格式。如果你对此不太了解的话,建议你读读官方文档)中的相关选项

item2备忘录

发表于 2019-01-02
1
2
3
4
5
6
7
8
9
# 选中
双击选中词
三击选中行
四击智能选中
ps: 选中自动复制到剪切板
# 自动完成
cmd + ;

docker中某镜像 entrypoint脚本解读

发表于 2018-12-21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
set -e # 在每个脚本开头都应该记上这句,意思是告诉bash如果任何语句的执行结果不是true则退出,这样的好处是防止错误像雪球一样越滚越大
if [ "${1:0:1}" = '-' ]; then # 该句判断是否是以-开头的选项 ${1:0:1} 对参数$1 从offset0开始截取长度1的字符 ${parameter:offset:length}
set -- elasticsearch "$@" # 标记1 该句的意思是如果命令docker启动命令只加了参数的话,补上elasticsearch命令
fi
# Drop root privileges if we are running elasticsearch
# allow the container to be started with `--user`
if [ "$1" = 'elasticsearch' -a "$(id -u)" = '0' ]; then
# Change the ownership of user-mutable directories to elasticsearch
for path in \
/usr/share/elasticsearch/data \
/usr/share/elasticsearch/logs \
; do
chown -R elasticsearch:elasticsearch "$path"
done
set -- gosu elasticsearch "$@" # 再次修改参数,用elasticsearch账号执行 命令。gosu 等同于 sudo,并规避了sudo的一些问题, https://segmentfault.com/a/1190000004527476
#exec gosu elasticsearch "$BASH_SOURCE" "$@"
fi
exec "$@" # 內建指令 exec 的功能與用途是相當特殊的。如果使用 exec 來執行“指令”,在“指令”執行完畢結果輸出之後,原先的 C shell 也會跟著終結

标记1
— 是参数的终止符,意思是不要将— 后的任意字符当做是-xx参数
set a b c 意思是设定$1 $2 $3 为 a b c
​$@ 是所有参数
例如

1
set -- elasticsearch "$@" 最终解析为elasticsearch 参数

exec date # 输出date内容后自动退出shell

服务问题排查方法论

发表于 2018-12-08

通常我们的web服务出故障,最多的有两类

  1. 资源问题
  2. 服务逻辑问题

资源问题

资源问题又包括资源是否不够造成系统瓶颈、或资源是否连通性上有问题等子问题,这里的资源指的服务依赖的一切资源比如DNS、上游接口、数据库资源等

服务逻辑问题

服务逻辑问题包括服务自己逻辑错误、多服务间异常影响造成的错误等

应对方法

  • 对资源及服务添加必要监控,包括连通性监控(端口),阈值监控,稳定性监控等等
  • 构建完善的服务保障系统,包括汇总实时监控、实时决策等,在故障时一键降级/扩容
    ** 降级分多级降级,不同级别有不同的反馈,比如一级自动降级、二级电话报警

成熟体系下的服务架构

发表于 2018-12-08

成熟系统的服务组成

  • 监控
  • 流量预估、回放压测gor
  • 日志收集分析 qps/rt/
  • 计划任务
  • 服务治理
  • 发布系统

工作小结

发表于 2018-12-03

最近一段时间,各个需求跟的很紧张,总觉得时间不够用,总结一下,时间基本花费在了两个地方

  • 排查线上问题
  • 支持产品需求

对于线上问题这方面,我能想到的是在需求开发阶段不能只要求自己开发完功能,还要做到对服务的监控治理

  • 输入输出及重点写入读取日志
  • 响应的快速debug小工具
  • 对于服务qps、rt等的监控

对于支持产品需求方面,投入精力到最值得投入的地方,碎片的一些需求实在忙不过来可以交给其他人来做

11月21日mcq队列code47问题排查

发表于 2018-11-21

背景

总是一段时间transfer就无法写入队列,报47错误。根据google得到的消息,47代表服务器临时不可用,于是一直怀疑是队列的锅。

今天再次出现47问题时,尝试用telnet访问队列,发现无法建立连接,报错,随即找运维,运维看了后表示端口不够用了,开了更大范围的端口使用。到此47错误暂时消失,不过为什么端口会不用用?在机器上使用netstat -nat|grep ESTABLISH|wc -l ,不看不知道,建立的连接有10多W…我靠,接着通过lsof -Pni|awk ‘{print $2}’|sort|uniq -c 找出占用最多的进程id,发现居然是最新上线的监控脚本,脚本中使用了内部编写的mc扩展,大致逻辑如下

1
2
3
4
5
6
7
8
9
10
while(true){
if($data = readQueue()){
...
}
}
func readQueue($key){
$mc = new Mc();
return $mc->get($key);
}

每次new新的mc对象都会建立一个连接,最终导致连接过多

ps:另外尝试使用官方扩展在循环中new对象,发现会复用之前的连接,不会建立多个连接。

php技术笔记

发表于 2018-11-14

基础

阅读全文 »
1…101112…29
Mu

Mu

230 日志
53 标签
© 2021 Mu
由 Hexo 强力驱动
主题 - NexT.Pisces