System Engineering Reading List


目标:
————–

–  普及基础理论,培养读Paper的习惯 

–  强化本领域的理解 

–  融汇贯通,理论和实际业务相结合

–  对系统进行理论提炼并逐步培养写Paper的能力


计划:
—————-

–  Overview:  What  is  a  distributed  system?  A  case  study  with  MapReduce.
    
    Reading:
        
    .  MapReduce:  https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf

    
–  RPC  and  Threads
    
    Reading:
    
    .  RPC:  http://www.cs.wustl.edu/~schmidt/PDF/rpc4.pdf
    
    .  SEDA:    https://www.cs.cornell.edu/courses/cs614/2003sp/papers/Wel01.pdf
    
–  Local  Storage

      Reading:
      
      .  LSM:  http://www.cs.umb.edu/~poneil/lsmtree.pdf

      .  (TODO:  any  local  storage  paper  with  latest  hardware  such  as  NVME?)
  
–  Distributed  Storage

    Reading:
      
      .  GFS:  http://www.cs.cornell.edu/courses/cs614/2004sp/papers/gfs.pdf
      
      .  Dynamo:  http://cloudgroup.neu.edu.cn/papers/cloud%20data%20storage/dynamo-sosp-2007.pdf

–  Distributed  Consensus

    Reading:
    
      .  Chubby:  https://research.google.com/archive/chubby.html
      
      .  Raft:https://raft.github.io/raft.pdf
  
–  Distributed  Transaction

    Reading:
        
      .  PWV:  http://www.vldb.org/pvldb/vol10/p613-faleiro.pdf

      .  Percolator:  http://cloudgroup.neu.edu.cn/papers/model/incrprocess_osdi_2010.pdf
      
–  Graph

    Reading:
    
      .  GraphX:  https://amplab.cs.berkeley.edu/wp-content/uploads/2014/09/graphx.pdf

      .  Wukong:  https://www.usenix.org/conference/osdi16/technical-sessions/presentation/shi

–  Streaming

    Reading:
        
      .  Spark  Streaming:  https://people.csail.mit.edu/matei/papers/2013/sosp_spark_streaming.pdf

      .  Time  Stream:  https://www.microsoft.com/en-us/research/publication/timestream-reliable-stream-computation-in-the-cloud/

–  Cluster  Management  

    Reading:
    
      .  Mesos:  https://cs.stanford.edu/~matei/papers/2011/nsdi_mesos.pdf

      .  Borg:  https://pdos.csail.mit.edu/6.824/papers/borg.pdf

–  System  Reliability

    Reading:
    
      .  Design  &  deploy:  http://mvdirona.com/jrh/talksAndPapers/JamesRH_Lisa.pdf
      
      .  ErrLog:  https://www.usenix.org/system/files/conference/osdi12/osdi12-final-109.pdf
      
      .  Failure  Recovery  Be  Evil:  https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/FailureRecoveryBeEvil.pdf

数据分析是通往更好人生的钥匙

雾霾变化分析、水木房产牛人carcar房价分析对我很有启发:通过数据分析,我们可以洞悉到事情的真实面目。

面对纷繁复杂的社会舆论,选择会盲从,因为不知道谁说的是真,谁说的是假,最终的决策是被情绪左右。

但是,数据(大部分时候)是客观的。

通过原始数据,很难看出背后的模式,但通过对原始数据进行加工和分析,就能看出很多规律。

对于短线操作,数据分析可能会有较大偏差,但长线来看,数据分析一定可以深刻地描述现实规律。

懂得了规律,投资行为、迁移行为就有了客观数据支持。

 

学习SQLSTATE

1. 什么是SQLSTATE

shell> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table ‘test.no_such_table’ doesn’t exist

上面执行一条SQL语句出错后的显示。1146是MySQL自己定义的错误码,42S02是ANSI SQL和ODBC定义的错误码,“Table ‘test.no_such_table’ doesn’t exist”是MySQL返回的错误原因。

