CentOS7搭建开源分布式搜索平台ELK实现日志实时搜索并展示图表

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

   一、简介 

    Elasticsearch是个基于Lucene实现的开源、分布式、restful的全文本搜索引擎,此外他还是一个分布式实时文档存储,其中每个文档的每个filed均是可被索引的数据,且可被搜索,也是一个带实时分析功能的搜索引擎,能够扩展至数以百计的节点实时处理PB级别的数据。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

    通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。因此使用一款能够自动实时收集日志的工具则完美的解决我们的问题,ELK官网提供的开源解决方案有elasticsearch、logstash、kiabana。


    ELK原理架构图:

    wKiom1hGbc2zIt6WAAE38vujqPM069.png

    说明:在此架构图中logstash agent负责将所有的应用服务日志收集并汇报给elasticsearch cluster集群中,而kibana则从ES集群中抽取数据生成图表,再返还给系统管理员。  


    二、ELK平台搭建

    ①ES平台是依赖于jdk的环境基础上进行的,所以在安装elasticsearch之前需安装jdk开发环境。   


    ②各个节点之间需做到时间同步,可使用时间服务器进行同步。


    ③各个节点之间能够通过主机名见名知意,方便自己的操作。  


安装配置如下:

实验环境 实验所需软件
CentOS7:(kernel-3.10.0-327.el7.x86_64) elasticsearch-1.7.2.noarch.rpm
Java: Openjdk version  ”1.8.0_65″ java-1.8.0-openjdk/openjdk-devel

  

#本文重要通过rpm包安装其环境极其软件,可自行到相依的官网下载rpm或源码包进行编译安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#安装openjdk开发环境
yum -y  install  java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless
#配置其环境变量
export  JAVA_HOME= /usr
source  java.sh 
[root@node2 ~] # java -version
openjdk version  "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
[root@node2 ~] #
#安装elasticsearch    
yum -y elasticsearch-1.7.2.noarch.rpm 
#编辑配置文件,不使用默认的cluster.name和node.name可根据自己业务的需求进行修改
cluster.name= alrenES     node.name=  "node2.alren.com"   
#启动服务,查看其监听的9300/tcp端口
systemctl start elasticsearch.service  
[root@node2 ~] # systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
    Loaded: loaded ( /usr/lib/systemd/system/elasticsearch .service; disabled; vendor preset: disabled)
    Active: active (running) since Mon 2016-12-05 21:05:47 CST; 19h ago
      Docs: http: //www .elastic.co
  Main PID: 7143 (java)
    CGroup:  /system .slice /elasticsearch .service
            └─7143  /bin/java  -Xms256m -Xmx1g -Djava.awt.headless= true  -XX...
 
