DBA(五):数据分片、Mycat服务

数据分片概述

分库/分表

  • 什么是分库分表?
  • 将存放在一台数据库服务器中的数据,按照特定的方式进行拆分,分散存储到多台数据库服务器中,以达到分散单台服务器负载的效果
    在这里插入图片描述
水平分割
  • 横向切分
  • 按照表中指定字段的分片规则,将表记录按行切分,分散存储到多个数据库中
    在这里插入图片描述
垂直分割
  • 纵向切分
  • 将单个数据库的多个表按照业务类型分类,分散存储到不同的数据库
    在这里插入图片描述

MyCAT介绍

  • 软件介绍:
  • 开源软件,是基于Java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案
  • 适合数据大量写入的存储需求
  • 支持MySQL、Oracle、Sqlserver、MongoDB等
  • 提供数据读写分离服务
  • 基于阿里巴巴Cobar进行研发的开源软件
  • 分片规则
  • mycat支持提供10种分片规则
  • 枚举法-----------sharding-by-intfile
  • 固定分片--------rule 1
  • 范围约定--------auto-sharding-long
  • 求模法------------mod-long
  • 日期列分区法—sharding-by-date
  • 通配取模----------sharding-by-pattern
  • ASCII码求模通配----sharding-by-prefixpattern
  • 编程指定----------sharding-by-substring
  • 字符串拆分hash解析------sharding-by-stringhash
  • 一致性hash-------sharding-by-murmur
  • 工作过程
  • 当mycat收到一个SQL命令时
  1. 解析SQL命令涉及到的表
  2. 然后看对表的配置,如果有分片规则,则获取SQL命令里的分片字段的值,并匹配分片函数,获得分片列表
  3. 然后将SQL命令往对应的数据库去执行
  4. 最后收集和处理所有的分片结果数据,并返回到客户端
部署MyCAT服务
环境部署

IP规划
在这里插入图片描述
拓扑结构
在这里插入图片描述

服务部署

步骤:
1.安装软件JDK(系统自带),安装mycat服务软件包软件包在此提取码:w4e7
2. 配置数据分片
3. 配置数据库服务器
4. 启动Mycat服务

1.在数据库服务器53、54、55主机中分别创建用于分片式存储的库db1、db2、db3
[root@host53 ~]# mysql -uroot  -p123456
mysql> create  database db1;
mysql> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)


[root@host54 ~]# mysql  -uroot  -p123456
mysql> create database  db2;
mysql> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db2                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

[root@host55 ~]# mysql  -uroot  -p123qqq...A
mysql> create  database db3;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db3                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

2.在host56主机安装mycat软件以及Java软件

[root@host56 ~]# yum  -y  install java-1.8.0-openjdk.x86_64
[root@host56 ~]# java -version      ##显示版本
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
[root@host56 ~]# tar  -zxvf   Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz     ##不需要安装,解压就可以使用
[root@host56 ~]# ls
mycat
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@host56 ~]# ls mycat/
bin  catlet  conf  lib  logs  version.txt
[root@host56 ~]# mv mycat/  /usr/local/
[root@host56 ~]# ls  /usr/local/
bin  etc  games  include  lib  lib64  libexec  mycat  sbin  share  src
[root@host56 ~]# cd  /usr/local/mycat/
[root@host56 mycat]# ls  lib/*.jar   Java的打包压缩文件

###################################################################
目录结构
[root@host56 mycat]# ls
bin                                 ##mycat命令
catlet                             ##扩展功能
conf                              ##配置文件
lib                                 ##mycat使用的jar包
logs                              ##mycat启动日志和运行日志
version.txt
wrapper.log                  ##mycat服务启动日志,在服务启动后自动生成
mycat.log                    ##记录SQL脚本执行后的报错内容,在服务启动后自动生成
###################################################################
配置文件说明
server.xml                   ##设置连接账号及逻辑库
schema.xml                ##配置数据分片存储的表
rule.xml                      ##分片规则
其他文件                    ##分片规则配置文件
###################################################################

3.配置Mycat服务

	创建客户端连接件使用的用户 密码  逻辑库  权限
