时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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

评论 1 条评论

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

软件测试 | 编写单元测试用例

测吧(北京)科技有限公司

测试

网易云商·七鱼智能客服自适应 ProtoStuff 数据库缓存实践

网易智企

Java 数据库 缓存

Unsafe Unlink:unlink利用

郑州埃文科技

漏洞

Dynamic Wallpaper Mac(视频动态壁纸) v14.3免激活

真大的脸盆

Mac Mac 软件 视频动态壁纸 高清动态壁纸

构建新一代智慧园区移动应用以推动数字转型

FinFish

智慧城市 移动开发 智慧园区 小程序容器 小程序技术

「AI之劫」:当机器超越人类底线,正在侵犯我们的创造力和道德

加入高科技仿生人

人工智能 低代码 AIGC

如何从命令行启动 CST 软件?

思茂信息

RocketMQ 在小米的多场景灾备实践案例

Apache RocketMQ

RocketMQ

FCPX插件-手势点击滑动视频转场 Hand Gesture Transitions

真大的脸盆

Mac Mac 软件 fcpx插件 视频特效插件 转场效果插件

互联网用户之间如何传输大文件

镭速

直播预告 | 博睿学院:智能告警与AIOps融合探索

博睿数据

根因分析 智能运维 智能告警 博睿数据 博睿学院

住宅代理的未来:挑战、趋势和机遇

摘星星的猫

火山引擎DataLeap数据调度实例的 DAG 优化方案 (二):功能设计

字节跳动数据平台

大数据平台 DAG DataLeap

APP和小程序共同塑造现代化政务服务

FinFish

小程序 小程序容器 小程序化 小程序技术 政务服务

PAG动效框架源码笔记 (二)层级视图

olinone

ios 动效 andiod 特效

镭速传输:安全文件传输的意义

镭速

软件测试 | Django客户端测试

测吧(北京)科技有限公司

测试

热技术冷思考:AIGC为SaaS带来的不能只有盲目自信

ToB行业头条

小程序技术助力智慧家居生态互联

FinFish

智慧城市 小程序容器 智慧家居 小程序化 小程序技术

软件测试 | unittest单元测试框架

测吧(北京)科技有限公司

测试

MegEngine 使用小技巧:用 mperf 进行安卓 opencl 算子的 roofline 分析

MegEngineBot

深度学习 开源 MegEngine roofline

AIGC背后的技术分析 | 知识图谱

TiAmo

自然语言处理 机器学习 知识图谱 AIGC

数据智能加持下,中小微企业告别“融资难”

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

共享电单车如何投放运营?流程介绍!

共享电单车厂家

共享电动车厂家 本铯智能电动车厂家 共享电动车投放 共享电单车运营

AREX Agent 源码解读之全链路跟踪和 Mock 数据读写

AREX 中文社区

Java 测试

AI女友同时和1000人谈恋爱,狂赚500万

引迈信息

人工智能 AI 低代码 JNPF

忙碌的七个层次

宇宙之一粟

生活 工作

基于WebGL智慧储能电站三维管理平台

2D3D前端可视化开发

物联网 数字孪生 智慧储能电站 微电网

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