本次分享中对小米目前的自动运维体系结构,设计思路和理念,各系统间的整合方式和核心架构进行了详细阐述;
同时也介绍了整个自动运维体系的构建过程和解决方案方法, 以及基础该套体系如何来解决困扰运维的若干问题
pdf下载:
6,968 浏览
本次分享中对小米目前的自动运维体系结构,设计思路和理念,各系统间的整合方式和核心架构进行了详细阐述;
同时也介绍了整个自动运维体系的构建过程和解决方案方法, 以及基础该套体系如何来解决困扰运维的若干问题
pdf下载:
5,821 浏览
在FullNAT在使用过程中,在开启SYNProxy的情况下,采用CURL去连接某个URL,会有偶尔卡顿一下,命令如下:
for i in `seq 1 10000`;do curl -o '/dev/null' -w "%{time_total}:%{time_connect}:%{time_appconnect}:%{time_starttransfer}\n" http://192.168.1.100 >> fullnat.txt ; done
100 582 100 582 0 0 54356 0 --:--:-- --:--:-- --:--:-- 58200
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 582 100 582 0 0 54586 0 --:--:-- --:--:-- --:--:-- 58200
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
以上命令偶尔会出现6s左右的超时等待。这个事情很神奇,为什么是6s呢,不是其他数字呢,如果是丢包的话,时间为什么这么固定呢,猜测这可能跟程序的实现有关系?
我们在FullNAT机器和RealServer机器同时抓包。如下图:
第一张图是在fullnat机器上抓的,是从client到fullnat的包,第二张图在real server上抓的,是从fullnat到real server的包,从图中可以看出,从xx.xx.116.25到xx.xx.48.24,xx.xx.116.25是client,xx.xx.48.24为fullnat的vip,从第一张图中看出,完成了三次握手以后,client就开始请求数据包,但是请求数据包一直没有回应,在超时以后一直进行重发。难道是请求数据包时丢了?我们从real server上的抓包情况可以得到结果。client从03秒(抓包机器时间设置相差3分钟,单秒数是对的)开始发送数据包,但是real server从09秒时才开始3次握手建立连接。建立连接以后,并且将重发的包又转发了一遍。那么,我们从二张图中得出,导致延迟的原因是fullnat和real server建立连接的过程中,第一个syn包丢了或者没有送出来,才导致了这6秒的延时,那么为什么是6s呢,这得从fullnat代码中查看,经过代码搜索,终于找到了蛛丝马迹。
在ip_vs_proto_tcp.c文件中:
1158 int sysctl_ip_vs_tcp_timeouts[IP_VS_TCP_S_LAST + 1] = {
1159 [IP_VS_TCP_S_NONE] = 2 * HZ,
1160 [IP_VS_TCP_S_ESTABLISHED] = 90 * HZ,
1161 [IP_VS_TCP_S_SYN_SENT] = 3 * HZ,
1162 [IP_VS_TCP_S_SYN_RECV] = 30 * HZ,
1163 [IP_VS_TCP_S_FIN_WAIT] = 3 * HZ,
1164 [IP_VS_TCP_S_TIME_WAIT] = 3 * HZ,
1165 [IP_VS_TCP_S_CLOSE] = 3 * HZ,
1166 [IP_VS_TCP_S_CLOSE_WAIT] = 3 * HZ,
1167 [IP_VS_TCP_S_LAST_ACK] = 3 * HZ,
1168 [IP_VS_TCP_S_LISTEN] = 2 * 60 * HZ,
1169 [IP_VS_TCP_S_SYNACK] = 30 * HZ,
1170 [IP_VS_TCP_S_LAST] = 2 * HZ,
1171 };
1161行中的IP_VS_TCP_S_SYN_SENT代表了当fullnat和real server 的第一syn包发送失败以后超时重传的时间,如果synproxy在第二个三次握手时,第一个syn包发送失败或者被丢弃,重发的时间间隔为3s,这就解释了为什么是超时6s,估计是fullnat发送了3次syn包,但是前两次都丢弃了,或者fullnat前两个根本没有发包。从抓包的结果来看,fullnat确实没有发送前2个包,我们进一步在fullnat中打日志查看。在ip_vs_conn.c文件中,对超时的连接有处理:
881 static void ip_vs_conn_expire(unsigned long data)
...
901 /*
902 * Retransmit syn packet to rs.
903 * We just check syn_skb is not NULL, as syn_skb
904 * is stored only if syn-proxy is enabled.
905 */
906 spin_lock(&cp->lock);
907 if (cp->syn_skb != NULL && atomic_read(&cp->syn_retry_max) > 0) {
908 atomic_dec(&cp->syn_retry_max);
909 if (cp->packet_xmit) {
910 tmp_skb = skb_copy(cp->syn_skb, GFP_ATOMIC);
911 cp->packet_xmit(tmp_skb, cp, pp);
912 }
913 /* statistics */
914 IP_VS_INC_ESTATS(ip_vs_esmib, SYNPROXY_RS_ERROR);
915 spin_unlock(&cp->lock);
916 goto expire_later;
917 }
918 spin_unlock(&cp->lock);
Read More →
5,878 浏览
这里的自动化主指自动化部署,它涵盖的范围很广泛,包括搭环境、修改配置、线上升级、扩容、迁移,以及带来的所有关联变更等等。
部署系统一直作为运维基础设施的核心组件,紧密的将监控、名字服务、配置管理等关联起来。
对于持续集成,配合hudson和本地部署工具,可以串联整个软件生命周期的自动化;对于服务稳定性来说,可以通过资源隔离及增加调度来自动运维服务,提高服务可用性。
这里是pdf版下载:
5,144 浏览
报警助手是小米运维部开发的针对运维人员的一款短信报警处理软件。运维人员每天会处理大量短信报警,经常会有漏报警,报警处理不及时,不重要短信频频打扰我们生活的问题。报警助手对报警进行拦截,实行分级别管理,对不同级别报警,采用不同的处理和提醒方式,让你能够高效准确的处理报警,节省更多的时间投入到工作、学习、及家庭中。
[P0][PROBLEM][hostname][host_ip][host is down]
4,559 浏览
这是我们团队正在写的监控系统的一部分
这是一个用golang写的小工具,没有任何部署依赖
这只是一个采集linux基础数据并做简单展示的agent,不会报警的哦
11,840 浏览
16,364 浏览
1,366 浏览
如何快速进行Google Hacking审计呢?
7,774 浏览
如果你是一名SRE兄弟,收到告警短信,你是否还在疯狂的敲着ssh | grep | sed | awk 这些命令的组合排查问题呢?如果1台,2台,3台机器,ok;如果有n台机器,你会不会抓狂?
如果你是一名DEV兄弟,开发一套高性能的分布式数据处理平台,你是不是还在考虑数据如何传输,中间件如何配置,资源如何调度的问题,Oops ,你应该将重点放在业务逻辑的开发而不是外围框架的Integration上, 考虑的问题太多了,你会不会抓狂?
很不幸,我是名SRE,我们需要使用一套日志分析工具来帮助我们快速定位问题。
Ops makes No Ops.
这是一张组件构建图
我们设想了2条数据流处理方式:
1,实时日志分析系统(Xlog):分为5层,数据采集层,数据持久化层,数据处理层,结果数据持久化层,数据展示层。
2,tracing系统:分为5层,数据采集层,数据持久化层,数据处理层,indexing层,数据检索展示层。
本文将重点介绍下“实时日志分析系统”的构建过程和一些内部实现细节,希望对读者有些帮助。
作为一名SRE,Reuse Infrustracture的能力也是一种核心竞争力!
Xlog使用下列组件来构建分布式流式日志处理系统:
http://storm.incubator.apache.org/
Xlog组件选型简单说明
A. Agent选型
说到日志采集,无非三种模式
说到组件选型,目前开源的收集组件
syslog/rsyslog/syslog-ng一般用于收集Linux系统日志,收集应用日志配置复杂且不利于二次开发;
scribe facebook开源的高性能日志收集组件,但是一年多无更新,bug fixing都成问题,c写的,不利于二次开发;
目前最火的三类Agent:logslash,fluentd,flume;分别用jruby,ruby,java实现,我个人觉得flume过于重了,先不考虑,logslash是 jruby实现的,二次开发不太熟悉,所以考虑fluentd
fluentd的优点:
通过使用,个人认为fluentd最方便的2点在于
a,配置十分便捷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
## tail gallery log from nginx log <source> type tail path /home/work/opdir/nginx/logs/access.log pos_file /tmp/micloud.xiaomi.com.pos format /^$/ tag kafka.micloud.xiaomi.com.gallery.access </source> ## match tag=kafka* and write to kafka <match *.**> type kafka brokers 127.0.0.1 default_topic gallery output_data_type json </match> |
配置一个souce用于日志的输入
配置一个match用于日志的输出
souce/match对的组合十分灵活,可以实现多对多,1对多,多对1的日志收集模式。
b,插件式架构,支持二次开发,满足不同组件系统的集成和私有化定制
比如我们需要开发一个non-buffered的out_plugin,只需要重写下列代码的method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class SomeOutput < Fluent::Output # First, register the plugin. NAME is the name of this plugin # and identifies the plugin in the configuration file. Fluent::Plugin.register_output('NAME', self) # This method is called before starting. def configure(conf) super ... end # This method is called when starting. def start super ... end # This method is called when shutting down. def shutdown super ... end # This method is called when an event reaches Fluentd. # 'es' is a Fluent::EventStream object that includes multiple events. # You can use 'es.each {|time,record| ... }' to retrieve events. # 'chain' is an object that manages transactions. Call 'chain.next' at # appropriate points and rollback if it raises an exception. def emit(tag, es, chain) chain.next es.each {|time,record| $stderr.puts "OK!" } end end |
你只需要在
1 2 |
register_output('NAME', self)中注册一个“NMAE" 分别实现configure()和emit()接口即可 |
B. 持久化组件
mongodb和kafka就不多说了,mongodb在这里主要利用其“Capped”的特性来缓存storm处理完毕的消息;kafka是目前当之无愧的最高性能分布式消息队列,我们在这里用kafka主要考虑到3点:
2,135 浏览
之前有同事希望在终端下开多个窗口查看服务状态,后来用xterm解决。
multitail可以很好的实现该功能,示例如下:
multitail --label "baidu.com: " -l 'ping baidu.com' --label "sina.com: " -l 'ping sina.com' --label "taobao.com: " -l "ping taobao.com" --label "sohu.com: " -l "ping sohu.com" --label "syslog: " /var/log/syslog -l "vmstat 1" -sw 100,100 -sn 3,3
-sw 用来设置有多少列,每列的大小
-sn 配合-sw/-s使用,设置每列的窗口数
-C 放在multitail后面,输出颜色
进入后,按h帮助,大写O清屏,更多功能大家自己发掘把,比如:只显示差异
安装使用yum或者apt, apt-get install multitail
更多例子:
Read More →