本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • ELK Stack
  • ELK Stack (1)——Elasticsearch 6介绍与安装配置教程

ELK Stack (1)——Elasticsearch 6介绍与安装配置教程

发布:TangLu2019-10-7 10:08分类: ELK Stack 标签: ELK ElasticSearch logstash kibana ELKStack

一、ELK STACK是什么

1、ELK的原理

ELK Stack是Elasticserach、Logstash、Kibana三种工具组合而成的一个栈。ELK可以将系统日志、访问日志、运行日志、错误日志等进行统一收集、存储分析和搜索以及图形展现。相比传统的CTRL+F或者使用SQL语句在数据库中进行查询,Elasticserach通过倒排索引和分词功能将所查内容出现的次数以及页面进行了定位,然后再用正排索引通过某页去查找出内容,搜索速度更快,就算是TB、PB级别的数据也可以快速搜索。而使用SQL的话必然会使用%来进行通配,而这是不支持走索引的。而且Elasticserach还支持分布式搜索,并且更智能。比如可以去掉类似“这,的,是”这样一些没有特殊含义的词汇,还可以进行分词搜索。比如搜索苹果手机,可以被拆分为苹果+手机2个关键词。另外还有搜索补全、搜索纠错、搜索关键词高亮等实用功能(使用百度搜索、电商网站产品搜索都会用到Elasticsearch)


2、ELK主要应用场景

· 解决开发人员需要频繁查看日志但又没有服务器权限的问题

· 通过Kibana可以快速在海量日志中过滤和定位故障,不需要再通过脚本来完成


二、ELK常用组件

· LogStash负责日志的收集,并且可以输出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,通常会在所有需要收集日志的服务器上安装Logstash,然后由Logstash agent端发送到Logstash的Server端

· ElasticSearch使用JAVA开发、基于Lucene搜索引擎库的全文搜索工具,通过RESTful API(一种接口设计规范,让接口更易懂)隐藏了Lucene原本的复杂性。实现了日志数据的分布式、实时分析,并且可以进行搜索补全与纠错等功能,是ELK最核心的组件。相比MySQL库和表的概念,在ES中把库叫做索引

· Kibana负责数据的展示与统计,是一个图形化的管理系统

· beat:轻量级的日志采集端,又分有filebeat、packbeat等多种beat


三、ElasticSearch工作流程

索引(index):存放文档的容器,索引类似MySQL中的库或者表的概念,同一类的数据最好放一个索引里

分片(shared):Elasticsearch 7以前在创建索引时如果没有指定分片数量(number_of_shards),默认会分为5个分片和一个副本(number_of_replicas),这些分片会依据内部算法划分到不同的节点中去。从ES7以后默认分片数修改为了1个。分片可以带来并行执行的好处,能提高效率。文档数据是根据HASH算法存储到分片,由于算法中涉及到了分片的数量,所以分片创建好以后不可修改,否则HASH值就变了。每一个分片都是一个独立完整的索引,分布在不同的节点上。如果发现有分片没有被分配到节点上,可以看下是否磁盘没有空间。如果节点数>分片数并不能起到优化作用,所以在初期就要规划好分片数

副本:副本的存在是为了提高数据的安全性,保证不会因为某个节点的故障而丢失数据。在head插件或者cerebro插件中查看分片,如果是虚线边框就代表是副本分片,实线边框是主分片。当有节点发生故障时,会从副本中选取一个分片提升为主分片。

节点:站在用户角度来看并没有主节点概念,每个节点对用户来说都是一样的,都会响应请求,但是对于集群来说,会有一个主节点用于管理节点状态以及决定shard分布方式,还会周期性检查其他节点是否可用并进行修复。各节点是通过集群名称来判断是否属于同一节点。


四、安装与配置Elasticsearch 6:

1、配置JAVA环境