[root@host56 mycat]# vim  /usr/local/mycat/conf/server.xml   (使用默认配置即可)
<user name="root">        //连接mycat服务时使用的用户名
     <property name="password">123456</property> //用户连接mycat用户时使用的密码
     <property name="schemas">TESTDB</property> //逻辑库名
</user>
<user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>    //只读权限,连接mycat服务后只有读记录的权限,不写这一行则是可读可写    
</user>	
		
	定义数据分片存储的表
---------------------------------------------------
定义分片的表
<schema>......</schema>   ##定义分片信息
<table>......</table>     ##定义表
name                      ##逻辑库或逻辑表名
dataNode                  ##指定数据节点
rule                      ##指定使用的分片规则
type=global               ##数据不分片存储

定义数据节点
<dataNode  选项=值,....../>  ##定义数据节点
name                        ##数据节点明
datahost                    ##数据库服务器主机名
database                    ##数据库名

定义数据库服务器IP地址及端口
<datahost  选项=值,......>...</datahost>  ##服务器主机名
name                  ##主机名(与datahost对应的主机名)
host                  ##主机名(与IP地址对应的主机名)
url                   ##数据库服务器IP地址及端口号
user                  ##数据库服务器授权用户
password              ##授权用户密码
---------------------------------------------------
[root@mycat56 mycat]# wc -l schema.xml  //删除前查看总行数
77 /root/schema.xml
[root@host56 mycat]# cp /usr/local/mycat/conf/schema.xml    /usr/local/mycat/conf/schema.xml.bak     #先做一次备份!!!
[root@host56 mycat]# vim   /usr/local/mycat/conf/schema.xml   

为了看到更为清晰的配置文件,可以将注释行删掉,大批量的删除后再进入到文件内逐行删除注释行<!--  -->,最后的配置文件大约为38行左右
[root@host56 mycat]# sed  -i '56,77d'  /usr/local/mycat/conf/schema.xml
[root@host56 mycat]# sed  -i '39,42d'  /usr/local/mycat/conf/schema.xml
[root@host56 mycat]# wc  -l  /usr/local/mycat/conf/schema.xml
38 /usr/local/mycat/conf/schema.xml

[root@host56 mycat]# vim   /usr/local/mycat/conf/schema.xml 
  1 <?xml version="1.0"?>
  2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3 <mycat:schema xmlns:mycat="http://io.mycat/">
  4 
  5         <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  6                 <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-    long" />
  7 
  8                 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,    dn3" />
  9                 <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn    3" />
 10                 <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="d    n1,dn2,dn3"
 11                            rule="mod-long" />
 12                 <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
 13                            rule="sharding-by-intfile" />
 14                 <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
 15                            rule="sharding-by-intfile">
 16                         <childTable name="orders" primaryKey="ID" joinKey="customer_id    "
 17                                                 parentKey="id">
 18                                 <childTable name="order_items" joinKey="order_id"
 19                                                         parentKey="id" />
 20                         </childTable>
 21                         <childTable name="customer_addr" primaryKey="ID" joinKey="cust    omer_id"
 22                                                 parentKey="id" />
 23                 </table>
 24         </schema>
 ##定义数据库主机名及存储数据的库
 25         <dataNode name="dn1" dataHost="mysql53" database="db1" />
 26         <dataNode name="dn2" dataHost="mysql54" database="db2" />
 27         <dataNode name="dn3" dataHost="mysql55" database="db3" />
 28 
 ##定义mysql53主机名对应的数据库服务器IP地址         
 29         <dataHost name="mysql53" maxCon="1000" minCon="10" balance="0" 30                           writeType="0" dbType="mysql" dbDriver="native" switchType="1    "  slaveThreshold="100">
 31                 <heartbeat>select user()</heartbeat>
 32                 <writeHost host="hostM1" url="192.168.4.53:3306" user="tian" 
 33                                    password="123qqq...A"> 
 34                 </writeHost> 
 35         </dataHost>                
 36   
 ##定义mysql54主机名对应的数据库服务器IP地址      
 37         <dataHost name="mysql54" maxCon="1000" minCon="10" balance="0" 
 38                           writeType="0" dbType="mysql" dbDriver="native" switchType="1    "  slaveThreshold="100"> 
 39                 <heartbeat>select user()</heartbeat> 
 40                 <writeHost host="hostM2" url="192.168.4.54:3306" user="tian"
 41                                    password="123qqq...A">
 42                 </writeHost> 
 43         </dataHost> 
 44   
 ##定义mysql55主机名对应的数据库服务器IP地址       
 45         <dataHost name="mysql55" maxCon="1000" minCon="10" balance="0" 
 46                           writeType="0" dbType="mysql" dbDriver="native" switchType="1    "  slaveThreshold="100">
 47                 <heartbeat>select user()</heartbeat>
 48                 <writeHost host="hostM3" url="192.168.4.55:3306" user="tian"
 49                                    password="123qqq...A">
 50                 </writeHost>
 51         </dataHost>
 52 </mycat:schema>
