引言

先给大家介绍2个概念:数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

切分模式

一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分

垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。

水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。

为什么用MyCat

不管怎么来说,数据切分虽然分散了单台服务器负载,但是带来了是设计和开发的复杂度。MyCat是一个开源的分布式数据库中间件,实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,在MyCat里,我们面向的是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

分库分表实践

基本环境

操作系统:CentOS / 7.1 (64bit)

JDK:1.8

MySQL:5.7

MyCat:1.6

业务目标

比如说我们现在有个实际的业务上设计需求,要将student和grade表进行垂直划分,分别存储不同的database中;还需要将student水平拆分,也要3个不同database存分别储。如下图所示,MyCat可以帮助实现这4个database的管理,而对于终端用户来说,就像只操作student和grade两张表,保证了中间件分库分页对程序员的透明性。

创建实际数据库

首先,我们肯定需要创建4个database:beijing、shanghai、guangzhou、basic,并生成对应的表。可以看出,student和grade表存在于不同的数据库,而且student表中的数据,分散存储在3个不同的数据库中:

create database beijing;
use beijing;
create table student(
id int primary key,
name varchar(8) not null,
grade int not null
); create database shanghai;
use shanghai;
create table student(
id int primary key,
name varchar(8) not null,
grade int not null
); create database guangzhou;
use guangzhou;
create table student(
id int primary key,
name varchar(8) not null,
grade int not null
); create database basic;
use basic;
create table grade(
id int primary key,
name varchar(8) not null
);

安装配置MyCat

比较简单,下载Mycat-1.6-RELEASE,直接解压缩即可。

为了方便,将/mycat/bin目录添加到环境变量:

/etc/profile文件后增加设置export PATH=/data/mycat/bin:$PATH

让profile立即生效:

# source /etc/profile

配置server

编辑\mycat\conf\server.xml:

<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>

这里MyCat会帮助我们生成一个虚拟的逻辑database,我们命名为TESTDB,并设置可以访问的用户名和密码,默认访问的端口号8066,其实MyCat还会提供一个管理端口:9066,方便我们对MyCat管理和监测,这个我们以后有机会再说。

配置schema

编辑\mycat\conf\schema.xml:

<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 取模分片 -->
<table name="student" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="grade" primaryKey="id" dataNode="dn4"/>
</schema> <!-- 申明节点对应的database -->
<dataNode name="dn1" dataHost="localhost1" database="beijing" />
<dataNode name="dn2" dataHost="localhost1" database="shanghai" />
<dataNode name="dn3" dataHost="localhost1" database="guangzhou" />
<dataNode name="dn4" dataHost="localhost1" database="basic" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 可读写的数据库实例 -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="******">
</writeHost>
</dataHost> </mycat:schema>

schema是比较重要的一块配置,主要维护了虚拟库与实际库的映射关系:

可以看到,虚拟的逻辑库TESTDB中维护了2张表student和grade;

grade对应存储在实际的数据库节点dn4,也就是basic;

而student被拆分为存储在3个实际的数据库节点,分别是beijing、shanghai、guangzhou,分片的算法取模,根据取模映射到不同的节点;

最后,我们将实际的访问地址、访问权限配置完成,当然,这里还可以配置主从/读写分离配置,这块不是本文讨论的重点,我们以后单独说。

启动MyCat

这时候,我们敲入命令:# mycat start ,正常的话可以启动MyCat,输入# mycat status,可以查看是否运行正常,如果运行停止,证明启动有误,可以进入控制台启动,# mycat console,进行调试。(有可能报内存错误,一般是由于配置java虚拟机的默认大小的问题,我们可以根据命令行的提示,去wrapper.conf中修改)

MyCat插入和查询

MyCat启动后,我们就可以连接MyCat帮我们生成的逻辑库了:

# mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB



接下来,我们在逻辑库中插入一下数据验证一下:

insert into grade (id,name) values (1,'一年级');
insert into grade (id,name) values (2,'二年级');
insert into grade (id,name) values (3,'三年级'); insert into student (id,name,grade) values (1,'张三',2);
insert into student (id,name,grade) values (2,'李四',1);
insert into student (id,name,grade) values (3,'王五',3);
insert into student (id,name,grade) values (4,'甲',3);
insert into student (id,name,grade) values (5,'乙',2);
insert into student (id,name,grade) values (6,'丙',1);

