-
Notifications
You must be signed in to change notification settings - Fork 0
/
mysqlxi-lie-wu.html
298 lines (258 loc) · 19.7 KB
/
mysqlxi-lie-wu.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="CatsAction" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="DB, SQL, MySQL, MySQL, " />
<meta property="og:title" content="MySQL系列五 - 分布式事务"/>
<meta property="og:url" content="./mysqlxi-lie-wu.html" />
<meta property="og:description" content="前述 本篇标题是MySQL分布式事务,但MySQL分布式事务只是对相关理论的实现,所以会花很大篇幅介绍分布式相关理论、解决方案,最后再讲解MySQL对XA协议的实现。 分布式事务理论 什么是分布式事务呢? 分布式事务是很多网络主机参与的事务,支持事务的事务管理器,资源管理器位于不同的网络节点上。 CAP定理 所谓CAP定理,是指在一个分布式系统中,无法同时满足一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance),最多只能满足其中两个。下面解释下这三个分布式指标。 一致性(Consistence):对于分布式系统的任何节点做更新,其他节点应该同步更新,多个节点读取到的数据不应该存在差异。 可用性(Availability):可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作,请求总是能够在有限的时间内返回结果,如果超过了这个时间范围,那么系统就被认为是不可用的。“有限的时间内”是在系统的运行指标,不同系统会有差别。“返回结果”是可用性的另一个重要指标,它要求系统完成对用户请求的处理后,返回一个正常的响应结果,要明确的反映出对请求处理的成功或失败。 分区容错性(Partition Tolerance):当分布式系统各节点网络不可达成独立的部分时,每个独立部分就叫一个分区。分区容错性要求各节点不连通时,能独立的提供完整的功能 …" />
<meta property="og:site_name" content="CatsAction's blog" />
<meta property="og:article:author" content="CatsAction" />
<meta property="og:article:published_time" content="2019-08-15T00:00:00+08:00" />
<meta name="twitter:title" content="MySQL系列五 - 分布式事务">
<meta name="twitter:description" content="前述 本篇标题是MySQL分布式事务,但MySQL分布式事务只是对相关理论的实现,所以会花很大篇幅介绍分布式相关理论、解决方案,最后再讲解MySQL对XA协议的实现。 分布式事务理论 什么是分布式事务呢? 分布式事务是很多网络主机参与的事务,支持事务的事务管理器,资源管理器位于不同的网络节点上。 CAP定理 所谓CAP定理,是指在一个分布式系统中,无法同时满足一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance),最多只能满足其中两个。下面解释下这三个分布式指标。 一致性(Consistence):对于分布式系统的任何节点做更新,其他节点应该同步更新,多个节点读取到的数据不应该存在差异。 可用性(Availability):可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作,请求总是能够在有限的时间内返回结果,如果超过了这个时间范围,那么系统就被认为是不可用的。“有限的时间内”是在系统的运行指标,不同系统会有差别。“返回结果”是可用性的另一个重要指标,它要求系统完成对用户请求的处理后,返回一个正常的响应结果,要明确的反映出对请求处理的成功或失败。 分区容错性(Partition Tolerance):当分布式系统各节点网络不可达成独立的部分时,每个独立部分就叫一个分区。分区容错性要求各节点不连通时,能独立的提供完整的功能 …">
<title>MySQL系列五 - 分布式事务 ·
CatsAction's blog
</title>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="./theme/image/logo.ico" />
<link rel="stylesheet" type="text/css" href="./theme/css/elegant.prod.css" media="screen">
<link rel="stylesheet" type="text/css" href="./theme/css/custom.css" media="screen">
</head>
<body>
<div id="content">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="./"><span class=site-name>CatsAction's blog</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li >
<a href=
.
>Home</a>
</li>
<li ><a href="./categories.html">Categories</a></li>
<li ><a href="./tags.html">Tags</a></li>
<li ><a href="./archives.html">Archives</a></li>
<li><form class="navbar-search" action="./search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article itemscope>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1>
<a href="./mysqlxi-lie-wu.html">
MySQL系列五
<small class="subtitle">
分布式事务
</small>
</a>
</h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<h2>前述</h2>
<p>本篇标题是MySQL分布式事务,但MySQL分布式事务只是对相关理论的实现,所以会花很大篇幅介绍分布式相关理论、解决方案,最后再讲解MySQL对XA协议的实现。</p>
<h2>分布式事务理论</h2>
<p>什么是分布式事务呢?</p>
<p>分布式事务是很多网络主机参与的事务,支持事务的事务管理器,资源管理器位于不同的网络节点上。</p>
<h5>CAP定理</h5>
<p>所谓CAP定理,是指在一个分布式系统中,无法同时满足一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance),最多只能满足其中两个。下面解释下这三个分布式指标。</p>
<ul>
<li>
<p>一致性(Consistence):对于分布式系统的任何节点做更新,其他节点应该同步更新,多个节点读取到的数据不应该存在差异。</p>
</li>
<li>
<p>可用性(Availability):可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作,请求总是能够在有限的时间内返回结果,如果超过了这个时间范围,那么系统就被认为是不可用的。“有限的时间内”是在系统的运行指标,不同系统会有差别。“返回结果”是可用性的另一个重要指标,它要求系统完成对用户请求的处理后,返回一个正常的响应结果,要明确的反映出对请求处理的成功或失败。</p>
</li>
<li>
<p>分区容错性(Partition Tolerance):当分布式系统各节点网络不可达成独立的部分时,每个独立部分就叫一个分区。分区容错性要求各节点不连通时,能独立的提供完整的功能。因此要求每个分区有其他分区的数据复制。</p>
</li>
</ul>
<p>对于实际应用,分区容错性是需要保证的。提高分区容错性,要求将数据复制到多个节点。然后,数据复制到多个节点,就会存在数据一致性问题。如果强制写同步,就会造成客户端请求阻塞时间变长,可能导致有限时间不能返回结果,从而影响可用性。</p>
<p>综上,CAP是不可能同时满足的,实际应用都是CA和CP。当然,大部分生产环境,都更看中可用性,而弱化一致性。一致性可以通过消息通信、补偿等机制,达到最终一致便可。</p>
<h5>BASE定理</h5>
<p>正如上一小节所讲,实际应用大部分情况都是弱化一致性,达到最终一致性即可。最终一致性便是BASE定理,是CAP定理的延伸。下面看看BASE定理的三个指标。</p>
<ul>
<li>
<p>基本可用:指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、功能上的可用性)。</p>
</li>
<li>
<p>软状态:指允许分布式系统出现中间状态。如异步主从复制,允许数据同步的延时。</p>
</li>
<li>
<p>最终一致性:最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。</p>
</li>
</ul>
<p>以上内容参考<a href="https://yq.aliyun.com/articles/692238">CAP和BASE理论</a></p>
<h2>分布式事务实现方案</h2>
<h5>2PC方案</h5>
<p>2PC分两个阶段,第一阶段准备阶段,第二阶段提交和回滚。下面分别介绍下这两个阶段。</p>
<p>1)准备阶段</p>
<p>在准备阶段,事务管理器(下面称协调者)向所有资源管理器(下面称参与者)下发prepare指令,参与者收到指令后,锁定所需要的资源,并把undo和redo写入日志。</p>
<p>2)提交或回滚阶段</p>
<p>如果第一阶段所有参与者都像协调者确认成功,那么协调者会向所有参与者发送commit指定,事务提交。否则,只要第一个阶段有一个参与者没有确认成功,就发送rollback指令,事务回滚。</p>
<p>由于2PC没有超市机制,在准备阶段,如果其中一台参与者宕机,就会造成协调者一直阻塞等待,影响并发性能。而且并发性能,又性能最低的参与者决定。</p>
<h5>3PC方案</h5>
<p>3PC(三阶段协议方案)是对2PC的改进。它分CanCommit,PreCommit,DoCommit三个阶段。</p>
<p>1)CanCommit</p>
<p>协调者向所有参与者询问是否可以进行事务提交。</p>
<p>2)PreCommit</p>
<p>如果第一阶段所有参与者都能进行事务提交,协调者下发PreCommit指令。协调者锁定资源,等待下一步指令。如果第一阶段有一个或以上参与者不能进行事务提交,下达中断指令。</p>
<p>3)DoCommit</p>
<p>如果第二阶段所有参与者都确认成功,下达Docommit指令,事务提交。否则下达事务回滚指令。</p>
<p>三阶段提交对比两阶段,引入超时机制减少事务阻塞,解决单点故障。在第三阶段,一旦参与者无法接受到协调者信号时,等待超时之后,参与者默认执行 commit,释放资源。</p>
<p>三阶段任然不能解决数据一致性问题。若协调者发出回滚命令,但是由于网络问题,参与者在等待时间内都无法接收到,这时参与者默认提交事务,而其他事务进行了回滚,造成事务不一致。</p>
<h5>TCC</h5>
<p>2PC和3PC都是数据资源库资源层的实现方案,TCC则是业务层面的实现方案,是对BASE定理的很好解决方案。</p>
<p>TCC是Try、Confirm和Cancel三个单词的首字母,它们相当于编程语言的异常机制。尝试执行某些语句,成功则提交,失败则做一些清除工作。下面介绍三个情况。</p>
<p>TCC实现的一个方案就是维护本地消息列表,对每个事务记录日志,定期扫描日志,对失败的事务重新提交或撤销,以保证所有参与者数据最终一致。</p>
<p><em>参考资料:<a href="https://www.php.cn/mysql-tutorials-413805.html">分布式事务的图文详解</a></em></p>
<h5>MQ事务消息</h5>
<p>很好的实现方案是阿里开源的RocketMQ,这里不再介绍,可以查看相关资料。</p>
<p><em>参考资料:<a href="https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html">分布式事务解决方案</a></em></p>
<h2>MySQL分布式事务的实现</h2>
<p>MySQL是资源管理器(参与者),因此它实现的是XA协议(2PC和3PC),MySQL有内部XA事务和外部XA事务。</p>
<h5>内部XA事务</h5>
<p>MySQL的各存储引擎是独立的,因此需要XA事务协调。对于二进制日志的操作,写需要XA事务。此时MySQL数据库服务器相当于协调者,而各存储引擎或二进制日志写线程作为参与者。</p>
<h5>外部XA事务</h5>
<p>这种情况MySQL作为一个完整的参与者组成分布式系统。MySQL对XA协议支持并不是很完整,因此更多的是通过其他解决方案,这里不再介绍。</p>
<h2>后述</h2>
<p>分布式系统的CAP问题,是计算机的难点问题。如何保证数据的一致性和可用性,更多的情况是采取弱一致性,基于本地消息补偿实现最终一致。阿里的RocketMQ也是一种很好的方案。</p>
<hr />
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="./mysqlxi-lie-si.html"
title="Previous: MySQL系列四 - 分区表和主从复制">MySQL系列四 <small class="subtitle">分区表和主从复制</small></a></li>
<li class="next-article"><a href="./redisxi-lie-yi.html"
title="Next: Redis系列一 - 概念和数据类型">Redis系列一 <small class="subtitle">概念和数据类型</small></a> »</li>
</ul>
</nav>
</aside>
</div>
<section id="article-sidebar" class="span2">
<h4>Published</h4>
<time itemprop="dateCreated" datetime="2019-08-15T00:00:00+08:00"> 8
15, 2019</time>
<!---->
<h4>Category</h4>
<a class="category-link"
href="./categories.html#mysql-ref">MySQL</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="./tags.html#db-ref">DB
<span>4</span>
</a></li>
<li><a href="./tags.html#mysql-ref">MySQL
<span>7</span>
</a></li>
<li><a href="./tags.html#sql-ref">SQL
<span>4</span>
</a></li>
</ul>
<h4>Stay in Touch</h4>
<div id="sidebar-social-link">
<a href="mailto:[email protected]" title="My Email Address" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="Mail" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#328cff"/><path d="m250 186c-46 0-69 35-69 74 0 44 29 72 68 72 43 0 73-32 73-75 0-44-34-71-72-71zm-1-37c30 0 57 13 77 33 0-22 35-22 35 1v150c-1 10 10 16 16 9 25-25 54-128-14-187-64-56-149-47-195-15-48 33-79 107-49 175 33 76 126 99 182 76 28-12 41 26 12 39-45 19-168 17-225-82-38-68-36-185 67-248 78-46 182-33 244 32 66 69 62 197-2 246-28 23-71 1-71-32v-11c-20 20-47 32-77 32-57 0-108-51-108-108 0-58 51-110 108-110" fill="#fff"/></svg>
</a>
<a href="https://github.com/boyaziqi" title="catsaction Github Repository" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#1B1817"/><path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"/></svg>
</a>
<a href="https://www.linkedin.com/feed/" title="My LinkedIn" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="LinkedIn" role="img" viewBox="0 0 512 512" fill="#fff"><rect width="512" height="512" rx="15%" fill="#0077b5"/><circle cx="142" cy="138" r="37"/><path stroke="#fff" stroke-width="66" d="M244 194v198M142 194v198"/><path d="M276 282c0-20 13-40 36-40 24 0 33 18 33 45v105h66V279c0-61-32-89-76-89-34 0-51 19-59 32"/></svg>
</a>
</div>
<h4>Friendship Links</h4>
<ul class="list-of-tags tags-in-article">
<li>
<a href="https://leetcode-cn.com/" title="力扣中国站点" target="_blank" rel="nofollow noopener noreferrer">
LeetCode
</a>
</li>
<li>
<a href="https://coolshell.cn/about" title="陈皓酷壳" target="_blank" rel="nofollow noopener noreferrer">
CoolShell
</a>
</li>
<li>
<a href="https://yikun.github.io/" title="姜毅坤博客" target="_blank" rel="nofollow noopener noreferrer">
Yikun
</a>
</li>
<li>
<a href="https://www.nowcoder.com/" title="牛客网" target="_blank" rel="nofollow noopener noreferrer">
牛客网
</a>
</li>
</ul>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div>
<span class="site-name">CatsAction's blog</span> - It's a wonderful world
</div>
<div id="fpowered">
Powered by: <a href="http://getpelican.com/" title="Pelican Home Page" target="_blank" rel="nofollow noopener noreferrer">Pelican</a>
Theme: <a href="https://elegant.oncrashreboot.com/" title="Theme Elegant Home Page" target="_blank" rel="nofollow noopener noreferrer">Elegant</a>
</div>
</footer> <script src="//code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script>
(function () {
if (window.location.hash.match(/^#comment-\d+$/)) {
$('#comment_thread').collapse('show');
}
})();
window.onhashchange=function(){
if (window.location.hash.match(/^#comment-\d+$/))
window.location.reload(true);
}
$('#comment_thread').on('shown', function () {
var link = document.getElementById('comment-accordion-toggle');
var old_innerHTML = link.innerHTML;
$(link).fadeOut(200, function() {
$(this).text('Click here to hide comments').fadeIn(200);
});
$('#comment_thread').on('hidden', function () {
$(link).fadeOut(200, function() {
$(this).text(old_innerHTML).fadeIn(200);
});
})
})
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : MIT -->
</html>