4.配置数据库服务器
首先确认53、54、55主机是否有相对应的库,授权给配置文件中的用户登录
53主机:
mysql> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> grant  all  on  *.*  to tian@"%"   identified  by  "123qqq...A";    ##添加授权用户
Query OK, 0 rows affected, 1 warning (0.10 sec)

54主机:
mysql> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db2                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql>  grant  all on  *.*  to  tian@"%" identified by "123qqq...A";         ##添加授权用户
Query OK, 0 rows affected, 1 warning (0.00 sec)

55主机:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db3                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> grant  all on  *.*  to  tian@"%" identified by "123qqq...A";    ##添加授权用户
Query OK, 0 rows affected, 1 warning (0.00 sec)

5.启动Mycat服务
	测试数据库的授权用户(记得要关防火墙)

[root@host50 ~]# mysql  -h192.168.4.53  -utian  -p123qqq...A
[root@host50 ~]# mysql  -h192.168.4.54  -utian  -p123qqq...A
[root@host50 ~]# mysql  -h192.168.4.55  -utian  -p123qqq...A


	启动服务
[root@host56 mycat]# /usr/local/mycat/bin/mycat  start 
Starting Mycat-server...
[root@host56 mycat]# netstat   -nutlp |  grep 8066   ##查看端口
tcp6       0      0 :::8066                 :::*                    LISTEN      1951/java           
[root@host56 mycat]# ps  -C  java    ##查看进程
   PID TTY          TIME CMD
  1951 ?        00:00:02 java
[root@host56 mycat]# ls  /usr/local/mycat/logs/       #此时查看,目录下就有了错误日志等文件
mycat.log  mycat.pid  wrapper.log

查看报错动态输出:
[root@host56 mycat]# tail  -f /usr/local/mycat/logs/wrapper.log

6.客户端访问分片服务器56
[root@host50 ~]# mysql  -h192.168.4.56  -P8066  -uroot  -p123456    #用server.xml中定义的用户名密码登录
MySQL [(none)]> show  databases;    #查看库,显示的是配置文件中设定的虚假的库
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)
MySQL [(none)]> use  TESTDB;
MySQL [TESTDB]> show  tables;      #查看表,这些表也是在schema.xml中定义的表
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| customer_addr    |
| employee         |
| goods            |
| hotnews          |
| orders           |
| order_items      |
| travelrecord     |
+------------------+
9 rows in set (0.00 sec)

MySQL [TESTDB]> desc  company;    #查看表结构,此时会报错,因为是分片式服务器中的虚拟表,所以会报出db1、 db2、 db3表中没有这个表
ERROR 1146 (42S02): Table 'db3.company' doesn't exist
MySQL [TESTDB]> desc  company;
ERROR 1146 (42S02): Table 'db2.company' doesn't exist
MySQL [TESTDB]> desc  company;
ERROR 1146 (42S02): Table 'db1.company' doesn't exist 


====================================================================
如果启动服务后查不到端口号,可以进行如下操作
[root@host56 ~]# cd  /usr/local/mycat/logs/
[root@host56 logs]# ls
2020-02  mycat.log  mycat.pid  wrapper.log
[root@host56 logs]# rm  -rf mycat.pid 
[root@host56 logs]# /usr/local/mycat/bin/mycat  start 
Starting Mycat-server...
===================================================================

