记一次mesos集群停容器时间过长的问题排查

公司 mesos 集群某个 app 已经有数千的实例数,每次做滚动升级时,由于总资源不足,需要分批操作,每次起一批新版本实例,再停一批旧版本实例。目前停容器的策略是,先从服务发现中摘除需要停掉的节点,等待 60 秒后再停止容器,释放资源,但是实际上每次从发送停止容器的请求到容器资源被实际释放需要长达 6 分钟,导致滚动升级耗时过长。经过排查,最终确认问题出在我们使用 docker 的方式上,这里记录下分析和解决问题的过程。


旅行、编程与写作

前段时间的精力主要放在了找工作上,压力也比较大,阅读和写博客的计划都有所耽误。后来难得利用换工作的间歇期去了云南的大理、丽江、香格里拉旅行,还看了《黑客与画家》这本书,对于工作、生活、理想的一些看法与感悟有了些许改变。


InfluxDB详解之TSM存储引擎解析(二)

上一篇文章主要介绍了 TSM 存储引擎一些相关的概念、组件以及数据存储的目录结构,文件组成结构等内容。这一篇将会尽量从 InfluxDB 源码的角度,深入讲解数据插入、查询、合并等操作的具体流程以及内部数据结构的设计。


go 程序中获取虚拟块设备的读写速度

最近在写程序时需要在 centos5 系统上获取 device mapper 中的虚拟块设备的读写信息。在这个过程中发现由于 go 跨平台的特性,有一些 api 是无法拿到特定平台上的一些特殊信息的,或者是需要一些小技巧来实现。


InfluxDB详解之TSM存储引擎解析(一)

InfluxDB 项目更新比较快,google 了一下网上的一些文档基本上都是简单介绍了一下,而且很多都已经过时了,比如其中使用的 TSM 存储引擎,甚至官方文档上的内容都不是最新的。在源码里的 README 中有最新的设计实现的一些概要说明。


golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发布的二进制文件中,用户下载以后可以直接使用,就方便很多。


使用gvm在不同go版本之间切换

Centos7上通过 yum 从 epel 仓库里直接安装的 go 版本还是 1.4.2,从源码编译安装最新的 go 版本比较麻烦,而且开发中有时需要调试在不同编译环境下可能存在的问题,不能忽略使用最新版本是存在某些 bug 的可能性。


linux下查看指定进程的所有连接信息

定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息。通常查找某个端口的连接信息使用 ss 或者 netstat 可以轻松拿到,如果是主动与别的机器建立的连接信息则可以通过 lsof 命令来获得。


从0到1:遥远的理想国

已经记不清自己到底有多久没有认真读过一本非技术类的书籍了,大量的时间被花在职业相关的学习中,宅属性与日俱增。长此以往,渐渐发现个人的主观思想愈加匮乏,对事物的思考与理解能力逐渐下降,这真是一件令人细思极恐之事。


InfluxDB 与 OpenTSDB 对比测试

通过调研,在时间序列数据库的选择上,从社区活跃度,易用程度,综合性能上来看比较合适的就是 OpenTSDB 和 InfluxDB,所以对这两个数据库进行了一个简单测试。



时间序列数据库调研之OpenTSDB

Java 项目,基于 HBase(2.3版本貌似开始支持 Google BigTable 和 Cassandra) 的一个时间序列数据库,被广泛应用于监控系统中。很多大公司都在使用,社区较为活跃。


kubernetes 初探及部署实践

Kubernetes 是 Google 开源的容器集群管理系统,作为 Go 语言开发的热门项目之一,它提供了应用部署、维护、 扩展机制等功能,利用 Kubernetes 能够方便地管理跨机器运行的容器化应用,目前主要是针对 Docker 的管理。


LSM Tree 学习笔记

最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等。之前还没有留意这么设计的原因,最近调研时间序列数据库的时候才发现这样设计的优势所在,所以重新又复习了一遍 LSM Tree 的原理。


部署openstack的对象存储服务swift

OpenStack Swift 是一个开源项目,提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。由于要开发自己的分布式存储应用,需要借鉴 swift 的一些架构,所以在自己的机器上搭建了一个集群环境用于测试。


搭建私有docker仓库

docker 使用起来确实非常方便,易于部署,但是在国内如果要从 DockerHub 上下载镜像实在是一件非常吃力的事,而且公司内部环境使用或者搭建类似 kubernetes 集群的话就需要搭建一个私有的 docker 镜像仓库,方便在集群上快速部署 docker 服务。


go程序中dns解析无法使用所有域名服务器

最近线上服务经常会出现异常,从错误日志来看是因为域名解析失败导致的,我们在 /etc/resolv.conf 中配置了多个域名服务器,第一个是内网的,用于解析内网域名,如果是外网域名,则会通过其他的域名服务器进行解析,按道理来说应该不会有问题,但是最近却频繁发生这样的故障,为了彻底解决问题,特意研究了一下 golang 中进行 dns 查询的源码并最终解决了此问题。


利用docker搭建gitlab及持续集成模块

