前几日送闺女上学,人送进去了,水杯被我提走了,大半天才发现。
今天送闺女上学,提前帮她拿出市民卡,人送了进去,结果闺女说这里面没有卡。一看,还真是空的。幸亏保安叔叔眼镜尖,卡掉在门外了 =.=
前几日送闺女上学,人送进去了,水杯被我提走了,大半天才发现。
今天送闺女上学,提前帮她拿出市民卡,人送了进去,结果闺女说这里面没有卡。一看,还真是空的。幸亏保安叔叔眼镜尖,卡掉在门外了 =.=
目标:
————–
– 普及基础理论,培养读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房价分析对我很有启发:通过数据分析,我们可以洞悉到事情的真实面目。
面对纷繁复杂的社会舆论,选择会盲从,因为不知道谁说的是真,谁说的是假,最终的决策是被情绪左右。
但是,数据(大部分时候)是客观的。
通过原始数据,很难看出背后的模式,但通过对原始数据进行加工和分析,就能看出很多规律。
对于短线操作,数据分析可能会有较大偏差,但长线来看,数据分析一定可以深刻地描述现实规律。
懂得了规律,投资行为、迁移行为就有了客观数据支持。
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的啊?
很久以前整理的,一直在更新。
github地址: https://github.com/justjavac/free-programming-books-zh_CN
来源:http://www.v2ex.com/t/143671
我在github上fork了一个分支:https://github.com/raywill/free-programming-books-zh_CN
在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关心。
结论:
《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/src/”,注意,不是”oceanbase/doc/”。
为什么要一直等到别人去做呢?也许,我该做些什么。
OceanBase一定会是一个非常优秀的数据库设计,分享其中的设计思想,设计原理,使用经验,善莫大焉。
目前,我并没有总揽OceanBase全局,但是,今天不去尝试,什么时候去呢?
so,do it,here on my own place。