写点什么

基于 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:063567

评论 1 条评论

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

AI 技术在英语学习中的应用

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

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

昆仑芯超节点创新设计:1U 4 卡高密算力,无缝适配各类机房环境

Baidu AICLOUD

nvidia 昇腾 超节点 910C NVL72

时序数据库 TDengine × Superset:开源界的时序可视化黄金组合

TDengine

tdengine 时序数据库 数据库·

MCP Server On FC之旅2: 从0到1-MCP Server市场构建与存量OpenAPI转MCP Server

阿里巴巴云原生

阿里云 云原生 函数计算

YashanDB:助力企业攻克AI时代数据管理难题,拥抱智能转型

极客天地

从40秒到11毫秒:TiDB环境下一次SQL深潜优化实战

TiDB 社区干货传送门

性能调优 7.x 实践 TiDB Cloud TiDB第四届征文-运维开发之旅

【CodeBuddy】三分钟开发一个实用小功能之:霓虹灯管菜单导航

jimaks

CSS

#放码来战.端云一体化开发#HarmonyOS 5 【农民叔叔】04.创建端云一体化工程项目

与辉鸿蒙

HarmonyOS HarmonyOS NEXT 端云一体化

微信小游戏外包开发流程

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

小游戏开发 软件外包公司 游戏开发公司

鸿蒙仓颉开发语言实战教程:实现商城应用详情页

幽蓝计划

从细胞工厂到智能制造:Extracellular 用时序数据库 TDengine 打通数据生命线

TDengine

tdengine 时序数据库 数据库‘’

为什么说MES越早上越好,8个问题带你读懂MES生产管理!

积木链小链

数字化转型 智能制造

微信小游戏的上线流程

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

游戏开发 微信小游戏 软件外包公司

EMQX Cloud 、时序数据库 TDengine Cloud 实现数据互通!联手打造端到端云上大数据解决方案

TDengine

数据库 tdengine 时序数据库

「金融证券行业」 如何搭建自己的研发智能管理体系?

禅道项目管理

项目 金融 银行 项目管理软件 软件项目管理

低成本也能实现大模型应用开发,英特尔与火山引擎是怎么做到的?

E科讯

“深时数字地球”国际大科学计划系列工作坊持续开放!专业友好可复现,赋能科学智能生态合作(1)

ModelWhale

科学智能 AI4S DDE 深时数字地球

从炫技到实用,天工超级智能体(Skywork Super Agents)的破冰之旅

脑极体

AI

CST软件TDR时域仿真实例

思茂信息

cst CST软件 CST Studio Suite

通义灵码上下文能力解析:自由组合需求描述,生成结果更高效

阿里云云效

阿里云 云原生 通义灵码

TiDB 全文搜索功能公开测试中

TiDB 社区干货传送门

新版本/特性解读

浅聊一下搭建企业私有知识库的可行方案

为自己带盐

人工智能 RAG应用

重磅!一文彻底搞懂 AI Agent

Techinsight

深度探讨:企业级智能体为何成为企业数字化转型新宠?

Techinsight

风靡全网的《羊了个羊》,其实可以用几百行代码复刻?

不惑

CodeBuddy首席试玩官

WebGL与APP之间的通讯方式

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

软件外包公司 webgl开发 webgl外包公司

英特尔至强6家族又添新成员:释放GPU潜能,AI性能更出色

E科讯

通义灵码上下文能力解析:自由组合需求描述,生成结果更高效

阿里巴巴云原生

阿里云 云原生 通义灵码

混合应用开发新范式:2025年企业级移动生态降本增效破局点

xuyinyin

Higress 入选全球 Top 100 MCP Servers 榜单|MCPMarket.com

阿里巴巴云原生

阿里云 云原生 Higress

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