目录
首先需要确定MySQL的分布式架构,是读写分离架构、数据分片架构、多主复制架构还是集群复制架构。
1.读写分离架构
- 架构描述:将数据库分为读库和写库,读库处理查询操作,写库处理更新操作。通过中间件将请求路由到相应的库。
- 主键方案:通常使用数据库自增主键或UUID。数据库自增主键在写库上生成,然后通过复制机制同步到读库不会出现并发写入主键重复问题。其次根据MySQL底层索引是B+树结构,每个节点就是一页,每页大小为16Kb,每页中的数据是有序的,每层的节点也都是有序排列的,而UUID生成是无序,但是在B+索引树中是有序的,每次写入都有很大可能出现B+索引树裂变重构影响查询性能,所以推荐使用自增主键。
2.数据分片架构(Sharding)
- 架构描述:将数据水平划分为多个分片,每个分片存储数据的一个子集,并分布在不同的物理节点上。客户端通过中间件或计算层将查询请求路由到相应的分片。
- 主键方案:
- 分布式ID生成器:如雪花算法(Snowflake),可以生成唯一的、有序的分布式主键,适合按时间排序的场景。雪花算法本质上是通过算法生成一个二进制的64位长整型。它由四个部分组成分别是最高一位为0代表正数因为我们取号是需要正整数的。第二部分是41位的时间戳,单位是毫秒,可以表示大约69.7年。第三部分10位的机器码,可以表示1024个机器。最后一部分12位表示,在一毫秒之内一个机器能够产生4096个号。但是雪花算法是强依赖时间戳的,如果出现时钟回拨,就会出现取号重复问题。
- UUID:虽然UUID在全局范围内唯一,但由于其无序性和较长的长度(128位),会出现上面描述UUID的问题。
3.多主复制架构
- 架构描述:在多个节点上设置主节点,每个主节点都可以处理写操作,并将更改同步到其他主节点和从节点。
- 主键方案:通常使用数据库自增主键,但需要通过某种机制(如步长、偏移量)来避免主键冲突。如果有三个主节点,可以将步长设置为3,然后分别为每个主节点设置不同的偏移量(如1、2、3)。这样,第一个主节点将生成主键1、4、7等,第二个主节点生成2、5、8等,第三个主节点生成3、6、9等。这种方法的一个主要限制是它影响了数据库的扩展性。当需要添加新的主节点时,可能需要重新调整步长和偏移量的设置。或者使用雪花算法来生成全局唯一的主键。在上面已经讲述了它的原理。