分析mysql acid 设计实现

32
分分 mysql acid 分分分分 blog- xiaorui.cc author- rfyiamcool

Upload: rfyiamcool

Post on 14-Apr-2017

138 views

Category:

Services


1 download

TRANSCRIPT

Page 1: 分析mysql acid 设计实现

分析 mysql acid 设计实现blog- xiaorui.cc

author- rfyiamcool

Page 2: 分析mysql acid 设计实现

innodb 基本结构innodb acid 概念innodb buffer pool

mvcc

各种延伸锁 , 各种锁

List

Page 3: 分析mysql acid 设计实现

innodb 的抽象结构tablespace

leaf node segment

no-leaf segment

rollback segment

extent

… page…

row row

row row

row row

trx idrollback ptr

field ptr…

segmentextent

pagerow

Page 4: 分析mysql acid 设计实现

b+tree 数据结构15| |56| | 77

15 | |30| | 45 … …

22 row20 row17 row16 row

[16, 17, 20, 22]

31 row35 row44 row32 row

[31, 32, 35, 44]

page

有序数组

Page 5: 分析mysql acid 设计实现

file system vs disk

disk - - - > 512 bytes

file system - - -> 4k

innodb engine - - - > 16k

Page 6: 分析mysql acid 设计实现

size 不同如何上下对齐 ?

partial page write ?

解决办法是 doublewrite buffer + doublewrite

doublewrite 性能影响 ? 5% - 10%

Page 7: 分析mysql acid 设计实现

dirty page

dirty pagedouble write buffer

(2m)

double write | double write 数据文件

redo log

crash recovery !!!

Page 8: 分析mysql acid 设计实现

what is acid

atomicity

consistency

isolation

durability

Page 9: 分析mysql acid 设计实现

atomicity

一个事务为一个原子 不可分割要么成功 要么失败

Page 10: 分析mysql acid 设计实现

consistency

经过一系列改动及异常崩溃,最后的结果是我要的 .

最终一致性强一致性

Page 11: 分析mysql acid 设计实现

isolationmvcc

隔离级别READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

Page 12: 分析mysql acid 设计实现

durability

一旦提交成功,那么事务涉及的数据都会持久化即使系统崩溃,修改的数据也不会丢失

Page 13: 分析mysql acid 设计实现

innodb buffer poolpage buffered

page buffered

page buffered

page buffered

page buffered

page bufferedold 37%

new 63%

新数据新数据新数据 新数据

Page 14: 分析mysql acid 设计实现

update where blog = ‘xiaorui.cc’

data in buffer pool

Load page to buffer pool

update data and mark dirty page !!!

yes !no !

Page 15: 分析mysql acid 设计实现

innodb buffer pool

lru

dirty page

free list

flush list

Page 16: 分析mysql acid 设计实现

一些概念总览redo

undo

checkpoint

purge

Page 17: 分析mysql acid 设计实现

if not checkpoint

写操作都是在 buffer pool 进行,每次提交都会顺序 io 增加 redo 日志 .

buffer pool 里面的 dirty page 越来越多 .

redo 越来越大 , 导致 recovery 时间过长 .

Page 18: 分析mysql acid 设计实现

if checkpoint

当 buffer pool 内存不够用时 , 将 dirty page 刷新到文件 .当 redo 文件过大又不可循环写入时 , 同上缩短 crash recovery 时间

Page 19: 分析mysql acid 设计实现

checkpoint + lsn待清理 Red

o Log

p1p2

p3

buffer poolflush list

创建 checkpointlsn: 1500 作为下一个点

p4

p5

刷新到磁盘 !last checkpoint :1000

顺序 :redo log == flush

list ?

Page 20: 分析mysql acid 设计实现

一个事务过程1. begin

2. undo log

3. udate where id = xxx;

4. redo buffer

5. redo fsync; binlog; commit

if crash ?

if crash ?

if crash ?

one of three happen crash ?

Page 21: 分析mysql acid 设计实现

redowhen redo save ?

when commit !

顺序 io

page number + block

when redo reduce ?

Ringbuffer full

flush timer run

Page 22: 分析mysql acid 设计实现

undo

随机 io

是否存入文件 , 取决于 buffer pool

Page 23: 分析mysql acid 设计实现

flush log rule

innodb_flush_log_at_trx_commit = 1

LogBuffer

FileSystemBuffer

Lb_logfile

innodb_flush_log_at_trx_commit = 0

innodb_flush_log_at_trx_commit = 2

write os cache

timer flush every 1s

Page 24: 分析mysql acid 设计实现

数据库并发处理的演变基于表的读写锁基于索引的读写锁 ( 分离锁 )mvcc

Page 25: 分析mysql acid 设计实现

mvcc

读读非阻塞读写非阻塞写写阻塞

一句话 , 并发的效果,串行的结果 !!!

Page 26: 分析mysql acid 设计实现

又是概念read view

隐藏字段是否可见的条件当前读快照读

Page 27: 分析mysql acid 设计实现

mvcc 流程图trx_id 10trx_id 15

| row| trx_id | rollback ptr | …

read view list

trx_idroll ptrdata

undo data

trx_idroll ptrdata…

undo dataread & write

trx_id in read view<= trx_id

Page 28: 分析mysql acid 设计实现

幻读record lock

gap lock

next gap lock

Page 29: 分析mysql acid 设计实现

业务数据不一致 事务 A 事务 Bts begin ts select stock where ticket=10ts begints update stock=stock-1ts committs select stock where ticket = 10ts update stock=stock-1ts commit

stock=1

stock=0

stock=-1

最后 -1

Page 30: 分析mysql acid 设计实现

互斥锁 vs 乐观锁互斥锁

select * from train where ticket = 10 for update;

乐观锁while 1:

update train set stock=stock-1 where ticket = 10 and stock = x;

Page 31: 分析mysql acid 设计实现

crash recovery

从 doublewrite 修正缺斤少两的 page

重做提交的 redo 日志回滚执行一半的 未提交的 事务

Page 32: 分析mysql acid 设计实现

“ Q & A”–fengyun rui