31

基于 MyCat 构建 MySQL 分布式集群

 3 years ago
source link: https://www.infoq.cn/article/Yphz4wTZO4kpuyzgciCR
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文由 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 个节点)。

RJfqMjA.png!web

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 配置文件架构

Q7JnamU.png!web

MyCat 配置文件变更

1、变更 MyCat 端口

MyCat 的默认服务端口是 8066,为了保证与 MySQL 的常用端口保持一致,本次测试中将端口变更为 3306。 特别注意的是在 server.xml 配置文件,这一段的配置是注释的,因此无论如何更改端口号,不除掉注释是不会生效的 。本次测试中直接将服务端口号复制出来新增一行。

复制代码

<!--
<propertyname="serverPort">3306</property> <propertyname="managerPort">9066</property>
<propertyname="idleTimeout">300000</property> <propertyname="bindIp">0.0.0.0</property>
<propertyname="frontWriteQueueSize">4096</property> <propertyname="processors">32</property>-->

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

复制代码

<propertyname="serverPort">3306</property> <propertyname="managerPort">9066</property>

2、增加 MyCat 用户

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

参考如下:

复制代码

<username="test">
<propertyname="password">123456</property>
<propertyname="schemas">szabm </property>
<propertyname="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),每个表一个分片规则。

复制代码

<schemaname="szabm7"checkSQLschema="false"sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<tablename="abm_acct_balance"dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"rule="abm_acct_balance-rule"/>
<tablename="abm_counter"dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"rule="abm_counter_rule"/>
<tablename="abm_realtime_fee"dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"rule="abm_realtime_fee_rule"/>
<tablename="abm_resource_present"dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"rule="abm_resource_present_rule"/>
</schema>

4、增加 MyCat 数据节点

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

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

复制代码

<dataNodename="ceph3"dataHost="ceph3db"database="szabm"/>
<dataNodename="ceph4"dataHost="ceph4db"database="szabm"/>
<dataNodename="ceph5"dataHost="ceph5db"database="szabm"/>
<dataNodename="ceph6"dataHost="ceph6db"database="szabm"/>
<dataNodename="ceph7"dataHost="ceph7db"database="szabm"/>

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

5、增加 MyCat 分片规则

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

复制代码

<tableRulename="abm_acct_balance-rule">
<rule>
<columns>ACCT_BALANCE_ID</columns>
<algorithm>mod-long_abm</algorithm>
</rule>
</tableRule>
<tableRulename="abm_counter_rule">
<rule>
<columns>COUNTER_ID</columns>
<algorithm>mod-long_abm</algorithm>
</rule>
</tableRule>
<tableRulename="abm_realtime_fee_rule">
<rule>
<columns>SUBSID</columns>
<algorithm>mod-long_abm</algorithm>
</rule>
</tableRule>
<tableRulename="abm_resource_present_rule">
<rule>
<columns>RESOURCE_ID</columns>
<algorithm>mod-long_abm</algorithm>
</rule>
</tableRule>
<functionname="mod-long_abm"class="io.MyCat.route.function.PartitionByMod">
<!-- how many data nodes -->
<propertyname="count">5</property>
</function>

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK