1.mycat是一个完全开源的,面向企业应用开发的大数据库集群,mysql
2.支持事务、ACID、能够替代MySQL的增强版数据库,目前支持关系型数据库以及非关系型数据库sql
3.能够用来代替昂贵的oracle数据库数据库
4.mycat是一个大数据(HDFS)的sql引擎服务器
经过上面的介绍,咱们知道,mycat其实就是一个数据库架构
mycat再初期的时候,是为了用来代替昂贵的oracle存在的,所以它支持的是免费的mysql数据库,也只支持mysql数据库,如今mycat已经能够支持多种数据库了,换句话说,mycat就是mysql的加强版。oracle
再以前介绍架构,咱们知道当数据库压力大的时候,使用独写分离和分库分表,可是mysql是不支持的,使用mycat来实现mysql独写分离和分库分表。分布式
HDFS:大数据的分布式文件存储系统oop
H:Hadoop(大数据),D:Distributed(分布式的),F:File(文件),S:System(系统)。大数据
在大数据中,数据量是很是大的,若是有1PB的数据(1PB=1024TB),没有这么大的硬盘,那么数据应该如何存储呢?blog
将数据拆分为块,分别存储进不一样的磁盘中,假设将这1P的数据,分为10份/20份,分别存储在10/20个磁盘上,当须要读取数据时,就从各个小的磁盘上来获取数据。
一样的,若是想要在1PB中查询一条数据,效率是很是低的,可是若是拆分为小块,查询数据时,直接到相应的块中查询,效率就会变高。
好比说:
1:在100条数据中查询第58条数据
2:将100条数拆分为10份,每份存十条,查询第58条数据,就到相应的块中查询数据,这就至关于在10条数据中查询一条数据
对比上面两种方式,能够看出第2种方式效率会比较高,固然这里假设的数据量比较少若是多的话呢?
HDFS就是经过第二种方式实现的,将大数据切分为块,分别存储到不一样的服务器上,这个服务器称为数据节点DataNode(如下简称DN)。
那么如今的问题就是:如何肯定要查询的数据存放在哪儿个数据节点上呢?
在以前写架构时,提到了,使用一个节点,这个节点就存放每一个数据节点上存放的数据:
好比说,将1份很大的数据拆分为10份,而后将这十份数据标上号:1,2,3,...10。而后使用一个服务器节点,节点内容就是一号服务器放第一份和第三份数据,2号服务器放第2份和第四份数据.....这个节点就称为命名节点NameNode(如下简称NN)。
注意:在将数据拆分存储时,要保证每份数据在服务器集群中至少存在两个节点上。
NameNode是在内存中作计算的。(why?在内存中计算速度很是快,可是比较消耗内存资源)
下面使用一张图来帮助理解:
从这里能够看出,NN是很是重要的,获取数据都是经过NN来找数据的位置的,那么若是NN宕机,就获取不到一条数据了。
这里有一个问题,NN是在内存中作计算的,若是NN宕机,那么占用的内存资源就会被释放,NN中的数据就没有了,即便重启,也获取不到数据,如何解决?
NN每隔一个小时,就会将数据持久化到硬盘中,当NN重启后会从硬盘中加载数据,这个过程大概20秒。
问题2:NN宕机重启后,能够从磁盘中获取数据,可是NN宕机时并不工做,如何获取数据,以及存储新的数据节点,重启后如何保证存储的数据正确?
其实除了NN以外,还有一个备用命名节点SecondaryNameNode(如下简称SN),DN中的数据会按期的向NN和SN中分别保存,SN负责监视NN,可是SN不是NN的从节点。
SN会不定时的检测NN的持久化硬盘中的数据,一旦发现本身有的数据,硬盘中没有,就会向硬盘中存入数据,也就是说,SN和NN组合在一块儿成为一个新的硬盘,替换掉原来的NN的硬盘,当NN重启后,会重新的硬盘中加载数据到内存。
关于大数据时,总会问到的一个问题:如何在10G的数据中查询两条重复的数据?
看到这个问题,正常想到的可能会是for循环,可是当数据量很是大的时候,不能这样用,若是使用for循环,可能要查一个月,如何查找呢?
在HDFS中,查询两条相同数据,由于是分块查询,所以会每一块每一块的查询,并标记当前块中,每条数据出现的次数,如:
mycat就是使用的HDFS的方式实现的,不过这里将F该成了D,mycat是HDDS(High Distributed Data System),