2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

基于 MyCat 构建 MySQL 分布式集群

  • 2020-07-20
  • 本文字数:6102 字

    阅读完需:约 20 分钟

基于MyCat构建MySQL分布式集群

本文由 dbaplus 社群授权转载。

什么是 MyCat

MyCat 是一个开源的分布式数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。


MyCat 通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。


  1. Schema:逻辑库,与 MySQL 中的 Database(数据库)对应,一个逻辑库中定义了所包括的 Table。

  2. Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点 DataNode。在此可以指定表的分片规则。

  3. DataNode:MyCat 的逻辑数据节点,是存放 table 的具体物理节点,也称之为分片节点,通过 DataSource 来关联到后端某个具体数据库上。

  4. DataSource:定义某个物理库的访问地址,用于捆绑到 Datanode 上。

  5. 分片规则:前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

测试 MySQL 分布式集群架构

本次测试环境部署集群架构为 MyCat 1.6.5(2 个节点)+MySQL 8.0.11(5 个节点)。


MySQL 节点安装与配置

首先在 5 个数据库节点中安装 MySQL 8.0.11,参考 MySQL 的官方文档,8.0.11 的安装与 5.7 安装基本上是一样的。安装 MySQL 软件后,每个 MySQL 数据库都创建一个数据库名称为 szabm。篇幅所限,MySQL 的安装和配置过程就此略过。


但是值得注意的是,使用参考常规方法安装完数据库,其中最重的一个配置是“lower_case_table_names=1”,表示不区分大小写。如果不配置该参数,容易由于大小写问题而找不到表。

安装 Java

1、下载软件


从 Java 的官网下载 Java 的二进制包,本次下载的版本是 jdk-8u152-linux-x64.tar.gz。


注:必须 JDK7 或更高版本。


2、解压软件


使用 tar 命令解压上传好的二进制软件包,为了方便管理,创建一个 Java 的软链接。


tar -xzvf jdk-8u152-linux-x64.tar.gzln -s jdk1.8.0_152 java
复制代码


3、配置 Java 环境变量


参考实际的 Java 安装目录,配置环境变量,如下仅供参考。


export JAVA_HOME=/gpdb/javaexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
复制代码

安装 MySQL 客户端

1、下载软件


从 MySQL 的官网下载二进制包的软件,本次由于后端要部署 MySQL 数据库,因此直接下载了服务端当客户端使用,本次下载为 mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz。


2、解压软件


使用 tar 命令解压上传的 MySQL 二进制软件包,为了方便管理,创建了一个 MySQL 的软链接。


tar -xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gzln -s mysql-8.0.11-linux-glibc2.12-x86_64 mysql
复制代码


3、配置 MySQL 环境变量


MySQL 客户端的环境变量,只需要配置 bin 目录路径即可。


export PATH=/gpdb/mysql/bin

MyCat 软件安装

1、下载软件


从 MyCat 的官网下载 MyCat 软件,本次使用的是很久之前下载的 MyCat 1.6.5 版本。


2、解压软件


使用 tar 命令解压软件,解压之后,直接在当前目录生成一个 MyCat 的目录。


tar -xzvf MyCat-server-1.6.5-release-20180122220033-linux.tar.gz


3、配置环境变量


运行 MyCat 需要配置 MYCAT_HOME 环境变量,和 bin 目录。


export MYCAT_HOME=/gpdb/MyCatexport PATH=$PATH:$MYCAT_HOME/bin
复制代码


4、启动 MyCat


1)启动 MyCat


使用 MyCat start 命令启动 MyCat 服务。MyCat 默认为服务端口是 8066,管理端口是 9066。


MyCat start


执行完成在$MYCAT_HOME 目录下的 logs 目录,查看 wrapper.log 日志文件,成功启动提示如下:


STATUS | wrapper  | 2018/07/02 18:20:04 | Launching a JVM...INFO   | jvm 1    | 2018/07/02 18:20:04 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.orgINFO   | jvm 1    | 2018/07/02 18:20:04 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.INFO   | jvm 1    | 2018/07/02 18:20:04 | INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN No appenders could be found for logger (io.MyCat.memory.MyCatMemory).INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN Please initialize the log4j system properly.INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.INFO   | jvm 1    | 2018/07/02 18:20:10 | MyCat Server startup successfully. see logs in logs/MyCat.log
复制代码


2)启动遇到的问题


