基于MyCat构建MySQL分布式集群

数据库 MySQL 分布式
MyCat是一个开源的分布式数据库中间件,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问。

 什么是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的软链接。 

  1. tar -xzvf jdk-8u152-linux-x64.tar.gz  
  2. ln -s jdk1.8.0_152 java 

3、配置Java环境变量

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

  1. export JAVA_HOME=/gpdb/java  
  2. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH  
  3. export 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的软链接。 

  1. tar -xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz  
  2. ln -s mysql-8.0.11-linux-glibc2.12-x86_64 mysql 

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目录。 

  1. export MYCAT_HOME=/gpdb/MyCat  
  2. export PATH=$PATH:$MYCAT_HOME/bin 

4、启动MyCat

1)启动MyCat

使用MyCat start命令启动MyCat服务。MyCat默认为服务端口是8066,管理端口是9066。

MyCat start

执行完成在$MYCAT_HOME目录下的logs目录,查看wrapper.log日志文件,成功启动提示如下: 

  1. STATUS | wrapper  | 2018/07/02 18:20:04 | Launching a JVM...  
  2. INFO   | jvm 1    | 2018/07/02 18:20:04 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org  
  3. INFO   | jvm 1    | 2018/07/02 18:20:04 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.  
  4. INFO   | jvm 1    | 2018/07/02 18:20:04 |   
  5. INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN No appenders could be found for logger (io.MyCat.memory.MyCatMemory).  
  6. INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN Please initialize the log4j system properly.  
  7. 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.  
  8. 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文件,找到内存的相关参数。 

  1. 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     
  2.  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:640 
  3.  2018-06-29 14:53:02.257  INFO [WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:330)) - sysconfig params:SystemConfig [processorBufferLocalPercent=100frontSocketSoRcvbuf=1048576frontSocketSoSndbuf=4194304backSocketSoRcvbuf=4194304backSocketSoSndbuf=1048576frontSocketNoDelay=1backSocketNoDelay=1maxStringLiteralLength=65535frontWriteQueueSize=2048bindIp=0.0.0.0, serverPort=8066managerPort=9066charset=utf8processors=32processorExecutor=64timerExecutor=2managerExecutor=2idleTimeout=1800000catletClassCheckSeconds=60sqlExecuteTimeout=300processorCheckPeriod=1000dataNodeIdleCheckPeriod=300000dataNodeHeartbeatPeriod=10000clusterHeartbeatUser=_HEARTBEAT_USER_clusterHeartbeatPass=_HEARTBEAT_PASS_clusterHeartbeatPeriod=5000clusterHeartbeatTimeout=10000clusterHeartbeatRetry=10txIsolation=3parserCommentVersion=50148sqlRecordCount=10bufferPoolPageSize=2097152bufferPoolChunkSize=4096bufferPoolPageNumber=640maxResultSet=524288bigResultSizeSqlCount=10bufferUsagePercent=80flowControlRejectStrategy=0clearBigSqLResultSetMapMs=600000defaultMaxLimit=100sequnceHandlerType=2sqlInterceptor=io.MyCat.server.interceptor.impl.DefaultSqlInterceptor, sqlInterceptorType=selectsqlInterceptorFile=/gpdb/MyCat/logs/sql.txt, mutiNodeLimitType=0mutiNodePatchSize=100defaultSqlParser=druidparserusingAIO=0packetHeaderSize=4maxPacketSize=16777216MyCatNodeId=1
  4.  2018-06-29 14:53:03.319 ERROR [WrapperSimpleAppMain] (io.MyCat.MyCatStartup.main(MyCatStartup.java:62)) - 2018-06-29 14:53:03 startup error 
  5.  java.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. 
  6.  Failed to parse byte string: -375809638B 
  7.          at io.MyCat.memory.unsafe.utils.JavaUtils.byteStringAs(JavaUtils.java:223) ~[MyCat-server-1.6.5-release.jar:?] 

通过查阅相关文件对内存参数的多次尝试,最终开启如下两个参数,才成功启动服务。 

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

  1. <!--  
  2.                         <property name="serverPort">3306</property> <property name="managerPort">9066</property>   
  3.                         <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>   
  4.                         <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> 

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

  1. <property name="serverPort">3306</property> <property name="managerPort">9066</property> 

2、增加MyCat用户

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

参考如下:     

  1. <user name="test">  
  2.              <property name="password">123456</property>  
  3.              <property name="schemas">szabm </property>  
  4.              <property name="readOnly">false</property>  
  5.      </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),每个表一个分片规则。 

  1. <schema name="szabm7" checkSQLschema="false" sqlMaxLimit="100">  
  2. <!-- auto sharding by id (long) -->  
  3.      <table name="abm_acct_balance" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"  rule="abm_acct_balance-rule" />  
  4.      <table name="abm_counter" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_counter_rule" />  
  5.      <table name="abm_realtime_fee" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_realtime_fee_rule" />  
  6.      <table name="abm_resource_present" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_resource_present_rule" />  
  7.        </schema> 

