11.4.6 工程现象
1.错误必然出现
只要是理论上有问题的设计或实现,实际运行时一定会出现,不管概率有多低。如果没有出现问题,要么是稳定运行时间不够长,要么是压力不够大。系统开发过程中要有洁癖,不要放过任何一个可能的错误,或者心存侥幸心理。
2.错误必然复现
实践表明,分布式系统测试中发现的错误等到数据规模增大以后必然会复现。分布式系统中出现的分布式或者多线程问题可能很难排查,但是,没关系,根据现象推测原因并补调试日志吧,加大数据规模,错误肯定会复现的。
3.两倍数据规模
分布式存储系统压力测试过程中,每次数据量或者压力翻倍,都会暴露一些新的问题。这个原则当然是不完全准确的,不过可以用来指导我们的测试过程。例如,OceanBase压测过程中往往会提一个目标:TB级别数据量的稳定性。假设线上真实的数据量为1TB,那么我们会在线上测试过程中构造2TB~5TB的数据量,并且将测试过程分为几个阶段:百GB级别压力测试、TB级别压力测试、5TB数据量测试、真实数据线下模拟实验等。
4.怪异现象的背后总有一个愚蠢的初级bug
调试过程中有时候会发现一些特别怪异的错误,比如总线错误,core dump的堆栈面目全非等,不用太担心,仔细审核代码,看看编译连接的库是否版本错误等,特别怪异的现象背后一般是很初级的bug。
5.线上问题第一次出现后,第二次将很快重现
线上问题第一次出现往往是应用引入了一些新的业务逻辑,这些业务逻辑加大了问题触发的概率。开发人员经常会认为线上的某个问题是小概率事件,例如多线程问题,加上修复难度大,从而产生懈怠心理。然而,正确的做法是永远把线上问题当成第一优先级,尽快找出错误根源并修复掉。