本次测试中遇到启动 MyCat 失败,提示内存参数存在问题。于是进入到$MYCAT_HOME/conf 目录下,找到 wrapper.conf 文件,找到内存的相关参数。


2018-06-29 14:53:02.257  INFO [WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:329)) - Startup processors ...,total processors:32,aio thread pool size:64     each process allocated socket buffer pool  bytes ,a page size:2097152  a page's chunk number(PageSize/ChunkSize) is:512  buffer page's number is:6402018-06-29 14:53:02.257  INFO [WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:330)) - sysconfig params:SystemConfig [processorBufferLocalPercent=100, frontSocketSoRcvbuf=1048576, frontSocketSoSndbuf=4194304, backSocketSoRcvbuf=4194304, backSocketSoSndbuf=1048576, frontSocketNoDelay=1, backSocketNoDelay=1, maxStringLiteralLength=65535, frontWriteQueueSize=2048, bindIp=0.0.0.0, serverPort=8066, managerPort=9066, charset=utf8, processors=32, processorExecutor=64, timerExecutor=2, managerExecutor=2, idleTimeout=1800000, catletClassCheckSeconds=60, sqlExecuteTimeout=300, processorCheckPeriod=1000, dataNodeIdleCheckPeriod=300000, dataNodeHeartbeatPeriod=10000, clusterHeartbeatUser=_HEARTBEAT_USER_, clusterHeartbeatPass=_HEARTBEAT_PASS_, clusterHeartbeatPeriod=5000, clusterHeartbeatTimeout=10000, clusterHeartbeatRetry=10, txIsolation=3, parserCommentVersion=50148, sqlRecordCount=10, bufferPoolPageSize=2097152, bufferPoolChunkSize=4096, bufferPoolPageNumber=640, maxResultSet=524288, bigResultSizeSqlCount=10, bufferUsagePercent=80, flowControlRejectStrategy=0, clearBigSqLResultSetMapMs=600000, defaultMaxLimit=100, sequnceHandlerType=2, sqlInterceptor=io.MyCat.server.interceptor.impl.DefaultSqlInterceptor, sqlInterceptorType=select, sqlInterceptorFile=/gpdb/MyCat/logs/sql.txt, mutiNodeLimitType=0, mutiNodePatchSize=100, defaultSqlParser=druidparser, usingAIO=0, packetHeaderSize=4, maxPacketSize=16777216, MyCatNodeId=1]2018-06-29 14:53:03.319 ERROR [WrapperSimpleAppMain] (io.MyCat.MyCatStartup.main(MyCatStartup.java:62)) - 2018-06-29 14:53:03 startup errorjava.lang.NumberFormatException: Size must be specified as bytes (b), kibibytes (k), mebibytes (m), gibibytes (g), tebibytes (t), or pebibytes(p). E.g. 50b, 100k, or 250m.Failed to parse byte string: -375809638B        at io.MyCat.memory.unsafe.utils.JavaUtils.byteStringAs(JavaUtils.java:223) ~[MyCat-server-1.6.5-release.jar:?]
复制代码


通过查阅相关文件对内存参数的多次尝试,最终开启如下两个参数,才成功启动服务。


# Initial Java Heap Size (in MB)wrapper.java.initmemory=16
# Maximum Java Heap Size (in MB)wrapper.java.maxmemory=4096
复制代码

MyCat 配置文件

1、MyCat 配置文件说明


MyCat 的配置文件全部存储在$MYCAT_HOME/conf 目录下,主要是 3 个文件,全部采用 xml 格式编写。


  • server.xml:MyCat 服务器参数调整和用户授权的配置文件。

  • schema.xml:是逻辑库定义和表以及分片定义的配置文件。

  • rule.xml:是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件。


注:配置文件修改,需要重启 MyCat 或者通过 9066 端口 reload。


2、MyCat 配置文件架构


MyCat 配置文件变更

1、变更 MyCat 端口


MyCat 的默认服务端口是 8066,为了保证与 MySQL 的常用端口保持一致,本次测试中将端口变更为 3306。特别注意的是在 server.xml 配置文件,这一段的配置是注释的,因此无论如何更改端口号,不除掉注释是不会生效的。本次测试中直接将服务端口号复制出来新增一行。


<!--                        <property name="serverPort">3306</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> -->
复制代码


本次采用在 server.xml 文件新增一行参数配置。


                <property name="serverPort">3306</property> <property name="managerPort">9066</property>
