基于MyCat构建MySQL分布式集群

2024-08-22 00:32

本文主要是介绍基于MyCat构建MySQL分布式集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

梁铭图,新炬网络首席架构师,十多年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP以及华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。

 

什么是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.gz

ln -s jdk1.8.0_152 java

 

3、配置Java环境变量

 

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

 

 

export JAVA_HOME=/gpdb/java

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

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

 

 

tar -xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz

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

 

 

export MYCAT_HOME=/gpdb/MyCat

export 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.org

INFO   | 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:640

2018-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 error

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.

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 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后能够正常访问。

这篇关于基于MyCat构建MySQL分布式集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094721

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了