MyCat数据库的基础配置及使用

2019 年 9 月 21 日

MyCat数据库的基础配置及使用

一、为什么需要分布式数据据库


随着计算机和信息技术的迅猛发展,行业应用系统的规模迅速扩大,行业应用所产生的数据量呈爆炸式增长,动辄达到数百 TB 甚至数百 PB 的规模,已远远超出传统计算技术和信息系统的处理能力,集中式数据库面对大规模数据处理逐渐表现出其局限性。因此,人们希望寻找一种能快速处理数据和及时响应用户访问的方法,也希望对数据进行集中分析、管理和维护。这已经成为迫切需求。


分布式数据库是在集中式数据库的基础上发展起来的,是计算机技术和网络技术结合的产物。分布式数据库是指数据在物理上分布而在逻辑上集中管理的数据库系统。物理上分布是指数据分布在物理位置不同并由网络连接的节点或站点上;逻辑上集中是指各数据库节点之间的逻辑上是一个整体,并由统一的数据库管理系统管理。不同的节点分布可以跨不同的机房、城市甚至国家。


二、分布式数据库的特点


分布式数据库具有透明性、数据冗余性、易于扩展性、自治性等特点,还具有经济、性能优越、响应速度更快、灵活的体系结构、易于集成现有系统等特点


分布式数据库尽管有着天生的高贵血统,但它依赖调整网络,对事务的处理远没有传统数据库成熟,在很长一段时间内分布式数据存储将与传统数据存储共存。


三、MyCat 数据库中间件简介


MyCat 是一个彻底开源的面向企业应用开发的大数据库集群,支持事务、ACID,是可以替代 MySQL 的加强版数据库。MyCat 被视为 MySQL 集群的企业级数据库,用来替代昂贵的 Oracle 集群,它是整合了内存缓存技术、NoSQL 技术、HDFS 大数据的新型 SQL Server,是结合了传统数据库和新型分布式数据仓库的新一代企业级数据库产品,也是一个优秀的数据库中间件


MyCat 是通过 Cobar 改良而生。MyCat 支持 Oracle、PostgreSQL,从 1.3 版本开始支持 NoSQL(SequoiaDB 及 MongoDB)并引入了 Druid 解析器。2016 年 MyCat 发布了 1.5 版本,2018 年发布了 1.6.6 版本 。目前 MyCat2.0 项目已经启动,核心代码已经提交(https://github.com/MyCatApache/MyCat2.git)。


四、MyCat 核心概念详解


4.1 逻辑库(schema)


通常在实际应用中,业务开发人员并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。



4.2 逻辑表(table)


既然有逻辑库,就会有逻辑表。在分布式数据库中,对于应用来说,读写数据的表就是逻辑表。逻辑表可以分布在一个或多个分片库中,也可以不分片。


1)分片表


分片表是指将数据量很大的表切分到多个数据库实例中,所有分片组合起来构成了一张完整的表。例如在 MyCat 上配置 t_node 的分片表,数据按照规则被切分到 dn1、dn2 两个节点。


<table name=”t_node” primaryKey=”vid” autoIncrement=”true” dataNode=”nd1,dn2” rule=”rule1” />
复制代码


2)非分片表


并非所有的表在数量很大时都需要进行分片。非分片表是相对分片表而言的,不需要进行数据切分的表。如下面配置中的 t_node 只存在于节点 dn1 上。


<table name=”t_node” primaryKey=”vid” autoIncrement=”true” dataNode=”dn1” />
复制代码


3)ER 表


关系型数据库是基于实体关系模型(Entity Relationship Model)的,MyCat 中的 ER 表便来源于此。基于此思想,MyCat 提出了基于 E-R 关系的数据分片策略,子表的记录与其所关联的父表的记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据关联查询不会跨库操作。


表分组是解决跨分片数据关联查询的一种很好的思路,也是数据切分的一条重要规则。


4)全局表


在一个真实的业务场景中往往存在大量类似的字典表,这些字典表中的数据变动不频繁,而且数据规模不大,很少有超过数十万条的记录。


当业务表因为规模进行分片后,业务表与这些附属的字典表之间的关联查询就成了比较棘手的问题,所以在 MyCat 中通过数据冗余来解决这类表的关联查询,即所有分片都复制了一份数据,我们把这些冗余数据的表定义为全局表。


