MYSQL-分布式

1,351 阅读3分钟

分布式架构

分布式数据库本身分为计算层、元数据层和存储层。

  • 计算层就是之前单机数据库中的 SQL 层,用来对数据访问进行权限检查、路由访问,以及对计算结果等操作。

  • 元数据层记录了分布式数据库集群下有多少个存储节点,对应 IP、端口等元数据信息是多少。当分布式数据库的计算层启动时,会先访问元数据层,获取所有集群信息,才能正确进行 SQL 的解析和路由等工作。另外,因为元数据信息存放在元数据层,那么分布式数据库的计算层可以有多个,用于实现性能的扩展。

  • 存储层用来存放数据,但存储层要和计算层在同一台服务器上,甚至不求在同一个进程中。

数据分片

首先选出分片键, 选择分片算法,比较常见的有RANGE和HASH。一般比较推荐HASH, RANGE是一个比较糟糕的算法。因为数据还是比较集中。选择一个适合的分片键和分片算法,把数据打散,并且业务的绝大部分查询都是根据分片键进行访问。

索引

用有序的全局唯一替代自增,是这个时代数据库主键的主流设计标准。

当查询条件不是分片键时,需要查询所有分片才能查出数据。此时可以添加索引表,进行类似二级索引的回表实现。虽然存储上较冗余全表容量小了很多,但是要根据另一个分片键进行数据的存储,依然显得不够优雅。

最优的设计,不是创建一个索引表,而是将分片键的信息保存在想要查询的列中,这样通过查询的列就能直接知道所在的分片信息。这样的实现方式较冗余表和索引表的设计来说,效率更高,查询可以提前知道数据对应的分片信息,只需 1 次查询就能获取想要的结果。这样实现的缺点是,主键值会变大一些,存储也会相应变大。

全链路的条带化设计

条带化是存储的一种技术,将磁盘进行条带化后,可以把连续的数据分割成相同大小的数据块,简单的说,条带化就是把每段数据分别写入阵列中不同磁盘上的方法。

分布式事务

2PC分布式事务

2PC 是数据库层面实现分布式事务的一种强一致性实现。在 2PC 中,引入事务协调者的角色用于协调管理各参与者(也可称之为各本地资源)的提交和回滚。而 2PC 所谓的两阶段是指parepare(准备)阶段和 commit(提交)两个阶段。

2PC 的一个难点在于 prepare 都成功了,但是在进行第二阶段 commit 的时候,其中一个节点挂了。这时挂掉的那个节点在恢复后,或进行主从切换后,节点上之前执行成功的prepare 事务需要人为的接入处理,这个事务就称之为悬挂事务。

可以通过命令 XA_RECOVER 查看节点上事务有悬挂事务

XA_RECOVER;
SHOW ENGINE INNODB STATUS\G;
XA COMMIT 'a';

优点是使用简单,当前大部分的语言都支持 2PC 的实现。若使用中间件,业务完全就不用关心事务是不是分布式的。缺点是,事务的提交开销变大了,从 1 次 COMMIT 变成了两次 PREPARE 和COMMIT。而对于海量的互联网业务来说,2PC 的性能是无法接受。

柔性事务

框架有TCC, SAGA , SEATA, 也可以通过消息表实现。它们实现原理本身就是通过补偿机制,实现最终的一致性。