又搞了一次事故



又搞了一次事故

又被我搞了个事故出来,大过年的。

我们binlog系统是这样的,数据库的每个分布式结点都有一个叫做pump的程序,会将所有log收集起来,发送到一个地方去汇总。汇总的节点叫做cistern,上层备份库从cistern拉数据。cistern会定期的清理老的数据,比如删除7天之前的。

问题出在删除的逻辑,超过多久的,全部删除,我代码直接这么写了。这是一个巨~~巨~巨~大的事务。用户线上跑了2天多以后,今天开始执行到那段逻辑。从监控的观察来复盘,当时应该是内存用涨到了500G以上,然后去跑交换,就死了。

发现问题后,修改GC,限制每次删除1000条。重启,仍然挂。关掉交换了也是,cistern目前是用boltdb做存储的,即使没有执行清理的逻辑,起来后内存直接会涨到0.5个T。这块应该是有问题的,cistern完全起不来。

算起来,我们在删除以及GC数据相关的事情已经栽了太多跟头。

  • rocksdb的删除,LMS删除不会直接删除,而是append操作,到一定时机做compaction。compaction时会比较影响到性能。
  • MVCC的删除,事务MVCC,删除也是标记而不是直接删掉。保留老版本后,读的时候需要扫描到所有版本,由于版本过多会影响性能。
  • 大表的删除,这是一个巨大的事务,内存会涨得很厉害,存储层的写入压力也非常大。

binlog设计我参与了的,而且今天导致问题的代码还是我写的,这次暴露不少问题。

cistern要把整个集群的流量都汇总,这个单点对于IO的压力太大了。机器配置要求太高,普通的SATA的IOPS跟不上,IO是会打满的。SSD成本原因,不可能太大,数据保存的时间是比较有限的。即使现在用户的土豪级配置,以那种流量,保留二三天压力都大。

boltdb的事务实现也是够粗暴的,直接上了一个全局的读写锁来实现。有写的时候,同一时间只有一个goroutine能够工作,而从当时的观察看,唯一能工作的那个goroutine还一直在处理freelist的alloc,大量的做memmove,100%的CPU都在干这个了,整个系统都卡在这儿。

之前选型是太过简单粗暴,只求先做出来。现在看来,boltdb还是不适合处理量大一点的数据。一旦IO阻塞一点,数据可能就堆积,都可能出问题。 对于当前的GC场景,是比较适合cistern上面按时间分片的,比如按时间整文件删除。

大到上层的设计,小到一行很不起眼的代码,都有可能让整个系统进入灾难。 对于编程,还真是只能时刻保持敬畏之心啊。


Read full article from 又搞了一次事故


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts