【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

评论 1 条评论

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

重磅发布全总结丨一文看懂阿里云弹性计算年度峰会

阿里云弹性计算

弹性计算 年度峰会

“有创业者的地方,创业邦一直都在” 创业邦100未来独角兽峰会暨2021创业邦年会圆满落幕

创业邦

智慧社区小程序搭建,智慧平安社区解决方案

电微13828808271

CSS之变量(二)条形加载条

Augus

CSS 12月日更

语音信号处理1:语音信号处理的发展

轻口味

安全漏洞之任意文件上传漏洞分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

由IDC余热回收创新技术实践引出的跨界合作探讨

安第斯智能云

算力 碳中和 节能 跨界合作

致敬全新的未来!创业邦100未来独角兽峰会暨2021创业邦年会成功举办

创业邦

干货分享!边云融合的时序时空数据库实践详解

百度开发者中心

物联网 时序数据库

情报信息分析研判系统搭建,情指勤一体化平台建设开发

电微13828808271

波卡生态的去中心化存储Crust Network | Hoo虎符研究院

区块链前沿News

波卡生态挖矿 Hoo虎符 虎符交易所 虎符研究院 去中心化存储

CameraX ImageAnalysis

Changing Lin

12月日更

重点人员管控系统开发搭建,指挥调度平台建设方案

电微13828808271

全球IT服务将增1.3万亿美元,联想持续布局智慧服务能力

科技大数据

模块7作业

Asha

如何开始移动网站测试

FunTester

测试 web测试 FunTester 移动端测试 响应式网页

Log4j2 Zero Day 漏洞 Apache Flink 应对指南

Apache Flink

大数据 flink log4j2

语音信号处理 4:汉语中语音的分类及韵律特性

轻口味

28天写作 12月日更

区块链数字收藏品平台开发,数字藏品交易平台搭建

电微13828808271

把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统

刘悦的技术博客

tornado 实时通信 Vue 3 web socket redis'

2021低代码平台推荐,每一个都具有10年行业开发经验!

J2PaaS低代码平台

低代码 低代码开发 低代码开发平台 地代码平台

饿了么小程序容器首屏秒开优化实践

阿里巴巴终端技术

小程序 App 移动开发 客户端 小程序容器

语音信号处理2:语音信号处理的应用

轻口味

语音信号处理3:语音信号处理的的整体结构

轻口味

[架构实战营] 模块七作业

张祥

架构实战营

微服务架构 | 如何利用日志链路追踪程序执行的慢SQL?

码农架构

性能分析 微服务治理 慢SQL 链路分析

如何在 GitHub 上高效阅读源码?

AlwaysBeta

GitHub 源码 源码分析 源码阅读 源码解析

飞桨EasyDL桌面版正式发布 本地数据、本地网络、本地算力也能高效建模

科技热闻

优酷 Android 构建速度优化实践

阿里巴巴终端技术

android App Gradle 移动开发 客户端

清河机械:用宜搭建设工厂数字化系统,节省80%开发成本

一只大光圈

阿里巴巴 低代码 数字化转型 钉钉宜搭

CRM系统如何帮助企业改变销售周期

低代码小观

程序员 销售管理 销售 CRM CRM系统

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