数据冗余是解决跨分片数据关联查询的一种很好的思路,也是数据切分规划的另一条重要规则。


4.3 分片节点(dataNode)


将数据切分后,一个大表被分到不同的分片数据库上,每个表分片所在的数据库是分片节点。


4.4 节点主机(dataHost)


将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。


五、MyCat 原理介绍


MyCat 原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 语句发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。



MyCat 收到一条 SQL 语句时,首先解析 SQL 语句涉及的表,接着查看此表的定义,如果该表存在分片规则,则获取 SQL 语句里分片字段的值,并匹配分片函数,得到该 SQL 语句对应的分片列表,然后将 SQL 语句发送到相应的分片去执行,最后处理所有分片返回的数据并返回给客户端。


六、MyCat 配置


  • schema.xml是MyCat的重要配置文件,它管理着逻辑库、分片表、分片节点和分片主机等信息。

  • service.xml是系统参数的配置文件,掌握MyCat优化方法,必须熟悉该文件的配置项。

  • sequence是全局序列的配置文件。


6.1 server.xml 配置文件


server.xml 配置文件包含了 MyCat 的系统配置信息,对应的源码是 SystemConfig.java。它有两个重要的标签,分别是 user、system掌握 system 标签的各项配置属性是 MyCat 调优的关键


<MyCat:server xmlns:MyCat="http://io.MyCat/">    <system>    <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->    <property name="useHandshakeV10">1</property>    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property> <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --> <!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议--> <!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --> <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --> <property name="processorBufferPoolType">0</property> <!--默认是65535 64K 用于sql解析时最大文本长度 --> <!--<property name="maxStringLiteralLength">65535</property>--> <!--<property name="sequnceHandlerType">0</property>--> <!--<property name="backSocketNoDelay">1</property>--> <!--<property name="frontSocketNoDelay">1</property>--> <!--<property name="processorExecutor">16</property>--> <!-- <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--> <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1开启 0关闭 --> <property name="useOffHeapForMerge">1</property>
<!-- 单位为m --> <property name="memoryPageSize">64k</property>
<!-- 单位为k --> <property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 单位为m --> <property name="systemReserveMemorySize">384m</property>

<!--是否采用zookeeper协调切换 --> <property name="useZKSwitch">false</property>
<!-- XA Recovery Log日志路径 --> <!--<property name="XARecoveryLogBaseDir">./</property>-->
<!-- XA Recovery Log日志名称 --> <!--<property name="XARecoveryLogBaseName">tmlog</property>--> <!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--> <property name="strictTxIsolation">false</property> <property name="useZKSwitch">true</property> </system> <!-- 全局SQL防火墙设置 --> <!--白名单可以使用通配符%或着*--> <!--例如<host host="127.0.0.*" user="root"/>--> <!--例如<host host="127.0.*" user="root"/>--> <!--例如<host host="127.*" user="root"/>--> <!--例如<host host="1*7.*" user="root"/>--> <!--这些配置情况下对于127.0.0.1都能以root账户登录--> <!-- <firewall> <whitehost> <host host="1*7.0.0.*" user="root"/> </whitehost> <blacklist check="false"> </blacklist> </firewall> -->
<user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <!-- 表级 DML 权限设置 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user>
<user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
</MyCat:server>
复制代码


6.2 schema.xml 配置文件


schema.xml 作为 MyCat 中重要的配置文件之一,涵盖了 MyCat 的逻辑库、表、分片规则、分片节点及数据源。


1)schema 标签


<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
复制代码


schema 标签用于定义 MyCat 实例中的逻辑库。MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分不同的逻辑库,如果有配置 schema 标签,则所有的表配置都会属于同一个默认的逻辑库。


<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"><table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100"><table name="company" dataNode="dn10,dn11,dn12" rule="auto-sharding-long" /></schema>
复制代码


如上所示配置了两个不同的逻辑库,逻辑库的概念等同于 MySQL 数据库中的 Database 概念,我们在查询逻辑库中的表时,需要切换到该逻辑库下才可以查询其中的表。


