日志分析工具ELK配置详解

一、ELK介绍
1.1 elasticsearch

1.1.1 elasticsearch介绍

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1.1.2 elasticsearch几个重要术语

NRT 
elasticsearch是一个近似实时的搜索平台,从索引文档到可搜索有些延迟,通常为1秒。

集群
集群就是一个或多个节点存储数据,其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
节点
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然啦,你可以自己定义。该名字也蛮重要的,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况下,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。

索引
索引是有几分相似属性的一系列文档的集合。如nginx日志索引、syslog索引等等。索引是由名字标识,名字必须全部小写。这个名字用来进行索引、搜索、更新和删除文档的操作。
索引相当于关系型数据库的库。
类型
在一个索引中,可以定义一个或多个类型。类型是一个逻辑类别还是分区完全取决于你。通常情况下,一个类型被定于成具有一组共同字段的文档。如chinasoft所有的数据存入在一个单一的名为logstash-chinasoft的索引中,同时,定义了用户数据类型,帖子数据类型和评论类型。
类型相对于关系型数据库的表。

文档
文档是信息的基本单元,可以被索引的。文档是以JSON格式表现的。
在类型中,可以根据需求存储多个文档。
虽然一个文档在物理上位于一个索引,实际上一个文档必须在一个索引内被索引和分配一个类型。
文档相对于关系型数据库的列。
分片和副本
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个十亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
分片的两个最主要原因:
a、水平分割扩展,增大存储量
b、分布式并行跨分片操作,提高性能和吞吐量
分布式分片的机制和搜索请求的文档如何汇总完全是有elasticsearch控制的,这些对用户而言是透明的。
网络问题等等其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。
为此,elasticsearch让我们将索引分片复制一份或多份,称之为分片副本或副本。
副本也有两个最主要原因:
高可用性,以应对分片或者节点故障。出于这个原因,分片副本要在不同的节点上。
提供性能,增大吞吐量,搜索可以并行在所有副本上执行。
总之,每一个索引可以被分成多个分片。索引也可以有0个或多个副本。复制后,每个索引都有主分片(母分片)和复制分片(复制于母分片)。分片和副本数量可以在每个索引被创建时定义。索引创建后,可以在任何时候动态的更改副本数量,但是,不能改变分片数。
默认情况下,elasticsearch为每个索引分片5个主分片和1个副本,这就意味着集群至少需要2个节点。索引将会有5个主分片和5个副本(1个完整副本),每个索引总共有10个分片。
每个elasticsearch分片是一个Lucene索引。一个单个Lucene索引有最大的文档数LUCENE-5843, 文档数限制为2147483519(MAX_VALUE – 128)。 可通过_cat/shards来监控分片大小。
1.2 logstash
1.2.1 logstash 介绍

LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。不同于分离的代理端(agent)或主机端(server),LogStash可配置单一的代理端(agent)与其它开源软件结合,以实现不同的功能。

1.2.2 logStash的四大组件

Shipper:发送事件(events)至LogStash;通常,远程代理端(agent)只需要运行这个组件即可;
Broker and Indexer:接收并索引化事件;
Search and Storage:允许对事件进行搜索和存储;
Web Interface:基于Web的展示界面
正是由于以上组件在LogStash架构中可独立部署,才提供了更好的集群扩展性。
1.2.2 LogStash主机分类

代理主机(agent host):作为事件的传递者(shipper),将各种日志数据发送至中心主机;只需运行Logstash 代理(agent)程序;
中心主机(central host):可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、Web界面端(Web Interface)在内的各个组件,以实现对日志数据的接收、处理和存储。
1.3 kibana

Kibana 也是一个开源和免费的工具,他可以帮助您汇总、分析和搜索重要数据日志并提供友好的web界面。他可以为 Logstash 和 ElasticSearch 提供的日志分析的 Web 界面

二、使用ELK必要性(解决运维痛点)
开发人员不能登录线上服务器查看详细日志
各个系统都有日志,日至数据分散难以查找
日志数据量大,查询速度慢,或者数据不够实时

三、elk部署之环境准备
3.1 机器准备

两台虚拟机:
192.168.3.17 node1.chinasoft.com
192.168.3.16 node2.chinasoft.com

关闭防火墙、selinux,时间设置成一样

3.2 系统环境(两台完全一致)

cat /etc/RedHat-release 
CentOS release 6.5 (Final)

这里采用rpm包安装
rpm -ivh elasticsearch-2.3.3.rpm

rpm -ivh logstash-2.3.2-1.noarch.rpm 
安装kibana
cd /usr/local/src
wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
tar zxf kibana-4.3.1-linux-x64.tar.gz
mv kibana-4.3.1-linux-x64 /usr/local/
ln -s /usr/local/kibana-4.3.1-linux-x64/ /usr/local/kibana
安装Redis,nginx和java

rpm -ivh jdk-8u102-linux-x64.rpm

yum install -y redis nginx

四、管理配置elasticsearch
4.1 管理node1.cinasoft.com的elasticsearch
修改elasticsearch配置文件,并授权
grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: chinasoft_elk_cluster 判别节点是否是统一集群
node.name: node1.chinasoft.com 节点的hostname
node.master: true 是否为主节点
path.data: /data/es-data 数据存放路径
path.logs: /var/log/elasticsearch/ 日志路径
bootstrap.mlockall: true 锁住内存,使内存不会再swap中使用
network.host: 0.0.0.0 允许访问的ip
http.port: 9200 端口

mkdir -p /data/es-data
chown elasticsearch.elasticsearch /data/es-data/
启动elasticsearch
service elasticsearch start
Starting elasticsearch:                                    [  OK  ]
chkconfig elasticsearch on

/etc/init.d/elasticsearch status
elasticsearch (pid  3545) is running...
ss -tunlp|grep 9200
tcp    LISTEN     0      50                    :::9200                 :::*      users:(("java",3545,108))
访问9200端口,会把信息显示出来
:9200/

{
  "name" : "node1.chinasoft.com",
  "cluster_name" : "chinasoft_elk_cluster",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

日志分析工具ELK配置详解


4.2 elasticsearch进行交互
4.2.1 交互的两种方法
Java API :
node client
Transport client
RESTful API
Javascript
.NET
php
Perl
Python
Ruby
4.2.2使用RESTful API进行交互
查看当前索引和分片情况,稍后会有插件展示
curl -i -XGET 'http://192.168.3.17:9200/_count?pretty' -d '{
"query" {
"match_all": {}
}
}'
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 95
{
"count" : 0, 索引0个
"_shards" : { 分区0个
"total" : 0,
"successful" : 0, 成功0个
"failed" : 0 失败0个
}
}

使用head插件显示索引和分片情况

[root@linux-node1 src]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
报错:ERROR: failed to download out of all possible locations..., use --verbose to get detailed information

原因:DNS配置有误,重新配置即可

在插件中添加一个index-demo/test的索引,提交请求
:9200/_plugin/head/

{
"_index": "index-demo",
"_type": "test",
"_id": "AVgAU8a2aw-Ww-rZC4yF",
"_version": 1,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

日志分析工具ELK配置详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/00075c0035f4d4f5cd9f2c3bcb230e58.html