其中,42S02就是本文要讨论的SQLSTATE

 

2. 为什么要有SQLSTATE

42S02是ANSI SQL和ODBC定义的错误码,可以理解成是错误码标准。假设没有SQLSTATE,世界会是什么样子?你开发了一款数据库驱动程序,希望兼容MySQL、Oracle、SQLServer。对于锁冲突,MySQL返回错误码2011,Oracle返回9912,SQLServer返回3231(以上3个数据为杜撰),如果你希望检查到锁冲突后,立即执行do_something(),那你需要这样写代码:

if (2011 == conn.errno || 9912 == conn.errno || 3231 == conn.errno) {
    do_something();
}

如果还希望支持Postgre,则需要增加Postgre的错误码处理。这是个悲伤地故事,不想再讲。

可见,数据库自定义错误码是靠不住的,他们各自为政。也许你会想,为什么这些数据库厂商不能协调一下,统一一下错误码呢?理想很丰满,现实很骨感。因为在某个特定数据库内部实现中,可能内部定义了四五个不同的错误码来表示锁冲突,用一个错误码无法满足内部逻辑的需求。所以,完美的解决方式是:

*. 内部,用数据库自己的错误码,爱怎么用就怎么用,当需要把这个错误码输出到外部的时候,先做一个转换,将内部错误码转换成SQLSTATE。
*. 数据库驱动程序只看SQLSTATE,忽略数据库自定义错误码。

 

3. SQLSTATE数据格式详解

SQLSTATE包含5个字母,前两位表示错误类别,后三位表示子类,均有0~9,A~Z(大写)这些字符组成。00000表示没有错误。

前两个字母定义的错误类别:

00 = 没有错误

01 = 有WARNING

02 = 游标NOT FOUND

> 02 表示某种异常,MySQL的异常,详细见http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html  这里定义了MySQL内部800多个错误码与SQLSTATE的映射

 

并不是每一个内部错误码都能明确映射到一个有意义的SQLSTATE,对于这一类内部错误码,统统都映射到HY000这个SQLSTATE上去,意思就是:我也不知道咱们这个错误码对应哪个SQLSTATE好,就这么凑合着吧。例如:Error: 1004 SQLSTATE: HY000 (ER_CANT_CREATE_FILE)

 关于SQLSTATE的格式,还有很多讲究,详细参考这篇文档,比较清晰:https://mariadb.com/kb/en/sql-99/sqlstate-codes/  


4. 数据库中如何实现SQLSTATE

可以创建一个Map,将错误码映射到SQLSTATE即可。如果错误码的规划设计正好是从0~N,或者0~-N,那么可以直接用数组来实现这个映射,错误码即为数组的下标;更通用的方式,还是用数组,只不过查找方式是二分查找,也很方便。

MySQL中的实现,详见share/errmsg.txt和include/sql_state.h 。

 

5. OceanBase中如何实现SQLSTATE

参见lib/ob_errno.cpp

可以看到,与MySQL相比,OB还多了一个负担:把OceanBase内部错误码尽可能映射成MySQL内部错误码。啥时候别人写数据库的时候能把内部错误码映射成OceanBase的啊?

 

 

 

[转] 免费的编程中文书籍索引


免费的编程中文书籍索引

来源:http://www.v2ex.com/t/143671
我在github上fork了一个分支:https://github.com/raywill/free-programming-books-zh_CN

OceanBase0.5中RPC的层次

在OceanBase0.5开源版本中,RPC其实是有一个层次的。自底向上,分别是:
Network Framework — libeasy,负责底层网络框架,packet级别
Client Manager — 负责跟libeasy交互,封装了回调逻辑、异步/同步逻辑
Rpc Stub — 封装了请求的序列化、反序列化逻辑,是应用代码与网络代码的粘合剂

应用代码直接使用Rpc Stub来使用网络最方便,跟调用本地函数区别不大。不需要关心序列化、反序列化过程中的内存问题。但是,应用层如果希望获得一些更为复杂的网络交互逻辑时Rpc Stub则不能提供。比如,希望在A函数post一个请求,然后希望在B函数里wait这个请求的返回值,rpc stub无能为力。

