对监控系统的思考

近期在做运维监控方面的事情,也研究了一下其他人是如何做的。把自己的想法做个总结记录一下吧。 监控期望的目标 及时发现 需要的是即时监控并报警 及时定位 定位问题要分开讲 运维层面 > 是机器硬件问题还是上面运行的基础服务的问题,或者是新上线代码的问题,需要回滚。 代码层面 > 在发生问题的时候,优先解决问题。定位代码问题提交hotfix 可以在解决问题之后做。 及时处理 提前预测(尽量减少问题的发生) 提前预测可以做的事情有很多,数据挖掘/分析之类的。当然有个更简单的方法,就是先小范围上线,进行监控。如果发现出问题了,就停止上线,进行回滚。(我们现在就是这样做的,虽然原因并不是这个 2333 监控遇到的主要问题 监控指标多 服务器CPU,内存,网络等的指标,基础服务Redis, MongoDB等的运行指标,对外服务的API是否正常工作,还有数据是否正确等。 监控报警多 监控指标多的时候,自然报警也会相应增加,但是报警的分组与轻重缓急也是一个很麻烦的问题。还有就是部署着不同服务的机器,触发报警时候的指标也不好确定。 报警多而且有关联,如何查找原因 可能同时会有多个指标触发了报警,但是要定位问题的时候,如何可以快速的定位问题。 多维度数据监控 这个话题太大(要感谢Baidu的颜大大的指点) 数据监控符合二八原则,重要数据需要多角度进行观察,需要有meta管理,需要动态简单配置。选择 好的,合理的数据模型可以有效的进行处理。 数据采集部分,在单机器做聚合;命名上使用正则格式化;完善的配置功能,支持数据流自定义维度。 对开源系统的使用,需要按照自己的实际情况进行适配。保证高可用性 先写这些吧,之后有时间再写,还有QCon上对运维监控上的一些分享也非常值得思考

Open-Falcon监控系统部署

本文并不分析Open-Falcon的架构或者选用它的原因,官方的文档在这里,虽然还不够完善。不过这也是我写这篇的原因,官方文档并没能把整个部署过程连在一起,而且个别地方有点问题。我在这篇文章中就不介绍各个组件的作用和功能了,只是单纯的介绍如何从零部署。 安装 下载 wget https://github.com/XiaoMi/open-falcon/releases/download/0.0.5/open-falcon-0.0.5.tar.gz -O open-falcon.tar.gz 解压 mkdir tmp tar -zxvf open-falcon.tar.gz -C ./tmp 基础环境 sudo apt-get install redis-server sudo apt-get install mysql-server pip install virtualenv # 数据库初始化的代码来源于官方文档 git clone https://github.com/open-falcon/scripts.git cd scripts mysql -h localhost -u root -p < db_schema/graph-db-schema.sql mysql -h localhost -u root -p < db_schema/dashboard-db-schema.sql mysql -h localhost -u root -p < db_schema/portal-db-schema.

源码编译MongoDB

上周放假正好有时间,编译安装了MongoDB,虽然MongoDB用了挺长时间的,但还是第一次用源码编译。在此做个备忘。因为已经完整编译安装过了,所以写起来的时候,就按照先知视角来写了~ 2333 下载MongoDB源码 MongoDB的官网上是有已经编译好的二进制包的,这里选择clone MongoDB在github上的仓库 git clone https://github.com/mongodb/mongo && cd mongo 在docs/building.md中是编译所需的依赖。 * A modern C++ compiler. One of the following is required. * GCC 4.8.2 or newer * Clang 3.4 (or Apple XCode 5.1.1 Clang) or newer * Visual Studio 2013 Update 2 or newer * Python 2.7 * SCons 2.3 我这台服务器是CentOS 6.5, 上面的gcc版本比较低,这里就先更新gcc咯. gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16) Copyright © 2010 Free Software Foundation, Inc.

重置Ghost博客的密码

在搭建Ghost博客的时候,尚未配置mail服务器时,重置密码的方法做个记录 打开数据库查看用户信息 如果全部默认设置,使用生产环境的话,应该是 sqlite3 content/data/ghost.db 如果是开发环境应该是 sqlite3 content/date/ghost-dev.db 查看用户信息 sqlite>SELECT * FROM users; 更新用户密码 Ghost对用户密码用的是BCrypt加密,可以使用BCrypt Hash Generator之类的工具生成一个想要修改的密码,例如”mypasswd”生成的密码是 $2a$10$QecJeBdw2lONRTnHJ0RoVO6DczdJWf4h4QgaUcgKsYFZlzTe1yeEK 假设之前查看到的用户信息,邮箱是admin@domain.com 那么,使用这样更新密码 UPDATE users SET password="$2a$10$QecJeBdw2lONRTnHJ0RoVO6DczdJWf4h4QgaUcgKsYFZlzTe1yeEK" WHERE email="admin@domain.com" 退出sqlite3 .exit

近况

博客好长时间没有更新了,今天抽空大致来说一下近况吧 工作 用这个标题的话,其实感觉想写的确实好多,但是还是挑一些比较重要的来说吧。现在的公司说实话还确实没有让我失望,工位上配的是一个 22寸的 AOC 显示器和一个24寸的 Dell 显示器, 主机内存 12G (我每天跑个Linux是有点浪费)办公区每天有物业定时打扫神马的,下午的时候有茶歇(茶水间还有一堆零食)。同事们相处感觉都很不错,每天中午一起出去吃饭,各种聊天调侃神马的,只是一开始不太了解项目中的配置神马的,让老大费心了… 这段时间还有很多有趣的事情 比如: 去金海湾度假村团建之类的。 再说一下最近的感受吧。 因为国庆前需要上线,所以放假前就每天都是在忙着开发神马的。不过那两周也是近期感觉最爽的时候 写代码高潮不断 而且也确实感觉工作是蛮有挑战性的,确实是我想要的工作 :-) 。 不过我还记得那周一,一打开邮箱看到中有7份未读的需求邮件, 确实是略惊吓。 在开发的项目,因为改变了设计思路,所以这些天主要都是在写前端。只不过一开始的时候感觉略虐心啊, 写Python时间长了已经是不习惯其他语言那种书写规范了 一堆括号写的好烦躁 但是从这两天的感觉来看,得感谢老大的这种设计思路,这段时间学到的确实很多。 从框架到一些库,一些插件, 还有程序上一些比较巧妙的用法 正在努力消化中 生活 有点后悔加上标题了 其实主要要说的应该都放在这里吧。 从搬家后基本上每天生活都很规律,目前差不多适应了。(找工作和面试神马的我写到碎碎念里面了,具体的等半年或者一年后当回忆录来写 233)值得吐槽的就是电信的客服,用的是电信的网,前几天换了路由器忘记了密码,打客服重置密码,但是一直连接不成功(691错误,明显就是帐号密码的问题嘛)结果本来想到了周末放假的时候再好好处理,结果到了周末打电话却一直没有客服啊用联通号打电信的客服我也是醉了 最后到了周一才让客服又重置才成功。 其实那也是导致我这么久没有更新博客的原因orz 。 * 一个原因是因为电脑重装了系统,环境啥的一直没有配置 * 另一个就是因为网络坑爹,实在有心无力 再者就是帝都的天气让人确实有点无奈,有天早上刚下楼,我还以为我要迈步进入寂静岭了 TAT ,感觉能幸存下来确实是很不容易啊。 最后说一下最近在网络弄好之后,挖了一个坑。打算独立开发一个网站的说, 重复造轮子的原因和大多数人是一样的 ,现有的东西没有我想要的 正好把最近学到的东西都拿来练练手 Try My Best !

