基于 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-xzvfjdk-8u152-linux-x64.tar.gz
ln-sjdk1.8.0_152java

3、配置 Java 环境变量

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

复制代码

exportJAVA_HOME=/gpdb/java
exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
exportCLASSPATH=.:$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-xzvfmysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
ln-smysql-8.0.11-linux-glibc2.12-x86_64mysql

3、配置 MySQL 环境变量

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

export PATH=$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 目录。

复制代码

exportMYCAT_HOME=/gpdb/MyCat
exportPATH=$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/0218:20:04| Launching a JVM...
INFO | jvm1|2018/07/0218:20:04| Wrapper (Version3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm1|2018/07/0218:20:04| Copyright1999-2006Tanuki Software, Inc. All Rights Reserved.
INFO | jvm1|2018/07/0218:20:04|
INFO | jvm1|2018/07/0218:20:06| log4j:WARN No appenders could be foundforlogger (io.MyCat.memory.MyCatMemory).
INFO | jvm1|2018/07/0218:20:06| log4j:WARN Please initialize the log4j system properly.
INFO | jvm1|2018/07/0218:20:06| log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
INFO | jvm1|2018/07/0218:20:10| MyCat Server startup successfully. see logsinlogs/MyCat.log

2)启动遇到的问题

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

复制代码

2018-06-29 14:53:02.257INFO[WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:329)) - Startup processors...,total processors:32,aio threadpoolsize:64
each process allocated socket bufferpoolbytes ,apagesize:2097152 a page's chunk number(PageSize/ChunkSize) is:512 buffer page's number is:640
2018-06-29 14:53:02.257INFO[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.319ERROR[WrapperSimpleAppMain] (io.MyCat.MyCatStartup.main(MyCatStartup.java:62)) - 2018-06-29 14:53:03 startuperror
java.lang.NumberFormatException: Size must be specified as bytes (b), kibibytes (k), mebibytes (m), gibibytes (g), tebibytes (t),orpebibytes(p). E.g. 50b, 100k,or250m.
Failedtoparse 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 (inMB)
wrapper.java.initmemory=16

# Maximum Java Heap Size (inMB)
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 配置文件,这一段的配置是注释的,因此无论如何更改端口号,不除掉注释是不会生效的 。本次测试中直接将服务端口号复制出来新增一行。

复制代码

<!--
3306 9066
300000 0.0.0.0
4096 32-->

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

复制代码

3306 9066

2、增加 MyCat 用户

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

参考如下:

复制代码

123456
szabm 
false

本次新增了个 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),每个表一个分片规则。

复制代码







4、增加 MyCat 数据节点

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

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

复制代码





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

5、增加 MyCat 分片规则

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

复制代码


ACCT_BALANCE_ID
mod-long_abm




COUNTER_ID
mod-long_abm




SUBSID
mod-long_abm




RESOURCE_ID
mod-long_abm




5

MyCat 服务验证

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

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

参考命令如下:

复制代码

netstat -an| grep 8066
netstat -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