精华内容
下载资源
问答
  • mycat分库分表
    千次阅读
    2022-03-11 21:06:25

    MyCAT分库分表

    一、分库分表简介

    • 在业务数据量过多的时候,而且数据不断持续增长的情况下,为了缓解单台服务器的压力,可以考虑使用分库或者分表方案

    二、垂直切分—分库

    1、思想

    • 一个数据库由很多的表构成,每个表对应这不同的业务,垂直切分是按照业务将表进行手动分类,利用MyCAT中间件进行管理,将同一个数据库中的多个表分开放在多个数据库中

    https://note.youdao.com/yws/public/resource/b7c8a66478a291b31e0f530ec74ae8c3/xmlnote/36AAAFDFE64E49ED8682B3AC8A135EBB/380B36E62D124BC98D5362B60C250EA3/26069

    2、配置实现

    • 环境描述

    192.168.152.10 MySQL服务器

    192.168.152.11 MySQL服务器

    192.168.152.12 MyCAT中间键

    192.168.152.13 测试客户端

    • 分别在两台MySQL上创建测试的库、表

      • 相同的库,不同的表
    • 在数据库db01上安装mariadb-server,创建数据库,account表,为mycat创建连接用户

    #第一个数据库
    [root@db01 ~]# yum -y install mariadb-server
    [root@db01 ~]# systemctl start mariadb
    [root@db01 ~]# systemctl enable mariadb
    Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
    [root@db01 ~]# mysql -uroot
    
    MariaDB [(none)]> create database game charset utf8;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use game;
    Database changed
    MariaDB [game]> create table Account(
        -> id int primary key not null auto_increment,
        -> name char(30));
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [game]> insert into Account(name) values("ljh"),("yxj");
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    MariaDB [game]> select * from Account;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ljh  |
    |  2 | yxj  |
    
    MariaDB [game]> grant all on game.*  to 'mycatuser'@'192.168.152.12' identified by "redhat";
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [game]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    • 在数据库db02上安装mariadb-server,创建数据库,area表,为mycat创建连接用户
    #第二个数据库
    [root@db02 ~]# yum -y install mariadb-server
    [root@db02 ~]# systemctl start mariadb
    [root@db02 ~]# systemctl enable mariadb
    Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
    [root@db02 ~]# mysql -uroot 
    MariaDB [(none)]> create database game charset utf8
        -> ;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use game;
    Database changed
    MariaDB [game]> create table area(
        -> aid int not null primary key auto_increment,
        -> aname char(40));
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [game]> insert into area(aname)values("北方大区"),("南方大区");
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    MariaDB [game]> select * from area;
    +-----+--------------+
    | aid | aname        |
    +-----+--------------+
    |   1 | 北方大区     |
    |   2 | 南方大区     |
    +-----+--------------+
    
    MariaDB [game]> grant all on game.*  to 'mycatuser'@'192.168.152.12' identified by "redhat";
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [game]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    
    • 安装MyCAT,配置java环境变量,修改配置文件
    [root@mycat ~]# tar -xf jdk-8u91-linux-x64.tar.gz -C /usr/local/^C
    [root@mycat ~]# tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
    [root@mycat ~]# tail -2 /etc/profile
    export JAVA_HOME=/usr/local/jdk1.8.0_91
    export PATH=$PATH:$JAVA_HOME/bin
    
    [root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
      <schema name="game" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn01">
                    <table name="Account" primaryKey="id" type="global" dataNode="dn01" />
                    <table name="area" primaryKey="aid" type="global" dataNode="dn02" />
            </schema>
    
            <dataNode name="dn01" dataHost="localhost1" database="game" />
            <dataNode name="dn02" dataHost="localhost2" database="game" />
    
            <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM1" url="192.168.152.10:3306" user="mycatuser"
                                       password="redhat">
                            <!-- can have multi read hosts -->
                    </writeHost>
            </dataHost>
    
    
            <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM1" url="192.168.152.11:3306" user="mycatuser"
                                       password="redhat">
                            <!-- can have multi read hosts -->
                    </writeHost>
            </dataHost>
    
    [root@mycat ~]# tail -6 /usr/local/mycat/conf/server.xml
    	<user name="ljh">
    		<property name="password">redhat</property>
    		<property name="schemas">game</property>
    	</user>
    
    </mycat:server>
    [root@mycat ~]# /usr/local/mycat/bin/mycat start
    Starting Mycat-server...
    Mycat-server is already running.
    [root@mycat ~]# netstat -tunlp | grep java
    tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      12735/java          
    tcp6       0      0 :::1984                 :::*                    LISTEN      12735/java          
    tcp6       0      0 :::8066                 :::*                    LISTEN      12735/java          
    tcp6       0      0 :::9066                 :::*                    LISTEN      12735/java          
    tcp6       0      0 :::45934                :::*                    LISTEN      12735/java          
    tcp6       0      0 :::45428                :::*                    LISTEN      12735/java          
    [root@mycat ~]# 
    
    
    • 客户端连接MyCAT进行测试
    MySQL [(none)]> show databases;
    +----------+
    | DATABASE |
    +----------+
    | game     |
    +----------+
    1 row in set (0.01 sec)
    
    MySQL [(none)]> use game;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    MySQL [game]> show tables;
    +----------------+
    | Tables_in_game |
    +----------------+
    | account        |
    | area           |
    +----------------+
    2 rows in set (0.00 sec)
    
    MySQL [game]> insert into account(name)values("jjj"),("ddd");
    ERROR 1146 (42S02): Table 'game.account' doesn't exist
    MySQL [game]> insert into Account(name)values("jjj"),("ddd");
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    MySQL [game]> select * from Account;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ljh  |
    |  2 | yxj  |
    |  3 | jjj  |
    |  4 | ddd  |
    +----+------+
    4 rows in set (0.00 sec)
    
    MySQL [game]> select * from area;
    +-----+--------------+
    | aid | aname        |
    +-----+--------------+
    |   1 | 北方大区     |
    |   2 | 南方大区     |
    |   3 | jjj          |
    |   4 | ddd          |
    +-----+--------------+
    4 rows in set (0.01 sec)
    
    MySQL [game]> 
    
    

    三、水平切分

    • 将上午写的schema.xml server.xml还原
    [root@mycat conf]# cp schema.xml.bak schema.xml
    cp: overwrite ‘schema.xml’? yes
    [root@mycat conf]# cp server.xml.bak server.xml
    cp: overwrite ‘server.xml’? yes
    
    • 先选择对应的规则和函数
    <mycat:rule xmlns:mycat="http://io.mycat/">
            <tableRule name="splitHWrule">
                    <rule>
                            <columns>id</columns>
                            <algorithm>func1</algorithm>
                    </rule>
            </tableRule>
    
            <function name="func1" class="io.mycat.route.function.PartitionByLong">
                    <property name="partitionCount">2</property>
                    <property name="partitionLength">512</property>
            </function>
    </mycat:rule>
    
    • 最后修改这两个配置文件
    [root@mycat conf]# vim schema.xml
           <schema name="phone" checkSQLschema="false" sqlMaxLimit="100">
                    <!-- auto sharding by id (long) -->
                    <table name="hw" dataNode="dn01,dn02" rule="splitHWrule" />
            </schema>
    
            <dataNode name="dn01" dataHost="localhost1" database="phone" />
            <dataNode name="dn02" dataHost="localhost2" database="phone" />
    
            <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM1" url="192.168.152.10:3306" user="mycatuser"
                                       password="redhat">
                            <!-- can have multi read hosts -->
                    </writeHost>
            </dataHost>
            <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM1" url="192.168.152.11:3306" user="mycatuser"
                                       password="redhat">
                            <!-- can have multi read hosts -->
                    </writeHost>
            </dataHost>
    [root@mycat conf]# cat server.xml
    	<user name="ljh">
    		<property name="password">redhat</property>
    		<property name="schemas">phone</property>
    	</user>
    
    
    • 在db01上创建相同数据库,相同的表,为mycat授权
    MariaDB [(none)]> create database phone charset utf8;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use phone;
    Database changed
    MariaDB [phone]> create table hw(
        -> id int primary key not null auto_increment,
        -> name char(30));
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> grant all on phone.* to 'mycatuser'@'192.168.152.12' identified by "redhat";
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> show tables;
    +-----------------+
    | Tables_in_phone |
    +-----------------+
    | hw              |
    +-----------------+
    
    • 在db02上创建相同数据库,相同的表,为mycat授权
    MariaDB [(none)]> create database phone charset utf8;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use database phone;
    ERROR 1049 (42000): Unknown database 'database'
    MariaDB [(none)]> use phone;
    Database changed
    MariaDB [phone]> create table hw(
        -> id int primary key not null auto_increment,
        -> name char(30));
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> grant all on phone.* to 'mycatuser'@'192.168.152.12' identified by "redhat";
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [phone]> select * from hw;
    +------+------+
    | id   | name |
    +------+------+
    |  513 | hzy  |
    | 1021 | zyz  |
    +------+------+
    
    • 用测试机连接创建不同的ID,来测试规则
    [root@localhost ~]# mysql -uljh -predhat -h 192.168.152.12 -P8066
    MySQL [(none)]> show databases;
    +----------+
    | DATABASE |
    +----------+
    | phone    |
    +----------+
    MySQL [phone]> insert into hw(id,name)values(10,"ljh"),(511,"yxj"),(513,"hzy"),(1021,"zyz");
    Query OK, 4 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    MySQL [phone]> select * from hw;
    +------+------+
    | id   | name |
    +------+------+
    |   10 | ljh  |
    |  511 | yxj  |
    |  513 | hzy  |
    | 1021 | zyz  |
    +------+------+
    
    
    #在db01上查看
    MariaDB [phone]> select * from hw;
    +-----+------+
    | id  | name |
    +-----+------+
    |  10 | ljh  |
    | 511 | yxj  |
    +-----+------+
    2 rows in set (0.00 sec)
    #在db02上查看
    MariaDB [phone]> select * from hw;
    +------+------+
    | id   | name |
    +------+------+
    |  513 | hzy  |
    | 1021 | zyz  |
    +------+------+
    
    更多相关内容
  • 基于mysql数据库,搭建配置mycat分库分表环境,编辑conf目录下service.xml,rule.xml,schema.xml三个文件,将数据均匀分配到不同数据库
  • mycat 分库分表

    2017-03-27 18:42:40
    基于mycat1.6.5改进 同时支持分库分表
  • Mycat分库分表

    2021-03-16 14:08:27
    Mycat分库分表

    切分原则

    垂直切分:按照表的分类来进行表的切分,那么水平切分是按照表中的行记录来进行的切分,将表中的行记录按照特定的规则,拆分到某些特定的数据库,实现同一个表的数据分散存储。如下示意图所示:

    水平切分:按照表中的行记录来进行的切分,将表中的行记录按照特定的规则,拆分到某些特定的数据库,实现同一个表的数据分散存储。如下示意图所示:
    在这里插入图片描述

    配置文件

    1. schema.xml:

    schema标签
    在这里插入图片描述
    定义的是Mycat实例中的逻辑库,Mycat可以有多个逻辑库,每个逻辑库都有自己 的配置,shema可以区别不同的逻辑库。
    checkSQLschema的作用:
    当该值设置为 true 时,如果我们执行语句select * from TESTDB.travelrecord;MyCat会把语句修改为select * from travelrecord;即把表示schema的字符TESTDB去掉,避免发送到后端数据库执行时报(ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。建议设置为true,避免加逻辑库的名字。
    sqlMaxLimit的作用:
    当该值设置为某个数值时。每条执行的SQL语句,如果没有加上limit语句,MyCat也会自动的加上所对应的值。例如设置值为100,执行select * from TESTDB.travelrecord;的效果为和执行select * from TESTDB.travelrecord limit 100;相同。不设置该值的话,MyCat默认会把查询到的信息全部都展示出来,造成过多的输出。
    特别注意:这个属性要小心使用,在hap项目加载时,会读取数据库表中数至redis缓存,如果该值设置过小了,会导致redis的缓存值加载不完全的情况,所以要根据项目的实际调整该值的实际大小。

    table标签
    在这里插入图片描述
    name的作用:
    逻辑表的表名,这个表名是唯一的,在schema中不可重复定义。
    dataNode的作用:
    定义逻辑表所属的数据节点,该属性的值需要和dataNode标签中name属性的值相互对应。
    rule的作用:
    该属性用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性值一一对应。
    primaryKey的作用:
    逻辑表所对应的真实表的主键值。
    autoIncrement的作用:
    使用autoIncrement=”true” 指定这个表有使用自增长主键,这样mycat才会不抛出分片键找不到的异常。
    使用autoIncrement=”false” 来禁用这个功能,当然你也可以直接删除掉这个属性。默认就是禁用的。

    dataNode标签
    在这里插入图片描述
    Name的作用:
    定义数据节点的名字,这个名字是唯一的,在table标签上使用该名字。
    dataHost的作用:
    定义该分片属于那一个数据库实例,引用的是dataHost标签定义的名字。
    database的作用:
    定义该节点主机上具体的数据库实例名字,便于确定该分片表具体落在哪一个数据节点上。

    dataHost标签
    在这里插入图片描述
    maxCon作用:
    指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。

    minCon作用:
    指定每个读写实例连接池的最小连接,初始化连接池的大小。

    balance作用:
    负载均衡类型,目前的取值有3种:

    1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
    2. balance=“1”,所有读操作都随机的发送到readHost 与 stand by writeHost 参与 select 语句的负载均衡。 适用双主双从
    3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发。
    4. balance=”3“,所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力 适用一主一从

    writeType作用:
    负载均衡类型,目前的取值有3种:
    5. writeType=“0”, 所有写操作都发送到可用的writeHost上。
    6. writeType=“1”,所有写操作都随机的发送到readHost。
    7. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。

    dyType作用:
    指定后端的数据库连接类型

    dbDriver作用:
    指定后端数据库采用的数据驱动类型

    hearbeat的作用:
    这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。
    在readHost和writeHost中指定实际的数据库连接地址Url和用户名、密码等信息。

    2.server.xml
    server.xml标签保存的是mycat的系统配置信息,包括全局SQL防火墙设置、系统用户设置以及全局序列设置。
    在这里插入图片描述
    指定了mycat的root用户的密码为123456,其可操作的数据库为TESTDB。
    Sql防火墙和黑名单设置:

    在system标签中有个配置属性为sequnceHandlerType,该属性指定了全局序列的设置方式,配置为0代表使用本地文件方式;配置为1代表使用数据库的方式;配置为2 使用本地时间戳方式。
    在这里插入图片描述

    3.rule.xml
    rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule
    和function。
    TableRule表规则:
    在这里插入图片描述
    表的规则的名称为rule1,这个rule1就会在schema.xml文件中的rule属性中所使用。所采用的分片算法为fun1,fun1的定义如下所示:
    在这里插入图片描述

    分片原则

    1. 分片枚举
    申明规则:


    accounting_date
    hash-int

    规则对应的算法:

    partition-hash-int.txt
    1

    在partition-hash-int.txt中申明枚举映射关系:
    2018-01-01=0
    2018-02-01=1
    2018-03-01=2
    在这里意味着:
    accounting_date的值为”2018-01-01”的记录会插入到第一个数据节点;accounting_date的值为”2018-02-01”的记录会插入到第二个数据节点;accounting_date的值为”2018-03-01”的记录会插入到第三个数据节点;(物理节点从0开始排序)

    2. 固定分片hash算法
    申明规则:


    id
    func1

    规则对应的算法:

    8
    128

    其中该算法,mycat要求partitionCount* partitionLength恒等于1024
    固定分片hash算法即对分片列id取hash值,然后划分到具体的数据节点上。

    3. 求模算法
    申明规则:


    id
    mod-long

    规则对应的算法:


    3

    该算法对分片列id进行取模运算,除数为设定的数据节点的数量,根据取余数的结果对数据记录进行拆分到不同的物理库中。

    4. 自然月分片
    申明规则:


    ACCOUNTING_DATE
    partbymonth

    规则对应的算法:

    yyyy-MM-dd
    2018-01-01

    dateFormat指定了日期的格式、sBeginDate指定了日期开始时间。该分片规则会按照月份列进行分区,每个月需要单独的一个数据库。

    5. 如何客户化开发分片规则
    在mycat源码(io.mycat.route.function)上去新建类继承AbstractPartitionAlgorithm该抽象类并实现RuleAlgorithm这个接口即可,重点实现其中的init方法和calculate方法。
    /**

    • @author jiaqing.xu@hand-china.com

    • @version 1.0

    • @name

    • @description

    • @date 2018/7/2
      */
      public class PartitionBySelf extends AbstractPartitionAlgorithm implements RuleAlgorithm {
      private int count;
      @Override
      public void init() {
      //初始化工作 变量赋值等操作
      }

      public void setCount(int count) {
      this.count = count;
      }

      @Override
      public Integer calculate(String columnValue) {
      //根据逻辑计算需要返回的物理节点dataNode的索引值
      return 0;
      }

      @Override
      public int getPartitionNum() {
      int nPartition = this.count;
      return nPartition;}}
      在rule.xml文件中引用该制定的客户化分片规则,在class中指定全路径名。

    展开全文
  • MYCAT分库分表

    2018-08-03 15:38:07
    mycat分库分表+20180731+潘壮志
  • 文章目录MySQL的分库分表什么是分库分表分割方式:MyCAT介绍软件介绍:分片规则工作过程拓扑结构部署MyCat服务器安装软件软件目录结构修改配置文件**1.定义连接用户和逻辑库名****2.数据分片配置**3.配置数据库...

    MySQL的分库分表

    什么是分库分表

    将存放在一台数据库服务器中的数据,按照特定方式进行拆分,分散存放到多台数据库服务器中,以达到分散单台服务器负载的效果
    在这里插入图片描述

    分割方式:

    • 垂直分隔
      • 纵向切分
        • 将单个数据库的多个表按业务类型分类,分散存储到不同的数据库

    在这里插入图片描述

    • 水平分隔

      • 横向切分

        • 按照表中指定字段的切片规则,将表记录按行切分,分散存储到多个数据库中
          在这里插入图片描述

    MyCAT介绍

    软件介绍:

    mycat是基于Java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案

    • 适合数据大量写入的存储需求
    • 支持MySQL、Oracle、SQL server、mongodb等
    • 提供数据读写分离服务
    • 提供数据分片服务
    • 基于阿里巴巴cobar进行研发的开源软件

    分片规则

    mycat支持提供10种分片规则

    1. 枚举法(sharding-by-intfile)
    2. 固定分片(rule1)
    3. 范围约定(auto-sharding-long)
    4. 求模法(mod-long)
    5. 日期列分区法(sharding-by-date)
    6. 通配取模(sharding-by-patterh)
    7. ASCII码求模通配(sharding-by-prefixpattern)
    8. 编程指定(sharding-by-substring)
    9. 字符串拆分hash解析(sharding-by-stringhash)
    10. 一致性hash(sharding-by-murmur)

    工作过程

    当Mycat收到一个SQL命令时

    1. 解析SQL命令涉及到的表
    2. 然后看对表的配置,如果有分片规则,则获取SQL命令里分片字段的值,并匹配分片函数,获得分片列表
    3. 然后将SQL命令发往对应的分片服务器去执行
    4. 最后收集和处理所有分片结果数据,并返回到客户端

    拓扑结构

    数据分片拓扑结构
    在这里插入图片描述

    主机名角色数据库IP地址
    client50客户端192.168.4.50/24
    mycat56分片服务器192.168.4.56/24
    mysql53数据库服务器db1192.168.4.53/24
    mysql54数据库服务器db2192.168.4.54/24
    mysql55数据库服务器db3192.168.4.55/24

    在53,54,55还原为初始独立数据库服务器,停止上面的主从结构(如果有配置主从请停止,如果没有请忽略)

    部署MyCat服务器

    安装软件

    安装jdk,系统自带的openjdk,或者去Java官网下载,使用mycat,Java环境版本不能低于1.8.0

    yum -y install jdk-8u144-linux-x64.rpm   #这里使用我自己下载的jdk包,没有使用系统自带的
    java -version
    

    安装mycat服务软件包

    tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
    mv mycat /usr/local/
    

    可以在这个下载

    链接:https://pan.baidu.com/s/1zz8-fTlhnX_WWgVt6n-jYQ
    提取码:123a

    软件目录结构

    ls /usr/local/mycat/
    bin     #mycat命令
    catlet    #扩展功能
    conf     #配置文件
    lib      #mycat使用的jar包
    logs      #mycat服务启动日志
    wrapper.log   #mycat服务启动日志 
    mycat.log       #记录SQL脚本执行后的报错内容
    
    重要的配置文件
    conf/rule.xml       #分片规则
    conf/schema.xml     #设置数据分片
    conf/server.xml    #设置连接账号及逻辑库
    其他文件            #函数调用文件
    
    分片规则配置文件以 .txt 或者以 .properties结尾
    

    修改配置文件

    1.定义连接用户和逻辑库名
    vim /usr/local/mycat/conf/server.xml   #使用默认配置就行
    

    在这里插入图片描述

    2.数据分片配置

    注:下面的注释不能出现在配置文件

    定义分片的表
    <schema>.....</schema>    #定义分片信息
    <table>.....</table>  #定义表
    name  #逻辑库名或者逻辑表名
    dataNode   #指定数据库节点
    rule   #指定使用的分片规则
    type=global   #数据不分片存储
    
    定义数据节点
    <dataNode 选项=值,.../>  #定义数据节点
    name   #数据节点名
    datahost   #数据库服务器主机名
    database   #数据库名
    
    定义数据库服务器IP地址及端口
    <datahost 选项=值,..>....</datahost>
    name   #主机名(与datahost对应的主机名)
    host    #主机名(与IP地址对应的主机名)
    url      #数据库服务器IP地址及端口号
    user     #数据库服务器授权用户
    password    #授权用户密码
    
    #由于该配置文件较大,在学习的时候可以先进行备份,以防修改错误导致服务不能启动。
    #在进行下面的操作之前可以,可以适当删除一些无用的配置,因为mycat也可以提供读写分离的服务,但本次实验只使用它分库分表的功能,所以在这里我删除了他的读写分离的配置
    # sed -i '56,77d' schema.xml 
    # sed -i '39,42d' schema.xml 
    # sed -i '16,18d' schema.xml
    #注:版本不同,请不要使用上述命令,或者不用删除多余配置
    vim /usr/local/mycat/conf/schema.xml
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
           #schema name="库名",这个库名要和server.xml 定义的库名一致
           #因为我们这次实验使用了三台数据库服务器所以在dataNode后给没有dn3的,加上dn3
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
                    <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
                    <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
                    <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
                               rule="mod-long" />
                    <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
                               rule="sharding-by-intfile" />
                    <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
                               rule="sharding-by-intfile">
                            <childTable name="orders" primaryKey="ID" joinKey="customer_id"
                                                    parentKey="id">
                                    <childTable name="order_items" joinKey="order_id"
                                                            parentKey="id" />
                            </childTable>
                            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
                                                    parentKey="id" />
                    </table>
            </schema>
            #指定dn1的主机和数据库,如:dn1的主机为sql53,在其上面分库的数据库为db1
            <dataNode name="dn1" dataHost="sql53" database="db1" />
            <dataNode name="dn2" dataHost="sql54" database="db2" />
            <dataNode name="dn3" dataHost="sql55" database="db3" />
            #定义sql53的详细信息,主要修改dataHost name,url="主机IP:3306",user="用户",mycat通过哪个用户来连接数据库,建议不要使用root,password="密码",用户的密码,writeHost host="名字",主机名,这个名字只要和其他数据库主机名不一致就行
            <dataHost name="sql53" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM1" url="192.168.4.53:3306" user="test"
                                       password="123456">
                    </writeHost>
     </dataHost>
      #因为dataHost的配置只有一份,所以剩下的两份需要我们自行添加
            <dataHost name="sql54" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM2" url="192.168.4.54:3306" user="test"
                                       password="123456">
                    </writeHost>
            </dataHost>
    
            <dataHost name="sql55" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="hostM3" url="192.168.4.55:3306" user="test"
                                       password="123456">
                    </writeHost>
            </dataHost>
    </mycat:schema>
    
    3.配置数据库服务器(3台都要配)

    根据分片配置做相应的设置

    • 创建存储数据的库
    • 添加mycat的连接用户
    #192.168.4.53
    mysql -uroot -p123456 -e "create database db1"
    mysql -uroot -p123456 -e 'grant all on *.* to test@"%" identified by "123456"'
    #192.168.4.54
    mysql -uroot -p123456 -e "create database db2"
    mysql -uroot -p123456 -e 'grant all on *.* to test@"%" identified by "123456"'
    #192.168.4.55
    mysql -uroot -p123456 -e "create database db3"
    mysql -uroot -p123456 -e 'grant all on *.* to test@"%" identified by "123456"'
    

    启动服务

    1.启动服务
    为了方便我们使用可以先做一个软连接,如果不做软连接就需要输入绝对路径
    ln -s /usr/local/mycat/bin/mycat /usr/bin
    mycat status   #查看状态
    mycat start
    #如果启动失败,可以查看目录下的日志,wrapper.log 
    

    出现问题时,可以先检查自己的环境,比如jdk是否安装或者查看版本是否高于1.80

    2.查看服务状态
    ss -nultp | grep 8066    #mycat默认端口
    
    3.测试配置

    客户端连接mycat服务器访问数据

    mysql -h 192.168.4.56 -P8066 -uroot -p123456
    show databases;   #这里的数据库为mycat 的测试数据库,在上面的配置文件中可以看到
    use TESTDB;
    show tables;   #这里出现的表,在上面分片的配置文件中能看到,这些表为虚拟表
    desc company;    #可以看出这张表并没有表结构
    

    在这里插入图片描述

    接下来我们创建表,创建的时候要符合表的分片规则。

    分片规则:

    下面介绍几种常见的分片规则

    sharding-by-intfile(枚举法)
    • 字段值必须在列举的范围内选择

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    打开配置文件/schema.xml 可以看出employee使用的分片规则是sharding-by-intfile,接下来打开rule.xml查看详细规则,可以看出sharding-by-intfile分片规则采用了hash-int算法,由图三可以看出hash-int算法的配置文件存储在partition-hash-int.txt 中

    由上面三图可以得出employee表要有一个ID字段作为主键,要有一个字段名为sharding_id,分片规则就是使用sharding_id做分片,分片算法使用hash-int

    我们打开partition-hash-int.txt

    vim /usr/local/mycat/conf/partition-hash-int.txt
    10000=0      
    10010=1
    10020=2
    #定义分片字段枚举的值,默认只有两个,因为我们的数据库有三个,所以需要我们添加一行枚举,当值为10000,把数据写入第一台服务器
    #当值为10010时,把数据写入第二台数据服务器,当值为10020时,把数据写入第三台
    
    重启服务
    mycat restart
    ss -nultp | grep 8066
    

    根据分片规则和配置进行建表

    接下来在客户端连接数据库
    mysql -h 192.168.4.56 -P8066 -uroot -p123456
    use TESTDB;
    create table employee ( ID int primary key auto_increment, sharding_id int , name char(15), home char(30), sex enum("man","woman") );
    desc employee;
    

    在这里插入图片描述

    然后我们在其余的数据库中就可以查到相应的数据

    55服务器
    在这里插入图片描述

    54服务器
    在这里插入图片描述

    53服务器
    在这里插入图片描述

    ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
    在这里插入图片描述

    创建表时可能会出错,出现这个错误,请大家仔细检查自己的配置文件和用户,或者去数据库看自己的表是否创建成功或者创建正确

    出现问题可以去日志文件查看那里出现问题了

    接下来我们插入数据

    在客户端插入数据

    insert into employee(sharding_id,name,home,sex) values(10000,"tom","usa","man");
    #sharing_id为10000,把这条数据插入到db1,
    insert into employee(sharding_id,name,home,sex) values(10010,"tom1","usa","man");
    insert into employee(sharding_id,name,home,sex) values(10020,"tom2","usa","man");
    insert into employee(sharding_id,name,home,sex) values(10030,"tom3","usa","man");
    #在这里输入sharing_id为300时,因为配置文件中并没有定义这个数据源,所以会失败
    

    在这里插入图片描述

    查询数据是否成功添加到相应的分片数据库上

    55服务器
    在这里插入图片描述

    54服务器
    在这里插入图片描述

    53服务器
    在这里插入图片描述

    添加成功

    mod-long(求模法)
    • 根据字段值与设定的数字求模结果存储数据

    接下来我们查看这个数据库的那张表使用了mod-long的规则
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qp9OHrNp-1640703171549)(E:/Typort/image-20211228215802386.png)]

    ​ 因为主键自增长会和求模发生冲突,所以我们这里删除主键的设置
    在这里插入图片描述

    接下来查看他的规则详情,在rule.xml中
    在这里插入图片描述

    这个代表了要使用表中的id字段去取余,所以我们的表中就需要有一个id字段,取余对应得算法也为mod-long(algorithm 对应的为算法名)。

    接下来查看算法的详情
    在这里插入图片描述

    表中的id字段默认与3取余,这里的值可以修改,根据实际情况修改,当值为3时,取余结果只能为0、1、2,与4取余时,结果为0、1、2、3。这个数值一般为数据库服务器的个数

    接下来重启服务

    mycat restart 
    ss -nultp | grep 8066  #有端口说明配置文件修改没有错误
    

    在客户端进行测试

    mysql -h 192.168.4.56 -P8066 -uroot -p123456
    use TESTDB;
    create table hotnews ( id int  , title char(15), comment char(50), worker char(20),uptime datetime);
    desc hotnews;
    

    在这里插入图片描述
    在客户端查看表结构

    55
    在这里插入图片描述

    54
    在这里插入图片描述

    53
    在这里插入图片描述

    在客户端插入记录

    insert into hotnews(id,title,comment,worker,uptime) values(7,"linux","nginx","test",now());
    #7和3取余为1,存储在第二台服务器
    insert into hotnews(id,title,comment,worker,uptime) values(8,"math","Lobita","Lobita",now());
    #8和3取余为2,存储在第三台服务器
    insert into hotnews(id,title,comment,worker,uptime) values(9,"Language","Shout","Lu Xun",now());
    #9和3取余为0,存储在第一台服务器
    

    在数据库查看插入情况

    53
    在这里插入图片描述

    54
    在这里插入图片描述

    55
    在这里插入图片描述

    不分片存储记录(type=global)

    接下来我们查看这个数据库的那张表使用了不分片的规则
    在这里插入图片描述
    客户端创建表

    mysql -h 192.168.4.56 -P8066 -uroot -p123456
    use TESTDB;
    create table company ( ID int primary key auto_increment, name char(15), addr char(100));
    insert into company(name,addr) values ("QQ","shenzheng"),("ali","hangzhou");
    

    接下来我们在数据库服务器查看,因为没有分片存储,所以三台服务器都有该表该数据

    55
    在这里插入图片描述

    54
    在这里插入图片描述

    53
    在这里插入图片描述

    在分片服务器上添加新库新表

    
    ....
    <property name="schemas">TESTDB,gamedb</property>
    ....
    #使用只读用户也能访问新库新表,也需要添加这个新库名
      <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB,gamedb</property>
                    <property name="readOnly">true</property>
            </user>
    ..
    

    在这里插入图片描述

    
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
            <schema name="gamedb" checkSQLschema="false" sqlMaxLimit="100" >
                  <table name="user" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
                  <table name="game_pople" dataNode="dn1,dn2,dn3" rule="mod-long" />
            </schema>
    ...
    

    在这里插入图片描述

    mycat restart
    ss -nultp | grep 8066  #查看是否启动成功
    

    接下来去客户端查看新添加的库表,并添加数据测试

    mysql -h 192.168.4.56 -P8066 -uroot -p123456
    use gamedb;
    show tables;
    create table user ( ID int primary key auto_increment, name char(15), host char(100));
    insert into user(name,host) values ("tom","usa"),("bob","china");
    
    create table game_pople ( id int  ,equipment char(15), comment char(50) ,uptime datetime);
    insert into game_pople(id,equipment,comment,uptime) values(7,"A","harm",now());
    #7和3取余为1,存储在第二台服务器
    insert into game_pople(id,equipment,comment,uptime) values(8,"B","defense",now());
    

    在客户端查看
    在这里插入图片描述

    在数据库服务器查看

    55
    在这里插入图片描述

    54
    在这里插入图片描述

    53
    在这里插入图片描述

    展开全文
  • MySQL-mycat分库分表

    2021-07-19 10:05:25
    一、安装与启动 安装JDK,要求JDK1.8,非1.8环境请自行编译源码 二、安装包执行 出现权限不足请提升到管理员权限 ...使用mycat分库分表之后,系统架构转变为如下所示, 配置好下面的配置文件 rule.x..

    一、安装与启动

    安装JDK,要求JDK1.8,非1.8环境请自行编译源码

    二、安装包执行

    出现权限不足请提升到管理员权限

    下载安装包 Index of /1.6.7.6/ 解压到本地

    修改具体的配置文件,每个版本都有点不一样

    管理员权限启动CMD,进入bin目录

    mycat insatll

    mycat start

    mycat status

    三、使用

    使用mycat做分库分表之后,系统架构转变为如下所示,

    配置好下面的配置文件

    rule.xml配置

    rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法, 或者对表使用相同的算法但具体的参数不同。这个文件里面主要有 tableRule 和 function 这两个标签。在具体使 用过程中可以按照需求添加 tableRule 和 function。

    schema.xml配置

    Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以 及 DataSource。弄懂这些配置,是正确使用 MyCat 的前提

    server.xml配置

    server.xml 几乎保存了所有 mycat 需要的系统配置信息。

        <user name="root">
            <property name="password">123456</property>
            <property name="schemas">TESTDB</property>
        </user>

    在项目中配置连接数据库

    #本地数据库连接账号和密码
    spring.datasource.druid.username=root
    spring.datasource.druid.password=123456
    #mycat的逻辑库 端口也是mycat的
    spring.datasource.druid.url=jdbc:mysql://localhost:8066/TESTDB

    到此,mycat中间件配置完成。

    展开全文
  • Mycat分库分表原理

    2021-03-01 10:33:40
    MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC...
  • mycat分库分表

    2018-12-26 18:16:19
    Mycat是数据库分库分表的中间件,Mycat使用最多的两个功能是:读写分离和分库分表功能,支持全局表和E-R关系(这两个比较实用) mycat相当于是一个代理,可以将多个实际数据库组合成一个完整的虚拟数据库 我们可以...
  • mycat分库分表搭建

    2020-11-27 16:55:17
    Mycat管理mysql数据库读写分离初步整理介绍 ...如上图所示,本环境中mysql读写分离中91为master节点,92为slave节点,93为mycat部署节点,其中91/92读写分离,并且一同作为mycat的datanode节点用于存放片数据。 ...
  • 什么是MYCAT: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术、NoSQL...
  • 【mycat】mycat分库分表

    2022-07-22 16:51:21
    Mycat2一大优势就是可以在终端直接创建数据源、集群、库表,并在创建时指定分库分表。以下步骤不是必须,看自己情况操作注前面由于搭建过双主双从的服务,为了方便,本文档教程不使用双主双从,使用一主一从演示就...
  • 一张表100w,按ID(分库字段)除以10取摸,分到10个库。1号库id最后位总是1,2号库id最后位是2,以此类推。不同的表尽量创建到不同的机器上,别10张表都在一个机器上,甚至一个数据库上,这样意义不大,实际操作时,...
  • 一、 MySQL+MyCat分库分表1 MyCat简介java编写的数据库中间件Mycat运行环境需要JDK.Mycat是中间件.运行在代码应用和MySQL数据库之间的应用.前身 : corba. 是阿里开发的数据库中间件.实现MySQL数据库分库分表集群管理...
  • 本文详细描述 MyCat 的安装配置参数介绍以及演示多种分库分表算法,每个步骤及参数都有说明,一步到位
  • mycat分库分表原理 一:介绍 1:mycat就是一个数据库中间件,数据库的代理,它屏蔽了物理数据库,应用连接mycat,然后mycat再连接物理数据库 2:它支持水平拆分(分库分表,通过分库达到分表),支持多种分片规则 3...
  • mycat分库分表原理

    千次阅读 2020-04-25 15:21:52
    MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC...
  • 原标题:mycat分库分表原理分析MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个...
  • 2.Mycat实现分库分表 主要编辑的配置文件在conf目录下,分别为schema.xml、rule.xml、server.xml、sequence_db_conf.properties四个文件。 schema.xml主要配置物理数据库的信息,逻辑数据库名称以及表和路由策略...
  • Mycat 分库分表、主从文档及代码demo,Mycat安装配置 Mycat分库实战 Mycat扩展应用 Mycat主从同步 Mycat实战demo
  • Mycat分库分表优缺点分析

    千次阅读 2020-03-26 23:55:29
    不同业务之间禁止使用跨join连表查询 垂直切分的优点 拆分后业务清晰,拆分规则明确 系统之间容易扩展和整合 数据维护简单 垂直切分的缺点 部分业务表无法join,只能通过接口调用,提升了系统复杂性 跨事务...
  • MyCat分库分表入门

    2021-01-20 21:31:51
    分区可以把表到不同的硬盘上,但不能分配到不同服务器上。优点:数据不存在多个副本,不必进行数据复制,性能更高。缺点:分区策略必须经过充分考虑,避免多个分区之间的数据存在关联关系,每个...
  • 分表分库后,表中主键如何生成 3.具体内容 3.1 数据切分概念 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机) 上面,以达到分散单台设备负载的效果。 3.2...
  • 分库分表就是将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库操作性能。根据业务的实际需要,基于 MyCAT 的分布式数据存储方案...
  • 模拟电商项目中的商品管理、订单管理、基础信息管理、日志管理模块,对整个系统中的数据表进行片操作,将根据不同的业务需求,采用不同的片方式 。 技术选型: - SpringBoot - SpringCloud - SpringMVC - ...
  • mycat分库分表配置

    2019-10-09 03:27:14
    1.什么是分库分表 在同一个系统(项目)中,把一张...使用mycat实现分库分表(HDFS:namenode datanode secondarynamdenode) 在整个mycat中也会使用到namenode和datanode mysql01服务器(linux)192.168.152.147:...
  • 数据库集群有什么问题? 1、自增ID会重复的问题。 解决办法是:①使用 UUID 做全局唯一ID,不过有...不过缺点是:设置 MySQL 集群时,必须确定有多少台机器,才能设置好步长,跟 ElasticSearch 集群片一样。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,128
精华内容 7,651
关键字:

mycat分库分表

友情链接: 简单数据结构.rar