checkSQLschema 属性,当把该值设置为 true 时,如果我们执行语句 select * from TESTDB.travelrecord;,则 MyCat 会把 schema 字符去掉,把 SQL 语句修改为 select * from travelrecord;可避免发送到后端数据库执行时报错。


SqlMaxLimit 属性,当该属性设置为某个值时,每次执行的 SQL 语句如果没有加上 limit 语句,MyCat 也会自动在 limit 语句后加上对应的值。如果不设置该值,则 MyCat 会把查询到的信息全部返回。


2)table 标签


<table name=”travelrecord” dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”></table>
复制代码


table 标签定义了 MyCat 中的逻辑表,所有需要拆分的的表都需要在 table 标签中定义。


table 标签的主要属性见下表,具体介绍参见 MyCat 官方网站 http://www.MyCat.io


属性名数量限制
nameString1
dataNodeString1…*
ruleString0…1
ruleRequiredboolean0…1
primaryKeyString1
typeString0…1
autoIncrementboolean0…1
subTablesString1
needAddLimitBoolean0…1


3)childTable 标签


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


4)dataNode 标签


dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常所说的数据分片。一个 dataNode 标签就是一个独立的数据分片。


5)dataHost 标签


dataHost 标签在 MyCat 逻辑库中作为底层标签存在,直接定义了具体的数据库实例,读写分离和心跳语句。


Heartbeat 标签用来配置心跳检查语句,Mysql 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。


writeHost 和 readHost 是读写的配置,一个 dataHost 内可以配置多个读和写。但如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 也将不可用;另一方面,MyCat 会自动检测到 writeHost 宕机,并切换到备用的 writeHost 上。


七、MyCat 分片


在 MyCat 中将表分为两种大的概念:数据量小且不需要做数据切分的表,称为非分片表;数据量大到单库性能、容量不足以支撑,数据需要通过水平切分均匀分布到不同的数据库中的表,称为分片表。而中间件最终需要处理的事情是对数据切分、聚合。


7.1 ER 关系分片表


ER 模型是实体关系模型,广泛采用概念模型设计方法,基本元素是实体、关系和属性。MyCat 将它引入数据切分规则中,使得有互相依赖的表能够按照某一规则切分到相同的节点上,避免跨库 Join 关联查询。具体详情配置内容在这里不做描述请参考官方文档。


八、功能与优势


8.1 常用命令


  • MyCat提供类似数据管理监控方式,可以通过MySQL命令行登录管理端口(9066)执行相应的SQL语句进行管理,也可以通过JDBC方式进行远程连接管理。

  • Reload @@config命令用于更新配置文件运行该命令,不用重启即可进行配置文件更新。

  • Reload @@sqlstat用来关闭和开启SQL监控分析。

  • Show @@database命令用来显示MyCat数据库列表,运行结果对应schema.xml配置文件的schema子节点。

  • Show @@datanode用来显示MyCat数据节点,运行结果对应schema.xml配置文件的dataNode节点。

  • Show @@heartbeat用于报告心跳状态。

  • Show @@connection用来获取MyCat的前端连接状态。

  • Kill @@connection id,id,id 用来关闭连接。

  • Show @@ cache用来查看缓存。

  • Show @@datasource 用来查看数据源状态,如果配置了主从或多主,则可以切换。

  • Switch @@ datasource name:index 用于切换数据源。

  • Show @@syslog limit 用于显示系统日志。

  • Show @@sql 显示在MyCat中执行过的语句。

  • Show @@shl.show 显示慢SQL语句。

  • Show @@sql.sum 显示SQL语句的整体执行情况、读写比例等。


8.2 局限性


delete 操作不支持没有主键的表。没有主键的表在不同节点的顺序不同,如果执行 select …limit…,则将出现不同的结果集。


不支持 XA 事务,在提交上可能回滚。


由于集群是乐观的并发控件,事务 commit 可能在该阶段中止,所以如果有两个事务向集群中的不同节点的同一行写入并提交,则失败的节点将中止。对于集群级别的中止,集群返回死锁错误。


整个集群的写入吞吐量由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将变得缓慢。


集群内部按照 id 自增长机制写入数据,比如集群中有三台可能是 3,6,9 这样的递增。


8.3 与 Sharding-JDBC 对比 Sharding-JDBC


