Mycat-解决MySQL数据量大查询压力大的问题

基础概念的了解,通过该作者的博客了解的:https://www.jianshu.com/p/10b26f040da0
Mycat是什么?

· 一个彻底开源的,面向企业应用开发的大数据库集群

· 支持事务、ACID、可以替代MySQL的加强版数据库

· 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

· 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

· 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

· 一个新颖的数据库中间件产品

数据库中间件

Mycat是一个介于数据库与应用之间,进行数据处理与交互的中间服务。原理图如下:

在这里插入图片描述
上图,通过下面案例进行了解
在这里插入图片描述

·应用服务器/application:例如MySQL,链接mysql的工具有很多,例如java应用程序、Navicat这些链接工具
  • 逻辑库:上图中,在Mycat服务区中的db-user库就是逻辑库,还是逻辑上存在的库,真正的数据来源还是Mysql;在Mycat中逻辑库在{mycat_home}/conf/schema.xml中用标签定义:
<!-- 逻辑库 db_user -->
<schema  name="db_user" checkSQLschema="false" sqlMaxLimit="100">
  • 逻辑表:逻辑表的数据来源,可以是数据进行切分后,分布在一个或者多个分片库中,针对不同的数据分布和管理特点,我们将逻辑表又分为分片表、全局表、E-R表(有外键且需要经常进行修改或者关联查询的表)
<!--分片表 用户表- dataNode相当于图中的两个节点 rule就是分片规则取模运算->
<table name="users" dataNode="db_user_dataNode$1-2" rule="mod-userId-long" primaryKey="userID">
  • 分片规则:将大数据量的表,切分到多个数据分片的规则,如上个代码片rule=“mod-userID-long”,这个mod-userID-long引用的规则定在Mycat的{mycat_home}/conf/rule.xml中,Mycat内置了很多分片规则,比如按时间、自定义数字范围、十进制取模、程序制定、字符串Hash、一致性Hash等等

  • 全局表:一个真实的业务系统中,往往存在大量类似数据字典表的表,数据字典表有以下几个特性
    数据变动不频繁
    数据规模不大,数据量在10万以内
    存在跟其他表有一点的关联查询要求(特别是分片表)
    Mycat提倡大家将具有上诉特点的表通过数据冗余的方式(全局表的定义)进行解决,即所有的分片都有一份数据的拷贝。通过MYCAT对这样的表进行数据的操作时,数据的修改,新增,删除时,所有的分片数据都将受到影响。

  • 非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。例如上图中的系统配置表和短信模板表在schema.xml中具体的定义如下

<!--系统配置表 和 短信模板表-->
<table name=“system_config" primaryKey="configName" dataNode="db_user_dataNode1"/>
<table name=“sms_template" primaryKey="smsID" dataNode="db_user_dataNode2"/>
  • ER表:关系型数据库是基于实体关系模型(Entity-Relationship Model)之上,通过其描述了真实世界中事物与关系,根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据 Join 不会跨库操作。
<table name="users" dataNode="db_user_dataNode$1-2" rule="mod-userId-long" primaryKey="userID">
       <!--ER表 用户地址表-->
       <childTable name="user_address joinKey="userID" parentKey="userID" primaryKey=”addressID"/>
</table>
  • 分片节点:就是定义有几个分片节点,例如上图两个主机各有一个节点,定义如下
<!--节点配置-->
<!--db_user-  dbHost是引用节点主机->
<dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user"/>
<dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user"/>
  • 节点主机:数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机,为了规避单节点主机并发数限制。
    尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机,在schema.xml中使用进行分片节点的定义如下:
<!--配置db_user的节点主机-->
<dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"
                 slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="userHost1" url="192.168.8.137:3306" user="root" password="123456"/>
 </dataHost>
 <dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"
                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"
                 slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="userHost2" url="192.168.8.101:3306" user="root" password="123456"/>
 </dataHost>
发布了45 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_15006743/article/details/104093195