老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题

业务需求痛点
业务增长 , 查询条件越来越多 , 索引越来越多业务发展初期 , 数据量不多 。 查询 , 写入都很快 。 随着业务的发展 , 数据量增大 , 出现慢查询 , 开始往表里不断的加索引 , 保证数据查询效率 。 但是当数据量继续增大 , 业务查询越来越复杂 。 程序员天天想着这个表怎么加索引 。 索引的增加 , 写入数据的时间成本越来越高 。 表数据增加 , 数据拆分越来越复杂数据量增大 , 开始进行分表处理 。 慢慢的发现 , 尼玛 , 分的表越来越多 。 再这么下去 , 这台数据库服务器上都容不下他了 , 这是要做数据分片的操作啊 。 分表已经够费劲了 , 还要分片?全文检索功能嗨 , 哥们 , 给我加个全文搜索的功能 。 简单的一句话 , 你心里十万个草尼马 。 这么多的数据量你让我搞全文搜索 。 上面业务通点总结起来就是要查的快 , 要分布式 , 要全文搜 。 ES能解决什么问题S主要运用于全文搜索、数据分析 , 底层使用开源库Lucene , 拥有丰富的RESTAPI 。 内部分布式的数据存储、倒排索引等设计 , 使其可以快速存储、搜索、分析海量数据 。 典型的使用方和应用场景 , 如github,StackOverflow , elasticsearch+logstash+kibana一体化的日志分析 。
ES搜索为什么快的原因
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
对于mysql中如上的数据表 , ES会对每个字段的值建立索引 , 通过索引的值去找数据 , 而且这些索引都是在内存里面的 。
name段索引:
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
age字段索引
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
address字段索引
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
这样 , 当我们要找上海市 , 年龄为21岁的数据就能够通过address,age索引快递定位到数据id=2的是我们需要查找的 。
然后再从磁盘中把数据id=2的数据读取出来 。
上面的其实就是ES中倒排索引的一个简化版本 。
实际上的ES的倒排序使用的是前缀作为索引 , 同时会使用FST对索引数据进行压缩 , 以保证在内存的数据量不会因为索引多而带来比较大的内存消耗 。
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
对于上面的数据表 , 如果采用HashMap的方式对name字段索引的话 , 索引所占用内存20个字节 。
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
但是如果转换成FST结构的话 , 可以用四个字节表示name,总共占用内存为4+4*3=16 。 (假设数据范围只有M,i,e,c)四个字符 。
老男孩的成长之路|又会带来什么问题?,ES能为你解决什么问题
文章图片
ES分布式数据结构设计数据分片均衡分片是Elasticsearch在集群中分发数据的关键 。 文档存储在分片中 , 然后分片分配到集群中的节点上 。 当集群扩容或缩小 , Elasticsearch将会自动在节点间迁移分片 , 以使集群保持平衡 。 数据可靠分片有主分片 , 复制分片 。 复制分片只是主分片的一个副本 , 它可以防止硬件故障导致的数据丢失 , 同时可以提供读请求 , 比如搜索或者从别的shard取回文档 。 每个主分片都有一个或多个副本分片 , 当主分片异常时 , 副本可以提供数据的查询等操作 。 主分片和对应的副本分片是不会在同一个节点上的 。 分布式搜索分片本身就是一个完整的搜索引擎 , 它可以使用单一节点的所有资源 。 主分片或者复制分片都可以处理读请求——搜索或文档检索 , 所以数据的冗余越多 , 能处理的搜索吞吐量就越大ES集群中每个节点通过路由都知道集群中的文档的存放位置 , 所以每个节点都有处理读写请求的能力 。 在一个写请求被发送到某个节点后 , 该节点即为协调节点 , 协调节点会根据路由公式计算出需要写到哪个分片上 , 再将请求转发到该分片的主分片节点上 。 如果是查询操作 , 则协调节点会将请求分发到其他分片上 , 其他分片查询结果之后再由协调节点将数据组装返回 。所以 , 引入ES , 能够实现帮你解决数据量多 , 分布式查询问题 。 同时ES会自动的替你对所有字段建立索引 , 以实现高性能的复杂聚合查询 , 因此只要是存入ES的数据 , 无论再复杂的聚合查询也可以得到不错的性能 , 而且你再也不用为如何建立各种复杂索引而头痛了 。 另外 , ES支持多种分词器 , 对全文搜索支持更加高效 。


推荐阅读