Mycat分库策略 2019-12-07 程序之旅 暂无评论 833 次阅读 ## Mycat分库策略 ### 数据库集群产生的问题 1. 自增id问题 2. 数据库关联查询问题(水平拆分) 3. 数据同步问题 避免自增id重复的解决方法,1、UUID形式。2、设置数据库的步长。 > - UUID 不适合使用在id,比较适合使用在token(令牌)的使用场景,所以不推荐使用 > > - 查询当前数据库步长 > > ```sql > show VARIABLES LIKE 'auto_inc%' > -- auto_increment_offset 起始值 > -- auto_increment_increment 步长 > set @@auto_increment_increment =1 -- 设置步长 > > set @@auto_increment_offset = 1 -- 设置id起始值 > ``` > > 但是使用步长来避免数据库集群id自增的问题也会有缺陷,在开始设计集群的时候就得定好数据库的节点数量,确定好数量之后,使用中就不能进行扩展新的数据库节点, 不然生成的步长规则会被改变。 ### 分库策略 数据库分表分库原则遵循:垂直拆分和水平拆分 简单的理解,垂直拆分是把不用的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。 #### 垂直拆分 根据不同的业务,拆分成不同的数据,比如会员数据库、订单数据库、支付数据库等。适用于大型互联网电商平台、微服务项目框架。 #### 水平拆分 按照数据行的切分,把一张表的内容分别的切分到不同的数据库中,主要是用于提升和突破数据库的性能瓶颈。 > 针对数据库的集群问题,Mycat的分库策略有很多,比如取模分片、枚举分片、范围分片、范围求模算法、固定分片hash算法等等,不同的分片算法需要根据实际情况使用而选择,例如枚举分片,适用于按照省份或区县来拆分数据类业务;一致性hash算法分片适用于分布式数据等。 ### 枚举分片 分片枚举算法就是根据不同的枚举(常量),进行分类存储。 应用场景:可以使用分片枚举实现根据地区进行分片存储到不同数据库进行存放。 分片的规则由`rule.xml`进行配置,使用的过程中可以灵活的使用不同的算法,或者同一算法使用不同的参数,它让分片过程变为可配置化。该文件包含两个重要标签:Function和tableRule。 #### Function标签 举例 ```xml partition-hash-int.txt 1 1 ``` - name 执行算法的名称,在`rule.xml`文件中唯一 - class 对应具体的分片算法,执行算法的具体类 - property 算法类中指定的配置项 #### tableRule标签 举例 ```xml name hash-int ``` - name 唯一算法的名称 - rule 分片算法的具体内容,包含columns和algorithm两个标签 - columns 分片的列名 - algorithm 算法名称,也就是指向function标签中的name #### 环境的配置 准备好三个不同的数据库和一个包含字段`name`的表`region` ![image-20191207170748489.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/12/07/109434161583936/image-20191207170748489.png) ##### 配置`schema.xml` ```xml select user() ``` ##### 配置`rule.xml` ```xml name hash-int partition-hash-int.txt 1 1 ``` ##### 配置`server.xml` ```xml 123456 mycat_testdb user mycat_testdb true ``` ##### 枚举配置文件 ```xml shangcheng=0 yuhang=1 binjiang=2 ``` ### 结果展示 以下是mycat虚拟数据库下插入的数据 ![image-20191207171221744.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/12/07/109443656519181/image-20191207171221744.png) 以下是不同数据库中插入的数据 ![image-20191207171435201.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/12/07/109461881466386/image-20191207171435201.png) ![image-20191207171446609.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/12/07/109474183537846/image-20191207171446609.png) ![image-20191207171455689.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/12/07/109473878406763/image-20191207171455689.png) PS:其他的分片策略也大同小异,这里就只简单的了解分片策略概念和实现了枚举分片策略。 打赏: 微信, 支付宝 标签: mysql, mycat 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。