Dec 05 21:05:47 node2.alren.com systemd[1]: Started Elasticsearch.
Dec 05 21:05:47 node2.alren.com systemd[1]: Starting Elasticsearch...
[root@node2 ~] #

 

    ES集群组件:

    Cluster:集群的标识为集群名称,默认为elasticsearch,节点就是靠此名字来加入到哪个集群中,一个节点只能属于一个集群。

    Node:运行单个ES实例的主机即为节点,用于存储数据,参与集群索引及搜索操作,节点的表示依靠节点名称。

    Shard:将索引切割成为物理存储组件,每个shard都是一个独立且完整的索引,创建索引时,ES默认将其分隔为5个shard,用户也可以按需自行定义,但一旦创建则不可修改,同时会产生一个replica副本。


    ES Cluster工作流程: 

    启动服务时,elasticsearch会监听在9300/tcp端口上,通过多播的方式查找同一类的集群的其他节点,并与之建立通信。集群中的所有节点会选举一个主节点负责管理整个集群状态,以及在集群范围内决定shard的分布方式,站在用户的角度而言,每个节点均可接受并响应用户的各类请求。   


    三、集群各管理及其操作

    常用的四类API:

    ①检查集群、节点、索引等健康状态与否,以及获取其相关的状态

    ②管理集群、节点、索引及元数据

    ③执行CRUD操作

    ④执行高级操作,例如paping,filetering等


    使用curl -X命令查看其节点状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[root@node2 ~] # curl -X GET ' #?pretty则是显示  
{
   "status"  : 200, #响应的状态码信息
   "name"  "node2.alren.com" #节点名
   "cluster_name"  "alrenES" #ES集群名称
   "version"  : {
     "number"  "1.7.2" #elasticsearch版本
     "build_hash"  "e43676b1385b8125d647f593f7202acbd816e8ec" ,
     "build_timestamp"  "2015-09-14T09:49:53Z" ,
     "build_snapshot"  false ,
     "lucene_version"  "4.10.4"
   },
   "tagline"  "You Know, for Search"
}
[root@node2 ~] # curl -X GET  #查看支持的API接口 
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/ {index}
/_cat/master
/_cat/nodes
/_cat/indices
/_cat/indices/ {index}
/_cat/segments
/_cat/segments/ {index}
/_cat/count
/_cat/count/ {index}
/_cat/recovery
/_cat/recovery/ {index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/ { alias }
/_cat/thread_pool
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/ {fields}
[root@node2 ~] # curl -X GET  #查看其主节点为哪台主机 
c-iCqp3FQh27948gAsyKaw node3.alren.com 10.1.10.67 node3.alren.com
[root@node2 ~] # curl -X GET  #查看当前ES cluster集群的所有节点 
node2.alren.com 10.1.100.6  6 84 0.06 d m node2.alren.com
node4.alren.com 10.1.100.7  4 69 0.15 d m node4.alren.com
node3.alren.com 10.1.100.8 16 72 0.10 d * node3.alren.com
[root@node2 ~] # curl -X GET ' #查看集群状态 
{
   "cluster_name"  "alrenES" #集群名称
   "status"  "green" ,         #集群健康状态
   "timed_out"  false ,    
   "number_of_nodes"  : 3,     #集群总共的节点数量        
   "number_of_data_nodes"  : 3,
   "active_primary_shards"  : 8,
   "active_shards"  : 16,
   "relocating_shards"  : 0,
   "initializing_shards"  : 0,
   "unassigned_shards"  : 0,
   "delayed_unassigned_shards"  : 0,
   "number_of_pending_tasks"  : 0,
   "number_of_in_flight_fetch"  : 0
}
[root@node2 ~] #


    插件安装的两种方式:

 给集群节点安装附加插件,可通插件扩展ES的功能,添加自定义的映射类型,自定义分析器,本地脚本,自定义发现方式。常用的插件有bigdesk,marvel,head,kopf等。

    ①直接解压插件的压缩包之或是插件放置于/usr/share/elasticsearch/plugins目录下即可

    ②使用全路径二进制脚本进行安装,例如:/usr/share/elasticsearch/bin/plugin -i bigdesk -u ftp://uri/bigdesk.lastest.zip ,安装完成之后可通过浏览器访问。访问的URL:http://uri:9200/_plugin/plugin_name


    插件实例图一:

 wKioL1hGjSqwxvR7AACNXRLF2Uo081.png


   插件实例图二:

wKiom1hGmkrT1J96AAD_3eHd_rk266.png


CRUD操作的相关API:增、删、改、查

1、创建文档:向索引中插入数据时将会自动创建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
curl -X PUT  'http://localhost:9200/students/class1/1?pretty'  -d 
'{
"name" : "tom" ,
"gender" : "male" ,
"age" :21
}'
#同理插入第二个则修改相应的值即可
curl -X PUT  'http://localhost:9200/students/class1/2?pretty'  -d 
'{
"name" : "jerry" ,
"gender" : "female" ,
"age" :21
}'


2、获取文档:查询插入的内容

1
curl -X GET  'http://localhost:9200/students/class1/1?pretty'


3、更新文档:PUT方法会直接覆盖至原有的文档信息,想要局部的更新使用_update

1
2
3
4
curl -X POST  'http://localhost:9200/students/class1/2/_update?pretty'  -d 
'{
"doc" :{ "age" :10}
}'


4、删除文档及其索引

1
2
curl -X DELETE  'http://localhost:9200/students/class1/2/' 
curl -X DELETE  'http://localhost:9200/students'


5、查看当前索引

1
curl -X GET  'localhost:9200/_cat/indeces?v'


项目小实战:


IP地址、软件规划: 

IP地址 实验所需软件 环境部署 主机名
10.1.10.65

logstash-1.5.4-1

redis

openjdk-1.8.0 node1
10.1.10.66

logstash-1.5.4-1

