Mycat实战案例(二)
目录
1.准备一个schema.xml配置文件,单分片表格的双机热备结构(两个数据库没有主从)
2.全局表:解决分片表格与数据量不大的变化稳定的非分片表的关联查询设计的表格结构.
4.修改商品表格的字段(多个分片的数据库中同时修改添加c_id)
11.实现schema.xml对category的全局表格配置(多分片复制)
3.schema.xml配置t_order和t_order_item的er分片表格关系
1.数据库新作表格,hashtable(主键char/varchar)
4进入Mycat 新增加数据(什么类型都可以都会映射到hash环上)
一.高可用的故障转移
1.准备一个schema.xml配置文件,单分片表格的双机热备结构(两个数据库没有主从)
2.Mycat读写都在一个表中
3.在Mycat中写数据
4.宕机对应的数据库
5.报错,转移
故障转移是为了临时顶替
二.全局表的配置
1.全局表:mycat不是所有的sql语句格式都能支持的
比如:跨分片的关联查询无法完成
由于一个表格是分片表,一个表格是非分片表格,在底层数据库中关联数据"薯片:1"关联的"1:食品"的类型数据跨分片了,在客户端执行查询时,跨分片的数据库mycat无法使用返回.
2.全局表:解决分片表格与数据量不大的变化稳定的非分片表的关联查询设计的表格结构.
3.全局表特点:
数据量不大,数据变化不大,稳定,一般都是公司中的工具表,字典表,与业务的关联关系比较多的表格都会在mycat数据库集群中实现全局表的 配置; 比如:页面代码代号 404 500 200......
工具字典表:
- 代码中使用的是数字数据:1980735799,到工具字典表去查;
- 198:多省数据
- 07:上海
- 357:分波路由器
- 99:目的地武汉
http编码中看到数字,200,201,404,500
4.修改商品表格的字段(多个分片的数据库中同时修改添加c_id)
5.数据库中创建新的表格category
6.shema.xml配置一个分片表格,一个非分片表格
7.进入数据库查看数据
8.category添加数据信息(非分片)
在Mytest中填写数据
9.product数据清空,添加数据(分片)
1.添加数据在第一分片中
2.添加数据在第二分片中
10.在mycat客户端执行关联查询
select * from product,category where product.c_id=category.id
查不到第二分片的数据,因为上面总结了 跨分片的关联查询无法完成
11.实现schema.xml对category的全局表格配置(多分片复制)
- 只需要在dataNode中添加 dn2即可,
- 不设置rule (没分片计算逻辑)就是全局表,而不是分片表,
- type默认就是global,可写可不写
- 一定要对应起来,如果你的分片表格,有N个分片,你的全局表必须N个分片
配置好分片表,把对应的表数据同步到其他表中 (复制)global全局复制
category将会由于多个分片的配置,同时没有给定分片规则的xml结构下,直接被定义为一个全局表,
任意插入到当前表格的数据,都会被复制到多个分片中
12.总结全局表格:
当业务逻辑中,业务表格数据庞大需要拆分成分片表个,同时关联查询的非分片表格就不能单独使用非分片配置--引入全局表;
三.ER表
1.ER分片表
mycat不支持跨分片的数据关联查询;分片表余分片表也有可能做关联查询;
- 每个分片表格都有对应的自己分片计算的,
- 如果实现多个表格,全部按照一个分片表格定义的分片计算 把相关的数据全部放进一个表格
- mycat首创ER分片表切分逻辑的中间件(没有ER之前的中间件是必须解决跨分片操作操作的问题的)
2.创建需要的表格
Mycat 无法创建表结构,无法区分,非分片表,分片表....
t_order(id,name),t_order_item(id,title,o_id)
两个分片的数据库中将需要的操作的表格创建处理
3.schema.xml配置t_order和t_order_item的er分片表格关系
这个是错误的案例, ER表不能按照之前的配置来处理
在上一个测试案例中添加数据库准备好的两个表格对应的逻辑ER分片表,测试的分片规则auto-sharding-long
childtable标签:(之前博客有介绍)
- 表示一个table标签的子标签,定义的是一个逻辑库的子库,实现的内容是ER分片表;
- <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
- name:表格的名称,
- primaryKey:主键
- joinKey:外键字段名称
- parentKey:外键字段在主表中的字段名称
<childtable> 可配置多个
4.mycat运行
1.运行报错,说明配置不正确,根据错误信息取修改对应的标签
2.标签写错了childTable
成功运行
5.mycat测试ER分片表的逻辑
1.两张表格各自插入一批数据;
2.新增数据时,
子表不支持insert into () values(),(),()批量插入,但是支持同时执行多个insert语句;以后版本应该会可以
mysql> insert into t_order (id,name) values('1','订单1');
Query OK, 1 row affected (0.09 sec)
mysql> insert into t_order (id,name) values('300001','订单2');
Query OK, 1 row affected (0.00 sec)
3.在子表中只能一条一条的添加
4.上午把数据玩炸了,重修部署了一下
第一分片
第二分片
5.订单数据
6.查询关联操作时
可以使用别名;select * from t_order a,t_order_item b where a.id=b.o_id 老版本不可以
7.不支持删除语句
delete a,b from t_order a,t_order_item b where a.id=b.o_id and a.id=1
8.但是支持内嵌的in关键字
delete from t_order_item where t_order_item.o_id
in (select id from t_order where t_order.id=1);
delete from t_order where id=1
9.查询结果
四.hash一致性的分片计算
之前的分片计算都是整数范围划分,
对应主键分片计算字段是int,long类型,不适用string类型,时间,
hash一致性对数据的类型有没有要求
1.mycat中hash一致性的原理
对比redis的hash一致性
概念 | redis | mycat |
节点信息 | 10.9.9.9:6379 | dn1,dn2,dn3 |
虚拟节点 | 10.9.9.9:6379#1 10.9.9.9:6379#2 | dn1#1,dn1#2 dn2#1,dn2#2 |
数据 | key值 | 字段值(id,order_id,haha_id) |
2.rule.xml中的hash一致性配置
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- hash散列的种子值 和数学模型散列算法有关 默认是0-->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
weightMapFile(0=权重整数值,1=权重整数值)
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>本来应该记录所有hash对应关系的日志根本没用 -->
</function>
3.schem.xml配置一个hash一致性计算分片的表格
1.数据库新作表格,hashtable(主键char/varchar)
2.配置模板
<table name="hashtable" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-murmur"/>
3.重新启动
4进入Mycat 新增加数据(什么类型都可以都会映射到hash环上)
- insert into hashtable (id) values('df05c14c-679e-414d-b10a-958a48793382');
- insert into hashtable (id) values('ecaf1f41-bc7b-4d2d-a237-3731caa11d86');
- insert into hashtable (id) values('58fbc094-a940-4025-8fcb-e517c8d683b2');
5.进行hash计算分片
第一分片
第二分片