Mycat软件使用详解,数据分片,分库分表,读写分离,

一、什么是分库分表?

将原本存放与一台数据库服务器里的数据,按照特定的方式进行拆分,分散存放到多台数据库中,以达到减轻单台数据库服务器压力,实现数据库负载均衡的效果

 

 

二、水平分割与垂直分割

1.水平分割

将每条记录按分片规则(图中是通过求余数的方式)分散到多个数据库中,要求每台数据库服务器中拥有相同的数据库和数据表

2.垂直分割

将单个数据库中的多个表按业务类型分类,分散存储到不同的表中,假设有4台数据库服务器,那可以按照客户,存款,贷款,支付创建四张表,安装表来识别数据库服务器,从而实现分散存储的效果

 

 

三、Mycat软件

不管是水平分割还是垂直分割,都需要有一个中间件来处理请求,将客户端的请求分发给不同的数据库,Mycat就是作为中间件的软件.

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

概述

-适合数据大量写入的存储需求

-支持Oracal,Sql Server,Mysql,Mongdb

-提供数据读写分离服务

-提供数据分片服务

-基于阿里巴巴Cobar进行研发的开源软件,是阿里巴巴用于处理数据分片的核心软件

Mycat支持的分片规则

mycat支持10种分片规则

Mycat的工作过程

1.解析Sql命令涉及到的表

2.查看mycat配置文件中对表的配置,查看分片规则,如果有对应的表和分片规则,则获取Sql命令里分片字段的值(由你自己设置,一般是id值),并匹配分片函数,对照分片列表,选择一台服务器

3.将sql命令发往对应的数据库服务器去执行

4.收集和处理由数据库返回的结果数据,返回给客户端

5.Mycat

 

四、部署分片服务器和数据库服务

1.拓扑图

准备五台服务器,分片服务器1台,3台数据库服务器,1台客户端

ip配置拓扑

 

2.部署分片服务器,安装mycat软件

需要安装jdk,前面说了mycat是基于java的,所以需要java环境

[mycat下载地址]http://www.mycat.io/

1)准备java环境

]# yum -y install java-1.8.0-openjdk //安装JDK

[root@mycat56 ~]# which java //查看命令

/usr/bin/java

[root@mycat56 ~]# 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)

 2)安装提供服务的软件包

[root@mycat56 ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz //解压源码

[root@mycat56 ~]# mv mycat /usr/local/ //移动目录

[root@mycat56 ~]# ls /usr/local/mycat/ //查看文件列表

bin catlet conf lib logs version.txt

2.5)mycat目录结构和配置文件信息

我们一般用到的是bin和conf,用于启动mycat和修改配置文件

我们在本次实验中要修改的文件是server.xml和schema.xml,下一节会使用rule.xml

3)设置连接账号

连接账号是用来访问mycat服务的,逻辑库是对外展示的库,并非真实用于存储数据的库,逻辑库位于mycat代理服务器上,真实库位于数据库服务器上

  1. ]# vim /usr/local/mycat/conf/server.xml
  2. <user name="root">        //连接mycat服务时使用的用户名
  3. <property name="password">123456</property> //用户连接mycat用户时使用的密码
  4. <property name="schemas">TESTDB</property> //逻辑库名
  5. </user>
  6. <user name="user">
  7. <property name="password">user</property>
  8. <property name="schemas">TESTDB</property>
  9. <property name="readOnly">true</property>    //只读权限,连接mycat服务后只有读记录的权限,不写这一行则是可读可写    
  10. </user>
  11. :wq

4)配置数据分片 

修改配置文件,这个配置文件中有比较多的注释文件,我这里不写出来,大家在修改文件之前应该要做一个备份,防止修改出错后能还原环境,整个文件格式如下,我们需要定义三个标签,一个是定义分片的库与表,然后定义数据节点,再定义数据库服务器的连接信息,包括数据库ip,登录账户密码.

 定义分片的库表,<schema>标签用于定义库,在这个标签下,定义表信息,包括逻辑表名,表主键值,分片规则以及数据库节点

