什么是数据库分片
一、海量数据的存储问题
随着互联网的发展,数据的量级也是指数的增长,从GB到TB到PB。对数据的各种操作也是
愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时
候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减
少对复杂查询的支持,来获取性能上的提升。
但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要
有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据
库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查
询性能将一个数据库的数据分散到不同的数据库中存储。
二、什么是数据库分片
简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多
个数据库(主机)上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
(1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切
可以称之为数据的垂直(纵向)切分
(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到
多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
三、如何实现数据库分片
当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同
的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要
向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。
这种情况下可以使用一个数据库中间件mycat来解决相关的问题。
二、什么是Mycat
Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL
数据库分片,此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽
了,阿里随后开源 Cobar,并维持到 2013 年年初,然后,就没有然后了。
Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输
协议,巧妙地将自己伪装成一个 MySQL Server,目前市面上绝大多数 MySQL 客户端工具
和应用都能兼容。比自己实现一个新的数据库协议要明智的多。
Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网
络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据
库成为通用的数据库中间件。
简单的说,MyCAT就是:
一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据
分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
二、Mycat支持的数据库
三、Mycat的分片策略
四、概念说明
1、逻辑库(schema)
前面一节讲了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发
人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成
的逻辑库。
2、逻辑表(table)
既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑
表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分
片,只有一个表构成。
分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有
一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是
相对分片表来说的,就是那些不需要进行数据切分的表。
3、分片节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节
点(dataNode)。
4、节点主机(dataHost)
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有
多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机
(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点
(dataNode)均衡的放在不同的节点主机(dataHost)。
5、分片规则(rule)
前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务
规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将
极大的避免后续数据处理的难度。
四,MyCat分片
一、需求
把商品表分片存储到三个数据节点上。
二、安装环境分析
两台mysql数据库服务器:
Host1:192.168.100.11
Host2:192.168.100.12
mysql节点1环境
操作系统版本 : centos6.4
数据库版本 : mysql-5.6
mycat版本 :1.4 release
数据库名 : db1、db3
mysql节点2环境
操作系统版本 : centos6.4
数据库版本 : mysql-5.6
mycat版本 :1.4 release
数据库名 : db2
MyCat安装到节点1上(需要安装jdk)
三、配置schema.xml
1、Schema.xml介绍
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及
DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
schema 标签用于定义MyCat实例中的逻辑库
Table 标签定义了MyCat中的逻辑表
dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心
跳语句。
注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。
在MySQL的配置文件中 vi /etc/my.cnf [mysqld] 中增加一行 lower_case_table_names=1
配置后重启mysql服务 service mysqld restart
MySQL在Linux找不到表名-处理忽略大小写
http://blog.csdn.net/h254532699/article/details/54318478
2、创建数据库
在第一台服务器上创建数据库db1、db3
在第二台服务器上创建数据库db2
3、Schema.xml配置
schema中配置一个table节点
配置后重启mysql服务 service mysqld restart
<mycat:schema xmlns:mycat=“http://org.opencloudb/”>
select user()
select user()
3、配置server.xml
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。
4、rule.xml
rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者
对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程
中可以按照需求添加tableRule
和function。
此配置文件可以不用修改,使用默认即可。
四、测试分片
1、创建表
配置完毕后,重新启动mycat:
使用mysql客户端连接mycat,创建表 tb_item 的表结构。
2、插入数据
3、分片测试
由于配置的分片规则为“auto-sharding-long”,所以mycat会根据此规则自动分片。
每个datanode中保存一定数量的数据。根据id进行分片
经测试id范围为:
Datanode1:1~5000000
Datanode2:5000000~10000000
Datanode3:10000001~15000000
当15000000以上的id插入时报错:
[Err] 1064 - can’t find any valid datanode :TB_ITEM -> ID -> 15000001
此时需要添加节点了。
论文参考:https://blog.csdn.net/qq_35152037/article/details/79681762