应用代码也可以直接用Client Manager,可以获得很大的灵活性。上一个例子中Rpc Stub搞不定的情况,Client Manager可以搞定。但是直接使用Client Manager会增加一些代码复杂度,例如:需要自己分配DataBuffer,如果追求高性能,还需要自己管理Thread Specific Buffer。

当业务逻辑的对网络需求的复杂度超过Client Manager能力范围时,可以直接用libeasy来解决问题。这是终极方案。在0.5中的SQL模块里用到了该方法,但使用经验证明这种方法可维护性很差,必须对其进行一定的封装。

需要传递哪些参数到远端的自问自答

思考是技术进步的阶梯

A向B机器发送一个plan执行的时候,随着plan本身还需要发送哪些结构?

分析:

OB0.5开源版中发送了SimpleScanParam,但这个参数并不是单独发送的,而是包装在了一个ObHuskTabletScan运算符中,在CS端根据运算符中的参数重新构造子Plan。

答案:

只需要发送plan本身即可。其余要发送的内容都应该封装到operator内部。

进一步发问:

operator内部要封装什么呢?

答案:

比如,读数据超时时间。在运行时用户可以通过命令修改读超时时间,需要将新的时间让plan知晓,以便序列化到B端。
再比如,读数据的版本号。随着时间流逝plan被反复执行,plan需要携带的版本号应该要随时间变化。
这些内容的变化,都应该封装到operator内部。具体做法可以是设置一个IParamProvider()给operator,operator可以随时通过IParamProvider获得最新的数据。IParamProvider的实现比较简单,它持有整个SQL Plan运行时环境的引用,可以随时从中获得最新的参数提供给operator。

这个细节不需要scheduler关心。

结论:

  1. 需要发送plan到B端,而不是自己裸发operator tree到远端。因为plan里面提供了一套遍历op tree(序列化)、分配operator(反序列化)的机制。相当于是一个query的管理器。
  2. 发送到B端的plan并不是一个全功能的plan,有精简的空间。
  3. plan之外并不需要传额外的东西到B端。

NoSQL贝

《Distributed Algorithms in NoSQL Databases》

本文英文原文发表于知名技术博客《Highly Scalable Blog》,对NoSQL数据库的分布式算法和思想进行详细的讲解。

中文版:http://blog.nosqlfan.com/html/4139.html

英文原版:http://highlyscalable.wordpress.com/2012/09/18/distributed-algorithms-in-nosql-databases/

 

 国内关注分布式系统的同学的博客集合:

淘宝褚霸:http://blog.yufeng.info/

专注: 高性能,容错, 分布式服务器的研究和实现;信仰: 简单就是美;背景: 14年c开发经验, 12年网络开发经验, 3年Linux内核开发;提供服务器架构、诊断、优化咨询服务

xlq的博客: http://blog.xiuwz.com/

80后,百度高工,专业码农,做过网站,当过讲师。专注互联网,热爱开源技术,痴迷PHP、Nginx、MYSQL、REDIS、HADOOP等开源技术,略懂WEB框架、前端优化、WEB安全、LAMP架构、数据挖掘。偏居北京五环外郊区,每日茫茫为生计而奔波。

 

好书推荐《OceanBase设计与实现》

这是我的旺旺签名档,本意调侃恶搞,却引来不少同学私下询问:“哪里可以下载《OceanBase设计与实现》?”,我只能无奈的说:”oceanbase/src/”,注意,不是”oceanbase/doc/”。

旺旺签名档轮播
旺旺签名档轮播

为什么要一直等到别人去做呢?也许,我该做些什么。

OceanBase一定会是一个非常优秀的数据库设计,分享其中的设计思想,设计原理,使用经验,善莫大焉。

目前,我并没有总揽OceanBase全局,但是,今天不去尝试,什么时候去呢?

so,do it,here on my own place。