Elastic Search
Elastic Search 是一种分布式,高性能,高可用,可伸缩的搜索和分析系统
中文手册:点击打开链接
1.为什么不能纯用数据库搜索?
如:执行select * from students where name like '%张三%'
- 数据库会一条一条的扫描
- 每条记录指定字段的文本可能很长,对这些文本一一扫描判断是否包含所需的关键字,效率很低
- 另外,包含“张小三“的结果搜索不出来
另外如果数据量很大,超过了一台机器的容量,此时就必须使用多台机器进行数据存储,我们自己实现的话很麻烦,ES运营而生:
- 自动维护数据分布到多个节点的索引的简历,还有搜索请求分布到多个节点的执行
- 自动维护数据的冗余副本,保证一些机器宕机了,也不会丢失任何数据
- 封装很多高级功能,让我们能快速开发应用和开发更加复杂的应用:复杂的搜索功能,聚合分析的功能,基于地理位置的搜索(例如距离我当前位置1公里以内的烤肉店)
2.大规模数据
当系统数据量达到十亿、百亿级别时引发的问题思考:
- 用什么数据库好(mysql、Oracle、sybase...)
- 如何解决单点故障(Zookeeper、MQ、 lvs(Linux Virtual Server)、F5、A10)
- 如何保证数据安全性(热备(数据库运行,采用archive log mode方式备份)、冷备(将数据库关闭之后备份,)、异地多活(不同城市 独立数据中心 全量备份 冷备))
- 如何检索(数据库代理中间件:mysql-proxy等)
- 如何统计分析(离线、近实时)
2.1传统关系型数据库的方案
- 通过主从备份解决数据安全性问题;
- 通过数据库代理中间件心跳监测,解决单点故障问题;
- 通过代理中间件将查询语句分发到各个slave节点进行查询,并汇总结果
2.2非关系型数据库方案
以mongodb为例,其它原理类似:
- 通过副本备份保证数据安全性;
- 通过节点竞选机制解决单点问题;
- 先从配置库检索分片信息,然后将请求分发到各个节点,最后由路由节点合并汇总结果
3.ES中的基本概念
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
3.1ES工作原理
当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示:
3.2概念
Cluster:集群。
ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
Node:节点。
形成集群的每个服务器称为节点。
Shard:分片。
当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。
Replia:副本。
为提高查询吞吐量或实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
全文检索
全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。
全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token,这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。
3.3 与mqsql对比
ES里有document、type、index概念,分别相当于数据库中的行、表和数据库。
ES | MySQL |
Index 索引 | Database 数据库 |
Type 类型 | Table 表 |
Document | Row 行 |
Field | Column 列 |
在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。
在ES中:Mapping定义索引下的Type的字段处理规则
即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
另外ES存放数据的节点有shard(primary shard)和replica(replica shard):
- replica上存放的是shard上的数据副本,提供高可用性,提供了搜索这类请求的吞吐量和性能。
- shard的数量在建立索引时配置,之后不能修改,默认为5个。replica 的数量可随时修改,默认1个shard对应1个 replica。一个shard可以对应一个或多个replica,每个shard和其对应的replica不能在同一节点上,所以一般配置两台服务器,每台服务器上均放置一部分shard和一部分replica。
3.ES使用
应用系统的数据结构都是面向对象的,复杂的 ,对象数据存储到数据库中,只能拆解开来,变成扁平的多张表(如一对多),每次查询出结果后还要再还原回原来的对象数据格式。
ES是面向文档(document)的,文档中存储的数据结构与面向对象的数据结构是一样的,基于这种文档数据格式,ES可以提供复杂的索引,全文检索,分析聚合等功能。ES 的 document 用json数据格式来表达。
3.1 简单的索引操作
- 创建索引:PUT /db_index?pretty
- 删除索引:DELETE /db_index?pretty
- 快速查看集群中有哪些索引:GET /_cat/indices?v