定义数据库节点,数据库节点连接数据库中的真实库,定义三个选项,name是dataNode的别称,dataHost是数据库服务器的别称,database是数据库服务器中的真实库

定义数据库服务器的信息,这里我们需要定义3个数据库服务器,包括ip地址,连接用户名与密码

如果复制的话记得把注释删了,这是源配置文件我加入了一些注释

  1. [root@mycat56 conf]# vim /usr/local/mycat/conf/schema.xml
  2. <?xml version="1.0"?>
  3. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  4. <mycat:schema xmlns:mycat="http://io.mycat/">
  5.   //对TESTDB库下的表做分片存储
  6. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  7.    //对travelrecord表做分片存储
  8. <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> 
  9. //对company表做分片存储
  10. <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
  11. //对goods表做分片存储
  12. <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
  13. //对hotnews表做分片存储
  14. <table name="hotnews" dataNode="dn1,dn2,dn3"rule="mod-long" />
  15. //对employee表做分片存储
  16. <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"rule="sharding-by-intfile" />
  17. //对customer表做分片存储,这张表较为特殊,有子表
  18. <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"rule="sharding-by-intfile">
  19. <childTable name="orders" primaryKey="ID" joinKey="customer_id"parentKey="id">
  20. <childTable name="order_items" joinKey="order_id"parentKey="id" />
  21. </childTable>
  22. <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"parentKey="id" />
  23. </table>
  24. </schema>
  25.  
  26.  
  27. //定义数据库主机名及存储数据的库
  28. <dataNode name="dn1" dataHost="localhost53" database="db1" />
  29. <dataNode name="dn2" dataHost="localhost54" database="db2" />
  30. <dataNode name="dn3" dataHost="localhost55" database="db3" />
  31.  
  32. //定义localhost53主机名对应的数据库服务器ip地址
  33. <dataHost name="localhost53" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  34. <heartbeat>select user()</heartbeat>
  35. <writeHost host="hostM53" url="192.168.4.53:3306" user="adminplj"password="123qqq...A"></writeHost>
  36. </dataHost>
  37.     
  38. //定义localhost54主机名对应的数据库服务器ip地址
  39.  <dataHost name="localhost54" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  40. <heartbeat>select user()</heartbeat>
  41. <writeHost host="hostM54" url="192.168.4.54:3306" user="adminplj" password="123qqq...A">
  42. </writeHost>
  43. </dataHost>
  44.  
  45.     //定义localhost54主机名对应的数据库服务器ip地址
  46. <dataHost name="localhost55" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  47. <heartbeat>select user()</heartbeat>
  48. <writeHost host="hostM55" url="192.168.4.55:3306" user="adminplj" password="123qqq...A">
  49. </writeHost>
  50. </dataHost>
  51.  
  52. </mycat:schema>

 

5)配置数据库服务器

根据分片文件的设置在对应的数据库服务器上创建存储数据的数据库,要求每台主机安装mariadb服务

yum -y install mariadb

输入命令进入mariadb:  mysql -uroot

  1. mysql> create database db1; //在数据库53上,创建db1库
  2. mysql> create database db2; //在数据库54上,创建db2库
  3. mysql> create database db3; //在数据库55上,创建db3库

根据分片文件配置,在对应的数据库服务器上创建授权用户(3台数据库服务器都要添加,在数据库服务器本机管理员root用户登录后执行授权命令)

  1. mysql> grant all on *.* to adminplj@"%" identified by "123qqq...A" ; //在数据库服务器192.168.4.53 执行
  2.  
  3. mysql> grant all on *.* to adminplj@"%" identified by "123qqq...A" ; //在数据库服务器192.168.4.54 执行
  4. mysql> grant all on *.* to adminplj@"%" identified by "123qqq...A" ; //在数据库服务器192.168.4.55 执行

 

6)测试数据库服务器是否能够连通

