搜索服务器
分布式架构
- 分布式架构下,每台机器都会有一个es节点,当es的客户端向es写数据的时候,会选择一个es节点,同时为了防止数据超过某一个节点的存储限制,会将数据拆分成多个分片shard,每个分片都存储一部分数据,分落到每一个节点中。
- 这个分片负责写数据,同时会备份一个分片,当主分片写完数据时会同步到备份分片中。
- 备份分片存在别的节点上,这样的话,假设在集群模式下,master节点挂了,es会选举一个节点成为master节点,es就会发现原先的节点里面分片无法进行写操作,就会找到该分片的备份分片,变为主分片来进行写操作。
- 当客户端向es里面读取数据的时候,主分片(primary shard)和备份分片(replica shard)都会提供读的操作。
es写数据过程
- 数据写到内存buffer中,这个时候数据时搜索不到的。
- 当buffer中有数据。默认每隔一秒后,会数据刷(refresh)到os cache先缓存下。这个时候数据就可以被搜索到了,buffer清空。
- 每个五秒将os cache写到日志文件中
- 当translog的数据达到一定的阈值,就会触发commit操作。
- 该操作让buffer的数据刷到os cache中,清空buffer,然后写一个 commit point 写到磁盘文件。
- 最后会把os cache所有数据刷到一个个segment file文件中。清空日志文件。默认三十分钟
- 当机器宕机,重启后es会自动读取日志文件的数据,恢复到内存buffer。
- 可能会有五秒的数据丢失问题,可以设置一个参数,使写入数据到buffer同时到日志文件,但是会导致性能将下一个数量级。
- 删除数据会在一个del文件中标识该数据被删除了,当客户端搜索数据的时候发现数据本标识成删除状态就不会搜索出来。
10.当磁盘文件多到一个程度中会触发merge操作,合并所有 segmentfile 就会物理删除数据。
es搜索数据过程
查询get操作
- 通过写入数据分配的id来进行hash,路由到对应到primary shard上,通过id来查询。
- 挑选一个节点查询id,节点将id进行hash查询到primary shard中。
- shard返回数据给节点
- 节点返回数据给客户端
搜索操作
- 将搜索请求发到所有shard,节点会找到自己本地的shard。
- 去找关键字匹配的数据返回给协调节点,协调节点再次进行筛选选出最匹配的document给客户端。
十几亿数据量中如何优化查询性能
性能优化的杀手锏–filesystem cache
- 你往es写的数据都往磁盘文件去了,操作系统会将磁盘文件的数据缓存到filesystem cache。
- es的搜索引擎严重依赖底层的filesystem cache中。
- 如果es性能要好,最佳情况下,机器的内容至少要总数据的一半。
- 在es存储少量数据用于搜索
- es+hbase设用于海量数据的在线存储,不要用于复杂的搜索。
- es写入的数据最要小于等于filesystem cahce的内容容量。
数据预热
- 将热点数据提前刷到filesystem cache中。
冷热分离
- 将热数据写入另外的索引中,确保热数据被预热之后,尽量保留在filesystem cache中,保证不被冷数据刷掉
设计es的数据模型
- 尽量不要再es用复杂的查询语句,会影响性能。
分页性能优化
- 不允许深度分页/默认深度分页性能很差