分享

ELK(分布式大数据搜索和日志挖掘及可视化)之核心elasticsearch(ES)

本帖最后由 Godman 于 2017-9-15 17:07 编辑
问题向导:
(1)什么是ELK,有什么作用?
(2)elasticsearch(ES)简介。

(3)基本操作与详细介绍
(4)elasticsearch(ES)与solr的简单对比





1、ELK介绍
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:https://www.elastic.co/products
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。


2、核心elasticsearch(ES)简介
Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。

它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。

Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。

但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。

Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。

当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:

  •     分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  •     实时分析的分布式搜索引擎。
  •     可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。


ElasticSearch(简称ES)是面向文档(document oriented),意味它可以存储整个对象或者文档,除了存储,还会索引每个文档的内容使之可以被搜索。

Elasticsearch中,文档归属于一种 类型(type) ,而这些类型存在于 索引(index)中,类比传统关系型数据库:
Relational DB -> Databases -> Tables -> Rows -> Columns
关系型数据库       数据库          表           行               列  
Elasticsearch -> Indices   -> Types  -> Documents -> Fields


3、基本操作与详细介绍

3.1、ES安装

ES由java语言实现,运行环境依赖java。ES 1.x版本,官方推荐使用jdk1.7+的环境,建议使用oracle jdk1.8;ES可以去官网下载,本文使用elasticsearch-1.6.0.tar.gz。


(1) 解压elasticsearch-1.6.0.tar.gz,sudo tar -zvxf elasticsearch-1.6.0.tar.gz,在当前路径生成目录:elasticsearch-1.6.0;

(2) 配置ES。这里只做最简单的配置,修改ES_HOME/config/elasticsearch.yml文件, 相关配置参数(可以使用默认的)

#集群名称
cluster.name: elasticsearch

#节点名称
node.name: "node1"

#节点是否存储数据
node.data: true

#索引分片数
index.number_of_shards: 5

#索引副本数
index.number_of_replicas: 1

#数据目录存放位置
path.data: /data/elasticsearch/data

#日志数据存放位置
path.logs: /data/elasticsearch/log

#索引缓存
index.cache.field.max_size: 500000

#索引缓存过期时间
index.cache.field.expire: 5m

(3) 启动ES。进入ES安装目录,执行命令:bin/elasticsearch -d -Xms512m -Xmx512m,然后在浏览器输入http://ip:9200/,查看页面信息,是否正常启动。status=200表示正常启动了。
123709_mUHy_1434710.png


也可以在终端测试
开启后你就可以使用另一个终端窗口来进行测试了:
[mw_shl_code=shell,true]curl 'http://localhost:9200/?pretty'[/mw_shl_code]
你应该看到如下提示:
{
   "status": 200,
   "name": "Shrunken Bones",
   "version": {
      "number": "1.4.0",
      "lucene_version": "4.10"
   },
   "tagline": "You Know, for Search"
}



3.2、面向文档
Elasticsearch 是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在 Elasticsearch 中索引、搜索、排序和过滤这些文档。不需要成行成列的数据。这将会是完全不同的一种面对数据的思考方式,这也是为什么 Elasticsearch 可以执行复杂的全文搜索的原因。
JSON
Elasticsearch使用 JSON (或称作JavaScript Object Notation ) 作为文档序列化的格式。JSON 已经被大多数语言支持,也成为 NoSQL 领域的一个标准格式。它简单、简洁、易于阅读。
把这个 JSON 想象成一个用户对象:
{
    "email":      "john@smith.com",
    "first_name": "John",
    "last_name":  "Smith",
    "info": {
        "bio":         "Eco-warrior and defender of the weak",
        "age":         25,
        "interests": [ "dolphins", "whales" ]
    },
    "join_date": "2014/05/01"
}

