ELK Stack部署笔记

ELK Stack部署笔记

PS: 新版对于有些核心功能现已免费提供,再次部署可直接上新版,提供更多功能,建议使用新版。

文中涉及的Elasticsearch等相关产品的命名和产品相关图片的版权均属于elastic公司所有!

基本介绍

ELK是由一系列工具组合起来的一套系统,主要为提供日志收集和日志分析;通常一个典型的ELK日志收集系统由以下组件构成:

架构

elk_single20190929230224

elk_cluster20190929230308

软件包描述那啥
Elasticsearch存储数据,基于javalucent实现的高性能搜索引擎(底层采用倒排索引)E
Logstash or Filebeat前者通常组建大规模收集使用,常单独部署(需要安装JDK环境,软件本身包也比较大,启动速度贼慢,配置麻烦);后者轻量,运行效率高(基于go语言开发的,配置简单,启动速度快)L or F
KibanaDashboard,从Elasticsearch中读取数据并展示在前端K

​ 如果涉及到日志的大规模收集,此时数据量较庞大,Elasticsearch无法处理太高的数据量,如果您的日志出现断续的情况,那么此时需要考虑部署Kafka+Zookeeper集群,其提供一个消息队列;我们Filebeat收集的日志会先放到消息队列里面,然后由Logstash定期从消息队列中读取一定的数据,并将数据存储到Elasticsearch中,Kafka在该架构内起一个缓冲的作用(也可以叫做中间件)。

Elasticsearch中的概念

elasticsearch是基于lucene库所开发的一个专为搜索数据而用的数据库(lucene是由java语言开发的一个用于信息全文检索的库);也是基于Key:Value的数据存储形式,相较于传统的关系型数据库(mysql)等具有查询速度快、操作、配置简单、功能丰富的优势。elasticsearch原生就支持分布式架构,可以使用大量节点构建高性能高可用的搜索引擎数据库,非常适合用于电商平台、知识库项目(wiki)、数据分析和数据挖掘(ELK)等场景。

GitHub项目地址: https://github.com/elastic/elasticsearch

倒排索引

​ 拆句子,将一句话拆成多个单词

示例:

I don't speak to English.

I don't speak to Chinese.

Chinese is a very beautiful language.

English is an international language.

拆分/匹配:

拆分后匹配
aChinese is a very beautiful language.
anEnglish is an international language.
II don't speak to English. 或者 I don't speak to Chinese.
isChinese is a very beautiful language.或者English is an international language.
toI don't speak to English.或者I don't speak to Chinese.
ChineseI don't speak to Chinese.或者 Chinese is a very beautiful language.
EnglishI don't speak to English.或者 English is an international language.
............

创建索引后,ES会对索引进行分词,将其拆成词,方便匹配!

副本集

​单节点情况下的ES默认没有副本,仅有索引,数据没有任何冗余性;多节点情况下数据可存在多个副本集,即便是某一个节点挂了,数据也能通过其它节点的副本集来补齐,确保数据完整性!副本集也可以在创建索引时指定数量,指定的数量不同,其警告信息级别也不同。

分片

一个索引数据被分片存储在不同的位置,单节点情况下,这些分片默认都在单台主机上;多节点(集群)情况下,这些分片位于不同的主机。分片存在于副本集中;初始分片数可以在创建索引时定义其数量。

Elasticsearch部分

安装

Elasticsearch官方地址:www.elastic.co

Elasticsearch使用java语言开发的,所以在部署Elasticsearch之前,我们需要先准备好java运行的环境;首先安装JDK

#安装JDK
yum install java -y
#查看java的版本信息
java -version

注: 本文实例使用的JDK版本为1.8.0,也就是epel仓库默认的那个;Elasticsearch系列的版本为6.6版本,Elasticsearch更新较快,所以,你通常没法使用最新的版本。再次部署,建议选择7.x的版本,官方在6.7版本后开放了一些付费功能。

​ 将下载的安装包上传到服务器,使用rpmyum进行安装即可。

配置

​ 默认情况下,ES(后面我们使用缩写的形式)监听的是回环地址,如果需要对外提供服务,我们还需要进行必要的配置,ES自身有多个配置文件,这些配置文件的作用也不相同;下面是其配置文件的描述:

/etc/elasticsearch
├── analysis-ik				#词典目录,如果涉及到中文分词,需要安装ES中文分词器
├── elasticsearch.keystore	#密钥
├── elasticsearch.yml		#ES主配置文件
├── ingest-geoip			#用于显示IP归属地的ES插件
├── jvm.options				#JVM配置文件,会涉及到内存锁定的配置项
├── log4j2.properties		#
├── role_mapping.yml		#角色映射
├── roles.yml				#配置角色
├── users					#用户配置
└── users_roles				#用户角色配置