测试授权用户:在192.168.4.56主机,使用授权用户分别连接3台数据库服务器,若连接失败,请检查数据库服务器是否有对应的授权用户。确认三台数据库服务器可以使用

  1. [root@mycat56 ~]# which mysql || yum -y install mariadb //安装提供mysql命令的软件包
  2. //连接数据库服务器192.168.4.53
  3. [root@mycat56 ~]# mysql -h192.168.4.53 -uadminplj -p123qqq...A
  4. mysql: [Warning] Using a password on the command line interface can be insecure.
  5. Welcome to the MySQL monitor. Commands end with ; or \g.
  6. Your MySQL connection id is 54
  7. Server version: 5.7.17 MySQL Community Server (GPL)
  8. mysql> exit; //连接成功 断开连接
  9. Bye
  10.  
  11. //连接数据库服务器192.168.4.54
  12. [root@mycat56 ~]# mysql -h192.168.4.54 -uadminplj -p123qqq...A
  13. Welcome to the MySQL monitor. Commands end with ; or \g.
  14. Your MySQL connection id is 47
  15. Server version: 5.7.17 MySQL Community Server (GPL)
  16. mysql> exit; //连接成功 断开连接
  17. Bye
  18.  
  19. //连接数据库服务器192.168.4.55
  20. [root@mycat56 ~]# mysql -h192.168.4.55 -uadminplj -p123qqq...A
  21. mysql: [Warning] Using a password on the command line interface can be insecure.
  22. Welcome to the MySQL monitor. Commands end with ; or \g.
  23. Your MySQL connection id is 49
  24. Server version: 5.7.17 MySQL Community Server (GPL)
  25. mysql> exit ; //连接成功 断开连接

7)启动服务mycat分片服务器

  1. [root@mycat56 ~]/usr/local/mycat/bin/mycat --help   //查看一下可以用的命令
  2. Usage /usr/local/mycat/bin/mycat {console | start | stop | restart | status | dump}
  3. [root@mycat56 ~]# /usr/local/mycat/bin/mycat start
  4. Starting Mycat-server...

查看服务状态

  1. [root@mycat56 ~]# netstat -utnlp | grep :8066 //查看端口
  2. tcp6 0 0 :::8066 :::* LISTEN 2924/java
  3. [root@mycat56 ~]# ps -C java //查看进程
  4. PID TTY TIME CMD
  5. 2924 ? 00:00:01 java

8) 测试mycat分片

这里测试的目的是测试是否在配置文件中创建的数据库和表正确显示,下一小节再演示如何实现分片插入数据

在客户端192.168.4.50 连接分片服务器,访问数据

命令: mysql -hmycat主机的IP -P端口号 -u用户 -p密码

  1. [root@client50 ~]# mysql -h192.168.4.56 -P8066 -uroot –p123456
  2. mysql> show databases; //显示已有的库
  3. +----------+
  4. | DATABASE |
  5. +----------+
  6. | TESTDB |
  7. +----------+
  8. 1 row in set (0.00 sec)
  9.  
  10. mysql> USE TESTDB; //进入TESTDB库
  11. mysql> show tables; //显示已有的表,配置文件里定义的表名
  12. +------------------+
  13. | Tables in TESTDB |
  14. +------------------+
  15. | company |
  16. | customer |
  17. | customer_addr |
  18. | employee |
  19. | goods |
  20. | hotnews |
  21. | orders |
  22. | order_items |
  23. | travelrecord |
  24. +------------------+
  25. 9 rows in set (0.00 sec)
  26. mysql>desc employee;    //查看表信息会提示数据表不存在,这是因为在真实数据库中并没有创建这个表,下节演示如何创建真实表,和使用分片规则插入数据
  27. mysql>ERROR 1146(42S02):Table 'db1.employee' doesn't exist;
  28. mysql>exit; //断开连接

 

五、连接分片服务器存储数据 

mycat有10中分片规则,这里讲解枚举法和求模法

枚举法 sharding-by-intfile

顾名思义,就是自己定义好枚举对象,根据指定的键值存储到对应的服务器(一般是id),以下是schema.xml的配置信息

以下是rule.xml和自己定义的*.txt枚举对象文件,两个文件需要在同一目录,这里的10000是什么意思呢?就是所谓的id,你在插入一条记录的时候,需要插入10000这一字段,用于指定插入的数据库服务器(为0,代表第一台) .这里服务器从0开始,代表第一台,依次向上加,我们可以看成是key-value的形式,也就是键值对形式,键的长度不固定,但是一般不会太大,一般你不会有太多的数据库服务器,5位即可

