mycat 使用之二 insert

os:centos 7.4
jdk: 1.8.0_131
mysql: 5.7.22
mycat: 1.6.5

node1 节点 mycat 1.6.5
node2、node3 节点 mysql 5.7.22

node1 节点插入数据

所有的操作都需要通过mycat进行,如果事先在node2、node3节点上创建表,在insert时就会报错。

# mysql -h127.0.0.1 -P3306 -uroot -prootroot
mysql> use peiybdb;
mysql> show tables;
+-------------------+
| Tables in peiybdb |
+-------------------+
| tmp_t0            |
+-------------------+
1 row in set (0.02 sec)

mysql> select * from tmp_t0;
Empty set (0.00 sec)

mysql> show create table tmp_t0\G
*************************** 1. row ***************************
       Table: tmp_t0
Create Table: CREATE TABLE `tmp_t0` (
  `c1` varchar(100) DEFAULT NULL,
  `c2` varchar(100) DEFAULT NULL,
  `c3` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> insert into tmp_t0(c1,c2,c3)values('1','11','111');
ERROR 1105 (HY000): Unknown column '_mycat_op_time' in 'field list'

原因是在schema.xml定义了 type=”global” ,

<table name="tmp_t0" dataNode="node2,node3" type="global" />

这个是由参数 useGlobleTableCheck 控制的全局表一致性检测,原理通过在全局表增加_MYCAT_OP_TIME字段来进行一致性检测,类型为bigint,create语句通过mycat执行会自动加上这个字段,其他情况请自己手工添加。
所以创建表不要在 datanode 各节点去创建,而是通过 mycat 去创建。

# mysql -h127.0.0.1 -P3306 -uroot -prootroot
mysql> drop table tmp_t0;
mysql> CREATE TABLE tmp_t0 (
  c1 varchar(100) DEFAULT NULL,
  c2 varchar(100) DEFAULT NULL,
  c3 varchar(100) DEFAULT NULL,
  KEY idx_tmp_t0_x0 (c1)
);

mysql> show create table tmp_t0\G
*************************** 1. row ***************************
       Table: tmp_t0
Create Table: CREATE TABLE `tmp_t0` (
  `c1` varchar(100) DEFAULT NULL,
  `c2` varchar(100) DEFAULT NULL,
  `c3` varchar(100) DEFAULT NULL,
  `_mycat_op_time` bigint(20) DEFAULT NULL COMMENT '全局表保存修改时间戳的字段名',
  KEY `idx_tmp_t0_x0` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.02 sec)

node1 节点的mycat再次插入数据

mysql> insert into tmp_t0(c1,c2,c3)values('1','11','111'),('2','12','112'),('3','13','113'),('4','14','114');
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from tmp_t0;
+------+------+------+----------------+
| c1   | c2   | c3   | _mycat_op_time |
+------+------+------+----------------+
| 1    | 11   | 111  |  1529432866207 |
| 2    | 12   | 112  |  1529432866207 |
| 3    | 13   | 113  |  1529432866207 |
| 4    | 14   | 114  |  1529432866207 |
+------+------+------+----------------+
4 rows in set (0.01 sec)

node2、node3 节点查询数据一致,没有分散。

mysql> select * from tmp_t0;
+------+------+------+----------------+
| c1   | c2   | c3   | _mycat_op_time |
+------+------+------+----------------+
| 1    | 11   | 111  |  1529432866207 |
| 2    | 12   | 112  |  1529432866207 |
| 3    | 13   | 113  |  1529432866207 |
| 4    | 14   | 114  |  1529432866207 |
+------+------+------+----------------+
4 rows in set (0.00 sec)

分析后发现是 schema.xml 的

缺少 rule 属性

去掉 type=”global” ,添加 rule=”rule1”,修改后如下:

同时修改rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">2</property>
        <property name="partitionLength">512</property>
    </function>
</mycat:rule>

要遵守 partitionCount*partitionLength=1024

tmp_t0需要添加一列id

mysql> CREATE TABLE tmp_t0 (
  id bigint(20),
  c1 varchar(100) DEFAULT NULL,
  c2 varchar(100) DEFAULT NULL,
  c3 varchar(100) DEFAULT NULL,
  KEY idx_tmp_t0_x0 (id)
);
mysql> insert into tmp_t0(id,c1,c2,c3)values(1,'1','11','111'),(2,'2','12','112'),(3,'3','13','113'),(4,'4','14','114'),(5,'1','11','111'),(6,'2','12','112'),(7,'3','13','113'),(8,'4','14','114'),(9,'3','13','113'),(10,'4','14','114'),(11,'3','13','113'),(12,'4','14','114');
mysql> insert into tmp_t0(id,c1,c2,c3)values(512,'1','11','111'),(513,'1','11','111'),(514,'1','11','111');

node2、node3节点上查询的数据分布符合预期

看来是要了解下 mysql的分片规则了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mycat中间件是一种用于分布式数据库架构的工具,它可以将多个数据库节点组合成一个逻辑库,并提供高性能和高可用性的数据库访问。在使用Mycat中间件之前,首先需要下载Mycat并将其上传到服务器。推荐将Mycat放在/usr/local/mycat目录下。你可以从Mycat官网的下载地址http://dl.mycat.io/1.6-RELEASE/下载Mycat的压缩包。 在启动Mycat之前,需要进入Mycat的bin目录,并执行命令"./mycat start"来启动Mycat。默认情况下,Mycat的端口是8066。一旦启动成功,你就可以开始使用Mycat中间件来管理你的分布式数据库了。 如果你想了解更详细的关于Mycat中间件的使用方法,我推荐你阅读一本名为《分布式数据库架构及企业实践-基于Mycat中间件》的高清版本的PDF文件。这本书由资深Mycat专家、一线架构师和DBA编写,共有8章内容,涵盖了Mycat的各个方面,包括基本原理、架构设计、性能优化等等。你可以在书中找到关于Mycat中间件的详尽介绍和使用方法。 在实际开发中,Mycat中间件通常是与数据库进行交互的,而对于开发者来说,Mycat中间件几乎是隐身的。在Mycat中,有一些重要的内部概念需要理解,包括逻辑库、逻辑表、分片节点、节点主机和分片规则等等。逻辑库是指Mycat本身,逻辑表是指Mycat中的表,而分片节点是指每个表分片数据所在的数据库。节点主机有时会将多个分片节点放在同一台服务器上,这些分片节点共享相同的节点主机。为了提高性能,通常会将读写压力较高的分片节点放在不同的节点主机上。分片规则是指数据切分的规则,这个规则非常重要,因为它决定了后续数据处理的难度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Mycat数据库中间件的使用教程](https://blog.csdn.net/weixin_39940088/article/details/88764488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [分布式数据库架构及企业实践-基于Mycat中间件](https://download.csdn.net/download/henanshengpuyangshi/10286770)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值