分片规则

  • 枚举法(sharding-by-intfile)
  • 字段值必须在规则文件定义的值里选择
1. 查看表使用的分片规则
[root@host56 mycat]# vim   /usr/local/mycat/conf/schema.xml
                <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">
2. 查看分片规则使用的函数
[root@host56 mycat]# vim   /usr/local/mycat/conf/rule.xml
        <tableRule name="sharding-by-intfile">              #分片规则
                <rule>
                        <columns>sharding_id</columns>         #分片字段名
                        <algorithm>hash-int</algorithm>        #算法,函数名
                </rule>
        </tableRule>
3. 查看函数确定分片字段名称
        <function name="hash-int"
                class="io.mycat.route.function.PartitionByFileMap">    #函数调用的配置文件,在lib里,不要动!!!!!
                <property name="mapFile">partition-hash-int.txt</property>    #分片字段值列表配置文件
        </function>
	
		定义分片字段值列表 :
		
[root@host56 conf]# vim  /usr/local/mycat/conf/partition-hash-int.txt 
10000=0      #0代表schema.xml中第一台数据库服务器  对应dn1
10010=1      #1代表schema.xml中第二胎数据库服务器  对应dn2
10020=2      #2代表schema.xml中第三台数据库服务器  对应dn3
[root@host56 conf]# /usr/local/mycat/bin/mycat  restart     #重启
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@host56 conf]# ss  -nutlp |  grep  8066   #可以再次查看到端口则说明重启成功
tcp    LISTEN     0      100      :::8066                 :::*                   users:(("java",pid=2236,fd=78))

4.建表(表的字段由第1 2 3步决定)

[root@host50 ~]# mysql  -h192.168.4.56  -P8066  -uroot  -p123456     ##客户端访问服务
MySQL [(none)]> use  TESTDB;     #进到TESTDB库
MySQL [TESTDB]> create  table employee(     #创建表结构
    -> ID int  primary key auto_increment ,
    -> sharding_id int ,
    -> name char(10) ,
    -> addree  varchar(50) ,
    -> mail  varchar(50)
    -> );
Query OK, 0 rows affected (0.13 sec)

MySQL [TESTDB]> desc employee;    ##查看表结构
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| ID          | int(11)     | NO   | PRI | NULL    | auto_increment |
| sharding_id | int(11)     | YES  |     | NULL    |                |
| name        | char(10)    | YES  |     | NULL    |                |
| addree      | varchar(50) | YES  |     | NULL    |                |
| mail        | varchar(50) | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

5.插入记录

