原文链接:MyCAT详解

作者:Rangle

一、MyCAT概述
MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的分布式中间件。MyCAT可不但支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。基础架构如下:

1、MyCAT原理

MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。

2、MyCAT功能
(1)数据库分片(Sharding)

通过某种条件,将同一数据库中的数据分散的存储到多个数据库中,已达到分散单台数据库设备负载的效果,这就是数据库分片。
a.水平拆分
同一张表的不同记录,根据表的某个字段的某种规则拆分到多个数据库(主机)上,这既是水平拆分。
单库业务表可能会过于庞大,存在单库读写与存储瓶颈,这种情况可以通过水平拆分解决,水平拆分基本架构如下:

常用水平拆分规则:
*ID
*日期
*特定字段取模

优点:

*拆分规则抽象好,join操作基本可以数据库内完成
*不存在单库大数据,高并发的性能瓶颈
*应用端改造少
*提高了系统稳定性和负载能力

缺点:
*拆分规则难以抽象
*分片事务一致性难以解决
*数据多次扩展难度跟维护量极大
*跨库join性能较差

b.垂直拆分
不同的表切分到不同的数据库(主机)上,这就是垂直拆分。
一般按照业务表进行分类,划分为不同的业务、模块库,耦合度越低,越容易做垂直拆分,垂直拆分基本架构如下:

垂直拆分注意点:
跨库Join,采用共享数据源或分库接口调用,根据资源和数据规模、负载而定

优点:
*拆分后业务清晰,拆分规则明确
*系统之间整合或扩展容易
*数据库维护简单

缺点:
*部分业务表无法Join,只能通过接口方式解决,提高了系统复杂度
*受每种业务不同的限制存在单库性能瓶颈,不容易扩展跟性能提高
*事务处理复杂

c.水平拆分和垂直拆分共同缺点
*分布式事务处理困难
*夸节点join困难
*扩数据源管理复杂

d.切分总则
*能不切分的尽量不切分
*如果要切分,选择合适的切分规则,提前规划好
*数据库切分尽量通过数据冗余或表分组来降低跨库join
*业务尽量使用少的多表join

(2)读写分离

(3)黑白名单限制

3、使用场景

(1)单纯读写分离,此时配置最为简单,支持读写分离、主从切换
(2)分库分表,对记录超过1000万的表进行水平拆分,最大支持1000亿单表水平拆分
(3)多租户应用,每个应用一个数据库,但程序只需连接MyCAT,程序不改变,实现多租户化
(4)报表系统,借住MyCAT分表能力,处理大规模的报表统计
(5)替代Hbase,分析大数据
(6)海量实时数据查询

4、优缺点
优点:
(1)支持多种类型数据库的分片
(2)易扩展
(3)

缺点:

二、MyCAT安装
1、下载
官网地址:http://www.mycat.io/
下载地址:http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
文档地址:http://www.mycat.io/document/Mycat_V1.6.0.pdf

2、mycat安装

1)mycat是java语言编写,在安装mycat前需要安装jdk,本次java版本是1.7

[root@node1 ~]# java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (rhel-2.6.9.0.el6_8-x86_64 u131-b00)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)

2)解压缩mycat(mycat解压缩后即安装完毕)

[root@node1 ~]# tar -xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz  -C /usr/local/

3)mycat用户创建

groupadd mycat
useradd -r -g mycat mycat
chown -R mycat.mycat /usr/local/mycat

4)mycat基本配置

环境变量配置:

[root@node1 ~]# vi ~/.bash_profile
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/mycat/bin export PATH [root@node1 ~]# source ~/.bash_profile

schema.xml配置:

[root@node1 ~]# cd /usr/local/mycat/conf/

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="node1" database="db01" />
<dataHost name="node1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.20.32.23:3306" user="myuser" password="myuser">
<readHost host="hostS2" url="10.20.32.24:3306" user="myuser" password="myuser" />
</writeHost>
<writeHost host="hostS1" url="10.20.32.24:3316" user="myuser" password="myuser" />
</dataHost>
</mycat:schema>

server.xml配置:

[root@node1 ~]# cd /usr/local/mycat/conf/

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property> </system> <user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user> </mycat:server>

5)mycat启动

[root@node1 conf]# mycat start
Starting Mycat-server...
[root@node1 conf]#

6)mycat状态检查

[root@node1 conf]# mycat status
Mycat-server is running (27956).

三、MyCAT使用

 1、mycat常用命令

./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态

四、MyCAT重要概念

 1、逻辑库(schema)

逻辑库是mycat中间件层配置的对应实际一个或多个业务数据库集群构成。