求模法 mod-long

枚举法的缺点就是你需要自己指定被插入的服务器,这样有很多缺点,一是需要人工指定,二是占用字段,浪费空间资源,三是后期修改较麻烦,当你添加服务器时还需要修改配置文件增加键值对

求模法要简单的多,也就是用余数来指定数据库服务器,一般用主键值作为被模数,改文件是schema.xml

指定服务器数量为3,也是余数,该文件是rule.xml

 

1.sharding-by-intfile分片规则的使用

1)查看配置文件,得知使用sharding-by-intfile分片规则的表名

[root@mycat56 ~]# vim /usr/local/mycat/conf/schema.xml

<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"

rule="sharding-by-intfile" />

:wq

2)查看规则文件,得知sharding-by-intfile分片规则使用的函数

  1. [root@mycat56 ~]# vim /usr/local/mycat/conf/rule.xml
  2. <tableRule name="sharding-by-intfile">
  3. <rule>
  4. <columns>sharding_id</columns> //数据分片字段名
  5. <algorithm>hash-int</algorithm> //使用的函数名
  6. </rule>
  7. </tableRule>
  8.  
  9. <function name="hash-int"
  10. class="io.mycat.route.function.PartitionByFileMap">
  11. <property name="mapFile">partition-hash-int.txt</property> //函数调用的配置文件
  12. </function>
  13. :wq

3)修改函数配置文件,添加dn3 数据节点

  1. [root@mycat56 ~]# vim /usr/local/mycat/conf/partition-hash-int.txt
  2. 10000=0 //当sharding_id字段的值是10000时,数据存储在数据节点dn1里
  3. 10010=1 //当sharding_id字段的值是10010时,数据存储在数据节点dn2里
  4. 10020=2 //当sharding_id字段的值是10020时,数据存储在数据节点dn3里
  5. :wq

4)重启mycat服务,使其修改有效

  1. [root@mycat56 ~]# /usr/local/mycat/bin/mycat stop    //停止服务
  2. [root@mycat56 conf]# /usr/local/mycat/bin/mycat start //启动服务
  3. [root@mycat56 conf]# netstat -utnlp | grep :8066 //有端口
  4. tcp6 0 0 :::8066 :::* LISTEN 1364/java
  5. [root@mycat56 conf]#
  6. [root@mycat56 conf]# ps –C java //有进程
  7. PID TTY TIME CMD
  8. 1125 ? 00:00:01 java
  9. [root@mycat56 conf]#