插入数据:

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10030 ,"bob","usa" ,"bob@111.com");
ERROR 1064 (HY000): can't find any valid datanode :EMPLOYEE -> SHARDING_ID -> 10030  
#sharding_id不能找到有效的数据节点,只能存放在partition-hash-int.txt里面的数据节点

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10000 ,"bob","usa" ,"bob@111.com");    ##存储在53服务器的db1库里的employee表里
Query OK, 1 row affected (0.03 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10000 ,"aaa","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10000 ,"bbb","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10010 ,"sss","usa" ,"bob@111.com");    ##存储在54服务器的db2库里的employee表里
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10010 ,"ddd","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10010 ,"fff","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10010 ,"ggg","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10020 ,"qqq","usa" ,"bob@111.com");        ##存储在55服务器的db3库里的employee表里
Query OK, 1 row affected (0.05 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10020 ,"www","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10020 ,"eee","usa" ,"bob@111.com");
Query OK, 1 row affected (0.00 sec)

MySQL [TESTDB]> insert into  employee(sharding_id ,name ,addree ,mail) values(10020 ,"rrr","usa" ,"bob@111.com");
Query OK, 1 row affected (0.01 sec)


6.在数据库服务器53/54/55主机查看数据是否成功分片存储到各个主机


[root@host53 ~]# mysql -uroot  -p123456

mysql> select *  from  db1.employee;
+----+-------------+------+--------+-------------+
| ID | sharding_id | name | addree | mail        |
+----+-------------+------+--------+-------------+
|  1 |       10000 | bob  | usa    | bob@111.com |
|  2 |       10000 | aaa  | usa    | bob@111.com |
|  3 |       10000 | bbb  | usa    | bob@111.com |
+----+-------------+------+--------+-------------+
3 rows in set (0.00 sec)


mysql> select *  from  db2.employee;
+----+-------------+------+--------+-------------+
| ID | sharding_id | name | addree | mail        |
+----+-------------+------+--------+-------------+
|  1 |       10010 | sss  | usa    | bob@111.com |
|  2 |       10010 | ddd  | usa    | bob@111.com |
|  3 |       10010 | fff  | usa    | bob@111.com |
|  4 |       10010 | ggg  | usa    | bob@111.com |
+----+-------------+------+--------+-------------+
4 rows in set (0.00 sec)


[root@host55 ~]# mysql  -uroot  -p123qqq...A
mysql> select *  from  db3.employee;
+----+-------------+------+--------+-------------+
| ID | sharding_id | name | addree | mail        |
+----+-------------+------+--------+-------------+
|  1 |       10020 | qqq  | usa    | bob@111.com |
|  2 |       10020 | www  | usa    | bob@111.com |
|  3 |       10020 | eee  | usa    | bob@111.com |
|  4 |       10020 | rrr  | usa    | bob@111.com |
+----+-------------+------+--------+-------------+
4 rows in set (0.00 sec)



MySQL [TESTDB]> select  *  from  employee;
+----+-------------+------+--------+-------------+
| ID | sharding_id | name | addree | mail        |
+----+-------------+------+--------+-------------+
|  1 |       10000 | bob  | usa    | bob@111.com |
|  2 |       10000 | aaa  | usa    | bob@111.com |
|  3 |       10000 | bbb  | usa    | bob@111.com |
|  1 |       10020 | qqq  | usa    | bob@111.com |
|  2 |       10020 | www  | usa    | bob@111.com |
|  3 |       10020 | eee  | usa    | bob@111.com |
|  4 |       10020 | rrr  | usa    | bob@111.com |
|  1 |       10010 | sss  | usa    | bob@111.com |
|  2 |       10010 | ddd  | usa    | bob@111.com |
|  3 |       10010 | fff  | usa    | bob@111.com |
|  4 |       10010 | ggg  | usa    | bob@111.com |
+----+-------------+------+--------+-------------+
11 rows in set (0.11 sec)
  • 求模法
  • 根据字段值与设定的数字求模结果存储数据
1.查看配置文件使用求模法规则的表名  
[root@host56 logs]# vim  /usr/local/mycat/conf/schema.xml
                 <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
                           rule="mod-long" />
                           
2.查看表的分片字段名及使用的函数配置
[root@host56 logs]# vim  /usr/local/mycat/conf/rule.xml
<tableRule name="mod-long">
                <rule>
                        <columns>x</columns>     #求模字段名,可自定义
                        <algorithm>mod-long</algorithm>    #算法
                </rule>
        </tableRule>
        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">3</property>       #字段与之求模的数字
        </function>
        
3.重启mycat服务
[root@host56 logs]# /usr/local/mycat/bin/mycat  stop 
Stopping Mycat-server...
Mycat-server was not running.
[root@host56 logs]# /usr/local/mycat/bin/mycat  start 
Starting Mycat-server...
[root@host56 logs]# /usr/local/mycat/bin/mycat  status
Mycat-server is running (1846).

4.客户端连接mycat服务建表存储数据
[root@host50 ~]# mysql  -h192.168.4.56  -P8066  -uroot  -p123456
MySQL [(none)]> show  databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.01 sec)
MySQL [(none)]> use TESTDB;

MySQL [TESTDB]> show  tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| customer_addr    |
| employee         |
| goods            |
| hotnews          |
| orders           |
| order_items      |
| travelrecord     |
+------------------+
9 rows in set (0.00 sec)

MySQL [(none)]> create  table  TESTDB.hotnews;    #在客户端不能用库名.表名创建,因为分片式服务器最终是写到相对应的数据库服务器上的,而数据库服务器中并没有TESTDB这个虚拟库,我们需要进到虚拟库中创建写入数据
ERROR 3000 (HY000): No MyCAT Database selected

MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> create table hotnews(ID int primary key auto_increment ,  x  int  , title  char(25) , comment varchar(150) );
Query OK, 0 rows affected (10.10 sec)

MySQL [TESTDB]>  insert into  hotnews(x , title , comment) values( 10, "dddd" , "yyyy");   #在这里虽然我们设置了自增模式,但是我们也需要写id号,否则会报错
ERROR 1264 (22003): Out of range value for column 'ID' at row 1

MySQL [TESTDB]> insert into  hotnews(ID ,x , title , comment) values(null , 11, "dddd" , "yyyy");    ##插入记录,11和3取余,余2,记录存储在55服务器的db3库里
Query OK, 1 row affected (0.07 sec)

MySQL [TESTDB]> insert into  hotnews(ID ,x , title , comment) values(null , 11, "dddd" , "yyyy");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]>  insert into  hotnews(ID ,x , title , comment) values(null , 10, "dddd" , "yyyy");     ##插入记录,10和3取余,余1,记录存储在54服务器的db2库里
Query OK, 1 row affected (0.02 sec)

MySQL [TESTDB]>  insert into  hotnews(ID ,x , title , comment) values(null , 10, "dddd" , "yyyy");
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into  hotnews(ID ,x , title , comment) values(null , 9, "dddd" , "yyyy");    ##插入记录,9和3取余,余0,存储在53服务器的db1库里
Query OK, 1 row affected (0.04 sec)

MySQL [TESTDB]> insert into  hotnews(ID ,x , title , comment) values(null , 9, "dddd" , "yyyy");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]> insert into  hotnews(ID ,x , title , comment) values(null , 11, "dddd" , "yyyy");
Query OK, 1 row affected (0.01 sec)

MySQL [TESTDB]>  insert into  hotnews(ID ,x , title , comment) values(null , 10, "dddd" , "yyyy");
Query OK, 1 row affected (0.00 sec)

MySQL [TESTDB]>  insert into  hotnews(ID ,x , title , comment) values(null , 9, "dddd" , "yyyy");
Query OK, 1 row affected (0.00 sec)

5.在3台数据库服务器本机查看数据

[root@host53 ~]# mysql -uroot -p123456
mysql> select *  from db1.hotnews;
+----+------+-------+---------+
| ID | x    | title | comment |
+----+------+-------+---------+
|  1 |    9 | dddd  | yyyy    |
|  2 |    9 | dddd  | yyyy    |
|  3 |    9 | dddd  | yyyy    |
+----+------+-------+---------+
3 rows in set (0.00 sec)

[root@host54 ~]# mysql -uroot -p123456
mysql> select *  from db2.hotnews;
+----+------+-------+---------+
| ID | x    | title | comment |
+----+------+-------+---------+
|  1 |   10 | dddd  | yyyy    |
|  2 |   10 | dddd  | yyyy    |
|  3 |   10 | dddd  | yyyy    |
+----+------+-------+---------+
3 rows in set (0.00 sec)

[root@host55 ~]# mysql -uroot  -p123qqq...A
mysql> select  *  from  db3.hotnews;
+----+------+-------+---------+
| ID | x    | title | comment |
+----+------+-------+---------+
|  1 |   11 | dddd  | yyyy    |
|  2 |   11 | dddd  | yyyy    |
|  3 |   11 | dddd  | yyyy    |
+----+------+-------+---------+
3 rows in set (0.00 sec)

[root@host50 ~]# mysql  -h192.168.4.56  -P8066  -uroot  -p123456
MySQL [TESTDB]> select *  from  hotnews;
+----+------+-------+---------+
| ID | x    | title | comment |
+----+------+-------+---------+
|  1 |    9 | dddd  | yyyy    |
|  2 |    9 | dddd  | yyyy    |
|  3 |    9 | dddd  | yyyy    |
|  1 |   10 | dddd  | yyyy    |
|  2 |   10 | dddd  | yyyy    |
|  3 |   10 | dddd  | yyyy    |
|  1 |   11 | dddd  | yyyy    |
|  2 |   11 | dddd  | yyyy    |
|  3 |   11 | dddd  | yyyy    |
+----+------+-------+---------+
9 rows in set (0.07 sec)
添加新库/新表
  • 服务端配置
