我们会每天根踪所有线上服务器的日志,将错误日志全部找出来并且邮件给开发人员,以查明每一次error以上的问题原因和fix 。直至错误降低为0 。另外 每一次的hbck结果如果有问题也会邮件给开发人员以处理掉 。尽管并不是每一次error都会引发问题,甚至大部分error都只是分布式系统中的正常现 象,但明白它们问题的原因是非常重要的 。
5 测试与发布
因为是未知的系统,我们从一开始就非常注重测试 。测试从一开始就分为性能测试和功能测试 。性能测试主要是注意基准测试 , 分很多场景,比如不同混合读 写比例,不同k/v大小 , 不同列族数,不同命中率,是否做presharding等等 。每次运行都会持续数小时以得到准确的结果 。因此我们写了一套自动化 系统,从web上选择不同的场景 , 后台会自动将测试参数传到各台服务器上去执行 。由于是测试分布式系统,因此client也必须是分布式的 。
我们判断测试是否准确的依据是同一个场景跑多次,是否数据,以及运行曲线达到99%以上的重合度,这个工作非常烦琐,以至于消耗了很多时间,但后来 的事实证明它非常有意义 。因为我们对它建立了100%的信任,这非常重要,比如后期我们的改进哪怕只提高2%的性能也能被准确捕捉到,又比如某次代码修改 使compact队列曲线有了一些起伏而被我们看到 , 从而找出了程序的bug,等等 。
功能测试上则主要是接口测试和异常测试 。接口测试一般作用不是很明显,因为hbase本身的单元测试己经使这部分被覆盖到了 。但异常测试非常重要, 我们绝大部分bug修改都是在异常测试中发现的,这帮助我们去掉了很多生产环境中可能存在的不稳定因素,我们也提交了十几个相应的patch到社区,并受 到了重视和commit 。分布式系统设计的难点和复杂度都在异常处理上,我们必须认为系统在通讯的任何时候都是不可靠的 。某些难以复现的问题我们会通过查 看代码大体定位到问题以后 , 在代码层面强行抛出异常来复现它 。事实证明这非常有用 。
为了方便和快速定位问题,我们设计了一套日志收集和处理的程序,以方便地从每台服务器上抓取相应的日志并按一定规律汇总 。这非常重要,避免浪费大量的时间到登录不同的服务器以寻找一个bug的线索 。
由于hbase社区在不停发展,以及线上或测试环境发现的新的bug,我们需要制定一套有规律的发布模式 。它既要避免频繁的发布引起的不稳定,又要 避免长期不发布导致生产版本离开发版本越来越远或是隐藏的bug爆发 。我们强行规定每两周从内部trunk上release一个版本 , 该版本必须通过所有 的测试包括回归测试,并且在release后在一个小型的集群上24小时不受甘扰不停地运行 。每个月会有一次发布,发布时采用最新release的版本, 并且将现有的集群按重要性分级发布,以确保重要应用不受新版本的潜在bug影响 。事实证明自从我们引入这套发布机制后,由发布带来的不稳定因素大大下降 了,并且线上版本也能保持不落后太多 。
6 改进和优化
Facebook是一家非常值得尊敬的公司 , 他们毫无保留地对外公布了对hbase的所有改造,并且将他们内部实际使用的版本开源到了社区 。facebook线上应用的一个重要特点是他们关闭了split,以降低split带来的风险 。与facebook不同,淘宝的业务数据量相对没有如此庞 大,并且由于应用类型非常丰富,我们并们并没有要求用户强行选择关闭split,而是尽量去修改split中可能存在的bug 。到目前为止,虽然我们并不 能说完全解决了这个问题,但是从0.90.2中暴露出来的诸多跟split以及宕机相关的可能引发的bug我们的测试环境上己经被修复到接近了0,也为社 区提交了10数个稳定性相关的patch,比较重要的有以下几个:
- 如何获取云服务器的源代码? 云服务器源代码怎么弄
- 如何设置云服务器的源代码? 云服务器源代码怎么设置
- 如何修改云服务器的源代码? 云服务器源码怎么修改
- 如何寻找云服务器的源代码? 云服务器源码怎么找
- 如何配置云服务器的源代码? 云服务器源码怎么设置
- redis哨兵keepalive 代码redis哨兵
- redis缓存商品列表 淘宝redis缓存框架
- redis怎么写 redis打字代码
- mongodb开发 mongodb是开放源代码吗
- mysql生成器 mysql代码生成er图
