
文章插图
其他观点:
MySQL的使用场景中 。读写分离只是方案中的一部分 。想要扩展 。势必会用到分库分表 。可喜的是Mycat里已经做到了 。今天花时间测试了一下 。感觉还不错 。
关于分库分表
当然自己也理了一下 。分库分表的这些内容 。如果分成几个策略或者阶段 。大概有下面的几种 。

文章插图
最上面的第一种是直接拆表 。比如数据库db1下面有test1,test2,test3三个表 。通过中间件看到的还是表test,里面的数据做了这样的拆分 。能够在一定程度上分解压力 。如果细细品来 。和分区表的套路有些像 。
接下来的几类也是不断完善 。把表test拆解到多个库中 。多个服务器中 。如果做了读写分离 。全套的方案这样的拆解改进还是很大的 。如此来看 。数据库中间件做了很多应用和数据库之间的很多事情 。能够流行起来除了技术原因还是有很多其他的因素 。
分库分表的测试环境模拟
如果要在一台服务器上测试分库分表 。而且要求架构方案要全面 。作为技术可行性的一个判定参考 。是否可以实现呢 。
如果模拟一主两从的架构 。模拟服务分布在3台服务器上 。这样的方案需要创建9个实例,每个实例上有3个db需要分别拆分 。
大体的配置如下:
master1: 端口33091
(m1)slave1: 端口33092
(m1)slave2: 端口33093
master2: 端口33071
(m2)slave1: 端口33072
(m2)slave2: 端口33073
master3: 端口33061
(m3)slave1: 端口33062
(m3)slave2: 端口33063
画个图来说明一下 。其中db1,db2,db3下面有若干表 。需要做sharding

文章插图

文章插图
所以我们需要模拟的就是这个事情 。
使用Mycat碰到的几个小问题解惑
使用Mycat的时候碰到了几个小问题 。感觉比较有代表性 。记录了一下 。
问题1:
首先是使用Mycat连接到数据库之后 。如果不切换到具体的数据库下 。使用[数据库名].[表名]的方式会抛出下面的错误 。可见整个过程中 。Mycat拦截了SQL信息做了过滤 。在转换的时候找不到目标路由 。当然实际使用中 。规范使用肯定不会有这个问题 。
mysql> select * from db1.shard_auto;
ERROR 1064 (HY000): find no Route:select * from db1.shard_auto
问题2:
在配置了sharding策略之后 。insert语句抛出了下面的错误 。这个是对语法的一个基本的要求 。
mysql> insert into shard_mod_long values(1,'aa',date);
ERROR 1064 (HY000): partition table, insert must provide ColumnList
问题3:
如果sharding策略配置有误 。很可能出现表访问正常 。但是DML会有问题 。提示数据冲突了 。至于如何配置sharding,下面会讲 。
mysql> select * from shard_mod_long;
Empty set (0.00 sec)
mysql> insert into shard_mod_long(ID,name,shard_date) values(1,'aa',current_date);
ERROR 1105 (HY000): Duplicate entry '1' for key 'PRIMARY'
问题4:
如果sharding的配置有误 。很可能出现多份冗余数据 。
查看执行计划就一目了然 。通过data_node可以看到数据指向了多个目标库 。
mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode21 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode31 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+
这种情况如果有一定的需求还是蛮不错的 。做sharding可惜了 。问题就在于下面的这个table配置 。
<table name=\"shard_auto\" primaryKey=\"ID\" type=\"global\" dataNode=\"pxcNode11,pxcNode21,pxcNode31\" rule=\"auto-sharding-long\" />
需要去掉 type=\"global\"的属性 。让它sharding 。
Mycat里面的sharding策略
Mycat的分片策略很丰富 。这个是超出自己的预期的 。也是Mycat的一大亮点 。
大体分片规则如下 。另外还有一些其他分片方式这里不全部列举:
(1)分片枚举:sharding-by-intfile
(2)主键范围:auto-sharding-long
(3)一致性hash:sharding-by-murmur
推荐阅读
- 2020年清明节是农历几月几日
- 有哪些影视作品让你看了一次就再也不想看了?为什么?
- 多少层纱布口罩可以预防病毒
- 回顾2000年代,数字音乐的盗版产业,都留下了哪些值得纪念的情怀?
- 如何帮助孩子解决情绪问题?
- 寒食节是农历哪一天
- 动画视频制作软件Wondershare Anireel?
- 为什么这么多人喜欢喝酒?
- 纱布口罩可以阻隔飞沫吗