use docsify

This commit is contained in:
songpengwei 2022-06-02 23:22:04 +08:00
parent c7712e970a
commit 853784218e
14 changed files with 72 additions and 3 deletions

0
.nojekyll Normal file
View File

View File

@ -5,10 +5,11 @@ DDIA 读书分享会,会逐章进行分享,结合我在工业界分布式存
读书会安排和往期录屏: [https://docs.qq.com/sheet/DWHFzdk5lUWx4UWJq](https://docs.qq.com/sheet/DWHFzdk5lUWx4UWJq)
# 《DDIA 逐章精读》小册
在理解英文原文的基础上,结合我的一些工作经验,进行一些相应扩展,并参考 [github 上 Vonng 的中文翻译版](https://github.com/Vonng/ddia),对每一章用中文重新组织,作为每次分享的文字稿,在此集结为 gitbook 小册,希望可以对有需要的同学有所帮助,水平所限,难免疏漏,如发现有任何有误之处,欢迎[提 issue](https://github.com/DistSysCorp/ddia/issues/new) 和 [PR](https://github.com/DistSysCorp/ddia/compare)。
在理解英文原文的基础上,结合我的一些工作经验,进行一些相应扩展,并参考 [github 上 Vonng 的中文翻译版](https://github.com/Vonng/ddia),对每一章用中文重新组织,作为每次分享的文字稿,在此集结为一本开源小册,希望可以对有需要的同学有所帮助,水平所限,难免疏漏,如发现有任何有误之处,欢迎[提 issue](https://github.com/DistSysCorp/ddia/issues/new) 和 [PR](https://github.com/DistSysCorp/ddia/compare)。
## 目录
### [](preface.md)
### 第一部分:数据系统基础
* [第一章:可靠、可扩展、可维护](ch01.md) [[视频](https://www.bilibili.com/video/BV1bY411L7HA)]

11
_sidebar.md Normal file
View File

@ -0,0 +1,11 @@
### 第一部分:数据系统基础
* [第一章:可靠、可扩展、可维护](ch01.md)
* [第二章:数据模型和查询语言](ch02.md)
* [第三章:存储与查询](ch03.md)
* [第四章:编码和演进](ch04.md)
### 第二部分:分布式数据
* [第五章:冗余](ch05.md)
* [第六章:分区](ch06.md)

View File

@ -42,7 +42,7 @@
因此,有必要从根本上思考下如何评价一个好数据系统,如何构建一个好的数据系统,有哪些可以遵循的设计模式?有哪些通常需要考虑的方面?
书中用了三个词来回答:***可靠性Reliability、可伸缩性Scalability、可维护性Maintainability***
书中用了三个词来回答:**可靠性Reliability、可伸缩性Scalability、可维护性Maintainability**
# 可靠性

28
index.html Normal file
View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DDIA 逐章精读</title>
<meta name="keywords" content="设计数据密集型应用 DDIA 数据库"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="在理解英文原文的基础上,结合我的一些工作经验,进行一些相应扩展,并参考 github 上 Vonng 的中文翻译版,对每一章用中文重新组织,作为每次分享的文字稿,在此集结为一本开源小册,希望可以对有需要的同学有所帮助,水平所限,难免疏漏,如发现有任何有误之处,欢迎提 issue 和 PR。">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="js/vue.css" title="vue"/>
</head>
<body>
<div id="app"></div>
<script>
window.$docsify = {
name: '《DDIA 逐章精读》',
repo: 'https://github.com/DistSysCorp/ddia',
loadSidebar: true,
subMaxLevel: 2,
themeColor: '#77AAC2',
auto2top: true
}
</script>
<script src="js/docsify.min.js"></script>
<script src="js/search.min.js"></script>
</body>
</html>

1
js/docsify-katex.js Normal file

File diff suppressed because one or more lines are too long

1
js/docsify.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/katex.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
js/prism-bash.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/prism-sql.min.js vendored Normal file
View File

@ -0,0 +1 @@
Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};

1
js/prism-yaml.min.js vendored Normal file
View File

@ -0,0 +1 @@
!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*".replace(/<PLAIN>/g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<<prop>>/g,(function(){return t})).replace(/<<value>>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<<prop>>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\\s*:\\s)".replace(/<<prop>>/g,(function(){return t})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);

1
js/search.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/vue.css Normal file

File diff suppressed because one or more lines are too long

21
preface.md Normal file
View File

@ -0,0 +1,21 @@
# 序
早就在知乎上听人推荐过这本书,之前偶尔翻过第二部分 Replication 和 Partition 两章,感觉讲的还不错,但对于做分布式存储和数据库人员来说,稍微有点泛泛而谈。初次见面,只觉其好而不神。
今年2022建了一个分布式系统和数据库爱好者的微信群如果不组织大家做点什么微信群迟早沦为僵尸群“好”一点的可能变成吹水群但这显然不是我的初衷。念念不忘必有回响心里又掠过了这本书更兼在北美华人群里见过本书被分享过还挺受欢迎。一拍大腿就是他了组织大家一块过一遍 DDIA 把,于是有了这个读书会。
一精读,便不可收拾。这才发现了此书之妙:数据系统方方面面,知识线索极为庞杂,本书却能以极为合理的脉络将其勾连在一起,形成环环相扣的知识体系。至于泛泛而谈?自然是真真香:这本就是框架式书籍,更何况,每章附录列出参考引用、论文列表,都是非常经典的深入阅读材料。
那么它的组织妙在何处?
现在20220425刚精读到第五章仅以现在认识来简单聊聊我的看法。
第一,全书分三个部分。分别是单机,多机,衍生。从单机开始聊数据系统,可以摒除分布式庞杂理论的影响,专注在数据系统本身相关理论;到第二个部分放开单机限制,着重讲将数据系统扩展到多机所面临的问题和一般解决方案;最后一部分笔锋一转,着眼数据处理,以数据系统视角看,无非是一个数据集的变换,也即数据的派生。三个部分,层层递进,相互正交。这种行文思路,正是大型工业代码组织思路:将复杂度拆解到几个正交、但又相互连结的模块,从而使每个部分都相对内聚而简洁。
第二,具体到第一部分,开篇就给了三个总纲式的“心法”:可靠性、可伸缩性、可维护性。然后,从上到下,由离用户最近的数据模型(比如关系模型)和查询语言(比如 SQL到稍微底层一点的存储引擎比如 B+ tree 和 lsm tree和查询引擎再到最底层的编码数据结构的降维和演化层层下探令人拍案叫绝。我之前工作和兴趣之余所接触到的零碎知识至此百川入海万法归一。
第三,具体到每一章,也是节节递进,读起来无比丝滑。比如第三章,在讲存储引擎时,从一个仅由两个 shell 函数组成的“kv 引擎” 起到一个简单的日志结构的存储Bitcask再到经典的 LSM-Tree。这又是工程中惯用思路从一个最小可用原型开始不断增加需求、解决瓶颈最终得到一个工业可用的存储引擎。
我们如何认识世界?不断归纳然后演绎。我们如何处理复杂度?不断拆解然后勾连。将汪洋恣肆的复杂度合理疏导,渐次递进,本书无愧神书!
> 如果你也对此书感兴趣但苦于无人交流欢迎参加我们的读书会https://docs.qq.com/sheet/DWHFzdk5lUWx4UWJq?tab=BB08J2 。里面有往期分享录屏、进群方式和之后安排,共勉~