4、增加MyCat数据节点

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

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

  1. <dataNode name="ceph3" dataHost="ceph3db" database="szabm" />  
  2.     <dataNode name="ceph4" dataHost="ceph4db" database="szabm" />  
  3.     <dataNode name="ceph5" dataHost="ceph5db" database="szabm" />  
  4.     <dataNode name="ceph6" dataHost="ceph6db" database="szabm" />  
  5.     <dataNode name="ceph7" dataHost="ceph7db" database="szabm" /> 

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

5、增加MyCat分片规则

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

  1. <tableRule name="abm_acct_balance-rule">  
  2.             <rule>  
  3.                     <columns>ACCT_BALANCE_ID</columns>  
  4.                     <algorithm>mod-long_abm</algorithm>  
  5.             </rule>  
  6.     </tableRule>  
  7.     <tableRule name="abm_counter_rule">  
  8.             <rule>  
  9.                     <columns>COUNTER_ID</columns>  
  10.                     <algorithm>mod-long_abm</algorithm>  
  11.             </rule>  
  12.     </tableRule>  
  13.     <tableRule name="abm_realtime_fee_rule">  
  14.             <rule>  
  15.                     <columns>SUBSID</columns>  
  16.                     <algorithm>mod-long_abm</algorithm>  
  17.             </rule>  
  18.     </tableRule>  
  19.     <tableRule name="abm_resource_present_rule">  
  20.             <rule>  
  21.                     <columns>RESOURCE_ID</columns>  
  22.                     <algorithm>mod-long_abm</algorithm>  
  23.             </rule>  
  24.     </tableRule>  
  25.     <function name="mod-long_abm" class="io.MyCat.route.function.PartitionByMod">  
  26.             <!-- how many data nodes -->  
  27.             <property name="count">5</property>  
  28.     </function> 

MyCat服务验证

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

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

参考命令如下: 

  1. netstat -an | grep 8066  
  2. netstat -an | grep 9066 

2、使用MySQL客户端连接MyCat服务

可以使用MySQL客户端连接MyCat服务,特别注意端口是8066。

参考命令如下:

  1. mysql -uuser -puser -h127.0.0.1 -P8066  

 

责任编辑:庞桂玉 来源: DBAplus社群
相关推荐

2015-07-21 16:23:22

Node.js构建分布式

2022-03-08 07:22:48

Redis脚本分布式锁

2015-07-28 10:14:33

HBasehadoop

2017-08-10 10:17:32

Hadoop分布式搭建

2022-10-19 08:39:46

⾼可⽤分布式集群

2019-09-26 15:43:52

Hadoop集群防火墙

2022-03-29 23:17:52

PostgreSQL集群Citus

2017-09-11 15:17:01

分布式集群负载均衡

2020-09-08 13:25:52

HBase分布式数据库

2017-11-03 15:05:56

Storm数据处理服务器

2022-01-05 19:34:18

AirflowCeleryMYSQL

2015-04-21 09:39:03

javajava分布式爬虫

2017-10-24 11:28:23

Zookeeper分布式锁架构

2018-11-15 12:35:25

Ceph分布式存储

2022-03-21 19:44:30

CitusPostgreSQ执行器

2022-03-27 06:37:37

SQLPostgreSQL集群

2023-01-06 16:42:28

2022-03-08 15:24:23

BitMapRedis数据

2017-04-13 10:51:09

Consul分布式

2022-05-11 13:55:18

高可用性分布式弹性
点赞
收藏

51CTO技术栈公众号