openjdk-1.8.0

node2

 

10.1.10.67

elasticsearch-1.7.2

kibana-4.1.2

openjdk-1.8.0 node3


    各个节点配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#node1需安装openjdk环境及logstash、redis 
yum -y  install  java-1.8.0-openjdk-devel java-1.8.0-openjdk java-1.8.0-openjdk-headless
yum -y  install  logstash-1.5.4-1.noarch.rpm 
yum -y  install  redis  
 
#node1配配置如下:
修改 /etc/redis/redis .conf
bind 0.0.0.0 
修改 /etc/logstash/conf .d /apache .conf 
input {
   file  {
     path    => [ "/var/log/httpd/access_log" ]
     type     =>  "httpd_log"
     start_position  =>  "beginning"
   }
}
 
filter {
   grok {
     match => { "message"  =>  "%{COMBINEDAPACHELOG}" }
   }
}
 
output {
   redis {
     port  =>  "6379"
     host  => [ "127.0.0.1" ]
     data_type   =>  "list"
     key   =>  "logstash-httpd_log"
   }
}
 
#完成上诉步骤后,启动服务 
#启动httpd服务,进行访问,查看本机的redis是否存在数据
[root@node1 ~] # redis-cli
127.0.0.1:6379> llen logstash-httpd_log
(integer) 72
127.0.0.1:6379> LINDEX logstash-httpd_log 0
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET / HTTP/1.1\\\" 403 4897 \\\"-\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.430Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/\",\"httpversion\":\"1.1\",\"response\":\"403\",\"bytes\":\"4897\",\"referrer\":\"\\\"-\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379> LINDEX logstash-httpd_log 1
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /noindex/css/bootstrap.min.css HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/bootstrap.min.css\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379> LINDEX logstash-httpd_log 3
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /images/apache_pb.gif HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/images/apache_pb.gif\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
.............
127.0.0.1:6379> LINDEX logstash-httpd_log 71
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:04 +0800] \\\"GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1\\\" 404 240 \\\"http://10.1.10.65/noindex/css/open-sans.css\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:05.490Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:04 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/fonts/Light/OpenSans-Light.ttf\",\"httpversion\":\"1.1\",\"response\":\"404\",\"bytes\":\"240\",\"referrer\":\"\\\"http://10.1.10.65/noindex/css/open-sans.css\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379>
 
#node2节点:从10.1.10.65中的redis取数据并能读取出来到elasticsearch集群中
编辑 /etc/logstash/conf .d /server .conf  
 
input {
   redis {
     port =>  "6379"
     host =>  "10.1.10.65"
     data_type =>  "list"
     key  =>  "logstash-httpd_log"
   }
}
 
output {
    elasticsearch {
       cluster =>  "logs"
     index   =>  "logstash-%{+YYYY.MM.dd}"
    }
}
 
#测试是否能够取得数据,使用logstash -f ./server.conf --configtest后查看node1上redis是否还存在数据
测试成功则使用:logstash -f . /server .conf & 
 
 
#node3上安装配置elasticsearch和kibana  
yum -y  install  elasticsearch-1.7.2.noarch.rpm
tar  xf kibana-4.2.1. tar .gz -C  /usr/local/ 
cd  /usr/local/
ln  -sv kibana-4.2.1 kibana  
 
#启动服务
systemctl start elasticserach.service 
/usr/local/kibana/bin/kibana  &  
 
#查看其集群状态及绘制图表信息  
{
   "status"  : 200,
   "name"  "Havok" ,
   "cluster_name"  "elasticsearch" ,
   "version"  : {
     "number"  "1.7.2" ,
     "build_hash"  "e43676b1385b8125d647f593f7202acbd816e8ec" ,
     "build_timestamp"  "2015-09-14T09:49:53Z" ,
     "build_snapshot"  false ,
     "lucene_version"  "4.10.4"
   },
   "tagline"  "You Know, for Search"
}


实验图:

wKiom1hIzfGyp4-XAACulsObQbI081.png    

    上诉为不可用状态,原因是logstash未连接至elasticsearch,elasticsearch未能从logstash中取得数据,如配置成功,将会出现create按钮,接下来将是一些图表上的操作就不过多解释和介绍。 