5)客户端连接分片服务器,存取数据

 有一点需要注意,就是数据库和表名不能随意创建,必须安装你配置文件中说明的去创建,因为我在schema.xml中配置了TESTDB这个库和employee这个表,所以下面我才可以创建它.简而言之就是你要创建什么表就必须先定义什么表

   mycat的好处就是不需要你重复建表,只需要在mycat上创建表,数据库服务器就会同步创建这些表

  1. ]#mysql -h192.168.4.56 -P8066 -uroot -p123456 //访问服务
  2. mysql> use TESTDB; //进入TESTDB库 //建表,在分片服务器中键表会在数据库中同步建表
  3. mysql> create table employee(
  4. ID int primary key ,
  5. sharding_id int,
  6. -> name char(15) ,
  7. age int ); 
  8. Query OK, 0 rows affected (0.68 sec)
  9.  
  10. mysql> desc employee; //查看表结构
  11. +-------------+----------+------+-----+---------+-------+
  12. | Field | Type | Null | Key | Default | Extra |
  13. +-------------+----------+------+-----+---------+-------+
  14. | ID | int(11) | NO | PRI | NULL | |
  15. | sharding_id | int(11) | YES | | NULL | |
  16. | name | char(15) | YES | | NULL | |
  17. | age | int(11) | YES | | NULL | |
  18. +-------------+----------+------+-----+---------+-------+
  19. 4 rows in set (0.00 sec)
  20. //插入表记录,因为我这里使用枚举法,所以要指定枚举值sharding_id
  21. Mysql>insert into employee(ID,sharding_id,name,age)  values
  22. (1,10000,"bob",19), //存储在53服务器的db1库的employee表里
  23. (2,10010,"tom",21), //存储在54服务器的db2库的employee表里
  24. (3,10020,"lucy2",16); //存储在55服务器的db3库的employee表里
  25. Query OK, 3 rows affected (0.07 sec)
  26. Records: 3 Duplicates: 0 Warnings: 0
  27. mysql> select * from employee; //查看表记录
  28. +----+-------------+------+------+
  29. | ID | sharding_id | name | age |
  30. +----+-------------+------+------+
  31. | 1 | 10000 | bob | 19 |
  32. | 2 | 10010 | tom | 21 |
  33. | 3 | 10020 | lucy | 16 |
  34. +----+-------------+------+------+
  35. 3 rows in set (0.06 sec)
  36.  
  37. mysql>insert into employee(ID,sharding_id,name,age) values
  38. (4,10000,"bob2",19), //存储在53服务器的db1库的employee表里
  39. (5,10000,"tom2",21), //存储在53服务器的db1库的employee表里
  40. (6,10000,"lucy2",16); //存储在53服务器的db1库的employee表里
  41. Query OK, 3 rows affected (0.07 sec)
  42. Records: 3 Duplicates: 0 Warnings: 0
  43.  
  44. mysql> select * from employee;  //查看表记录 
  45. | ID | sharding_id | name | age |
  46. +----+-------------+-------+------+
  47. | 1 | 10000 | bob | 19 |
  48. | 4 | 10000 | bob2 | 19 |
  49. | 5 | 10000 | tom2 | 21 |
  50. | 6 | 10000 | lucy2 | 16 |
  51. | 3 | 10020 | lucy | 16 |
  52. | 2 | 10010 | tom | 21 |
  53. +----+-------------+-------+------+
  54. 6 rows in set (0.00 sec)

6)在数据库服务器本机,查看表记录

在数据库服务器192.168.4.53 查看数据

  1. [root@host53 ~]# mysql -uroot -p123qqq...A -e "select * from db1.employee"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +----+-------------+-------+------+
  4. | ID | sharding_id | name | age |
  5. +----+-------------+-------+------+
  6. | 1 | 10000 | bob | 19 |
  7. | 4 | 10000 | bob2 | 19 |
  8. | 5 | 10000 | tom2 | 21 |
  9. | 6 | 10000 | lucy2 | 16 |
  10. +----+-------------+-------+------+
  11. [root@host53 ~]#

在数据库服务器192.168.4.54 查看数据

  1. [root@host54 ~]# mysql -uroot -p123qqq...A -e "select * from db2.employee"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +----+-------------+------+------+
  4. | ID | sharding_id | name | age |
  5. +----+-------------+------+------+
  6. | 2 | 10010 | tom | 21 |
  7. +----+-------------+------+------+
  8. [root@host54 ~]#

在数据库服务器192.168.4.55 查看数据

  1. [root@host55 ~]# mysql -uroot -p123qqq...A -e "select * from db3.employee"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +----+-------------+------+------+
  4. | ID | sharding_id | name | age |
  5. +----+-------------+------+------+
  6. | 3 | 10020 | lucy | 16 |
  7. +----+-------------+------+------+
  8. [root@host55 ~]#

2.mod-long分片规则的使用

1)查看配置文件,得知使用mod-long分片规则的表名

注意要删除 primaryKey="ID" autoIncrement="true" 不然无法存储数据,非自增长

[root@mycat56 ~]# vim /usr/local/mycat/conf/schema.xml

<table name="hotnews" dataNode="dn1,dn2,dn3" rule="mod-long" />

:wq

 

2)查看规则文件,得知 mod-long分片规则使用的函数

  1. [root@mycat56 ~]# vim /usr/local/mycat/conf/rule.xml
  2. <tableRule name="mod-long">
  3. <rule>
  4. <columns>id</columns>    //数据分片字段,与表中字段同名
  5. <algorithm>mod-long</algorithm> //函数名
  6. </rule>
  7. </tableRule>
  8. <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
  9. <!-- how many data nodes -->
  10. <property name="count">3</property> //指定求模数字
  11. </function>
  12. :wq

 

