分布式搜索引擎有elasticsearch,solr这是两个比较常流行的。
1.es的分布式架构原理
2.es写入数据的工作原理;es查询的工作原理
3.es在数据量很大的时候如何提高查询性能
4.es生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
es的分布式架构原理
es中存储数据的基本单位是索引,一个索引差不多相当于mysql里的一张表,
index/type/mapping/document/field
index:mysql中的一张表
type:一个index里可以有多个type,
mapping:如果一个type是一个具体的一个表,mapping就是这个这个表结构的定义
document:index里的一个type写一条数据,叫document,一条document就代表了mysql中某个表里的一行数据
field:每个document有多个field,每个field就代表了这个document中的一个字段值。
每个索引会拆分成多个shard,每个shard存储部分数据,这个跟kafka比较类似。
es集群有多个节点,会自动选举一个节点为master,主要负责维护索引元数据,负责切换primary shard和replica shard身份。
如果master宕机,会重新选举一个节点为master。
如果非master宕机,那么master节点会控制当前这个节点的replica shard切换为primary shard。等重启回复后,之前宕机的primary shard变为了replica shard。
es写入数据的工作原理
写数据过程:
1.客户端选择node发送请求,这个node就是协调节点
2.协调节点对document进行路由,将请求转发给对应的node
3.实际的node上的primary shard处理请求,然后将数据同步到replica shard
4.协调节点如果发现primary node和replica shard都完成后返回响应给客服端
es读取数据的过程
查询某一条数据,写入了某个document,这个document会自动分配一个全局唯一的id,叫doc id
同事也是根据doc id进行hash路由到对应的primary shard上面去。也可以手动指定doc id
1.客户端发送请求到任意一个node,成为协调节点
2.协调节点对document进行路由,将请求转移到对应的node,此时会使用round-robin随机轮询算法,在primary 以及 replica随机选一个,让读请求负载均衡。
3.接收请求的node返回document给协调节点
4.协调节点返回document给你客户端
es搜索数据的过程
1.客户单发送请求给协调节点,
2.协调节点将请求转发到所有的primary shard 或 replica shard
3.每个shard将自己的搜索结果也就是doc id返回给协调节点,再由协调节点进行数据的合并,排序,分页等
4.接着由协调节点根据doc id去各个节点上拉去实际的document数据。
写数据的底层原理
1.先写入buffer,在buffer中单额数据是搜索不到的;同事数据写入translog日志
2.如果buffer快满了,或者到一定时间,就会将buffer刷新到另一个新的segment file中先进入系统
os cache中。只有在数据写到os cache中才能被搜索到。
为什么叫准实时呢?因为在写入数据一秒后才能被看到。可以通过java api手动执行一次刷新操作,也就是refresh。
3.只有数据refresh到os cache,此时就可以让这个segment file的数据对外提供搜索了
4.当translog达到一定长度时会进行一次commit操作
5.commit操作发生第一步,就是将buffer中的数据refresh到os cache中,然后清空buffer
6.将commit point写入磁盘文件,里面标识commit point对应的所有segment file
7.强行将os cache 中目前所有数据都fsync到磁盘文件中去,清空translog
translog的作用:如果机器宕机,那么存在buffer中的、os cache中的都会数据都会丢失。一旦机器恢复es会自动读取translog日志
8.将现有的translog清空,再次启动一个translog,此时commit操作完成
9.translog其实也是先写入os cache,每隔五秒刷到磁盘上去。如果每次写操作必须直接写到磁盘上就会导致性能下降。
10.如果是删除操作,在commit的时候会生成.del文件,这个文件里将某个doc标识为delete状态
11.更新操作就是将原来的删除重新插入一条‘
12.buffer每refresh一次就会产生一个segment file,定期执行merge
13.将多个segment file 合为一个,同时会将标识为delete的doc物理删除,并写入磁盘同时删除旧的segment file