一、Mycat的安装和配置(使用的java开发的)
前提:A、安装了JDK
1、安装
1、在mycat官网[http://www.mycat.io/] 下载mycat
wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
2、由于我自己的机器内存比较小,改下内存大小
3、然后启动mycat
console:代表前端启动,如果发现后端启动报错,就可以使用前端启动
start代表后端启动
8066是mycat提供 外部访问的端口
4、如何让mycat对我们的库进行分片呢
首先看下分片的概念:
逻辑库(schema) :
前面一节讲了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。对应我们在开发的时候,要使用的库,注意这个库是不存在的,它是逻辑上存在的
逻辑表(table):类似视图
既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。总而言之就是需要进行分片的表。
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
分片节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。
节点主机(dataHost)
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。节点主机会对应真实的数据库
分片规则(rule)
前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
基于范围分片
基于hash分片
5、做下分片的测试
Mycat的配置
schema.xml:逻辑库的配置文件
schema的name是逻辑库的名称,这个名字可以随便改,checkSQLschema:要不要检查
sqlMaxLimit:每次从库查多少条数据,类似limit 100,代表查询前100条数据
下面的table是逻辑表,name是逻辑的表名,dataNode:逻辑表所对应的数据节点
dn1,dn2,dn3来源于下面的节点dataNode的名字。tb_user这张逻辑表按照rule的规则
分片规则来分片到三个不同的数据库,这个相当于是水平的方式来分库的。意味着在每个库中的表的结构是一样的。
这个分片规则:0-500万到库 1 501万到1000万到库2 1001万到1500万到库3,默认的分片规则是这个的。
下面的是一个主机分了三个库,这里也可以用三台演示 dataHost:代表数据的主机节点
下面代表着真实数据库的位置,maxCon:最大的连接池数,minCon:最小的连接池数
balance:负载均衡,它总共有三个量,0,1,2.后面会详细写 writeType:写入类型
dbType:数据库的类型
下面的是真实的数据库服务器,这里面的user和password,是要访问数据库的用户名和密码
server.xml:
主要配置mycat的服务参数的,比如端口号,myat用户名和密码使用的逻辑数据库等
在这个配置文件中先配置下字符集,别的先不用管。在这个文件里面可以配置增删改查的权限以及用户只读的权限。
下面的是对应逻辑库的名称,登录Mycat的用户名和密码是mycat,可以随便设置,不是和数据库连的用户名和密码。默认的端口是8066,web端的管理端口是9066
配置完成后要重启服务器,如果不重启的话,配置的文件是不生效的。
用navicat连接的时候,和正常访问mysql是一样的,什么都不用变
这时三个库创建好,db1,db2,db3
由于逻辑表,逻辑库,因为逻辑表要关联到三个库,如果在241上没有库的话,会报错。要用脚本来创建,在mycat里面必须要使用脚本来创建。
创建完成之后,然后刷新下db1的库,db2的库,db3的库
这时0到500万在库1中,501万到1000万是在库2中,1001万到1500万的数据在库3,进行水平分库了。
这时只在库1有数据,因为1到500之中的数据存储在库1中,默认是按照id来进行分库的
下面是分页的结果
在三个库中执行了相同的sql语句,最后在执行自己的sql语句,这就是解决跨库分页的问题了。
0到4代表提取的是4条,然后归并结果,在查询1到3的结果
总结:当我们要进行水平 分库的时候可以用它来做。mycat已经把数据放入到内存里面去进行缓存了,然后归并结果在返回出来。意义:数据量的大的话才用mycat。