3)重启mycat服务,使其修改有效

  1. [root@mycat56 ~]# /usr/local/mycat/bin/mycat stop    //停止服务
  2. [root@mycat56 conf]# /usr/local/mycat/bin/mycat start //启动服务
  3. [root@mycat56 conf]# netstat -utnlp | grep :8066 //有端口
  4. tcp6 0 0 :::8066 :::* LISTEN 1364/java
  5. [root@mycat56 conf]#
  6. [root@mycat56 conf]# ps –C java //有进程
  7. PID TTY TIME CMD
  8. 1125 ? 00:00:01 java

 

4)客户端连接分片服务器,存取数据

  1. ]#mysql -h192.168.4.56 -P8066 -uroot -p123456 //访问服务
  2. mysql> use TESTDB; //进入TESTDB库
  3. mysql> create table hotnews(     //创建表时需要与rule.xml文件定义的求模值名一样
  4. id int ,title char(30),
  5. comment char(200)); 
  6. Query OK, 0 rows affected (0.79 sec)
  7.  
  8. mysql> desc hotnews; //查看表结构
  9. +---------+-----------+------+-----+---------+-------+
  10. | Field | Type | Null | Key | Default | Extra |
  11. +---------+-----------+------+-----+---------+-------+
  12. | id | int(11) | YES | | NULL | |
  13. | title | char(30) | YES | | NULL | |
  14. | comment | char(200) | YES | | NULL | |
  15. +---------+-----------+------+-----+---------+-------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> insert into hotnews(id,title,comment)values(9,"sc","xxxxx"); //插入第1条表记录,9和3取余 余0 记录存储在53服务器的db1库里
  19. Query OK, 1 row affected (0.11 sec)
  20.  
  21. mysql> insert into hotnews(id,title,comment)values(10,"xx","haha");//插入第2条表记录,10和3取余 余1 记录存储在54服务器的db2库里
  22. Query OK, 1 row affected (0.05 sec)
  23.  
  24. mysql> insert into hotnews(id,title,comment)values(11,"yy","zz");//插入第3条表记录,11和3取余 余2 记录存储在55服务器的db3库里
  25. Query OK, 1 row affected (0.03 sec)
  26.  
  27. mysql> select * from hotnews; //查看表记录
  28. +------+-------+---------+
  29. | id | title | comment |
  30. +------+-------+---------+
  31. | 11 | yy | zz |
  32. | 10 | xx | haha |
  33. | 9 | sc | xxxxx |
  34. +------+-------+---------+
  35. 3 rows in set (0.01 sec)

 

5)在数据库服务器本机,查看表记录

在数据库服务器192.168.4.53 查看数据

  1. [root@host53 ~]# mysql -uroot -p123qqq...A -e "select * from db1.hotnews"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +------+-------+---------+
  4. | id | title | comment |
  5. +------+-------+---------+
  6. | 9 | sc | xxxxx |
  7. +------+-------+---------+
  8. [root@host53 ~]#

在数据库服务器192.168.4.54 查看数据

  1. [root@host54 ~]# mysql -uroot -p123qqq...A -e "select * from db2.hotnews"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +------+-------+---------+
  4. | id | title | comment |
  5. +------+-------+---------+
  6. | 10 | xx | haha |
  7. +------+-------+---------+
  8. [root@host54 ~]# [root@host54 ~]#

在数据库服务器192.168.4.55 查看数据

  1. [root@host55 ~]# mysql -uroot -p123qqq...A -e "select * from db3.hotnews"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +------+-------+---------+
  4. | id | title | comment |
  5. +------+-------+---------+
  6. | 11 | yy | zz |
  7. +------+-------+---------+
  8. [root@host55 ~]#

 

六、自定义数据库表

具体要求如下:

  • 逻辑库名BBSDB
  • 逻辑表名company2数据不分片,把数据存储到3台数据库服务器上
  • 逻辑表名employee2 使用枚举法分片规则把数据存储到3台数据库服务器上

