MySQLES能为你解决什么问题,又会带来什么问题?( 二 )

  • 分布式搜索分片本身就是一个完整的搜索引擎 , 它可以使用单一节点的所有资源 。 主分片或者复制分片都可以处理读请求——搜索或文档检索 , 所以数据的冗余越多 , 能处理的搜索吞吐量就越大ES 集群中每个节点通过路由都知道集群中的文档的存放位置 , 所以每个节点都有处理读写请求的能力 。 在一个写请求被发送到某个节点后 , 该节点即为协调节点 , 协调节点会根据路由公式计算出需要写到哪个分片上 , 再将请求转发到该分片的主分片节点上 。 如果是查询操作 , 则协调节点会将请求分发到其他分片上 , 其他分片查询结果之后再由协调节点将数据组装返回 。
  • 所以 , 引入ES , 能够实现帮你解决数据量多 , 分布式查询问题 。 同时ES会自动的替你对所有字段建立索引 , 以实现高性能的复杂聚合查询 , 因此只要是存入ES的数据 , 无论再复杂的聚合查询也可以得到不错的性能 , 而且你再也不用为如何建立各种复杂索引而头痛了 。 另外 , ES支持多种分词器 , 对全文搜索支持更加高效 。
    ES引入会有什么样的问题
    • 字段类型无法修改、写入性能较低和高硬件资源消耗ES需要在创建字段前要预先建立Mapping , Mapping中包含每个字段的类型信息 , ES需要根据Mapping为字段建立合适的索引 。 由于这个Mapping的存在 , ES中的字段一旦建立就不能再修改类型了 。 ES在数据结构灵活度上高于MySQL但远不如MongoDB
    • 不支持事务,JOIN
    • 吃硬件ES的排序和聚合(Aggregation)操作会把几乎所有相关不相关的文档都加载到内存中 , 一个Query就可以很神奇地吃光所有内存 , 现在新的Lucene版本优化了基于硬盘的排序 , 但也仅当你使用SSD的情况下 , 才不会牺牲过多的搜索性能 。 其他的问题还包括 , 大量的增量写操作会导致大量的后台Merge , CPU和硬盘读写都会很容易达到瓶颈 。 ES确实在横向Scale方面做的很出色 , 但前提是有足够的预算买硬件 。
    • 数据实时性每当有新增的数据时 , 就将其先写入到内存中 , 在内存和磁盘之间是文件系统缓存 , 当达到默认的时间(1秒钟)或者内存的数据达到一定量时 , 会触发一次刷新(Refresh) , 将内存中的数据生成到一个新的段上并缓存到文件缓存系统 上 , 稍后再被刷新到磁盘中并生成提交点 。 因此 , 从Index请求到对外可见能够被搜到 , 最少要1秒钟的数据延时 。
    • 不支持数据的权限管理
    总结 ES香不香看你怎么用 。 有人用的很爽 , 有人用的很痛苦 。 用好了就少加班调索引 , 调sql 。 用不好就常加班调ES 。
    优点:
    1.高并发
    2.容错能力比mg强 。 比如1主多从 , 主片挂了从片会自动顶上
    3.满足大数据下实时读写需求 , 无需分库(不存在库的概念) 。
    4.易扩展 。 分片数据自动均衡5.支持较复杂的条件查询 , group by、排序都不是问题
    缺点:
    1.不支持事务
    2.读写有一定延时
    3.无权限管理
    【MySQLES能为你解决什么问题,又会带来什么问题?】4.吃硬件


    推荐阅读