1.添加新库
[root@host56 logs]# vim   /usr/local/mycat/conf/server.xml   #添加新的库
 82                 <property name="schemas">TESTDB,GAME</property>
 97                 <property name="schemas">TESTDB,GAME</property>

2.添加新表
[root@host56 ~]# vim   /usr/local/mycat/conf/schema.xml    #添加以下几行,添加虚拟表 
  5         <schema name="GAME" checkSQLschema="false" sqlMaxLimit="100">
  6                 <table name="teacher"  dataNode="dn1,dn2,dn3"  rule="mod-long" /> 
  7                 <table name="class"  dataNode="dn1,dn2,dn3"  type="global" />  
  8         </schema>
  
3.重启mycat服务
[root@host56 logs]# /usr/local/mycat/bin/mycat  stop 
Stopping Mycat-server...
Mycat-server was not running.
[root@host56 logs]# /usr/local/mycat/bin/mycat  start
Starting Mycat-server...
[root@host56 logs]# ss  -nutlp |  grep 8066
tcp    LISTEN     0      100      :::8066                 :::*                   users:(("java",pid=2762,fd=77))
  • 客户端访问
    1.客户端连接mycat服务
[root@host50 ~]# mysql  -h192.168.4.56  -P8066  -uroot  -p123456

2.创建新表存数据
MySQL [(none)]> show  databases;
+----------+
| DATABASE |
+----------+
| GAME     |        ##逻辑库
| TESTDB   |
+----------+
2 rows in set (0.01 sec)

MySQL [(none)]> use  GAME;

MySQL [GAME]> create table class(name char(10)  ,age  int);
Query OK, 0 rows affected (0.04 sec)

MySQL [GAME]> insert into  class  values("yyy" ,19);
Query OK, 1 row affected (0.07 sec)

MySQL [GAME]> insert into  class  values("yyy" ,19);
Query OK, 1 row affected (0.03 sec)

MySQL [GAME]> insert into  class  values("yyy" ,19);
Query OK, 1 row affected (0.01 sec)

MySQL [GAME]> insert into  class  values("yyy" ,19);
Query OK, 1 row affected (0.01 sec)

MySQL [GAME]> insert into  class  values("zzz" ,20);
Query OK, 1 row affected (0.01 sec)

MySQL [GAME]> insert into  class  values("zzz" ,20);
Query OK, 1 row affected (0.00 sec)

MySQL [GAME]> insert into  class  values("zzz" ,20);
Query OK, 1 row affected (0.02 sec)


MySQL [GAME]> select *  from  class;
+------+------+
| name | age  |
+------+------+
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| zzz  |   20 |
| zzz  |   20 |
| zzz  |   20 |
+------+------+
7 rows in set (0.05 sec)

3.在数据库服务器查看
[root@host53 ~]# mysql -uroot -p123456
mysql> select *  from db1.class;
+------+------+
| name | age  |
+------+------+
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| zzz  |   20 |
| zzz  |   20 |
| zzz  |   20 |
+------+------+
7 rows in set (0.00 sec)



[root@host54 ~]# mysql -uroot -p123456
 mysql> select *  from db2.class;
+------+------+
| name | age  |
+------+------+
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| zzz  |   20 |
| zzz  |   20 |
| zzz  |   20 |
+------+------+
7 rows in set (0.01 sec)

[root@host55 ~]# mysql -uroot  -p123qqq...A
mysql> select  *  from  db3.class;
+------+------+
| name | age  |
+------+------+
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| yyy  |   19 |
| zzz  |   20 |
| zzz  |   20 |
| zzz  |   20 |
+------+------+
7 rows in set (0.00 sec)
总结
  1. mycat介绍:做数据分片存储的软件
  2. 10种分片规则:枚举法,求模法
  3. 配置文件:配置连接用户,逻辑库名,逻辑表,分片字段名
  4. 服务管理:启动,停止,查看状态,kill killall
  5. 分片规则的使用:水平分割 mod-long sharding-by-intfile
  6. 添加新库新表
  7. 客户端连接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值