3.3、索引实例
在 Elasticsearch 中,文档属于一种 类型(type),各种各样的类型存在于一个 索引 中。你也可以通过类比传统的关系数据库得到一些大致的相似之处:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
这对于Elasticsearch来说非常简单。我们只要执行HTTP GET请求并指出文档的“地址”——索引、类型和ID既可。根据这三部分信息,我们就可以返回原始JSON文档:
[mw_shl_code=shell,true]GET /megacorp/employee/1[/mw_shl_code]
响应的内容中包含一些文档的元信息,John Smith的原始JSON文档包含在_source字段中。
{
  "_index" :   "megacorp",
  "_type" :    "employee",
  "_id" :      "1",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "first_name" :  "John",
      "last_name" :   "Smith",
      "age" :         25,
      "about" :       "I love to go rock climbing",
      "interests":  [ "sports", "music" ]
  }
}


我们尝试一个最简单的搜索全部员工的请求:

全文搜索——一种传统数据库很难实现的功能。
我们将会搜索所有喜欢“rock climbing”的员工:
GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

你可以看到我们使用了之前的[size=0.85em]match查询,从[size=0.85em]about字段中搜索"rock climbing",我们得到了两个匹配文档:
{
   ...
   "hits": {
      "total":      2,
      "max_score":  0.16273327,
      "hits": [
         {
            ...
            "_score":         0.16273327, <1>
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            }
         },
         {
            ...
            "_score":         0.016878016, <2>
            "_source": {
               "first_name":  "Jane",
               "last_name":   "Smith",
               "age":         32,
               "about":       "I like to collect rock albums",
               "interests": [ "music" ]
            }
         }
      ]
   }
}



3.4、倒排索引
Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。

为了创建倒排索引,我们首先切分每个文档的content字段为单独的单词(我们把它们叫做词(terms)或者表征(tokens))(译者注:关于terms和tokens的翻译比较生硬,只需知道语句分词后的个体叫做这两个。),把所有的唯一词放入列表并排序,结果是这个样子的:


TermDoc_1Doc_2
QuickX
TheX
brownXX
dogX
dogsX
foxX
foxesX
inX
jumpedX
lazyXX
leapX
overXX
quickX
summerX
theX

现在,如果我们想搜索"quick brown",我们只需要找到每个词在哪个文档中出现即可:

TermDoc_1Doc_2
brownXX
quickX
-----------------
Total21
两个文档都匹配,但是第一个比第二个有更多的匹配项。 如果我们加入简单的相似度算法(similarity algorithm),计算匹配单词的数目,这样我们就可以说第一个文档比第二个匹配度更高——对于我们的查询具有更多相关性。



3.5、分布式
一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。
集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。我们例子中的集群只有一个节点,所以它会充当主节点的角色。
做为用户,我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。
Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:
  • 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
  • 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
  • 冗余每一个分片,防止硬件故障造成的数据丢失。
  • 将集群中任意一个节点上的请求路由到相应数据所在的节点。
  • 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。




4、与solr简单区别
ElasticSearch(简称ES)是一个分布式、Restful的搜索及分析服务器,设计用于分布式计算;能够达到实时搜索,稳定,可靠,快速。和Apache Solr一样,它也是基于Lucence的索引服务器,而ElasticSearch对比Solr的优点在于:

  •     轻量级:安装启动方便,下载文件之后一条命令就可以启动。
  •     Schema free:可以向服务器提交任意结构的JSON对象,Solr中使用schema.xml指定了索引结构。
  •     多索引文件支持:使用不同的index参数就能创建另一个索引文件,Solr中需要另行配置。
  •     分布式:Solr Cloud的配置比较复杂。
其他比较
  •     Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
  •     Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  •     Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  •     Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。










已有(4)人评论

跳转到指定楼层
skshao 发表于 2017-9-18 05:14:22
正需要,謝謝分享!
回复

使用道具 举报

Godman 发表于 2017-9-18 16:02:22
多谢支持,这周会分享一篇实战篇
回复

使用道具 举报

老街的腔调 发表于 2017-12-16 09:14:53
不错不错....6666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条