一、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、OLAP和OLTP对比

2、关系型和非关系型数据库对比

3、

MyCAT详解的更多相关文章

  1. MyCAT详解【转】

    原文链接:MyCAT详解 作者:Rangle 一.MyCAT概述MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离.分片的分布式中间件.MyCAT可不但支持Oracle.MSSQL.MY ...

  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. 查找Ubuntu下包的归属

    今天在制作docker时,发现我的程序有些依赖的包不太好找应该安装什么. 在centos下面,可以用命令: rpm -qf <libraryname> 在Ubuntu下面,发现一个网站基本 ...

  2. J15W-J45W铜制截止阀厂家,J15W-J45W铜制截止阀价格 - 专题栏目 - 无极资讯网

    无极资讯网 首页 最新资讯 最新图集 最新标签   搜索 J15W-J45W铜制截止阀 无极资讯网精心为您挑选了(J15W-J45W铜制截止阀)信息,其中包含了(J15W-J45W铜制截止阀)厂家,( ...

  3. Android SurfaceFlinger

    Android 系统启动过程Activity 创建过程Activity 与 Window 与 View 之间的关系 Android 系统从按下开机键到桌面,从桌面点击 App 图标到 Activity ...

  4. Train Problem II(卡特兰数 组合数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023 Train Problem II Time Limit: 2000/1000 MS (Java/ ...

  5. System.Security.Cryptography.CryptographicException 微信支付中公众号发红包时候碰到的错误。

    转 留记录.我是第二个错误原因 我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置 ...

  6. CentOS下安装官方RPM包的MySQL后找不到my.cnf

    PS:昨天一同事问我说他用MySQL 5.5官方的rpm包安装了,但是在/etc/下面没有my.cnf配置文件.官方rpm包安装的mysql默认确实是没有/etc/my.cnf. 为什么没有这个文件而 ...

  7. Ubuntu安装Python的mysqlclient

    介绍 本人想在Ubuntu上开发Python程序,使用MySQL数据库. 安装环境: Ubuntu14.04 安装MySQL数据库 具体步骤如下: apt-get update apt-get ins ...

  8. 编译impala2.0.0

    使用redhat5.8没编译成功,改用redhat6.4最终编译成功. 参考官方的文档https://github.com/cloudera/Impala/tree/v1.2.2 不知道官方的read ...

  9. awk中引用变量使用单引号''

    举例如下 who命令输出第一列 (1)第一种情况不使用引号 # i=1;who | awk '{print $${i}}' 输出如下: awk: {print $${i}} awk:          ...

  10. Vue(五)--组件

    1.组件也需要进行注册才可以使用:分为局部注册和全局注册 <body> <div id="app" > <my-component></m ...