MyCat 是一个中间件的第三方应用,sharding-jdbc 是一个 jar 包。因为 MyCat 是单独部署,所以使用 MyCat 就像是访问数据库一样,而 sharding-jdbc 的逻辑都是需要在工程里写的。


如果只是单独应用可以使用轻量级的 Sharding-JDBC,如果多个服务都需要操作数据库则使用 MyCat 更合适。因为用 Sharding-JDBC 需要在每一个工程里边都配置上相应的分片等逻辑,而 MyCat 只需要配置一份单独部署。


参考文献


  • 《分布式数据库架构及企业实践基于MyCat中间件》

  • 官方网站:http://www.MyCat.io/


本文转载自公众号宜信技术学院(ID:CE_TECH)


原文链接


https://mp.weixin.qq.com/s/ZTZT0fRek1PLFVxeEjq5ZQ


2019 年 9 月 21 日 08:001789

评论 1 条评论

发布
用户头像
不是数据库,而是数据库中间件~
2019 年 09 月 25 日 20:56
回复
没有更多评论了
发现更多内容

加密货币可能是人类历史上最大的/富国银行报告:加密货币投资像19世纪50年代的早期淘金热财富转移

CECBC区块链专委会

数字货币

修一座安全的广厦,庇护赛博世界的流浪者

脑极体

观点|发展区块链金融,长三角如何建设“四梁八柱”

CECBC区块链专委会

区块链

Redis Sentinel-深入浅出原理和实战

Linux服务器开发

redis 中间件 底层应用开发 web服务器 Linux服务器开发

架构师训练营第三周作业

Geek_xq

DeFi借贷质押系统APP开发|DeFi借贷质押软件开发

开發I852946OIIO

系统开发

20分钟带你掌握JavaScript Promise和 Async/Await

Geek_Willie

Java

揭开IP地址的神秘身份!!!

德胜网络-阳

cartographer环境建立以及建图测试(详细级)

良知犹存

cartographer slam

SDK开发质量保障经验总结

张明云

接口 程序设计 接口测试 sdk SDK测试

架构师训练营W08作业

Geek_f06ede

深入Linux内核架构——进程虚拟内存

赖猫

c++ Linux

DolphinDB与Pandas对于大文本文件处理的性能对比

DolphinDB

数据库 pandas tsdb 数据库选择 DolphinDB

大促中为什么需要可视化监控大屏?

京东智联云开发者

大数据 监控 数据可视化

天下武功,唯”拆“不破| 技术人应知的创新思维模型 (4)

Alan

思维模型 28天写作营 技术人应知的创新思维模型 MECE 组合创新

生产环境全链路压测建设历程之五 针对稳定性矛盾, 从目标、流程、组织体系发力

数列科技杨德华

案件数同比下降七成 北京引入“区块链”化解物业纠纷

CECBC区块链专委会

区块链 法律

TensorFlow2 Fashion-MNIST图像分类(一)

书豪

tensorflow 学习

docker与podman的故事:一个方兴未艾,一个异军突起

晓川

本文帮你在Unix下玩转C语言

MySQL从删库到跑路

unix C语言

架构师训练营第 1 期第12周作业

业哥

架构词典:工程

lidaobing

架构 工程能力

挖矿矿池系统开发详情丨挖矿矿池源码案例

系统开发咨询1357O98O718

挖矿矿池系统开发案例 旷工系统开发功能

LeetCode题解:515. 在每个树行中找最大值,BFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

CTO与COO联手接了公司的外包项目 | 法庭上的CTO(6)

赵新龙

CTO 法庭上的CTO

合伙开公司、借款变工资 | 法庭上的CTO(7)

赵新龙

CTO 法庭上的CTO

海量数据架构下如何保证Mycat的高可用?

冰河

分布式事务 分布式数据库 分布式存储 mycat 数据库集群

刚入职,就被各种 Code Review,真的有必要吗?

xcbeyond

方法论 研发管理 编程习惯

TensorFlow2 Fashion-MNIST图像分类(二)

书豪

甲方日常 66

句子

工作 随笔杂谈 日常

滴滴开源小桔棱镜:一款专注移动端操作行为的利器

滴滴技术

开源 滴滴 移动端

MyCat数据库的基础配置及使用-InfoQ