正则匹配中文及字符编码问题

匹配中文的正则表达式 窝写了一小段代码(虽然写的不太好,但是基本可以表达意思) -- import re nickname = raw_input('Please input your nickname > ') if not re.search(u'^[\u4e00-\u9fa5a-zA-Z0-9]+$', unicode(nickname,'utf8')): print 'Your nickname format is error, please try again !' else: print 'Hello %s'% nickname 如你所见,上面第5行的代码,就是匹配中文和字母,数字的正则表达式了。里面的\u4e00-\u9fa5 就是中文汉字的unicode编码所在位置。 Python字符串的编码问题 还是以上面那段代码来说。注意看第5行的代码 if not re.search(u'^[\u4e00-\u9fa5a-zA-Z0-9]+$', unicode(nickname,'utf8')): 其实这样的代码并不严谨。因为在Python 中默认是用unicode编码来处理字符串的,因此做编码转换的时候,一般要以unicode作为中间编码,也就是说: 其他编码格式的字符串—>解码(decode)—>unicode—>编码(encode)—>所需要的编码格式。 因此,处理字符串编码的问题的时候,先要明白需要转换的字符串的编码格式是什么。 代码中字符串的默认编码格式与代码文件本身的编码格式是一样的 比如: s = ‘涛’ 在utf8的文件中,那么s就是utf8编码的,但是如果文件是gb2312编码,那么s就是gb2312编码的。此时,如果想要处理s这个字符串就要先decode成unicode编码了。 不过如果是酱紫 s = u’涛’,那么s就是unicode编码了,这个时候s的编码方式不会被文件的编码所影响。 如果一个字符串已经是unicode编码了,再解码就会出错 因此严谨的方式就是先对字符串进行编码格式的判别,最简单的办法就是使用Python 默认提供的isinstance() 方法. 代码可以这样写 isinstance(s, unicode) 如果不是unicode编码就会报错。 窝今天在处理用户昵称的地方,忘记字符串会直接使用文件的编码了,所以对它进行了重新编码orz果断就报错了。。。以后还是要好好注意细节的说。

