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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MyCat是一个彻底开源的面向企业应用开发的大数据库集群,支持事务、ACID,是可以替代MySQL的加强版数据库。

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

随着计算机和信息技术的迅猛发展,行业应用系统的规模迅速扩大,行业应用所产生的数据量呈爆炸式增长,动辄达到数百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

属性名 数量限制
name String 1
dataNode String 1..*
rule String 0..1
ruleRequired boolean 0..1
primaryKey String 1
type String 0..1
autoIncrement boolean 0..1
subTables String 1
needAddLimit Boolean 0..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/

作者:高玉珑

来源:宜信技术学院

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 关系型数据库 网络安全
Navicat Premium 17 最新版下载与配置:5分钟完成企业级数据库工具部署
Navicat Premium 17 是一款支持多种主流数据库(如 MySQL、Oracle、PostgreSQL 等)的多数据库管理工具,提供可视化数据建模、SQL 编辑和数据同步等功能。试用版提供 14 天全功能体验,商业版支持跨平台使用。安装环境要求 Windows 10/11 或 macOS 12.0+,最低配置为 4GB 内存。下载并解压安装包后,按步骤启动安装程序、接受许可协议、自定义安装路径并完成安装。首次运行时需激活许可证并配置数据库连接。常见问题包括无法写入注册表、试用期续费及连接数据库权限问题。高级功能涵盖 SSH 通道加速、自动化任务调度和性能调优建议。
85 19
|
4月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
18天前
|
数据库
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。
|
18天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
4月前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
4月前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
270 9
|
4月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
204 3
|
4月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
4月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
399 2
|
4月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
103 2

热门文章

最新文章