ElasticSearch默认工作在集群模式下,扩展性很强,并且支持自动发现。所以在实验环境中需要至少2台服务器来搭建,但是为了防止脑裂,建立使用基数台服务器。在部署ElasticSearch前需要先部署JAVA环境,所以第一步是安装JDK,这里偷懒使用yum安装了openjdk,生产环境还是建议用JDK的源码包

yum install java-1.8.0-openjdk.x86_64


2、ElasticSearch的下载与配置文件的修改

通过官网www.elastic.co(不是com)进行tar包下载,解压后进入config目录,该目录下除了有一个主配置文件elasticsearch.yml需要配置外,还有一个jvm.options文件用于JVM的调优。jvm.options文件主要是JVM优化相关,关于垃圾回收这块使用默认配置就可以了。主要调整的就是最大内存和最小内存的设置。通常设置为一样大小,具体的值可以设置为系统最大内存的一半或三分之二,但不要超过32G,并且预留一半内存给系统

为了保证性能,内存和数据量有一个建议比例,搜索类项目建议比例为1G内存:16G数据,日志类项目为1G:48~96G。假设存放1T数据,有3个节点,1个副本,那么每个节点存储的数据就是2T/3≈700G左右,然后预留100G空间,每个节点就需要存放800G数据,再按照这个比例就可以算出推荐内存了。

-Xms1g  #程序启动时占用内存的大小
-Xmx1g  #程序启动后最大可占用内存的大小


3、修改ElasticSearch主配置文件elasticsearch.yml

vi /usr/local/elasticsearch-6.7.1/config/elasticsearch.yml
cluster.name: test_es  #集群名称,相同集群名称的节点会自动加入到该集群
node.name: node-1_9 #节点名称,这里1_9代表IP最后2段位1.9
path.data: /data/es/data #节点数据存储路径
path.logs: /data/es/logs #节点日志存储路径
node.master: true  #配置节点是否能成为master。默认所有节点都是true,建议只一台配置true,其他为False
node.data: true  #配置该节点是否能存储数据,默认为true,推荐把主节点设置为false
network.host: 10.4.1.9 #修改为节点IP,建议配置为内网地址,一定不能配置0.0.0.0,会导致信息泄露
http.port: 9200 #ES端口
discovery.zen.ping.unicast.hosts: ["10.4.1.9", "10.4.1.27", "10.4.1.31"] #master节点列表。
discovery.zen.minimum_master_nodes:2 #配置主节点数量的最少值,少于该值的话ES集群不可用,为避免脑裂,通常配置为节点数量/2+1,比如使用了三台节点,那么配置应该为2
bootstrap.system_call_filter: false  #关闭自检程序
bootstrap.memory_lock: false  


4、启动Elasticsearch

在bin目录下有一个elasticsearch脚本,加上-d选项可以让服务在系统后台启动。服务启动后默认监听在9200端口,还有个9300端口用于集群间通信。如果需要重启ES的话可以使用jps显示 一下ES的PID,然后kill掉再启动,比直接用ps去查PID要方便一点。另外还有一个elasticsearch-plugin脚本用于插件管理

/usr/local/elasticsearch-6.7.1/bin/elasticsearch -d
/usr/local/elasticsearch-6.7.1/bin/elasticsearch-plugin list  #查看插件


五、Elasticsearch常见错误解决(如果配置文件中监听的端口是非回环地址127.0.0.1(建议把监听地址配置在内网网卡上,数据更安全),在运行Elasticsearch时会遇到一些内核报错,具体报错和解决方法如下(做好配置后,需要注销用户重新登录才会生效

1、don't run elasticsearch as root

解决办法:Elasticsearch是不允许使用root用户来运行的,所以需要把ElasticSearch目录所有者修改为其他用户,并切换到该用户去执行。用浏览器打开能看到如下信息代表安装成功:

elk2.png


2、Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):

解决办法:内存不足,升级内存


3、Exception in thread "main" java.nio.file.AccessDeniedException

解决办法:运行Elasticsearch程序的用户权限不够,把Elasticsearch目录权限修改下即可


4、max virtual memory areas vm.max_map_count [65530] is too low
解决办法:修改/etc/sysctl.conf,增加一行vm.max_map_count= 262144。然后执行sysctl -p使其生效


5、max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
解决办法:修改/etc/security/limits.conf,做以下配置

*                soft   nproc          65536
*                hard   nproc          65536
*                soft   nofile         65536
*                hard   nofile         65536


6、max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]