Bash 显示 Git 分支

虽然一直都在用git,但是并没有注意到还有这个方便的用法 于是乎赶快学习一下 :-) 上网查了一下资料,都说Ubuntu下如何如何方便,其他的发行版需要先下载一个文件,然后添加source,再如何如何。。 其实查再多都不如实践。以下是窝经过查资料加上对个人bash的配色后写出的配置文件,加入到 ~/.bashrc 中即可(对各个发行版通用的) function git_branch { ref=$(git symbolic-ref HEAD 2> /dev/null) || return; echo "("${ref#refs/heads/}") "; } PS1="[\[\e[1;35m\]\u\[\e[1;32m\]\w\[\e[0m\]] \[\e[0m\]\[\e[1;36m\]\$(git_branch)\[\e[0;33m\]\$" 或者 function git-branch-name { git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3 #git rev-parse --abbrev-ref HEAD } function git-branch-prompt { local branch=`git-branch-name` if [ $branch ]; then printf " [%s]" $branch; fi } PS1="\u@\h \[\033[0;36m\]\W\[\033[0m\]\[\033[0;32m\]\$(git-branch-prompt)\[\033[0m\] \$ " -- 按照惯例,上一张图

Grub2 rescue 修复

昨天下午的时候想要把分区处理一下,突然发现硬盘里面有一个未使用的102M的分区,很果断的把这些乱七八糟的分区都给干掉了。结果呢,再次开机的时候就坑了(虽然酱紫的事情干过很多次了,这次做个记录吧)开机时提示如下: GRUB loading.. error: unknown filesystem. Entering rescue mode.... grub rescue> grub rescue 支持的命令 ls 查看硬盘的分区情况,如果你已知自己的grub的安装位置(比如我的在(hd0,msdos9)/boot/grub2),那么就直接进行下一步。 如果不知道,那就ls每个分区,比如: ls (hd0,msdos2)/,如果正确就会显示里面到内容,直到找到grub 这里一个很关键的地方就是在硬盘位置后应该加入/ set 直接输入的话, 可以看到root 和 prefix 的设置。这里需要把这两个选项改成我们已经找到的位置。 窝的设置如下 grub rescue> set grub rescue> prefix=(hd0,msdos9)/boot/grub2 grub rescue> root=hd0,msdos9 insmod 载入模块。这里区别是窝这次记录的关键。 grub2和grub的一个很重要的区别就是模块的位置。grub2的模块位置在/boot/grub2/i386-pc/normal.mod 执行命令: grub rescue>insmod (hd0,msdos9)/boot/grub2/i386-pc/normal.mod 执行成功之后,提示符会变成normal normal 进入正常模式,直接输入命令即可 grub rescue>normal 这个时候,就可以看到熟悉的引导界面了。 grub2-install 进入系统后执行命令 $ sudo update-grub $ sudo grub2-install /dev/sda 如果不执行这样的命令的话,重启之后还会回到之前的界面orz

Linux中Sublime中文输入

这篇只是为了备忘所以把以前写的东西搬这边了 -.- 代码源于网络,感谢分享 这里的关键就是以下的代码和编译 /* sublime-imfix.c Use LD_PRELOAD to interpose some function to fix sublime input method support for linux. By Cjacker Huang <jianzhong.huang at i-soft.com.cn> gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC LD_PRELOAD=./libsublime-imfix.so sublime_text */ #include <gtk/gtk.h> #include <gdk/gdkx.h> typedef GdkSegment GdkRegionBox; struct _GdkRegion { long size; long numRects; GdkRegionBox *rects; GdkRegionBox extents; }; GtkIMContext *local_context; void gdk_region_get_clipbox (const GdkRegion *region, GdkRectangle *rectangle) { g_return_if_fail (region !