使用Mycat实现数据切分(上)

Posted WhCAT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Mycat实现数据切分(上)相关的知识,希望对你有一定的参考价值。

    

    往期回顾:


    在前一篇文章中,我们把Replication集群和PXC集群搭建起来了,当对数据进行分片处理之后,原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了一个完整的数据库存储。一切看起来似乎都那么的完美,然而问题来了,我们该怎么去统一读写、管理所有的分片数据库集群呢?在应用程序中直接操作,还是使用数据库中间件操作?使用Mycat的意义又是什么呢?


|使用Mycat的意义



    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存储引擎,所以并不是完全意义的分布式数据库系统。那么 Mycat 是什么?


    Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。



    数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。如果没有数据库中间件,那么应用将直接面对分片集群,数据源切换、事务处理、数据聚合都需要应用直接处理,原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的重复造轮子。即使抛开重新造轮子这个问题,轮子造不造的好可能是更大的问题,一不小心可能就会翻车。

使用Mycat实现数据切分(上)

    所以有了数据库中间件,应用只需要集中于业务处理,大量的通用的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要,而Mycat正是你需要的一款高性能数据库中间件。


    Mycat可以把多个集群统一管理起来,Mycat在运行时会把自己虚拟成一个数据库节点,包括虚拟账户虚拟逻辑库、虚拟逻辑表。用户在使用Mycat中间件时如同使用单节点数据库一般简单。


使用Mycat实现数据切分(上)


|垂直切分介绍



    垂直切分是按照业务逻辑进行划分,把一个数据库中的数据表拆分到多个独立的数据库。


使用Mycat实现数据切分(上)


    垂直切分最大的作用是把一个数据库的并发压力分散到不同的数据库节点上。


使用Mycat实现数据切分(上)


    需要注意的是垂直切分不能减少单个表的数据量以及并发压力。


    垂直切分的缺点:

  【1】不能跨mysql节点做表连接查询,只能通过接口方式解决
  【2】跨MySQL节点的事务,需要分布式事务机制来实现


|水平切分介绍



    水平切分是按照某个字段的某种规则,把数据切分到多张数据表(可以是同一数据库的不同数据表,也可以是不同数据库的数据表上)。


使用Mycat实现数据切分(上)


    水平切分最大的作用是减少单个表的数据量和并发压力,如果切分后的表存储在不同的数据库节点上,那也可以减少单个库的数据量和并发压力。


    水平切分的缺点:

  【1】数据切分规则需要根据业务逻辑制定

  【2】集群扩容麻烦,需要做大量的数据迁移工作


    水平切分集群扩容需要慎重,在数据量不断增大的情况下,可以采用水平切分+冷热数据分离的方式解决,把不常用的数据从表中抽离出来,归档到ToKuDB引擎的数据库中。

    

使用Mycat实现数据切分(上)


|单数据库节点项目的演化



    单数据库节点项目在迭代升级成多节点数据库项目的过程中,可以先从水平切分开始做起。先针对单个表做水平切分,再根据不同的业务逻辑划分,做垂直切分。


|容器化部署Mycat



    水平切分和垂直切分的概念以及优缺点介绍完了,接下来就开始安装Mycat了。Mycat基于Java语言编写,所以需要jdk环境。接下来我们就先创建一个JDK容器,并在数据卷目录下安装Mycat程序吧。


下载JDK镜像

docker pull adoptopenjdk/openjdk8docker tag adoptopenjdk/openjdk8 openjdk8docker rm adoptopenjdk/openjdk8


运行容器

docker run -d -it --name mycat1 –v mycat1:/root/server --privileged --net=host  openjdk8


查看Mycat数据卷所在目录


docker inspect mycat1docker volume inspect mycat1


使用Mycat实现数据切分(上)


进入数据卷目录


cd /var/lib/docker/volumes/mycat1/_data


下载mycat压缩包(推荐1.6.7.3版本的),并解压安装


wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gztar -xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz


压缩包解压好了,也就安装完成了。



|Mycat目录结构介绍




解压后的mycat目录结构如下:


使用Mycat实现数据切分(上)

    我们关心的目录有bin、conf、logs目录,这三个目录分别存放了Mycat可执行程序、Mycat配置文件、Mycat运行日志。


    bin 程序目录,除了提供封装成服务的版本之外,也提供了 nowrap 的shell 脚本命令,方便大家选择和修改,进入到 bin 目录:


可使用以下命令前台启动|后台启动|停止|重启|查看运行状态

    

mycat { console | start | stop | restart | status }


    conf 目录下存放配置文件,server.xml 是 Mycat 服务器参数调整和用户授权的配置文件,全局主键生成方式、虚拟逻辑库,虚拟账户都在这里配置,schema.xml 是逻辑库定义和表以及分片定义的配置文件,rule.xml 是分片规则的配置文件,分片规则的具体参数信息单独存放为文件,也放在这个目录下。配置文件修改,需要重启 Mycat 或者通过 9066 端口 reload。


     lib 目录下主要存放 Mycat 依赖的一些 jar 文件。


   日志存放在 logs/mycat.log 中,每天一个文件,日志的配置是在 conf/log4j.xml 中,根据自己的需要,可以调整输出级别为 debug,debug 级别下,会输出更多的信息,方便排查问题。


|端口放行


    

    如果你的Linux系统开启了防火墙,则需要放行8066和9066这2个端口。8066是供外界连接的端口,其实就等效于原来的mysql的默认的3306端口,9066端口用来对Mycat进行配置以及获取状态。


    下面这段代码用于在centos上放行端口

firewall-cmd --zone=public --add-port=8066/tcp --permanentfirewall-cmd --zone=public --add-port=9066/tcp --permanentfirewall-cmd --reload


    至此,Mycat安装完成。当然了,后面还需要对Mycat做大量配置才可以正常使用Mycat。在此之前不妨先运行一下Mycat吧!


    先进入Mycat容器

docker exec -it mycat1  /bin/bash

    进入/root/server目录

cd /root/server/


    可以看到之前在数据卷目录下载的压缩包以及解压后的目录


使用Mycat实现数据切分(上)


    直接进入mycat/bin目录下,在前台运行Mycat


cd mycat/bin/./mycat console

   可以看到Mycat成功运行起来了


使用Mycat实现数据切分(上)

       使用Navicat连接一下(IP为docker虚拟机宿主机ip,端口为8066,默认用户名root,默认密码123456):

        

    

    可以看到,有反应,但报错了。原因是我们还没配置虚拟逻辑库和虚拟数据表。   


    至此,使用Mycat实现数据切分(上)已经完成了,在本篇文章中讲了什么是水平切分、什么是垂直切分,还讲了如何使用Dokcer部署mycat、mycat目录介绍、防火墙端口放行。在后面的章节中,我们将对mycat的配置文件下手,讲解如何配置实现单个PXC集群的负载均衡、单个Replication集群的读写分离、Mycat自带的数据切分规则介绍、自定义数据切分规则、多个PXC集群实现数据切分、多个Replication集群实现数据切分、全局表以及父子表、全局主键生成方式等内容。


    如果你觉得这篇文章对你有帮助,麻烦关注一下我。点一点关注、点一点在看都是对我莫大的鼓励。






以上是关于使用Mycat实现数据切分(上)的主要内容,如果未能解决你的问题,请参考以下文章

使用Mycat实现数据切分(中)

MySQL之分库分表(MyCAT实现)

mycat的切分规则

mycat实现mysql读写分离,热切换,集群

mycat实现mysql读写分离,热切换,集群

读书笔记-Mycat权威指南-10-分片规则