版本控制的重要性应该是毋庸置疑了,git 作为现在最流行的版本控制工具,各种规模的公司都在用。通常开源项目都会放在 github 上,基础功能是免费的,私有项目收费。对于一个小团队来说,gitlab 就是另外一个替代品,可以用来搭建自己私有的git服务器。


简记用sed对文件执行批量替换字符串的方法

每次要进行一些批量的文本处理,例如 sed, awk 处理数据或者涉及到正则表达式的时候,都需要临时去再查一遍资料,看一下怎么用。这里简要记录一下对大量文件进行正则匹配后批量替换文本的方法,方便以后要用的时候回顾一下。


OpenTSDB部署与使用

OpenTSDB 是基于 HBase 存储时间序列数据的一个开源数据库,对于存储监控系统采集的数据来说非常合适,不仅在写入查询上有很高的效率,而且节省存储空间。


如何使golang项目可以在任意目录下编译

通常我们将golang项目直接放在 $GOPATH/src 目录下,所有 import 的包的路径也是相对于 GOPATH 的。我在开发 frp(一个可以用于穿透内网的反向代理工具)的时候就遇到一个比较小但是挺棘手的问题,需要使这个项目可以在任意目录里被编译,方便其他成员不需要做额外的操作就可以一同开发,这里分享一下解决的方法。


Go中如何优雅地关闭net.Listener

在开发一个 Go 语言写的服务器项目的时候,遇到一个很有意思的问题,这个程序会根据客户端的请求动态的监听本地的一个端口,并且与客户端交互结束后需要释放这个端口。Go 的标准库提供了常用的接口,开发网络服务非常方便,网上随便就可以找到很多样例代码。


使用godep管理golang项目的第三方包

go语言项目的第三方包资源现在十分丰富,使用起来也非常方便,直接在代码中 import 之后再使用 go get 命令下载到本地即可。但是在合作开发一个golang项目时,经常会遇到每个人在各自的机器上使用 go get 下载的第三方包版本不一致的情况(因为 go get 会下载指定包的最新版本),很有可能会遇到版本不兼容的情况。


终端利器 Tmux

开发过程中通过ssh到服务器是很常见的,工作中基本上90%的时间在和终端打交道,如果没有一个称手的工具,将会在不停打开新的 tab 页,窗口切换中耗费大量的时间。Tmux 是终端复用器的意思,和 screen 类似,但是高度可定制,通过 tmux 可以方便地管理大量的 ssh 连接,并且灵活地在不同窗口,不同面板之间切换。


gem 源被屏蔽的解决方法

由于国内的网络环境比较特殊,使用 gem install 安装 ruby 包的时候,往往不能成功,我们可以手动替换成阿里提供的镜像源来进行下载。


给shell的输出加上颜色

在写一些脚本的时候输出信息太多,对一些重要信息加上颜色提示会更加友好。


codis 2.x版本环境搭建与测试

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别(有一些命令不支持),上层应用可以像使用单机的 Redis 一样,Codis 底层会处理请求的转发。Codis 支持不停机进行数据迁移, 对于前面的客户端来说是透明的, 可以简单的认为后面连接的是一个内存无限大的 Redis 服务。


mac上将socks5代理转为http代理

在 mac 上使用 ss 的时候创建的是 socks5 代理,浏览器可以正常设置使用,不过在 shell 中一些程序无法使用 socks5 代理,而需要使用 http 代理,通过设置 http_proxy 环境变量,就可以让 shell 通过 http 代理来访问网络。polipo 这款工具就可以帮助我们将 socks5 代理转换为 http 代理。


Redis集群调研

Redis作为一个使用场景很高的NoSQL数据库,支持了较为丰富的数据类型,相比于其他关系型数据库在性能方面优势明显。互联网公司通常更加倾向于将一些热点数据放入Redis中来承载高吞吐量的访问。

单机Redis在普通的服务器上通常ops上限在5w左右,开启pipeline的情况下在20-30w左右。对于大多数中小公司来说,通常单机的Redis已经足够,最多根据不同业务分散到多台Redis。


如何修改进程的名称

在开发 php 扩展的过程中,希望能创建一个独立的子进程做一些额外的处理工作,并且为子进程修改一个有意义的名称,发现还是有一些难度的。


go语言中使用smtp发送邮件及smtp协议的相关问题

go 的标准库中有一个 smtp 包提供了一个可以非常方便的使用 smtp 协议发送邮件的函数,通常情况下使用起来简单方便,不过我在使用中却意外遇到了一个会导致邮件发送出错的情况。



MongoDB常用命令

MongoDB 是一个基于分布式文件存储的数据库,由C++编写,介于关系数据库和非关系数据库之间的产品,所以在很多业务上可以取代 mysql,提供更高的性能以及更好的扩展性。虽然 MongoDB 不支持 sql 语法,但是从常用的操作命令上来说和 sql 的用法相类似。


python中使用pycurl库上传文件

在对外提供各种语言SDK的时候经常会遇到需要上传文件的问题,例如在python中我们可以借助pycurl库实现这个功能。


在C++中利用反射和简单工厂模式实现业务模块解耦