2、逻辑表(table)
a.逻辑表是mycat切分到多个数据库或者不切分对应用程序显示的统一的表。
b.分片表是原有的大表,经过分片,分布在不同数据库、相同数据库的保留相同表结构,但数据不同的表。
c.非分片表是未做切分的表。
d.ER表基于E-R关系分片策略,子表记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组保证数据join不会跨库操作。
e.全局表,业务系统中变化不大、数据量不大(十万以下),但又需要经常关联的表,mycat采用冗余在各个节点一个份来完成。

3、分片节点(dataNode)
数据库分片后,一个大表被切分到不同的分片数据库上,每个表分片所在的数据库就是分片节点。

4、分片主机(dataHost)
分片节点所在的服务器,数据切分后,每个分片节点不一定都会独占一台服务器,同一个分片服务器可能存储多个分片节点,尽量使读写压力高的分片节点均衡的放在不同的节点主机上。

5、分片规则(rule)
按照某种业务规则把数据分到某个分片节点上的规则,就是分片规则。(分片规则非常重要,直接决定后续数据处理复杂度)

6、全局序列号(sequence)
当数据库分片后,原有的主键约束在分布式条件下无法使用,因此需要引入外部机制保证数据唯一表示,这种保证全局的数据唯一表示机制就是全局序列号(sequence)。

7、多租户
多用户的环境共用相同的系统、程序组件,并且确保各用户间数据的隔离性。
a.一个用户一个数据库,隔离级别最高、安全性最好,费用最高
b.共享数据库,隔离数据架构,每个用户一个schema
c.共享数据库,共享数据架构,共享database、schema,通过表tenantID区分租户数据

更多阅读:

数据库相关中间件介绍

MyCAT详解【转】的更多相关文章

  1. MyCAT详解

    一.MyCAT概述 MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离.分片的分布式中间件.MyCAT可不但支持Oracle.MSSQL.MYSQL.PG.DB2关系型数据库,同时也支持 ...

  2. Mycat详解及配置读写分离(Centos7)

    目录 一.理论概述 二.环境 三.部署 一.理论概述 原理简述 参考文档 MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析.路由分析.读写分离分析.缓存分析等,然后将SQL发给后端真实的 ...

  3. MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解

    MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...

  4. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

  5. Mycat分布式数据库架构解决方案--schema.xml详解

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文件 ...

  6. Mycat分布式数据库架构解决方案--rule.xml详解

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文件 ...

  7. Mycat分布式数据库架构解决方案--Server.xml详解

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文件 ...

  8. zookeeper使用详解(命令、客户端、源码)

    1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言   zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ...

  9. Docker详解

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

随机推荐

  1. 运行时给java对象动态的属性赋值

    运行时给java对象动态的属性赋值 如何给java对象动态的属性赋值(也就是在代码执行的时候才决定给哪个属性赋值)         1.自定义一个工具类ReflectHelper,代码如下所示: pa ...

  2. mouse without borders无界鼠标使用教程

    mouse without borders无界鼠标使用教程 摘自https://www.jianshu.com/p/6a0209ad03f8   老黑随笔 关注  0.4 2018.05.18 11: ...

  3. sed替换 - 含斜杠(\)和Shell变量

    gen_image.bat中的内容如下:   FOTARomPacker.exe -i .\_ini\FOTARomPacker.ini -o .\_Output\a.bin @IF %ERRORLE ...

  4. ALV 颜色设置(行,列,单元格)

    [转自:https://www.cnblogs.com/mingdashu/p/color_alv.html] BCALV_EDIT_03 http://blog.sina.com.cn/s/blog ...

  5. (七)UML之用例图

    用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. [用途]:帮助开发团队以一种可视化的方式理解系统的功能需求. 用例图所包含的元素如下: 1. ...

  6. jQuery动态创建html元素的常用方法汇总

    在使用jQuery进行WEB程序设计的时候非常有用.分享给大家供大家参考.具体方法如下: 一般来说,可以通过以下几种方式动态创建html元素: 1.使用jQuery创建元素的语法 2.把动态内容存放到 ...

  7. 【ARTS】01_30_左耳听风-201900603~201900609

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 一个区分度很大的iOS面试题

    @property 后面可以有哪些修饰符?@property中有哪些属性关键字? 属性可以拥有的特质分为四类: 原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确 ...

  9. LNMP V1.4正式版本安装及新增Let's Encrypt一键安装和其他功能

    军哥的LNMP一键安装包已经有一些年头了,着实给需要在Linux VPS.服务器中安装WEB环境的用户提供不小的帮助,而且每年儿童节都会有较大版本的更新和升级.老左在二月份的时候有体验过LNMP V1 ...

  10. spring boot 复选框

    jsp代码 技能: <form:checkboxes path="jineng" items="${jinengItme}" /> spring代码 ...