本文转载自微信公众号“写PHP的老王”,转载请联系写PHP的老王公众号。业务需求痛点业务增长,查询条件越来越多,索引越来越多在??业务发展初期,数据量并不多。查询和写入速度很快。随着业务的发展,数据量增加,出现查询慢的情况,于是我们开始不断地给表添加索引,以保证数据查询的效率。但是当数据量不断增加时,业务查询变得越来越复杂。程序员每天都想着怎么给这张表加索引。随着索引的增加,写入数据的时间成本越来越高。表数据越来越多,数据拆分越来越复杂。数据量增加,开始分表处理。慢慢发现,尼玛,分表越来越多了。再这样下去,这台数据库服务器就容不下他了。这就是数据分片的操作。分表已经够费劲了,还需要分表吗?全文搜索功能嗨,哥们,帮我加一个全文搜索功能。简单一句话,你心里有十万只草泥马。这么多数据,你让我做全文检索。以上业务点总结起来就是快速、分布式、全文搜索。ES能解决什么问题?S主要用于全文检索和数据分析。底层使用开源库Lucene,拥有丰富的RESTAPI。内部分布式数据存储、倒排索引等设计使其能够快速存储、搜索和分析海量数据。典型用户及应用场景,如github、StackOverflow、elasticsearch+logstash+kibana综合日志分析。ES搜索速度快的原因对于上面mysql中的数据表,ES会为每个字段的值创建一个索引,通过索引值查找数据,而这些索引都在内存中。姓名段索引:年龄字段索引地址字段索引这样我们在找上海的时候,可以通过address和ageindexexpress定位到年龄为21岁的数据到我们需要查找的数据id=2。然后从磁盘中读取dataid=2的数据。上面其实就是ES中倒排索引的简化版。实际上,ES的倒排排序是使用前缀作为索引,通过*FST*对索引数据进行压缩,保证内存中的数据量不会因为索引数量多而造成比较大的内存消耗。对于上面的数据表,如果name字段是用HashMap索引的,索引占用的内存是20字节。但是如果转换成FST结构,可以用四个字节来表示名字,总共占用内存为4+4*3=16。(假设数据范围只有M、i、e、c)四个字符。ES分布式数据结构设计DataSharding均衡分片是Elasticsearch在集群中分布数据的关键。文档存储在分片中,然后分布在集群中的各个节点上。当集群扩容或缩容时,Elasticsearch会自动在节点间迁移分片,以保持集群的平衡。数据可靠分片包括主分片和副本分片。副本分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,也可以提供读取请求,例如从其他分片搜索或检索文档。每个主分片都有一个或多个副本分片。当主分片异常时,副本可以提供数据查询等操作。主分片和对应的副本分片不会在同一个节点上。分布式搜索分片本身就是一个完整的搜索引擎,可以使用单个节点的所有资源。主分片和副本分片都可以处理读请求——搜索或者文档检索,所以数据越冗余,可以处理的搜索吞吐量就越大ES集群中的每个节点通过路由知道文档在集群中的存储位置,所以每个节点都有能力处理读写请求。写入请求发送到某个节点后,该节点成为协调节点。协调节点会根据路由公式计算需要写入哪个分片,然后将请求转发给该分片的主分片节点。如果是查询操作,协调节点会将请求分发到其他分片,协调节点将数据组装起来返回其他分片的查询结果。所以ES的引入可以帮你解决大数据量和分布式查询的问题。同时,ES会自动为你索引所有字段,实现高性能的复杂聚合查询。因此,只要将数据存储在ES中,无论聚合查询多么复杂,都可以获得很好的性能,再也不用担心了。如何创建各种复杂的索引而令人头疼。另外,ES支持多种分词器,对于全文搜索效率更高。ES会引入什么样的问题?字段类型不可修改,写入性能低,硬件资源消耗高。ES在创建字段之前需要先建立一个Mapping。Mapping包含每个字段的类型信息。ES需要根据Mapping创建字段。建立适当的索引。由于这个Mapping的存在,ES中的字段一旦创建,类型就不能修改了。ES在数据结构上比MySQL灵活,但远不如MongoDB。不支持事务,JOIN吃硬件。ES的排序和聚合(Aggregation)操作会将几乎所有相关和不相关的文档加载到内存中,一个Query可以很快神奇地吃掉所有内存,现在新的Lucene版本优化了基于硬盘的排序,但前提是你使用SSD,不会牺牲太多搜索性能。其他问题还包括大量增量写操作会导致大量后台合并,CPU和硬盘读写容易达到瓶颈。ES确实在水平扩展方面做得很好,但前提是有足够的预算来购买硬件。数据实时每当有新数据时,都会先写入内存。在内存和磁盘之间有一个文件系统缓存。当达到默认时间(1秒)或内存中的数据达到一定数量时,会触发刷新(Refresh),内存中的数据会在一个新的段上生成并缓存在文件缓存系统上,稍后将刷新到磁盘并生成一个提交点。因此,从Index请求到对外可见并可以被搜索到,至少需要1秒的数据延迟。不支持数据的权限管理总结ES好不好用就看你怎么用了。有的人用的很好,有的人用的很痛。使用较少的超时调整索引和调整sql。如果效果不好,我经常加班,调整ES。优点:1.高并发2.容错性比mg强。比如1主多从,如果主芯片挂了,从芯片会自动充值。3、满足大数据的实时读写需求,无需分库(没有库的概念)。4.易于扩展。分片数据自动均衡5.支持更复杂的条件查询,groupby和排序不是问题缺点:1.不支持事务2.读写有一定延迟3.无权限管理4.需要硬件