编辑主配置文件:

vim /etc/elasticsearch.yml

粘贴以下的配置:

#file: /etc/elasticsearch.yml
#集群配置相关,如果要组ES集群,请打开并修改这些选项
#集群名称,所有节点一致则被认为这些节点在一个集群
#cluster.name: test
#节点名,组集群时需要保证节点名称不同
node.name: node_1
#集群IP探测列表,关联即可,根据具体的情况进行修改
#discovery.zen.ping.unicast.hosts: ["172.16.0.130","172.16.0.131"]
#集群节点最小可用数,是通过一个表达式计算出来
#该参数取值为: x=候选节点/2+1
#因为使用该取值方法,故组集群最小节点数为3节点
#discovery.zen.minimum_master_nodes: x
#数据目录
path.data: /var/lib/elasticsearch
#日志目录
path.logs: /var/log/elasticsearch
#启用内存锁定,此处修改完还需要更改systemd的服务模块的参数,否则内存锁定会失败
#做内存锁定是防止ES的内存被GC回收
bootstrap.memory_lock: true
#监听的IP地址
network.host: 172.16.0.130,127.0.0.1
#监听端口
http.port: 9200
#支持跨域的选项
http.cors.enabled: true
http.cors.allow-origin: "*"

由于我们添加了内存锁定相关的参数,故还需要修改systemd的服务模块的配置,执行

systemctl edit elasticsearch.service

添加启动参数,不加此参数会造成内存锁定失败,无法启动ES

[Service]
LimitMEMLOCK=infinity

修改JVM配置,主要是关于内存锁定;因为GC会回收内存,这会影响到ES的性能!我们需要将内存锁死在一个固定的大小,关于这个大小:ES官方建议最大内存不超过32GB,初期情况我们可考虑设定为24GB(如果你的内存足够的话)。即便是后期真的内存不足了,也有一定的余地。

编辑文件/etc/elasticsearch/jvm.options

vim /etc/elasticsearch/jvm.options

找到下面的参数,并根据您的主机内存大小来设定该值

#请根据您的实例的可用内存来设定此参数
#设定初始内存分配大小
-Xms1g
#设定最大内存分配大小
-Xmx1g

重新载入systemd,使一些配置生效

systemctl daemon-reload

启动

启动ES并加入开机自启

systemctl start elasticsearch.service
systemctl enable elasticsearch.service

启动时会比较缓慢,请耐心等待!

测试

由于ES的所有API接口调用都是走HTTP/HTTPS协议的,所以您可以直接使用curl命令检测ES是否正常工作,如下:

curl http://127.0.0.1:9200

如果存在以下输出,表示您部署的ES已经工作正常。

