基本概念:
在大数据眼中,行不再是行,而是一个文档,都是这么叫的,比如MongoDB,Elasticcsearch
关系数据库,库,表,行,列
Elasticsearch,索引,类型,文档,字段
NIO IO
IO是面向流的,NIO是面向缓冲的。
什么是分片?为什么要分片?分片的作用在分布式集群中扮演的角色是什么?
分片,我的理解是:假设10万个文档(在mysql中就是10万条记录),如果没有集群一说的话,就会直接将一条条记录存储到mysql,这我们都很熟悉。
假设集群中设置了文档的分片数是100,那么每个分片大概就会有1000个文档,这1000个文档就是一个分片,将文档集离散的分散在集群的各个节点上。
既然是分片,那么就会有主次之说,主分片,与备份分片,出现备份是为了防止数据丢失,比如:某台机器挂了,会根据副本分片,将失去的数据找回来,但是,副本数会加大磁盘的存储量,浪费磁盘的资源,当然会造成集群中各个节点之间的数据的一个传输过程,本来如果只有主分片的话,各个节点传输一次就OK了,但是,加上副本分片的话,传输量会加大到差不多2倍以上。
所以,在分布式集群中,数据再也不要看成一个整体了,他会断裂存储到各个节点的仓库中,当我们操作Es的时候,多个分片就会并发的执行........
索引/类型 索引就相当于mysql数据库的表,而类型标识了数据类型
索引过程:
理解索引过程:比如一个用户发了20万个帖子,描述完毕。
数据(可以是一个文档,即一条记录)索引的时候,会根据文档的标识ID与Es具体的算法将具有相关性的文档写到一个主分片中,比如上面的20万个帖子就会更新到一个分片中,然后copy备份分片到其他几点中,这大概是索引的过程。
搜索过程:
搜索的时候,我们最不想碰到就是,比如,寻找某一个文档,要去集群中的各个节点都去试一下,最坏的是,试到最后一个机器的分片才找到,最好的是试了第一个机器的分片就找到,这,很明显不是Es的做法,太笨蛋了。
Es会这样做:
将请求封装成JSON格式,就好比mysql的一个简单的查询“select * from test where id = 1234 ”比如请求id是1234的这个文档,Es的路由算法会根据文档ID,瞬间算出,这个文档大概属于哪个机器的哪个分片中,然后将该请求直接路由到所属机器,执行搜索操作。
注意:集群内部会选择一个master出来,如果出现“脑裂”会出现多个master(这种情况不应该出现才对),所以,集群中的每一个机器都有可能被选择为master,其他机器当然会和master通信。