jesonouyang commited on
Commit
17424d4
·
1 Parent(s): dde05a6

数据一致性

Browse files
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ .gitignore
2
+ .idea
3
+ site
Dockerfile ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9.0-alpine
2
+
3
+ RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
4
+ RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mkdocs-material==9.0.13
5
+
6
+ WORKDIR /app
7
+
8
+ COPY docs /app/build
9
+ COPY mkdocs.yml /app/mkdocs.yml
10
+
11
+ RUN mkdocs build
12
+
13
+ EXPOSE 8000
14
+
15
+ CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]
docs/index.md ADDED
@@ -0,0 +1 @@
 
 
1
+ # README
docs//346/225/260/346/215/256/344/270/200/350/207/264/346/200/247/index.assets//344/270/200/350/207/264/346/200/247/346/250/241/345/236/213.jpeg ADDED
docs/数据一致性/index.md ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 数据一致性
2
+
3
+ 数据一致性通常指关联数据之间的逻辑关系是否正确和完整,而数据存储的一致性模型则可以认为是存储系统和数据使用者之间的一种约定,如果使用者遵循这种约定,则可以得到系统所承诺的访问结果[[1]](https://cn.pingcap.com/article/post/5950.html)。
4
+
5
+ 数据一致性分为`多副本数据一致性`和`分布式事务数据一致性`。
6
+
7
+ 系统中可能会面临下面的问题(导致数据不一致):
8
+
9
+ 1. 程序依托的操作系统层、硬件层可能会随时失效(包括正在执行写操作的过程中)。
10
+ 2. 应用程序可能随时崩溃(包括一系列操作执行到中间某一步)。
11
+ 3. 网络中断可能随时会发生,它会切断客户端与服务端的链接或数据库之间的链接。
12
+ 4. 多个客户端可能会同时访问服务端,并且更新同一批数据,导致数据互相覆盖。
13
+ 5. 客户端可能会读到一些无意义的、部分更新的数据数据(某些操作执行到一半被中止导致的)。
14
+
15
+ ## 多副本数据一致性
16
+
17
+ 多副本下不同节点之间的数据内容是一样的。
18
+
19
+ 每个保存系统完整数据集的节点称之为`副本`。
20
+
21
+ ### 主从复制
22
+
23
+ #### 同步复制
24
+
25
+ 主节点写入后还需要等待所有从节点完成写入,并且最新的写入对所有用户可见。
26
+
27
+ #### 异步复制
28
+
29
+ 在主节点写入完成后,异步复制到从节点。(一般复制到从节点是非常快的)
30
+
31
+ #### 半同步复制
32
+
33
+ 在数据库中有时会设置一个从节点(从节点数大于 1)复制策略为`同步`。
34
+
35
+ #### 复制日志的实现
36
+
37
+ 1. 基于语句的复制
38
+ 2. 基于预写日志(WAL)的复制
39
+ 3. 基于行的逻辑日志复制
40
+ 4. 基于触发器的复制
41
+
42
+ ### 多主节点复制
43
+
44
+ 适用于多数据中心场景。
45
+
46
+ 需要考虑写冲突 (场景类似协同编辑文档时,可能会产生冲突,服务很难自动处理)
47
+
48
+ ### 无主节点复制
49
+
50
+ #### quorum
51
+
52
+ 一种抽屉原理的应用,w(写请求写入节点数) + r(读请求读取节点数) > n(节点总数)
53
+
54
+
55
+
56
+ ## 分布式事务数据一致性
57
+
58
+ ~~分布式事务下不同节点之间的数据内容是不一样的。~~
59
+
60
+ ### 事务
61
+
62
+ 事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑操作单元,即事务中的所有读写是一个执行的整体,整个事务要么成功(提交),要么失败(中止或回滚)。如果失败,应用程序可以安全地重试[[2]]()。
63
+
64
+ ### ACID
65
+
66
+ 1. 原子性 (Atomicity):是系统中不可分解为更小粒度的东西,它只能处于操作之前后操作之后的状态,没有中间状态,在操作失败时可以安全地重试。
67
+ 2. 一致性 (Consistency):系统处于应用程序所期待的`预期状态`。
68
+ 3. 隔离性 (Isolation):系统中同时运行的多个事务相互隔离,互不干扰。
69
+ 4. 持久性 (Durability):成功完成的事务的更改将持久保存,即使系统崩溃也不会丢失。
70
+
71
+ #### 隔离级别
72
+
73
+ 如数据库中的读-提交、快照隔离(或可重复读)、可串行化等
74
+
75
+ ### 单节点事务
76
+
77
+ 在单节点上运行的事务,不需要与其他节点交互,也就不会出现部分节点失败导致的操作分割,我们只需要考虑当前节点整体失败导致的操作分割即可。对于单节点事务,一般是在存储引擎上,通过 `Undo Log`、`Redo Log` 和 `Commit 记录` 来实现[[3]]()。(注:此处提到的存储引擎是 MySQL 的 InnoDB)
78
+
79
+ ### 多节点事务
80
+
81
+ 对于多节点上运行的事务(分布式事务)来说,除了当前节点整体失败导致的操作分割之外,还存在部分节点失败导致的操作分割。我们知道当前节点整体失败导致的操作分割,可以按单节点事务来处理,而对于部分节点失败导致的操作分割,一个常见的思路是通过两阶段提交( 2PC )来解决[[3]]()。
82
+
83
+ #### 两阶段提交(2PC)
84
+
85
+ 2PC 引入了单节点事务所没有的一个新组件:协调者(也称事务管理器)[[4]]()。
86
+
87
+ - 选择一个协调者,这个协调者可以是分布式事务的参与节点,也可以是一个单独的进程。
88
+ - 阶段 1
89
+ - 协调者发送事务请求(Prepare)到所有的参与节点,并询问它们是否可以提交。
90
+ - 如果所有的参与节点都回复`是`,那么接下来协调者在阶段 2 发出提交(Commit)请求。
91
+ - 如果任何的参与节点都回复`否`,那么接下来协调者在阶段 2 发出放弃(Rollback)请求。
92
+ - 阶段 2
93
+ - 依据阶段 1 返回的结果,决定事务最终是提交(Commit)还是放弃(Rollback)。
94
+
95
+ ##### 协调者发生故障
96
+
97
+ 在协调者发生故障前,如果参与者在第一阶段成功响应,那么将一直等待协调者的提交或放弃请求
98
+
99
+ #### 三阶段提交(3PC)
100
+
101
+ 在 2PC 两个阶段之间插入了一个阶段,增加了一个相互协商的过程。
102
+
103
+ 加入了超时机制避免阻塞(参与者一直等待)。
104
+
105
+ 通常,非阻塞原子提交依赖于一个完美的故障检测器,即有一个非常可靠的机制可以判断出节点是否已经崩溃。在无限延迟的网络环境中,超时机制并不是可靠的故障检测器,因为即使节点正常,请求也可能由于网络问题而最终超时[[10]]()。
106
+
107
+ #### TCC(Try-Confirm-Cancel)
108
+
109
+ TCC 本质上是一个业务层面上的 2PC,他要求业务在使用 TCC 模式时必须实现三个接口`Try()`、`Confirm()`和`Cancel()`[[5]](https://juejin.cn/post/7017333689109446670)
110
+
111
+ #### XA
112
+
113
+ 是异构环境下实施两阶段提交的一个工业标准[[6]]()
114
+
115
+ #### SAGA、本地消息表、事务消息
116
+
117
+ [[7]聊一下分布式事务](https://albenw.github.io/posts/425b6837/)
118
+
119
+ ## 事务管理器
120
+
121
+ go 跨语言分布式事务管理器 [dtm](https://github.com/dtm-labs/dtm/blob/main/helper/README-cn.md)
122
+
123
+ - 支持多种事务模式:SAGA、TCC、XA
124
+ - 支持消息最终一致性:二阶段消息,比本地消息表更优雅的方案
125
+
126
+ dtm 示例 https://github.com/dtm-labs/dtm-examples/blob/main/doc/README-cn.md
127
+
128
+ ## 数据一致性基础理论
129
+
130
+ ### CAP
131
+
132
+ 在分布式系统中共享数据时,无法同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三个特性
133
+
134
+ - 一致性(Consistency):在分布式系统中的所有节点中,对于任何操作的执行结果都是一致的。换句话说,系统中的所有节点都能够看到相同的数据状态。
135
+ - 可用性(Availability):系统必须对于每个请求都能够给出响应,即系统保持持续的可用性,不会因为节点故障或其他原因导致无法响应客户端请求。
136
+ - 分区容忍性(Partition tolerance):系统能够在网络分区的情况下继续正常运行。网络分区是指分布式系统中的节点之间出现通信故障,导致节点无法相互通信的情况。
137
+
138
+ 分区容忍性是分布式系统的必要属性,需要在`一致性`和`可用性`之间取舍
139
+
140
+ 1. `CP` 需要保证一致性,当节点判断分区发生后,需要拒绝服务
141
+ 2. `AP` 需要保证可用性,当节点判断分区发生后,返回当前节点上已有的数据值
142
+
143
+ ### BASE
144
+
145
+ BASE 是指基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventual Consistency)
146
+
147
+ 核心思想是即使无法做到强一致性(CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性。
148
+
149
+ - 基本可用(BA):读写操作尽可能的可用,但写操作在冲突的时候可能丢失结果,读操作可能读取到旧的值。
150
+ - 软状态(S):没有一致性的保证,允许系统存在中间状态,而该中间状态不会影响系统整体可用性,这里的中间状态就是 CAP 理论中的数据不一致。
151
+ - 最终一致性(E):如果系统运行正常且等待足够长的时间,系统最终将达成一致性的状态。
152
+
153
+ ## 一致性模型
154
+
155
+ ![一致性模型](index.assets/一致性模型.jpeg)
156
+
157
+ [[8]]()
158
+
159
+ 更具体的一致性模型介绍 https://es.cs.rptu.de/publications/datarsg/Senf13.pdf
160
+
161
+ ### 线性一致性
162
+
163
+ 强一致性也被叫做线性一致性、严格一致性
164
+
165
+ 比如主从复制架构中的同步复制
166
+
167
+ ### 顺序一致性
168
+
169
+ #### 单调读一致性
170
+
171
+ 用户总是从固定的同一副本执行读取(而不同的用户可以从不同的副本读取)[[9]]()
172
+
173
+ ### 因果一致性
174
+
175
+ 事件之间存在因果关系
176
+
177
+ #### 写后读一致性
178
+
179
+ 确保用户总能看到自己最近提交的更新。
180
+
181
+ “读你所写”一致性(读自己的写)也叫做写后读一致性、读写一致性
182
+
183
+ ## 案例
184
+
185
+ TODO
186
+
187
+
188
+
189
+ ## 参考
190
+
191
+ [[1]数据的一致性是什么?数据一致性解决方案概述](https://cn.pingcap.com/article/post/5950.html)
192
+
193
+ [[2]数据密集型应用系统设计-P211]()
194
+
195
+ [[3]极客时间-深入浅出分布式技术原理-第23节]()
196
+
197
+ [[4]数据密集型应用系统设计-P334]()
198
+
199
+ [[5]分布式事务-2PC与TCC](https://juejin.cn/post/7017333689109446670)
200
+
201
+ [[6]数据密集型应用系统设计-P334]()
202
+
203
+ [[7]聊一下分布式事务](https://albenw.github.io/posts/425b6837/)
204
+
205
+ [[8]大数据日知录-第二章]()
206
+
207
+ [[9]数据密集型应用设计- P158]()
208
+
209
+ [[10]数据密集型应用设计- P337]()
210
+
211
+ https://mp.weixin.qq.com/s/O9Z5e_BzdxKcULHigYMkRg
mkdocs.yml ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ site_name: Hello Arch
2
+ site_url: https://www.hello-algo.com/
3
+ site_author: Krahets
4
+ site_description: 天天学习 好好向上
5
+ # Repository
6
+ repo_name: jesonouyang/hello-arch
7
+ repo_url:
8
+ edit_uri:
9
+ version:
10
+
11
+ # Copyright
12
+ copyright: Copyright © 2023 jesonouyang
13
+
14
+ # Configuration
15
+ theme:
16
+ name: material
17
+ language: zh
18
+ features:
19
+ # - announce.dismiss
20
+ - content.action.edit
21
+ # - content.action.view
22
+ - content.code.annotate
23
+ - content.code.copy
24
+ - content.tabs.link
25
+ - content.tooltips
26
+ # - header.autohide
27
+ # - navigation.expand
28
+ - navigation.indexes
29
+ - navigation.instant
30
+ # - navigation.prune
31
+ # - navigation.sections
32
+ # - navigation.tabs
33
+ # - navigation.tabs.sticky
34
+ - navigation.top
35
+ - navigation.footer
36
+ - navigation.tracking
37
+ - search.highlight
38
+ - search.share
39
+ - search.suggest
40
+ - toc.follow
41
+ # - toc.integrate
42
+ palette:
43
+ - scheme: default
44
+ primary: white
45
+ # accent: indigo
46
+ toggle:
47
+ icon: material/theme-light-dark
48
+ name: Switch to dark mode
49
+ - scheme: slate
50
+ primary: grey
51
+ # accent: indigo
52
+ toggle:
53
+ icon: material/theme-light-dark
54
+ name: Switch to light mode
55
+ font:
56
+ text: Noto Sans SC
57
+ code: Fira Code
58
+ favicon: assets/images/favicon.png
59
+ logo: assets/images/logo.png
60
+ icon:
61
+ logo: logo
62
+ repo: fontawesome/brands/github
63
+ edit: material/file-edit-outline
64
+
65
+ extra:
66
+ social:
67
+ - icon: fontawesome/brands/github
68
+ link: https://github.com/1005281342
69
+
70
+ # generator: false
71
+ status:
72
+ new: 最近添加
73
+
74
+ # Plugins
75
+ plugins:
76
+ - search
77
+ - glightbox:
78
+ touchNavigation: true
79
+ loop: false
80
+ effect: zoom
81
+ slide_effect: none
82
+ width: 100%
83
+ height: auto
84
+ zoomable: true
85
+ draggable: false
86
+ auto_caption: false
87
+ caption_position: bottom
88
+
89
+ # Extensions
90
+ markdown_extensions:
91
+ - abbr
92
+ - admonition
93
+ - attr_list
94
+ - def_list
95
+ - footnotes
96
+ - md_in_html
97
+ - toc:
98
+ permalink: true
99
+ - pymdownx.arithmatex:
100
+ generic: true
101
+ - pymdownx.betterem:
102
+ smart_enable: all
103
+ - pymdownx.caret
104
+ - pymdownx.details
105
+ # - pymdownx.emoji:
106
+ # emoji_index: !!python/name:materialx.emoji.twemoji
107
+ # emoji_generator: !!python/name:materialx.emoji.to_svg
108
+ - pymdownx.highlight:
109
+ anchor_linenums: true
110
+ - pymdownx.inlinehilite
111
+ - pymdownx.snippets
112
+ - pymdownx.superfences
113
+ - pymdownx.keys
114
+ # - pymdownx.magiclink:
115
+ # repo_url_shorthand: true
116
+ # user: squidfunk
117
+ # repo: mkdocs-material
118
+ - pymdownx.mark
119
+ - pymdownx.smartsymbols
120
+ - pymdownx.tabbed:
121
+ alternate_style: true
122
+ - pymdownx.tasklist:
123
+ custom_checkbox: true
124
+ - pymdownx.tilde
125
+
126
+ extra_javascript:
127
+ - javascripts/mathjax.js
128
+ - https://polyfill.io/v3/polyfill.min.js?features=es6
129
+ - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
130
+ # - javascripts/katex.js
131
+ # - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.js
132
+ # - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/contrib/auto-render.min.js
133
+
134
+ extra_css:
135
+ - stylesheets/extra.css
136
+ # - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.css
137
+
138
+ # Page tree
139
+ nav:
140
+ - 数据一致性:
141
+ # [icon: material/book-open-outline]
142
+ - 数据一致性/index.md