Demo入门Mycat【面试+工作】

前言

Mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里;

下面将从Mycat提供的demo来简单分析一下:

准备

1.Jdk1.7.0_80

2.Mysql 5.5

3.Mycat-server-1.6-release http://dl.mycat.io/1.6-RELEASE/

4.Mycat配置后端的writeHost和readHost,配置成本机即可,在conf/schema.xml下:

5.配置日志等级为debug,在conf/log4j2.xml下:

启动Mycat

1.启动Mycat,运行bin/startup_nowrap.bat可执行文件

2.连接Mycat服务器,默认端口是8066

3.简单查看Mycat服务器,包括数据库,数据表

以上显示的数据库和数据表,都配置在conf/schema.xml中,相关的还有conf/server.xml和conf/rule.xml。

schema.xml主要定义了逻辑库,逻辑表等相关信息;

server.xml主要配置了一些系统参数;

rule.xml主要定义了分库分表的一些规则。

下面主要以schema.xml中配置的默认的逻辑库和逻辑表,来做一些简单的操作了解Mycat。

Demo展示

schema.xml定义了后台的Mysql数据库db1,db2,db3;所以首先需要在Mysql数据库中创建这三个数据库;

1.表travelrecord(分片规则),定义如下:

name:定义了逻辑表的表名;

dataNode:定义这个逻辑表所属的dataNode,需要和dataNode标签中name属性的值相互对应,也就是对应的后台的数据库;

rule:用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义;

1.1分别在三个数据库中创建表

1.2在rule.xml中定义的规则

此分片规则提前规划好分片字段某个范围属于哪个分片,具体定义在conf/autopartition-long.txt文件中;并且指定了id作为分片字段;

1.3模拟id范围插入数据

1.4查询数据,并观察日志

id=5000001应该路由到dn2节点,查看日志:

无查询条件的应该路由到三个节点,查看日志:

2.表company(全局表),定义如下:

2.1分别在三个数据库中创建表

2.2逻辑表类型

type定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型,如果是全局表,所有的分片都有一份相同的数据;

查看日志如下:

2.3查看全局表

多次执行查看全局表,查看日志会发现每次从三个分片中随机取一个执行查询语句;以下三条日志是执行三次的结果:

3.表hotnews(自增主键),定义如下:

3.1分别在三个数据库中创建表

3.2自增长主键

在分库分表的情况下,默认的MySQL的自增长主键无法满足主键的唯一性,Mycat提供了全局序列号的功能,来保证表主键的唯一性;

Mycat提供了多种全局序列号的方式包括:本地文件方式,数据库方式,本地时间戳方式,分布式ZK ID 生成器,Zk 递增方式;

server.xml默认的的sequnceHandlerType=2,表示本地时间戳方式,具体使用如下:

同时配置了rule=”mod-long”,指定的分片规则为取模,可以查看数据结果,在db1下插入了如下数据:

4.表employee(配置primaryKey),定义如下:

4.1分别在三个数据库中创建表

4.2插入数据

employee指定的分片规则是sharding-by-intfile,具体conf/rule.xml:

使用sharding_id作为分片字段,分片规则是“分片枚举”:通过在配置文件中配置可能的枚举 id,自己配置分片,此处配置在conf/partition-hash-int.txt中,准备插入两条数据,分别入库dn1和dn2:

4.3primaryKey属性

表示该逻辑表对应真实表的主键,当分片规则使用非主键进行分片的,当使用主键查询时,会将查询语句发送到所有的分片节点上,如果配置了该属性,那么Mycat就会缓存主键和具体dataNode的信息;

第一次执行上面的查询语句,查看日志可以发现往2个分片节点上都发送了查询语句:

当第二次执行此查询语句,再查看日志只往一个节点发送了查询语句:

5.表customer和orders(父子表关系),定义如下:

5.1分别在三个数据库中创建表

5.2父子表关系

childTable 标签用于定义 E-R 分片的子表,通过标签上的属性与父表进行关联;

joinKey:插入子表的时候会使用这个列的值查找父表存储的数据节点;

parentKey:属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置;

5.3模拟数据的插入

分别通过分片规则往dn1和dn2上面各自插入了一条数据,下面再往orders插入数据看是否可以插入到关联的节点上;

customer_id=1对应的customer表的id,应该插入到dn1节点上,查看日志:

同理指定customer_id=2:

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王磊的博客

golang操作文件

1、读取文件信息: /* 读取文件信息 */ func readFile(path string) string { fi, err := os.Open(p...

2765
来自专栏知识分享

2-LPC1778之GPIO

其实这篇文章主要是介绍自己为其写的GPIO库,自己借鉴了原子写的STM32,野火写的K60,还有LPC官方库,然后按照自己平时用的,然后写了一个..其实写库的主...

3325
来自专栏运维技术迷

MySQL数据库(七):数据导出与导入

一、数据导入 1.什么是导入:把系统文件的内容保存到数据库服务器的表里 2.导入数据时的注意事项? -表中字段的个数要和文件列中的个数相等 ...

4065
来自专栏乐沙弥的世界

MySQL 数据库简单操作

    对于想要从事或爱好mysql相关工作的童鞋们,有必要掌握在命令行下对mysql实现一些简单的操作。本文从描述了如何登录到mysql数据库服务器,如何在m...

1022
来自专栏FreeBuf

如何使用基于整数的手动SQL注入技术

今天,我将教大家如何使用基于整型的手动SQL注入技术来对MySQL数据库进行渗透测试。提醒一下,这是一篇写给newbee的文章。话不多说,我们直奔主题!

1576
来自专栏深度学习之tensorflow实战篇

MYSQL数据导出与导入,secure_file_priv参数设置

MySQL 报错 [Code: 1290, SQL State: HY000] The MySQL server is running with the –...

6075
来自专栏hbbliyong

使用JPA中@Query 注解实现update 操作

spring使用jpa进行update操作主要有两种方式: 1、调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保...

3647
来自专栏Python自动化测试

Django模型学习笔记(五)

在前面的四节中介绍了django环境的搭建,项目创建,执行原理以及url的路由系统,本小节学习Django的模型部分,众所周知,django是MTV...

1173
来自专栏黑泽君的专栏

day30_Hibernate复习_02

对象的三种状态:     瞬时状态:没有ID,不在Session缓存中     持久状态:有ID,在Session缓存中     游离状态:有ID...

821
来自专栏北京马哥教育

MySQL开源热备工具XtraBackup的原理与程序说明

XtraBackup是Percona发布的MySQL开源热备工具,可以在尽量不影响线上读写的情况下进行快速全备、增备。支持InnoDB, XtraDB, 和My...

3445

扫码关注云+社区

领取腾讯云代金券