写点什么

基于 MyCat 构建 MySQL 分布式集群

2020 年 7 月 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 年 7 月 20 日 14:062170

评论 1 条评论

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

区块链云算力挖矿平台开发公司,云算力软件开发价格

135深圳3055源中瑞8032

钻石与小度:智能语音助手背后的“马斯洛需求模型”

脑极体

承兑商支付平台开发搭建,USDT支付系统解决方案

135深圳3055源中瑞8032

DDIA 读书笔记(3)数据编码与演化

莫黎

Mac常见问题解决方案与使用技巧

jiangling500

Mac

第六周 Doris临时故障时序图

Geek_fabd84

最实用的无线PORTAL测试案例

网络技术平台

测试 无线网络 网络

作业一:

丁乐洪

CAP 原理

黄立

CAP

C 语言实现一个简单的 web 服务器

C语言与CPP编程

c c++ socket C语言 HTTP

打破内卷化,AppGallery Connect的全生命周期赋能方案

脑极体

新手初学Java性能之 垃圾收集器

Java架构师迁哥

架构师训练营第 2 周学习总结

菜青虫

极客大学架构师训练营

架构师训练营第 1 期第 6 周作业

du tiezheng

极客大学架构师训练营

二、ood原则

Geek_28b526

第二周-作业

Geek_0b0f83

极客大学架构师训练营

软考资料学习库

玄兴梦影

jdk 源码系列之HashMap

sinsy

源码 jdk HashMap底层原理

写时复制集合 —— CopyOnWriteArrayList

程序员小航

Java 源码 并发 源码阅读 JUC

cglib 入门前篇

Rayjun

Java cglib

成为架构师 - 架构师训练营第 02 周

陈永龙Vincent

架构师训练营第二周作业

李日盛

架构

前端组件化

韩向民

架构师训练营第 1 期 week6

张建亮

极客大学架构师训练营

架构师训练营第 1 期 week6 总结

张建亮

极客大学架构师训练营

深入浅出System.gc() 源码解读

AI乔治

Java 架构

架构师训练营第六周作业

我是谁

极客大学架构师训练营

区块链钱包开发技术公司,数字钱包APP系统搭建

135深圳3055源中瑞8032

第2周 框架设计-作业

SuGeek

架构师训练营第 2 周课后练习

菜青虫

极客大学架构师训练营

架构训练营第二周学习小结

李日盛

OCR技术的未来发展与演进

OCR技术的未来发展与演进

基于MyCat构建MySQL分布式集群-InfoQ