我们插入了6条student记录,这时应该根据不同的取模结果,存在不同的实际数据库的student表中,所以我们切换到实际数据库:# mysql -uroot -ppassword

分别查看实际数据库:



再看此时的逻辑数据库:



逻辑数据库,查询grade和student两张表,已经数据聚合,还可以进行排序;



如果我们需要将2张表进行关联,也是可以的:

/*!mycat:catlet=io.mycat.catlets.ShareJoin */select * from student s,grade g on s.grade=g.id where g.name='一年级';

附录

附:个人研究整理和总结(查看原图或者打开原地址链接)

MyCat | 分库分表实践的更多相关文章

  1. 分布式数据库中间件 MyCat | 分库分表实践

    MyCat 简介 MyCat 是一个功能强大的分布式数据库中间件,是一个实现了 MySQL 协议的 Server,前端人员可以把它看做是一个数据库代理中间件,用 MySQL 客户端工具和命令行访问:而 ...

  2. MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...

  3. 《MyCat分库分表策略详解》

    在我们的项目发展到一定阶段之后,随着数据量的增大,分库分表就变成了一件非常自然的事情.常见的分库分表方式有两种:客户端模式和服务器模式,这两种的典型代表有sharding-jdbc和MyCat.所谓的 ...

  4. MariaDB Spider 数据库分库分表实践

    分库分表 一般来说,数据库分库分表,有以下做法: 按哈希分片:根据一条数据的标识计算哈希值,将其分配到特定的数据库引擎中: 按范围分片:根据一条数据的标识(一般是值),将其分配到特定的数据库引擎中: ...

  5. 3.Mysql集群------Mycat分库分表

    前言: 分库分表,在本节里是水平切分,就是多个数据库里包含的表是一模一样的. 只是把字段散列的分到不同的库中. 实践: 1.修改schema.xml 这里是在同一台服务器上建立了4个数据库db1,db ...

  6. mycat 分库分表

    单库分表已经在上篇写过了,这次写个分库分表,不同在于配置文件上的一点点不同 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> &l ...

  7. MyCat分库分表入门

    1.分区 对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后 ...

  8. 分库分表实践-Sharding-JDBC

    最近一段时间在研究分库分表的一些问题,正好周末有点时间就简单做下总结,也方便自己以后查看. 关于为什么要做分库分表,什么是水平分表,垂直分表等概念,相信大家都知道,这里就不在赘述了. 本文只讲述使用S ...

  9. Mycat分库分表(一)

    随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...

随机推荐

  1. webpack 解决 semantic ui 中 google fonts 引用的问题

    semantic ui css 的第一行引用了 google web font api,由于不可告人而又众所周知的原因,这条链接在国内无法访问: @import url('https://fonts. ...

  2. [.net 面向对象程序设计深入](36)Redis——基础

    [.net 面向对象程序设计深入](36)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  3. [Swift]LeetCode206. 反转链表 | Reverse Linked List

    Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...

  4. [Swift]LeetCode340.最多有K个不同字符的最长子串 $ Longest Substring with At Most K Distinct Characters

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...

  5. ubuntu中环境变量的几个问题思考

    问题一:export PATH=$PATH:/usr/local和export PATH=/usr/local:$PATH这两个的区别是什么?可以随便用吗? 这两个都是要把该目录加到环境变量中,一般的 ...

  6. Linux 设置自启动服务

     0 为停机,机器关闭.(千万不要把initdefault设置为0 )    1 为单用户模式,就像Win9x下的安全模式类似.    2 为多用户模式,但是没有NFS支持.    3 为完整的多用户 ...

  7. .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...

  8. Fleck For Web Socket

    效果图 (前沿).WebSocket是一种基于TCP/IP通讯一种新的通讯协议,它实现了服务器和客户端双工通讯,允许服务器主动发送给客户端. (浏览器对Socket的支持) . 浏览器 支持情况 Ch ...

  9. C# Serialize

    一.序列化又称为串行化,是.NET运行时环境用来支持用户自定义类型的机制,目的是以某种存储给对象持久化,或者是将这种对象传输到另一个地方, 二. .NET框架提供了两种序列化的方式 一种是使用Bina ...

  10. 在.NET中使用Redis

    dll文件 namespace RedisDemo { public partial class RedisPage : System.Web.UI.Page { protected void Pag ...