1.配置mycat服务器

1)添加新库

需要在server的property下添加一个库名

[root@mycat56 ~]# vim /usr/local/mycat/conf/server.xml

<user name="root">

……

<property name="schemas">TESTDB,BBSDB</property>//指定逻辑库名

</user>

:wq

2)添加新表

  1. [root@mycat56 ~]# vim /usr/local/mycat/conf/schema.xml
  2. <mycat:schema xmlns:mycat="http://io.mycat/">
  3.             <schema name="BBSDB" checkSQLschema="false" sqlMaxLimit="100">
  4.         <table name="company2" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> //指定逻辑表名company2
  5.         <table name="employee2" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile" />
  6. </schema>
  7. </mycat:schema >
  8. :wq

3)重启mycat服务

[root@mycat56 ~]# /usr/local/mycat/bin/mycat stop //停止服务

[root@mycat56 conf]# /usr/local/mycat/bin/mycat start //启动服务

2.测试配置

1)连接mycat服务器、建表、插入记录

[root@host50 ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456 //连接mycat服务器

mysql> show databases; //显示已有的数据库

+----------+

| DATABASE |

+----------+

| BBSDB | //逻辑库BBSDB

| TESTDB |

+----------+

mysql> show tables; //查看表

+-----------------+

| Tables in BBSDB |

+-----------------+

| company | //逻辑表

| employee |

+-----------------+

mysql> desc company; //查看表表结构上一个实验创建了所以这里可以直接使用,否则你需要创建一下

+-------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| ID | int(11) | NO | PRI | NULL | |

| name | char(50) | YES | | NULL | |

| addr | char(50) | YES | | NULL | |

+-------+----------+------+-----+---------+-------+

3 rows in set (0.00 sec)

mysql> insert into company(ID,name,addr)values(1,"tarena","beijing");//插入记录

Query OK, 1 row affected (0.10 sec)

mysql> insert into company(ID,name,addr)values(2,"tmall","beijing");

Query OK, 1 row affected (0.15 sec)

mysql> insert into company(ID,name,addr)values(3,"sina","beijing");

Query OK, 1 row affected (0.13 sec)

mysql> select * from company; //查看表记录

+----+--------+---------+

| ID | name | addr |

+----+--------+---------+

| 1 | tarena | beijing |

| 2 | tmall | beijing |

| 3 | sina | beijing |

+----+--------+---------+

3 rows in set (0.04 sec)

2)在数据库服务器本机,查看表记录,在数据库服务器53本机查看。

为什么会都有数据,因为我们这里并没有使用分片规则,没有定义规则就会默认在所有数据库上添加记录,这就相当于创建了一个数据集群

  1. [root@host53 ~]# mysql -uroot -p123qqq...A -e "select * from db1.company2"
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +----+--------+---------+
  4. | ID | name | addr |
  5. +----+--------+---------+
  6. | 1 | tarena | beijing |
  7. | 2 | tmall | beijing |
  8. | 3 | sina | beijing |
  9. +----+--------+---------+
  10. [root@host53 ~]#
  11. 在数据库服务器54本机查看

  12. [root@host54 ~]# mysql -uroot -p123qqq...A -e "select * from db2.company2"
  13. mysql: [Warning] Using a password on the command line interface can be insecure.
  14. +----+--------+---------+
  15. | ID | name | addr |
  16. +----+--------+---------+
  17. | 1 | tarena | beijing |
  18. | 2 | tmall | beijing |
  19. | 3 | sina | beijing |
  20. +----+--------+---------+
  21. [root@host54 ~]#
  22. 在数据库服务器55本机查看

  23. [root@host55 ~]# mysql -uroot -p123qqq...A -e "select * from db3.company"
  24. mysql: [Warning] Using a password on the command line interface can be insecure.
  25. +----+--------+---------+
  26. | ID | name | addr |
  27. +----+--------+---------+
  28. | 1 | tarena | beijing |
  29. | 2 | tmall | beijing |
  30. | 3 | sina | beijing |
  31. +----+--------+---------+

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值