解决办法:修改/etc/security/limits.d/20-nproc.conf,做以下配置

*          soft    nproc     4096
*          hard    nproc     4096


六、Elasticsearch数据操作方式

要操作ES中的数据有2种方式,一个是使用Kibana中的Dev tools工具进行数据操作,该工具支持自动补齐,只需把PUT、GET等命令写进去运行就可以了另一个是用curl命令调用API接口。ES有四类API,作用大概分为:检查集群节点、索引当前状态;管理集群节点、索引及元数据;执行增删改查操作执行高级操作,如paging,filtering。而Elasticsearch常用API有cat和cluster,下面是一些日常用法介绍:

1、使用curl命令查看cat API下的功能,其中indices用于检查所有索引,health用于检查集群状态

catapi1.png


2、查看ES集群健康状态,green代表主副分片分配正常;yellow代表主分片正常,有副本分片未正常分配;red代表有主分片未分配 。如果集群成为red状态,需要检查是否有集群离线,如果有离线节点,通过重启恢复即可。如果是索引问题,则需要删除错误索引。

http://localhost:9200/_cluster/health  #如果状态非green,可以关注unassigned_shard查看未分配的分片数
http://localhost:9200/_cluster/health?pretty #加上pretty会将内容格式化再输出,更美观

http://localhost:9200/_cat/health  
http://localhost:9200/_cat/health?v  #?v可以让显示信息更详尽

http://localhost:9200/_cluster/state?pretty #可以看主节点信息等

GET /_cluster/allocation/explain  #集群red的原因


3、查询Elasticsearch所有节点列表

curl http://localhost:9200/_cat/nodes?v


4、查询Elasticsearch所有索引

curl http://localhost:9200/_cat/indices?v


5、为Elasticsearch创建索引或数据,数据需要是json格式,如果对已存在数据进行操作会进行覆盖,属于updated

curl -XPUT "10.4.0.221:9200/nginx_web_log.2019.03.01"  #新增一个索引nginx_web_log.2019.03.01
curl -XPUT "10.4.0.221:9200/nginx_web_log.2019.03.01/users/1{
  "name":"tanglu",
  "age": 30
}" 


6、查询Elasticsearch数据

cutl -XGET /nginx_web_log.2019.03.01/users/1 #返回的source就是ES里的数据


7、删除Elasticsearch中的索引或者数据

curl -XDELETE http://10.4.0.221:9201/nginx_web_log.2019.03.*  #支持通配符


8、ES数据备份与迁移

elasticdump --input=http://源IP:9200/索引名 --output=http://目标IP:9200/索引名 --type=settings
elasticdump --input=http://源IP:9200/索引名 --output=http://目标IP:9200/索引名 --type=mapping
elasticdump --input=http://源IP:9200/索引名 --output=http://目标IP:9200/索引名 --type=data



下面是更贴近实际操作的curl命令,插入了两条数据

#为blog索引新增两条记录,指定type为article,ID为2和3
curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/2?pretty' -d '
{
  "title": "test",
  "content":"testsfsdfdsfdsf",
  "PV":10
}'

curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/3?pretty' -d '
{
  "title": "test",
  "content":"testsfsdfdsfdsf",
  "PV":23
}'


关于Elasticsearch更多使用说明,请看本站后续文章……

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《ELK Stack (1)——Elasticsearch 6介绍与安装配置教程
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-295.html  [生成短网址]

已有 0/8086 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~