数据库分布式事务
解决数据库内部多个数据节点写入时的原子性问题
BigTable
学习资料:理解BigTable | Hexo
一个分布式 多维 映射 表
三级索引row_key,column_key,timestamp查询
row_key: 倒排(com.google.www)字符串,按照字典序排序
column: 有列族的概念,族名必须有意义,是访问控制的基本单元
time: 保存数据版本
一个整表分成tablets(子表)
Chubby作用:1. 选定master server,获取独占锁 2.发现活跃的子表服务器 获取子表位置
主服务器作用:1. 了解子表分配情况,监控 2. 扫描metadata table发现未分配的子表,将其分配到子表服务器 3. 负载均衡
子表的物理形态:SSTable
SSTable是专门为Bigtable设计的存储格式
子表服务器(一个server大概存100个子表)
一个子表对应多个SSTable
查询体系
BigTable基本架构:
子服务器知道对应子表的sstables,通过索引找到它(在GFS)里,通过GFS找到数据。
Percolator
分库分表水平切分,解决可扩展性
跨行事务:在单个事务中操作多行
增加了一个全局时钟TSO和全局锁
事务流程:(加强版2PC)
在bigtable列概念上增加两个列:lock(存储事务过程中的锁信息), write(存储最近一次提交的版本号)
大体流程就是
pre-write阶段,事务内确定一个primary写操作,其他的都是secondary。先要执行primary写操作,然后把primary lock锁定主操作行,然后再去异步执行次操作。在此操作的lock列添加主操作行及列名。
commit阶段,先要去提交主操作,即在主操作行的write列加上最新timestamp。然后抹去lock,之后异步地把其他此操作给提交,抹去lock。
转账流程很好理解漫谈Google Percolator分布式事务-CSDN博客
快照隔离级别:
区别于传统关系型数据,percolator是快照隔离级别。
优点:
对于读操作:能够保证不会幻读(即读到多一行数据,结果集不同)
对于写操作:能够保证在多个事务并发的时候,不会有多余一个事务提交成功。
实现:保证所有commit_ts的时间要早于之前所有start_ts和commit_ts。
MVCC
为了提高并发性能,处理读写冲突,目的是不加锁,非阻塞并发读。
当前读:select lock in share mode, select for update, update, insert,delete。这些操作都会加锁
快照读:不加锁,非阻塞读
MVCC是行锁的变种,避免了加锁操作,但是基于多版本,意思是可能读到的是历史版本。
InnoDB 的MVCC如何工作:
核心是返回查询结果的两个条件:
1. 事务开始前已经存在,或自己插入。
2. 事务读取行在开始之前未删除。