复制代码


2、增加 MyCat 用户


登陆 MyCat 的用户都是存储在 server.xml 配置文件的尾部,最好的办法是直接复制一个用户,然后进行相关变更。


参考如下:


        <user name="test">                <property name="password">123456</property>                <property name="schemas">szabm </property>                <property name="readOnly">false</property>        </user>
复制代码


本次新增了个 test 用户,密码是“123456”,能够访问的数据库是“szabm”,具有读写权限。这里用户访问的数据库必须在 schema.xml 文件中配置。


3、增加 MyCat 数据库


MyCat 中的数据库一般通称为逻辑数据库,一般建议与后端的 MySQL 数据库实际名称保持一致。server.xml 用户配置的逻辑数据库必须与 schema.xml 中的逻辑数据库保持一致。在启动 MyCat 是会自动进行检查,必须保持一致。


本次在测试在 schema.xml 配置了 1 个 szabm 的逻辑数据库,包含 4 个测试表(abm_acct_balance,abm_counter,abm_realtime_fee,abm_resource_present,表名必须与后端的 MySQL 数据库实际表名保持一致)。每个表存储在 5 个数据节点(ceph3,ceph4,ceph5,ceph6,ceph7),每个表一个分片规则。


 <schema name="szabm7" checkSQLschema="false" sqlMaxLimit="100"> <!-- auto sharding by id (long) -->      <table name="abm_acct_balance" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"  rule="abm_acct_balance-rule" />      <table name="abm_counter" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_counter_rule" />      <table name="abm_realtime_fee" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_realtime_fee_rule" />      <table name="abm_resource_present" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_resource_present_rule" />        </schema>
复制代码


4、增加 MyCat 数据节点


MyCat 中的数据节点就是逻辑的数据存储节点,表与数据节点之间为 1 对多的关系。每个逻辑节点对应一个后端的逻辑主机和实际数据库,即逻辑节点,逻辑主机,实际数据库之间全部为一一对应的关系,数据库名称为同一个,是后端 MySQL 数据库的实际数据库名称。


本次的测试参考节点如下:


        <dataNode name="ceph3" dataHost="ceph3db" database="szabm" />        <dataNode name="ceph4" dataHost="ceph4db" database="szabm" />        <dataNode name="ceph5" dataHost="ceph5db" database="szabm" />        <dataNode name="ceph6" dataHost="ceph6db" database="szabm" />        <dataNode name="ceph7" dataHost="ceph7db" database="szabm" />
复制代码


本次配置了 5 个逻辑数据节点,对应 5 个逻辑主机,对应的是后端同一个数据库 szabm7。


5、增加 MyCat 分片规则


MyCat 的分片规则,表明该表按什么算法规则进行分节点数据存储。现在 MySQL 支持多种的分片规则,本次的分片规则采用最简单的求模取余。


        <tableRule name="abm_acct_balance-rule">                <rule>                        <columns>ACCT_BALANCE_ID</columns>                        <algorithm>mod-long_abm</algorithm>                </rule>        </tableRule>        <tableRule name="abm_counter_rule">                <rule>                        <columns>COUNTER_ID</columns>                        <algorithm>mod-long_abm</algorithm>                </rule>        </tableRule>        <tableRule name="abm_realtime_fee_rule">                <rule>                        <columns>SUBSID</columns>                        <algorithm>mod-long_abm</algorithm>                </rule>        </tableRule>        <tableRule name="abm_resource_present_rule">                <rule>                        <columns>RESOURCE_ID</columns>                        <algorithm>mod-long_abm</algorithm>                </rule>        </tableRule>        <function name="mod-long_abm" class="io.MyCat.route.function.PartitionByMod">                <!-- how many data nodes -->                <property name="count">5</property>        </function>
复制代码

MyCat 服务验证

1、检查 MyCat 服务的端口状态


在使用 MySQL 客户端登陆验证之前,可以先检查 MyCat 的服务端口和管理端口是否存在。


参考命令如下:


netstat -an | grep 8066netstat -an | grep 9066
复制代码


2、使用 MySQL 客户端连接 MyCat 服务


可以使用 MySQL 客户端连接 MyCat 服务,特别注意端口是 8066。


参考命令如下:


mysql -uuser -puser -h127.0.0.1 -P8066
复制代码


