zoukankan      html  css  js  c++  java
  • 06-MySQL基于MyCat的分布式数据库的搭建

    一、MyCat简介

    1、什么是MyCat?

    MyCAT是:

    * 一个彻底开源的,面向企业应用开发的“大数据库集群”;
    * 支持事务、ACID、可以替代MySQL的加强版数据库;
    * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群;
    * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL;
    * 一个新颖的数据库中间件产品;

    2、MyCat的特性

    * 支持 SQL92标准(数据库的一个ANSI/ISO标准);
    * 支持Mysql集群,可以作为Proxy使用;
    * 支持JDBC连接ORACLE、DB2、SQL Server、PostgreSQL、MongoDB,将其模拟为MySQL Server使用;
    * 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群;
    * 自动故障切换,高可用性;
    * 支持读写分离,支持Mysql双主多从,以及一主多从的模式;
    * 支持全局表,数据自动分片到多个节点,用于高效表关联查询;
    * 支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询;

    3、MyCat架构图

    4、MyCat的分片策略

    * MyCAT支持水平分片与垂直分片:
      水平分片:一个表格的数据分割到多个节点上,按照行分隔。
      垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3上。

    * MyCat通过定义表的分片规则来实现分片,每个表格可以绑定一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分配算法。

    5、MyCat的组成部分

    * Schema:逻辑库,与MySQL中的Database对应,一个逻辑库中定义了所包括的Table;

    * Table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点(DataNode),在此可以指定表的分片规则;

    * DataNode:MyCat的逻辑数据节点,是存放Table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体的数据库上;

    * DataSource:定义某个物理库的访问地址,用于捆绑到DataNode上;

    6、MyCat百度云盘地址(Mycat-server-1.6.7.4-release-20200105164103-linux.tar),有需要的可以下载,也可以去官网下载

    链接:https://pan.baidu.com/s/1a6Y_YL2DHUzz4zyvYHRkKQ 
    提取码:z9os 

     官网:http://www.mycat.org.cn/

    二、MyCat架构的搭建

    1、测试环境IP配置

     机器名称   IP 服务器角色 备注
     Manager   192.168.232.45 MyCat服务器 操作系统redhat7.5
    node1 192.168.232.42 MySQL主节点 操作系统redhat7.5;MySQL5.7.22
    node2 192.168.232.43 MySQL从节点1 操作系统redhat7.5;MySQL5.7.22
    node3 192.168.232.44 MySQL从节点2 操作系统redhat7.5;MySQL5.7.22

    2、配置IP映射

    在各节点的/etc/hosts文件中配置如下内容:

    192.168.232.42 node1
    192.168.232.43 node2
    192.168.232.44 node3
    192.168.232.45 manager

    3、3个节点先安装好数据库

    注:

    * 这里不做说明,参考安装文档,数据版本最好一致;

    * 3个数据库节点上都要添加忽略大小写的配置,在/etc/my.cnf下添加lower_case_table_names=1即可;

    4、manage节点上创建mycat用户和组

    groupadd mycat
    useradd mycat -g mycat
    passwd mycat
    cat /etc/group  --查看用户组

    5、解压mycat安装包

    tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

    注:mycat是依赖jdk的,没有安装jdk的要先安装好jdk(jdk7以上)

    6、配置环境变量

    7、配置schema.xml文件

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="customer" checkSQLschema="false" sqlMaxLimit="100">
                    <!-- auto sharding by id (long) -->
                    <table name="person" dataNode="dn1,dn2,dn3" rule="mod-long" />
                    <table name="TB_ITEM" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
                    <table name="TB_USER" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" rule="mod-long" />
                    <!-- global table is auto cloned to all defined data nodes ,so can join 
                            with any table whose sharding node is in the same data node -->
                    <table name="student" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    
    
            </schema>
            <dataNode name="dn1" dataHost="node1" database="customer1" />
            <dataNode name="dn2" dataHost="node2" database="customer2" />
            <dataNode name="dn3" dataHost="node3" database="customer3" />
    
            <dataHost name="node1" 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="node1" url="192.168.232.42:3308" user="root"
                            password="123456">
                            <!-- can have multi read hosts -->
    
                    </writeHost>
            </dataHost>
            <dataHost name="node2" 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="node2" url="192.168.232.43:3308" user="root"
                            password="123456">
                            <!-- can have multi read hosts -->
    
                    </writeHost>
            </dataHost>
            <dataHost name="node3" 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="node3" url="192.168.232.44:3308" user="root"
                            password="123456">
                            <!-- can have multi read hosts -->
    
                    </writeHost>
            </dataHost>
    
    
    
    </mycat:schema>

    注:

    * customer是逻辑库,应用访问的就是这个库,下面dataNode里配置的customer1、customer2、customer3是3个节点上的物理数据库,真正存储数据的地方;

    * table标签中的type=“global”表示的是全局表,在所指定的dataNode节点上都存储数据,意思就是存储3份数据,没有做切片;

    * balance参数设置

    balance=“0”, 所有读操作都发送到当前可用的writeHost上。
    
    balance=“1”,所有读操作都随机的发送到readHost。
    
    balance=“2”,所有读操作都随机的在writeHost、readhost上分发。

    * WriteType参数设置

    writeType=“0”, 所有写操作都发送到可用的writeHost上。
    
    writeType=“1”,所有写操作都随机的发送到readHost。
    
    writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。

    * swatchType参数设置

    -1:表示不自动切换
    
    1 :默认值,自动切换
    
    2 :基于MySQL主从同步的状态决定是否切换

    注:Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。

    8、配置server.xml文件

    注:server.xml几乎保存了mycat需要的所有配置信息,最常用的是在此配置逻辑数据库、用户、密码、权限等。

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
            - you may not use this file except in compliance with the License. - You 
            may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
            - - Unless required by applicable law or agreed to in writing, software - 
            distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
            WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
            License for the specific language governing permissions and - limitations 
            under the License. -->
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
            <system>
            <property name="defaultSqlParser">druidparser</property>
          <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
            <!-- <property name="processorBufferChunk">40960</property> -->
            <!-- 
            <property name="processors">1</property> 
            <property name="processorExecutor">32</property> 
             -->
                    <!--默认是65535 64K 用于sql解析时最大文本长度 -->
                    <!--<property name="maxStringLiteralLength">65535</property>-->
                    <!--<property name="sequnceHandlerType">0</property>-->
                    <!--<property name="backSocketNoDelay">1</property>-->
                    <!--<property name="frontSocketNoDelay">1</property>-->
                    <!--<property name="processorExecutor">16</property>-->
                    <!-- 
                            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
                    <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
                            <property name="processors">32</property> <property name="processorExecutor">32</property> 
                            <property name="serverPort">8066</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> -->
            </system>
            <user name="test">
                    <property name="password">test</property>
                    <property name="schemas">customer</property>
            </user>
    
            <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">customer</property>
                    <property name="readOnly">true</property>
            </user>
            <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property> 
                    <property name="weight">1</property> </node> </cluster> -->
            <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> 
                    </host> </quarantine> -->
    
    </mycat:server>

    注:test是读写用户,user是只读用户

    9、配置rule.xml文件

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

    此配置文件可以不用修改,使用默认即可。

    10、在三个节点先创建好数据库(customer1、customer2、customer3)

    --node1
    mysql> create database customer1 default character set utf8;
    Query OK, 1 row affected (0.06 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | customer1          |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    
    --node2
    mysql> create database customer2 default character set utf8;
    Query OK, 1 row affected (0.06 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | customer2          |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    
    --node3
    mysql> create database customer3 default character set utf8;
    Query OK, 1 row affected (0.34 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | customer3          |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)

    11、启动mycat

    [root@manager ~]# su - mycat
    Last login: Tue Dec 22 10:54:32 CST 2020 on pts/0
    [mycat@manager ~]$ mycat start
    Starting Mycat-server...
    [mycat@manager ~]$ mycat status
    Mycat-server is running (4396).
    [mycat@manager ~]$ ps -ef | grep mycat
    root       4284   4074  0 14:23 pts/1    00:00:00 su - mycat
    mycat      4285   4284  0 14:23 pts/1    00:00:00 -bash
    mycat      4396      1  0 14:24 ?        00:00:00 /mysql/mycat/mycat/bin/./wrapper-linux-x86-64 /mysqlmycat/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/mysql/mycat/mycat/logs/mycat.pid wrapper.daemonize=TRUE
    mycat      4398   4396 33 14:24 ?        00:00:06 java -DMYCAT_HOME=. -server -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/mysql-binlog-connector-java-0.16.1.jar:lib/reflectasm-1.03.jar:lib/annotations-13.0.jar:lib/kotlin-stdlib-1.3.50.jar:lib/kotlin-stdlib-common-1.3.50.jar:lib/curator-framework-2.11.0.jar:lib/log4j-core-2.5.jar:lib/commons-collections-3.2.1.jar:lib/mongo-java-driver-3.11.0.jar:lib/fastjson-1.2.58.jar:lib/commons-lang-2.6.jar:lib/log4j-1.2-api-2.5.jar:lib/Mycat-server-1.6.7.4-release.jar:lib/mysql-connector-java-5.1.35.jar:lib/netty-buffer-4.1.9.Final.jar:lib/hamcrest-core-1.3.jar:lib/hamcrest-library-1.3.jar:lib/libwrapper-linux-x86-64.so:lib/log4j-slf4j-impl-2.5.jar:lib/ehcache-core-2.6.11.jar:lib/asm-4.0.jar:lib/leveldb-api-0.7.jar:lib/minlog-1.2.jar:lib/jsr305-2.0.3.jar:lib/log4j-api-2.5.jar:lib/jline-0.9.94.jar:lib/libwrapper-linux-ppc-64.so:lib/dom4j-1.6.1.jar:lib/kryo-2.10.jar:lib/okio-2.2.2.jar:lib/libwrapper-linux-x86-32.so:lib/objenesis-1.2.jar:lib/druid-1.0.26.jar:lib/wrapper.jar:lib/leveldb-0.7.jar:lib/mapdb-1.0.7.jar:lib/univocity-parsers-2.2.1.jar:lib/guava-19.0.jar:lib/joda-time-2.9.3.jar:lib/curator-recipes-2.11.0.jar:lib/zookeeper-3.4.6.jar:lib/okhttp-4.2.2.jar:lib/sequoiadb-driver-1.12.jar:lib/slf4j-api-1.6.1.jar:lib/velocity-1.7.jar:lib/log4j-1.2.17.jar:lib/netty-common-4.1.9.Final.jar:lib/netty-3.7.0.Final.jar:lib/disruptor-3.3.4.jar:lib/curator-client-2.11.0.jar -Dwrapper.key=8mVcPdJniednz5DH -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=4396 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start
    mycat      4485   4285  0 14:25 pts/1    00:00:00 ps -ef
    mycat      4486   4285  0 14:25 pts/1    00:00:00 grep --color=auto mycat
    [mycat@manager ~]$ 

    12、连接mycat

    注:mycat的默认端口是8066

    [root@manager ~]# mysql -utest -ptest -P8066 -h192.168.232.45
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MySQL connection id is 1
    Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MySQL [(none)]> show databases;
    +----------+
    | DATABASE |
    +----------+
    | customer |
    +----------+
    1 row in set (0.00 sec)
    
    MySQL [(none)]> use customer;
    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 [customer]> show tables;
    +--------------------+
    | Tables in customer |
    +--------------------+
    | person             |
    | student            |
    | tb_item            |
    | tb_user            |
    +--------------------+
    4 rows in set (0.00 sec)
    
    MySQL [customer]> select * from tb_item;
    ERROR 1105 (HY000): Table 'customer1.tb_item' doesn't exist
    MySQL [customer]> 

    注:连接成功后,在customer逻辑库下是有这几个表名的,但是这些表使用的时候还是需要创建,这里这是显示在配置文件配置的table标签里有哪些表名而已,是逻辑表,真正的数据节点上还看不到表。

    13、连接mycat的管理端

    注:mycat的管理端口是9066

    [root@manager ~]# mysql -utest -ptest -P9066 -h192.168.232.45 
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (monitor)
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MySQL [(none)]> show @@database;
    +----------+
    | DATABASE |
    +----------+
    | customer |
    +----------+
    1 row in set (0.01 sec)
    
    MySQL [(none)]> show @@dataNode;
    +------+-----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
    | NAME | DATHOST         | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
    +------+-----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
    | dn1  | node1/customer1 |     0 | mysql |      0 |   10 | 1000 |      77 |          0 |        0 |       0 |            -1 |
    | dn2  | node2/customer2 |     0 | mysql |      0 |   10 | 1000 |      74 |          0 |        0 |       0 |            -1 |
    | dn3  | node3/customer3 |     0 | mysql |      0 |   10 | 1000 |      75 |          0 |        0 |       0 |            -1 |
    +------+-----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
    3 rows in set (0.02 sec)
    
    MySQL [(none)]> show @@heartbeat;
    +-------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    | NAME  | TYPE  | HOST           | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
    +-------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    | node1 | mysql | 192.168.232.42 | 3308 |       1 |     0 | idle   |   30000 | 4,3,3        | 2020-12-22 14:35:42 | false |
    | node2 | mysql | 192.168.232.43 | 3308 |       1 |     0 | idle   |   30000 | 3,2,2        | 2020-12-22 14:35:42 | false |
    | node3 | mysql | 192.168.232.44 | 3308 |       1 |     0 | idle   |   30000 | 5,2,2        | 2020-12-22 14:35:42 | false |
    +-------+-------+----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
    3 rows in set (0.01 sec)
    
    MySQL [(none)]> show @@cache;
    +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
    | CACHE                               | MAX   | CUR  | ACCESS | HIT  | PUT  | LAST_ACCESS   | LAST_PUT      |
    +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
    | ER_SQL2PARENTID                     |  1000 |    0 |      0 |    0 |    0 |             0 |             0 |
    | SQLRouteCache                       | 10000 |    1 |      1 |    0 |    1 | 1608618743582 | 1608618743689 |
    | TableID2DataNodeCache.TESTDB_ORDERS | 50000 |    0 |      0 |    0 |    0 |             0 |             0 |
    +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
    3 rows in set (0.02 sec)
    
    MySQL [(none)]> show @@connection;
    +------------+------+----------------+------+------------+------+----------+---------+--------+---------+---------------+-------------+------------+---------+------------+
    | PROCESSOR  | ID   | HOST           | PORT | LOCAL_PORT | USER | SCHEMA   | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
    +------------+------+----------------+------+------------+------+----------+---------+--------+---------+---------------+-------------+------------+---------+------------+
    | Processor0 |    1 | 192.168.232.45 | 8066 |      45614 | test | customer | utf8:33 |    281 |     903 |           309 |        4096 |          0 | 3       | true       |
    | Processor0 |    2 | 192.168.232.45 | 9066 |      33918 | test | NULL     | utf8:33 |    199 |    1902 |            99 |        4096 |          0 |         |            |
    +------------+------+----------------+------+------------+------+----------+---------+--------+---------+---------------+-------------+------------+---------+------------+
    2 rows in set (0.00 sec)
    
    MySQL [(none)]> 

    管理端相关命令:

    * reload命令

    * reload @@config;  重新加载配置文件,在修改完配置文件后,不用重启mycat。
    
    * reload @@sqlstat=open; 开启SQL监控分析功能。
    
    * reload @@sqlstat=close; 关闭SQL监控分析功能。
    
    * reload @@sqlshow=10; 设置慢SQL时间阈值。
    
    * reload @@user_stat; 重置SQL监控分析的数据,这个命令用于清除缓存。该命令工作在9066端口,用来将客户端执行show @@sql; show @@sql.sum;show@@slow.success;命令之后的缓存信息清除。

    * show命令

    * show @@database;   查看所有数据库。
    
    * show @@dataNode;  查看所有的数据节点(ACTIVE:表示活跃的连接数量,IDLE:表示空闲的连接数量,SIZE:表示对应的总连接数量)。
    
    * show @@dataNode where schema=customer;  查看某个逻辑库的所有数据节点。
    
    * show @@heartbeat; 检查心跳状态(1:正常状态,-1:连接错误,-2:连接超时,0:初始化状态)。
    
      注:若节点发生故障,则会连续进行默认的5个周期检测,心跳连接失败后就会变成-1,节点故障确认,然后可能发生切换。
    
    * show @@connection; 获取mycat当前的连接状态,即现在有几个客户端连接mycat。
    
    * kill @@connection  1; 强制关闭连接,id的值是show @@connection结果的id列。
    * show @@backend;  查看后端连接状态。
    
    * show @@cache ; 查看mycat缓存。
    
    * show @@datasource; 查看数据源的状态,如果配置了主从或者多主,则可以切换。
    
    * show @@syslog limit=3;  显示系统日志,limit=3表示显示行数。

    三、测试分片

    1、使用“auto-sharding-long”分片规则的表TB_ITEM

    注:

    * 从schema.xml里可以看出TB_ITEM表使用的分片规则是auto-sharding-long

    * 从rule.xml看auto-sharding-long的具体分片函数,是按照id列来具体分片的

    (1)连接mycat,创建TB_ITEM表

    MySQL [(none)]> use customer;
    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 [customer]> show tables;
    +--------------------+
    | Tables in customer |
    +--------------------+
    | person             |
    | student            |
    | tb_item            |
    | tb_user            |
    +--------------------+
    4 rows in set (0.00 sec)
    
    MySQL [customer]> create table tb_item (id int(10),name varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.12 sec)
    
    MySQL [customer]> 

    (2)插入数据

    注:使用mycat插入数据的时候,要补全字段值

    MySQL [customer]> insert into tb_item(id,name) values(1,'jack');
    Query OK, 1 row affected (0.07 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(5000000,'jack');
    Query OK, 1 row affected (0.00 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(5000001,'jack');
    Query OK, 1 row affected (0.02 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(10000000,'rose');
    Query OK, 1 row affected (0.02 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(10000001,'wade');
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(15000000,'wade'); 
    Query OK, 1 row affected (0.00 sec)
    
    MySQL [customer]> insert into tb_item(id,name) values(15000001,'wade');
    ERROR 1064 (HY000): can't find any valid datanode :TB_ITEM -> ID -> 15000001
    MySQL [customer]> 

    (3)查看3个节点的数据分布情况

    --node1
    mysql> use customer1;
    Database changed
    mysql> show tables;
    +---------------------+
    | Tables_in_customer1 |
    +---------------------+
    | tb_item             |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_item;
    +---------+------+
    | ID      | NAME |
    +---------+------+
    |       1 | jack |
    | 5000000 | jack |
    +---------+------+
    2 rows in set (0.00 sec)
    
    --node2
    mysql> use customer2;
    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> show tables;
    +---------------------+
    | Tables_in_customer2 |
    +---------------------+
    | tb_item             |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_item;
    +----------+------+
    | ID       | NAME |
    +----------+------+
    |  5000001 | jack |
    | 10000000 | rose |
    +----------+------+
    2 rows in set (0.00 sec)
    
    
    --node3
    mysql> use customer3;
    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> show tables;
    +---------------------+
    | Tables_in_customer3 |
    +---------------------+
    | tb_item             |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from tb_item;
    +----------+------+
    | ID       | NAME |
    +----------+------+
    | 10000001 | wade |
    | 15000000 | wade |
    +----------+------+
    2 rows in set (0.00 sec)

    注:从数据的分布情况和最后insert数据来看,发现使用auto-sharding-long分片规则的数据分布如下:

    node1:1~5000000

    node2:5000001~10000000

    node3:10000001~15000000

    如果数据超过15000000,就需要添加节点了。

    2、使用“mod-long”分片规则的表person

    (1)查看server.xml中mod-long的分片函数

     注:也是通过对id字段求模,来对数据进行分片的。

    (2)连接mycat,创建person表

    MySQL [customer]> create table person(id int(10),age int(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.02 sec)

    (3)插入数据

    MySQL [customer]> insert into person(id,age) values(1,20);
    Query OK, 1 row affected (0.22 sec)
    
    MySQL [customer]> insert into person(id,age) values(2,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(3,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(4,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(5,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(6,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(5000000,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(5000001,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(10000000,25);
    Query OK, 1 row affected (0.00 sec)
    
    MySQL [customer]> insert into person(id,age) values(10000001,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(15000000,25);
    Query OK, 1 row affected (0.01 sec)
    
    MySQL [customer]> insert into person(id,age) values(15000001,25);
    Query OK, 1 row affected (0.00 sec)

    (4)查看3个节点的数据分布情况

    --node1
    mysql> show tables;
    +---------------------+
    | Tables_in_customer1 |
    +---------------------+
    | person              |
    | tb_item             |
    +---------------------+
    2 rows in set (0.00 sec)
    
    mysql> select * from person;
    +-----------+------+
    | ID        | AGE  |
    +-----------+------+
    |         3 |   25 |
    |         6 |   25 |
    |   5000001 |   25 |
    |  15000000 |   25 |
    | 950000010 |   25 |
    +-----------+------+
    5 rows in set (0.00 sec)
    
    --node2
    mysql> show tables;
    +---------------------+
    | Tables_in_customer2 |
    +---------------------+
    | person              |
    | tb_item             |
    +---------------------+
    2 rows in set (0.00 sec)
    
    mysql> select * from person;
    +----------+------+
    | ID       | AGE  |
    +----------+------+
    |        1 |   20 |
    |        4 |   25 |
    | 10000000 |   25 |
    | 15000001 |   25 |
    +----------+------+
    4 rows in set (0.00 sec)
    
    --node3
    mysql> show tables;
    +---------------------+
    | Tables_in_customer3 |
    +---------------------+
    | person              |
    | tb_item             |
    +---------------------+
    2 rows in set (0.00 sec)
    
    mysql> select * from person;
    +----------+------+
    | ID       | AGE  |
    +----------+------+
    |        2 |   25 |
    |        5 |   25 |
    |  5000000 |   25 |
    | 10000001 |   25 |
    +----------+------+
    4 rows in set (0.00 sec)

    注:从上面的数据分布可以看出规律如下:

    一共三个分片数据库,所以count=3,分片的时候id的值要对3取模,

    取模=0时,存放在第一个分片数据库节点(3对3取模是0)

    取模=1时,存放在第二个分片数据库节点(1对3取模是1)

    取模=2时,存放在第三个分片数据库节点(2对3取模是2)

     

     

     

  • 相关阅读:
    CS Academy Round #65 Count Arrays (DP)
    Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)
    Codeforces 915F Imbalance Value of a Tree(并查集)
    HDU 4866 Shooting (主席树)
    玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)
    Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)
    第十三届北航程序设计竞赛决赛网络同步赛 B题 校赛签到(建树 + 打标记)
    TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)
    Codeforces 901C Bipartite Segments(Tarjan + 二分)
    supervisor安装与使用
  • 原文地址:https://www.cnblogs.com/jialanyu/p/14167700.html
Copyright © 2011-2022 走看看