在设计一个系统框架的时候往往需要划分各个模块、组件,抽象出公共的部分,尽量避免耦合,以利于以后的扩展和复用。在这方面,JAVA的很多特性在利用各种设计模式的时候会非常容易,而在C++中就需要自己去一步步实现。


epoll使用说明

在《UNIX网络编程》一书中介绍了如何使用select/poll来实现I/O多路复用,简而言之就是通过内核的一种机制,监视多个文件描述符,一旦某个文件描述符处于就绪状态,就通知用户程序进行相应的读写操作,这样用户程序就不用阻塞在每一个文件描述符上。


如何处理僵尸进程

在使用c/c++开发过程中经常会用到多进程,需要fork一些子进程,但是如果不注意的话,就有可能导致子进程结束后变成了僵尸进程。从而逐渐耗尽系统资源。


linux core文件调试

在完成公司项目,测试进程的时候,经常会发现日志到了某一段特定的代码的时候就没了,进程直接退出,也没有捕获到任何的异常信息,如果日志打印的较多还可能比较容易发现问题 题,如果日志较少,就很难进行进一步的查错了。但是发现在该目录下生成了一个core文件,可以帮助我们查找程序崩溃的原因。


linux shell中的条件判断

在日常开发中经常需要编写一些简单的部署或者测试统计之类的脚本,直接用shell来编写几条命令就可以实现一些较为复杂的功能,十分方便。不过 linux shell 中的条件判断和其他编程语言略有不同,有一些需要特别注意的地方。


能否被8整除

题目:给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。 输入格式: 多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意:重排可以让0开头。


使用astyle进行代码格式化

在参与团队的开发的时候,由于平台和编写代码的工具的不同等等问题,经常会遇到代码格式非常混乱的情况,严重影响了代码的阅读效率。后来发现了一款比较好的工具 – “astyle”。


Linux下如何进行文件编码格式转换

最近把项目放到github上,但是发现代码中注释的中文部分有些是乱码,检查后发现是因为我的Centos装在虚拟机上,而我是在Windows环境下通过UE来写代码的,而UE默认是使用ASCII编码。为了避免在UE里对一个个文件进行手动修改,希望在Linux上使用命令来批量转换编码格式。


使用Vim打造自己的IDE

之前一直使用UE的FTP功能编辑Linux虚拟机上的代码文件,之后再切换到Linux上去编译,调试程序,感觉这样比较麻烦,而且UE的功能也不像VS以及Eclipse的IDE那样强大,所以就查阅了一些资料,想要把Linux下最常用的文本编辑工具Vim打造成一个适合自己的IDE,可以直接ssh登陆到远程机器上直接进行开发。


vimdiff常用命令

整理了一下在使用vimdiff进行文件合并的时候用到的一些常用的命令,方便以后查询。


Git常用命令

在用Git进行项目管理的时候有一些经常会遇到的问题处理起来比较复杂,本文记录了一些常用的命令和操作。


Git使用备忘

Git是一款免费、开源的分布式版本控制系统,由于 GitHub 的存在,我们很方便的用于管理我们平时的开发项目。

Git的命令较多,虽然大多数都不是很常用,但是还是需要记下来方便日后查看。


学习Git的常用网站

学习Git的使用的过程中参考了很多的网站,主要是两个地方讲的比较清楚,例子也很丰富,特别记录一下。


主机使用代理上网,虚拟机Linux的shell如何连外网

在公司电脑上网都需要使用代理,虚拟机里面装的Linux系统需要使用yum命令来安装软件,所以需要在shell界面能连上外网才行。

因为公司限制了每个人只能用一个IP,所以虚拟机中的Linux系统使用NAT方式和主机相连。主机是Win7操作系统,会发现网络里面多了VMnet8这个网络。


C/C++获取精确到微秒级的系统时间

最近要为自己的项目开发一个日志模块,需要获取精确到微秒级的系统时间,查阅了一些资料,发现在C/C++里面可以通过 gettimeofday(struct timeval * tv,struct timezone * tz) 和 localtime(const time_t * timep) 这两个函数的配合使用来得到我想要的结果。


size() == 0和empty()的比较

最近开发公司项目的时候发现大量用到了STL模板库,而且很多地方都需要判断一个容器是否为空,看到了两种写法,分别使用了容器的 size() 函数和 empty()函数。

我觉得很好奇,这两种写法有什么区别呢?在网上查阅了一些资料,发现说empty()效率更高的占大多数。又查看了SGI STL的帮助文档,里面有一句话:


从简单实例开始,学会写Makefile(二)

如果文件间存在着相互之间的引用关系该怎么办?如果把.h文件和.cpp文件放在了不同的目录下该怎么办?如果我想生成静态库,然后在其他地方引用静态库该怎么办?如果我想将程序迁移到Unix平台下,使用不同的编译器,难道要依次修改所有的Makefile?


从简单实例开始,学会写Makefile(一)

作为一个刚刚从大学毕业的新人,进公司不久就遇到了一个不大不小的门槛——看不懂Makefile!而Makefile所干的事却关系到程序的编译和链接,一个好的Makefile文件可以极大地提升编译项目文件的效率,免去手动编译的烦恼。