注:由于本次安装的客户端是 8.0.11 版本,发现不兼容 MyCat 1.6.5 版本,所以后面将 MySQL 的客户端变更为 5.7.20 后能够正常访问。


作者介绍


梁铭图,新炬网络首席架构师,十多年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有 Oracle OCM、Togaf 企业架构师(鉴定级)、IBM CATE 等认证,曾获 dbaplus 年度 MVP 以及华为云 MVP 等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650791953&idx=2&sn=0491614a1b3da23f3b41c300fa35e0e1&chksm=f3f95584c48edc9219a104014e3a442907caf6144398ce86ef0e6d9c130f6c48893bdfe8cb41&scene=27#wechat_redirect


2020-07-20 14:063246

评论 1 条评论

发布
用户头像
老师对mycat2有没有深入研究
2021-01-31 10:43
回复
没有更多了
发现更多内容

IDC报告:忆联狂揽中国企业级SSD市场三连冠,自有品牌出货量同比激增117%

财见

加速 AI 推理,焱融全闪存储成就 KVCache 以存换算关键一跃

焱融科技

人工智能 AI推理 KVCache

汽车人,变形出发?

脑洞汽车

AI

得物自研DScript2.0脚本能力从0到1演进

得物技术

MyEMS能耗数据上报省市重点用能单位能耗在线监测系统平台

开源能源管理系统

开源 能源管理

开源能源管理系统在安全自主可控方面的重要性

开源能源管理系统

开源 能源管理

干货 | 异构数据库日志怎么解析才不踩坑?

tapdata

异构数据库日志解析 日志结构化处理 TapData日志采集, 数据变更捕获CDC

还不懂什么是“进销存”吗?一文带你读懂!

积木链小链

数字化转型 智能制造 生产管理 进销存管理

Grafana与MyEMS的比较分析

开源能源管理系统

开源 能源管理

Illustrator 2024 for Mac(AI2024领先的矢量图形软件)v28.1中文激活版

Rose

放弃「人盯人」,把控项目又有怎样的解题思路?

禅道项目管理

项目管理 甘特图 项目管理软件 禅道 甘特图软件

从云原生到小程序生态:容器技术驱动的应用开发变革

xuyinyin

MCP Server On FC 之旅第 4 站:长连接闲置计费最高降低 87% 成本的技术内幕

阿里巴巴云原生

阿里云 云原生 函数计算

开启报名|Nacos3.0 开源开发者沙龙 Agent&MCP 专场

阿里巴巴云原生

阿里云 开源 云原生 nacos

那些被历史抛弃的汽车

脑洞汽车

AI

平衡的艺术——精确财务规划与敏捷业务管理

智达方通

财务分析 财务规划

NocoBase v1.7.0 正式版发布

NocoBase

开源 低代码 零代码 插件 版本更新

AI技术改变英语学习的方式

北京木奇移动技术有限公司

软件外包公司 AI英语学习 AI技术应用

2025年碳材料展|2025第九届上海国际碳材料大会

秋硕展览

2025河南新零售展|2025郑州国际自有品牌展会

秋硕展览

烟草行业监管新利器:中烟创新案卷评审评查系统提速监管效能

中烟创新

RS485总线是否必须加120Ω终端电阻

开源能源管理系统

开源 能源管理

让通义千问3帮忙算笔账:中小研发团队用云消息队列比自建开源省多少?

阿里巴巴云原生

阿里云 云原生 云消息队列

荣耀开发者服务平台产品功能速递Vol.6丨智能体自助上架功能上线!

荣耀开发者服务平台

荣耀开发者服务平台 AI 智能体 荣耀HONOR YOYO助理

Axure RP 11中文授权码 附安装教程

Rose

告别传统管理!MES系统如何赋能印刷企业数字化升级?

万界星空科技

数字化转型 制造业 mes 印刷行业 万界星空科技

去面试AI大模型,会问到哪些问题?

王中阳Go

AI

焱融科技与英迈中国达成战略合作 共筑 AI 算力存储新生态

焱融科技

MyEMS开源能源管理系统 + EG200 4G网关

开源能源管理系统

开源 能源管理

不懂 PromQL?AI 智能体帮你玩转大规模指标数据分析

阿里巴巴云原生

阿里云 云原生 Prometheus 可观测

金融新纪元:AI正在重塑金融服务业的未来

新消费日报

基于MyCat构建MySQL分布式集群_开源_dbaplus社群_InfoQ精选文章