本文转自chengong1013 51CTO博客,原文链接:http://blog.51cto.com/purify/1880645,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
Linux 应用服务中间件 nginx
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
111 0
|
24天前
|
SQL JSON 大数据
ElasticSearch的简单介绍与使用【进阶检索】 实时搜索 | 分布式搜索 | 全文搜索 | 大数据处理 | 搜索过滤 | 搜索排序
这篇文章是Elasticsearch的进阶使用指南,涵盖了Search API的两种检索方式、Query DSL的基本语法和多种查询示例,包括全文检索、短语匹配、多字段匹配、复合查询、结果过滤、聚合操作以及Mapping的概念和操作,还讨论了Elasticsearch 7.x和8.x版本中type概念的变更和数据迁移的方法。
ElasticSearch的简单介绍与使用【进阶检索】 实时搜索 | 分布式搜索 | 全文搜索 | 大数据处理 | 搜索过滤 | 搜索排序
|
4月前
|
关系型数据库 分布式数据库 数据库
【PolarDB开源】PolarDB-X源码解读:分布式事务处理机制揭秘
【5月更文挑战第20天】PolarDB-X,PolarDB家族的一员,专注于大规模分布式事务处理,采用2PC协议保证ACID特性。源码解析揭示其通过预提交、一致性快照隔离和乐观锁优化事务性能,以及利用事务日志进行故障恢复。深入理解其事务处理机制对开发者掌握分布式数据库核心技术至关重要。随着开源社区的发展,更多优化方案将涌现,助力构建更强大的分布式数据库系统。
177 6
|
9天前
|
Linux pouch 容器
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
关于如何在CentOS 7.6操作系统上安装和使用阿里巴巴开源的Pouch容器管理工具的实战教程。
43 2
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
因为一个问题、我新学了一门技术 ElasticSearch 分布式搜索
这篇文章讲述了作者因为一个检索问题而学习了ElasticSearch技术,并分享了排查和解决ElasticSearch检索结果与页面展示不符的过程。
因为一个问题、我新学了一门技术 ElasticSearch 分布式搜索
|
2月前
|
存储 关系型数据库 MySQL
深度评测:PolarDB-X 开源分布式数据库的优势与实践
本文对阿里云开源分布式数据库 PolarDB-X 进行了详细评测。PolarDB-X 以其高性能、强可用性和出色的扩展能力在云原生数据库市场中脱颖而出。文章首先介绍了 PolarDB-X 的核心产品优势,包括金融级高可靠性、海量数据处理能力和高效的混合负载处理能力。随后,分析了其分布式架构设计,包括计算节点、存储节点、元数据服务和日志节点的功能分工。评测还涵盖了在 Windows 平台通过 WSL 环境部署 PolarDB-X 的过程,强调了环境准备和工具安装的关键步骤。使用体验方面,PolarDB-X 在处理分布式事务和实时分析时表现稳定,但在网络问题和性能瓶颈上仍需优化。最后,提出了改进建
6690 2
|
2月前
|
分布式计算 API 对象存储
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
Ray是一个开源的分布式计算框架,用于构建和扩展分布式应用。它提供了简单的API,使得开发者可以轻松地编写并行和分布式代码,而无需担心底层的复杂性。
234 11
|
2月前
|
关系型数据库 分布式数据库 数据库
PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。
【7月更文挑战第3天】PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。通过数据分片和水平扩展支持微服务弹性,保证高可用性,且兼容MySQL协议,简化集成。示例展示了如何使用Spring Boot配置PolarDB,实现服务动态扩展。PolarDB缓解了微服务数据库挑战,加速了开发部署,为云原生应用奠定基础。
201 3
|
2月前
|
关系型数据库 分布式数据库 PolarDB
**PolarDB开源指南:构建分布式数据库集群**踏上PolarDB开源之旅,了解如何从零开始搭建分布式集群
【7月更文挑战第3天】**PolarDB开源指南:构建分布式数据库集群**踏上PolarDB开源之旅,了解如何从零开始搭建分布式集群。采用存储计算分离架构,适用于大规模OLTP和OLAP。先准备硬件和软件环境,包括Linux、Docker和Git。然后,克隆源码,构建Docker镜像,部署控制节点和计算节点。使用PDCli验证集群状态,开始探索PolarDB的高性能与高可用性。在实践中深化学习,贡献于数据库技术创新。记得在安全环境下测试。
161 1