{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "qpEEnWQLTwCa9rhSZNF3tQ",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Logstash or Filebeat部分

​ 现在,存放日志的位置我们已经有了,接下来我们要部署关于日志收集的服务;早期,涉及到日志收集我们使用的是Logstash来做的,但Logstash其自身是也是基于java语言所开发的,通常需要在目标主机先部署JDK环境,而且Logstash本身安装包比较庞大,启动速度非常慢!会影响到目标主机的性能!其配置文件涉及到大量的正则匹配选项,不同的日志套用不同的匹配规则,并不利于大规模部署。维护也比较麻烦!为了解决这些问题,官方基于go语言重写了一个名为filebeat的工具来做日志收集,该工具配置简单,内置了大量常见服务日志的采集模板,我们现在无需进行太复杂的配置即可进行工作,由于是基于go语言开发的,其启动速度快,运行效率较高!

PS: 同类的工具还有非常多,多到ES官网逛一逛,您会收获更多!

安装

ES技术栈的产品通常版本号是一种对应的关系,所以,我们这里选择得filebeat版本也为6.6,使用下载或者是rz的方式将包传到需要收集日志的服务器上,这里我们测试用的是收集nginx的访问日志。本机需要装好nginx的服务

#安装filebeat
rpm -ivh filebeat-6.6.0-x86_64.rpm
#安装nginx
yum install nginx -y
#启动nginx的服务
systemctl start nginx

配置

本文以收集nginx日志为例,我们套用的是filebeatnginx模块,这是最简单和快速的一种方式;其它修改nginx输出日志格式的方法也可以,但比较麻烦我们并不推荐。

首先配置filebeat的主配置文件:

#打开文件
vim /etc/filebeat.yml

添加如下的配置:

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  #载入模块
  reload.enabled: true
  reload.period: 10s
#使用了变量,加入了时间信息
output.elasticsearch:
  hosts: ["172.16.0.130:9200"]
  indices:
    - index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
    #如果包含"access"的内容,将其放入nginx_access目录内
      when.contains:
        fileset.name: "access"
    - index: "nginx_error-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        fileset.name: "error"
#使用自定义的名称时需要指定以下参数
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true

因为我们使用了filebeat内置的模块来进行日志的格式收集,所以我们还要对该模块做一定的配置,打开模块的配置文件,/etc/filebeat/modules.d/nginx.yml,修改该文件的内容:

- module: nginx
  #访问日志
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log"]
  #错误日志
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log"]

启用filebeatnginx模块

filebeat modules enable nginx
#实际上就是将一个模块配置文件放入/etc/filebeat/modules.d/目录内

使用下面的命令,可以查看filebeat默认支持的模块以及模块的启用状态,基于此,您可以创建不同服务的日志采集需求

filebeat modules list

注: filebeat会记录文件的位置点信息,即便是重启了filebeat的服务以后,下次去拿数据时依然会到上次的位置点取数据。

启动

启动filebeat并加入开机自启

systemctl start filebeat.service
systemctl enable filebeat.service

我们可以使用ab压测工具产生一些nginx的访问日志

#同时会产生access和error日志
ab -n 1000 -c 1000 http://127.0.0.1/sjhdshdvbhs
#如果没有ab压测工具可以使用下面的命令来进行安装
yum install httpd-tools

Kibana部分

Kibana主要负责展示数据,通常ES的数据可读性不是太好,我们需要使用kibana来做一个数据的展示。如果需要进行一些数据的查询,也可在kibana中的Dev Tools中直接查询,而无需使用curl这类命令。

安装

同样的,您可以使用wget下载包安装或者使用rz上传包,版本依然是选择与ES对应的版本

rpm -ivh kibana-6.6.0-x86_64.rpm

配置

修改kibana的主配置文件

vim /etc/kibana/kibana.yml

粘贴以下的配置

#kibana默认的监听端口
server.port: 5601
#kibana默认的监听IP
server.host: "0.0.0.0"
#配置Elasticsearch的连接地址
elasticsearch.hosts: ["http://172.16.0.130:9200"]
#在ES中创建kibana自己的索引文件
kibana.index: ".kibana"

注: 如果您要配置HTTPS访问,需要在kibana内设定SSL证书的位置。如果通过公网访问,请设置好用户账户相关,不要使用默认的配置,以免造成安全问题。做HTTPS时可将端口修改为443,前端可以考虑再部署nginx做一个HTTPHTTPS302跳转。

启动

启动kibana服务并加入开机自启

systemctl start kibana
systemctl enable kibana

kibana启动也需要等待一定的时间。

创建图形

待添加

Kafka部分

待添加

Zookeeper部分

待添加

其它工具

安装Elasticsearch-Head工具管理Elasticsearch数据

ES-Head项目地址:https://github.com/mobz/elasticsearch-head

elasticsearch-head工具可以提供一个简单的web页面用以管理elasticsearch数据库,该工具使用JavaScript所写,可以通过npm的形式安装,所以,使用该方法装需要安装部署好node.js的环境,比较麻烦!还有可能安装失败!故我们采用了最快速度形式,在google Chrome浏览器的应用商店内有一款同名的浏览器插件,安装好后可直接使用,无需部署node.js环境。(商店你是别想访问了,也不要问我如何访问的。提供一个打包好的插件下载地址:https://pan.baidu.com/s/1J8nxHJVIq4IKZtbzWwKn_A 提取码:kxyr )

ES-Head的管理页面

elasticsearch_head

"集群健康值"的颜色反应了当前ES集群的一个整体状态,下面是颜色所代表的含义:

颜色含义备注
绿色集群健康状态正常所有的副本数量都是对的
黄色数据完整,但副本数不够或分片数量不够如果副本数设为0的话会呈现绿色,但此时没有数据冗余
红色数据不完整,缺少某些分片通常为主分片数量不对,此时数据是不可用的
灰色未连接网络断开或ES不可用

安装Elasticsearch的中文分词插件

中文分词器插件项目地址:https://github.com/medcl/elasticsearch-analysis-ik

​ 默认情况下,ES是不支持对中文进行分词的,对于中文数据的处理就变的非常不便!(它会将中文拆成一个一个的汉字来处理,而不像对于英文的处理,拆成一个一个的单词)那么此时,我们就需要给ES装扩展插件来提供额外支持。

关于安装:

​ 您需要确定您目前适用的ES版本来选择适用合适的插件版本,安装仅需执行下面的命令即可:

#首先进入ES的可执行文件目录
cd /usr/share/elasticsearch/bin
#执行在线安装,您需要注意版本号
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
#离线安装时需要先将包下载下来,然后走file协议即可进行离线安装
#采用何种方式取决于您的网络的稳定性
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
./elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-6.6.0.zip

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×