ELK企业级日志分析平台

Posted Gong_yz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK企业级日志分析平台相关的知识,希望对你有一定的参考价值。

文章目录


主机部署应用:

主机ip角色
k8s1192.168.56.171cerebro
server1192.168.56.11elasticsearch
server2192.168.56.12elasticsearch
server3192.168.56.13elasticsearch
server4192.168.56.14logstash
server5192.168.56.15kibana

一、elasticsearch

elasticsearch简介:
Elasticsearch 是一个开源的分布式搜索分析引擎,建立在一个全文搜索引擎库Apache Lucene基础之上Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎:
一个分布式的实时文档存储,每个字段 可以被索引与搜索
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
基础模块
cluster: 管理集群状态,维护集群层面的配置信息。
alloction: 封装了分片分配相关的功能和策略。
discovery: 发现集群中的节点,以及选举主节点。
gateway: 对收到master广播下来的集群状态数据的持久化存储indices: 管理全局级的索引设置
http:允许通过JSON over HTTP的方式访问ES的APItransport: 用于集群内节点之间的内部通信。engine: 封装了对Lucene的操作及translog的调用
elasticsearch应用场景:
信息检索
日志分析
业务数据分析
数据库加速
运维指标监控
官网: https://www.elastic.co/cn/
软件下载:
https://elasticsearch.cn/download
安装软件
#rpm -ivh jdk-8u171-linux-x64.rpm
#rpm -ivh elasticsearch-7.6.1.rpm //7.6版本自带jdk,直接安装即可

1.集群部署

文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html
下载:https://elasticsearch.cn/download/
配置解析 :
时间同步:之前已做

[root@server1 elasticsearch]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.11   server1
192.168.56.12   server2
192.168.56.13   server3
192.168.56.14   server4
192.168.56.15   server5
192.168.56.16   server6

软件安装:下载rpm包后进行安装
[root@server1 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm

修改配置

[root@server1 ~]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# vim elasticsearch.yml
cluster.name: my-es                              ##集群名字
path.data: /var/lib/elasticsearch                          ##数据目录
path.logs: /var/log/elasticsearch                          ##日志
bootstrap.memory_lock: true                          ##内存锁定,根据jvm.option定义,锁死1G内存
network.host: 0.0.0.0                          ##监听本机所有接口
http.port: 9200                          ##端口
discovery.seed_hosts: ["server1", "server2", "server3"]                         ##启用集群后,需添加集群主机名
cluster.initial_master_nodes: ["server1", "server2", "server3"]                         ##哪些节点可以作为master做初始化

修改系统限制:
原因是:kernel>system>app,系统层面需满足要求

[root@server1 ~]# vim /etc/security/limits.conf         ##加到文件最后
elasticsearch soft memlock unlimited         ##内存锁定
elasticsearch hard memlock unlimited         ##内存锁定
elasticsearch  -  nofile  65535          ##文件描述
elasticsearch  -  nproc  4096          ##进程数

[root@server1 ~]# vim jvm.options
-Xms1g
-Xmx1g
Xmx设置不超过物理RAM的50%,以确保有足够的物理RAM留给内核文件系统缓存。但不要超过32G
物理机内存很大的时候,可以在一台物理机完成集群的搭建!!

[root@server1 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[service]
...
LimitMEMLOCK=infinity

[root@server1 ~]# systemctl  daemon-reload

[root@server1 ~]# swapoff -a
[root@server1 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl  enable --now  elasticsearch

显示下图,即完成配置:

server1配置好后,直接把配置复制到server2和server3

配置ssh免密
[root@server1 elasticsearch]# ssh-keygen
[root@server1 elasticsearch]# ssh-copy-id server2
[root@server1 elasticsearch]# ssh-copy-id server3


复制软件
[root@server1 ~]# scp elasticsearch-7.6.1-x86_64.rpm server2:
[root@server1 ~]# scp elasticsearch-7.6.1-x86_64.rpm server3:

server2和server3软件安装
[root@server2 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm
[root@server3 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm

从server1复制配置
[root@server1 ~]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# scp elasticsearch.yml server2:/etc/elasticsearch/
[root@server1 elasticsearch]# scp elasticsearch.yml server3:/etc/elasticsearch/

[root@server1 elasticsearch]# scp /etc/security/limits.conf server2:/etc/security/
[root@server1 elasticsearch]# scp /etc/security/limits.conf server3:/etc/security/

[root@server1 elasticsearch]# scp /usr/lib/systemd/system/elasticsearch.service server2:/usr/lib/systemd/system/
[root@server1 elasticsearch]# scp /usr/lib/systemd/system/elasticsearch.service server3:/usr/lib/systemd/system/
server2上启动服务
[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# systemctl  enable --now  elasticsearch

server3上启动服务
[root@server3 ~]# swapoff -a
[root@server3 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[root@server3 ~]# systemctl daemon-reload
[root@server3 ~]# systemctl  enable --now  elasticsearch


2.cerebro部署

cerebro:cerebro一款全能的ES工具,安装配置简单,功能强大;可以监控集群、配置集群、操作ES数据;
需要docker,用之前实验的k8s1节点即可
cerebro官方:https://github.com/lmenezes/cerebro/

使用docker启动服务
[root@k8s1 ~]# docker pull lmenezes/cerebro
[root@k8s1 ~]# docker run -d --name cerebro -p 9000:9000 lmenezes/cerebro ##docker run -d -e CEREBRO_PORT=8080…可以修改监听端口

访问网页:http://192.168.56.171:9000/

注:节点地址可以填写任意ES集群节点ip都行

3.elasticsearch集群角色分类


防止脑裂,将功能角色分开,有利于集群稳定
生产集群中可以对这些节点的职责进行划分:

  • 建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。
  • 再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力 也会比较大。
  • 所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求实现请求转发,负载均衡等功能。
    节点需求
  • master节点:普通服务器即可(CPU、内存 消耗一般)·data节点:主要消耗磁盘、内存。
    path,data: data1data2,data3这样的配置可能会导致数据写入不均匀,建议只指定一个数据路径,磁盘可以使用raid0阵列,而不需要成本高的ssd。
  • Coordinating(协调)节点: 对cpu、memory要求较高。
[root@server1 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true     ##master
node.data: false      ##不存数据
node.ingest: true     ##预处理
node.ml: false        ##ml
[root@server1 elasticsearch]# systemctl  restart elasticsearch.service

[root@server2 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true
node.data: true
node.ingest: false
node.ml: false
[root@server2 ~]# systemctl  restart elasticsearch.service

[root@server3 ~]# vim /etc/elasticsearch/elasticsearch.yml
node.master: true
node.data: true
node.ingest: false
node.ml: false
[root@server3 ~]# systemctl  restart elasticsearch.service

server2对应的功能查询如下:

elasticsearch节点扩容、节点缩容:

二、logstash

介绍:
Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据,并将数据标准化到您选择的目标输出。它提供了大量插件,可帮助我们解析,丰富,转换和缓冲任何类型的数据。

1.部署

版本需要保持一致
下载:https://elasticsearch.cn/download/

新建一台虚拟机server4部署logstash
[root@server4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm     ##Java开发,新机要安装jdk
[root@server4 ~]# yum install -y logstash-7.6.1.rpm

命令方式
[root@server4 bin]# /usr/share/logstash/bin/logstash -e 'input  stdin    output  stdout  '       ##不报错就OK

2.elasticsearch输出插件

[root@server4 conf.d]# pwd
/etc/logstash/conf.d
[root@server4 conf.d]# vim test.conf
input 
        stdin  


output 
        stdout                                         ##终端输出也展示:westos Linux

        elasticsearch                                   ##往ES
                hosts => "192.168.56.11:9200"            ##输出到的ES主机与端口
                index => "logstash-%+YYYY.MM.dd"       ##定制索引名称,年月日,每天截断一次;可以支持列表格式
        


[root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
                    ##-e命令行 -f文件
                     ##有报错,直接报错至终端屏幕
                     ##实际中启动后,防止后台即可,自动读取目录

启动成功后录入数据,ctrl+c可退出

可以看到索引,但是看不到具体内容

3.elasticsearch-head插件:带数据浏览

下载网址:https://github.com/mobz/elasticsearch-head

安装依赖
[root@k8s1 ~]# yum install -y bzip2
[root@k8s1 ~]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@k8s1 ~]# cd phantomjs-2.1.1-linux-x86_64
[root@k8s1 phantomjs-2.1.1-linux-x86_64]# cp bin/phantomjs /usr/local/bin/
[root@k8s1 ~]# yum install -y fontconfig
[root@k8s1 ~]# phantomjs
phantomjs>

安装插件
[root@k8s1 ~]# rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm
[root@k8s1 ~]# yum install -y unzip
[root@k8s1 ~]# unzip elasticsearch-head-master.zip
[root@k8s1 ~]# cd elasticsearch-head-master/
[root@k8s1 elasticsearch-head-master]# npm install  --registry=https://registry.npm.taobao.org

[root@k8s1 elasticsearch-head-master]# vim _site/app.js

启动服务
[root@k8s1 elasticsearch-head-master]# npm  run start &

[root@k8s1 elasticsearch-head-master]# netstat -antlp|grep :9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      9897/grunt

修改es配置
[root@server1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"

[root@server1 ~]# systemctl  restart elasticsearch.service

访问:http://192.168.56.171:9100/

4.file输入插件

[root@server4 conf.d]# vim test.conf
input 
        file 
                path => "/var/log/messages"          ##读取的系统文件
                start_position => "beginning"        ##从文件的开头开始
        


output 
        stdout 

        elasticsearch 
                hosts => "192.168.56.11:9200"            ##
                index => "syslog-%+YYYY.MM.dd"         ##名字为:syslog
        



[root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

.sincedb文件保存文件读取进度,避免数据冗余读取

[root@server4 conf.d]# cd /usr/share/logstash/data/plugins/file
[root@server4 file]# l.
.  ..  .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server4 file]# ls -i  /var/log/messages
50695316 /var/log/messages

sincedb文件一共6个字段
1.inode编号(定位文件)
2.文件系统的主要设备号
3.文件系统的次要设备号
4.文件中的当前字节偏移量
5.最后一个活动时间戳(浮点数)
6.与此记录匹配的最后一个已知路径

删除后重新读取
[root@server4 file]# rm -f .sincedb_452905a167cf4509fd08acb964fdb20c

5.syslog 插件:logstash伪装成日志服务器

logstash伪装成日志服务器
[root@server4 conf.d]# vim test.conf
input 
        syslog         ##默认端口为514


output 
         stdout 

        elasticsearch 
                hosts => "192.168.56.11:9200"
                index => "syslog-%+YYYY.MM.dd"
        



[root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

配置客户端日志输出
[root@server1 ~]# vim /etc/rsyslog.conf
去掉以下行的注释
$ModLoad imudp
$UDPServerRun 514

*.*	 @@192.168.56.14:514                  ##传送至的位置

[root@server1 ~]# systemctl  restart rsyslog.service

6.多行过滤插件

从server1拷贝模板文件
[root@server1 elasticsearch]# pwd
/var/log/elasticsearch
[root@server1 elasticsearch]# scp my-es.log server4:/var/log/

[root@server4 conf.d]# vim test.conf
input 

        file 
                path => "/var/log/my-es.log"
                start_position => "beginning"
                codec => multiline                       ##多行
                pattern => "^\\["                      ##匹配;[开头,\\转译;错误日志不是[开头
                negate => true                     ##匹配到了
                what => previous                     ##向上合并
                
        



output 
        stdout 

        elasticsearch 
                hosts => "192.168.56.11:9200"
                index => "myeslog-%+YYYY.MM.dd"   ##名字myeslog
        



[root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

如果第二次执行此命令,需要删除下面目录下对应的文件
[root@server4 conf.d]# cd /usr/share/logstash/data/plugins/file

一个事件输出为一个:如下图,错误的是不“[”开头,则两个[ ]输出为一条

7.grok过滤

[root@server4 ~]# yum install -y httpd
[root@server4 ~]# systemctl  enablel --now httpd
[root@server4 ~]# echo www.westos.org > /var/www/html/index.html

访问此站点生成日志信息
[root@k8s1 ~]# ab -c1 -n 300 http://192.168.56.14/index.html


[root@server4 conf.d]# vim grok.conf
input 
        file 
                path => "/var/log/httpd/access_log"      ##http日志
                start_position => "beginning"
        


filter 
        grok                                   ##预处理、过滤; HTTPD_COMBINEDLOG是变量
                match =>  "message" => "%HTTPD_COMBINEDLOG" 
        


output 
        stdout                          ##作用是终端输出

        elasticsearch 
                hosts => "192.168.56.11:9200"
                index => "apachelog-%+YYYY.MM.dd"      ##apachelog名称
        



[root@server4 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf


企业运维之 ELK日志分析平台(Elasticsearch)

ELK日志分析平台--Elasticsearch的介绍与安装

1. ELK介绍

ELK 指的是⼀套完整的⽇志集中处理解决⽅案,将Elasticsearch + Logstash + Kibana 三个开源⼯具配合使⽤,以满足用户对⽇志的查询、排序、统计需求。
当没有ELK 时可以使用shell中的三剑客awk、sed、grep来对日志进行简单的处理。
ELK常见架构:

  1. Elasticsearch + Logstash + Kibana
    这是一种最简单的架构。通过 logstash 来收集日志,通过Elasticsearch 对日志进行分析,将所得结果展示用 Kibana(web界面)展示。这种架构也是官网介绍的方式,但是在实际生产中很少使用。

  2. Elasticsearch + Logstash + filebeat + Kibana
    相比第一种架构,此架构增加了一个 filebeat 模块。filebeat 是一个轻量的日志收集代理,部署在客户端。优点是相较于logstash消耗更少的资源,但缺点是当 logstash 出现故障时,日志会出现丢失。

  3. Elasticsearch + Logstash + filebeat + redis(中间件(kafka集群化)) + Kibana
    这种架构是对于第二种架构的完善,通过增加中间件,来避免数据的丢失。当 Logstash 出现故障,日志还存留在中间件中,当Logstash 再次启动,则会读取中间件中积压的日志。

ELK 的⼯作原理:

(1)在所有需要收集⽇志的服务器上部署Logstash;或者先将⽇志进⾏集中化管理在⽇志服务器上,在⽇志服务器上部署 Logstash。
(2)Logstash收集⽇志,将⽇志格式化并输出到 Elasticsearch 群集中。
(3)Elasticsearch 对格式化后的数据进⾏索引和存储。
(4)Kibana 从 ES群集中查询数据⽣成图表,并进⾏前端数据的展⽰

2. Elasticsearch简介

Elasticsearch 是一个开源的分布式搜索分析引擎,建立在一个全文搜索引擎库 Apache Lucene基础之上。
Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎:

一个分布式的实时文档存储,每个字段可以被索引与搜索;
一个分布式实时分析搜索引擎;
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据 .

基础模块

  • cluster:管理集群状态,维护集群层面的配置信息。
  • alloction:封装了分片分配相关的功能和策略。
  • discovery:发现集群中的节点,以及选举主节点。
  • gateway:对收到master广播下来的集群状态数据的持久化存储。
  • indices:管理全局级的索引设置。
  • http:允许通过JSON over HTTP的方式访问ES的API。
  • transport:用于集群内节点之间的内部通信。
  • engine:封装了对Lucene的操作及translog的调用。

elasticsearch应用场景:
信息检索、日志分析、业务数据分析、数据库加速、运维指标监控

官网:https://www.elastic.co/cn/
软件下载:https://elasticsearch.cn/download/

3. Elasticsearch 的部署

三台主机,每一台需要配置 2G 的内存。
在官网下载所需的软件包,此处用的是7.6.1版本的rpm包,不需要额外的jdk包支持,因为该版本集成了jdk。

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html

elasticsearch-7.6.1-x86_64.rpm
#安装
[root@server1 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm 
#设置开机自启	
[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl enable --now elasticsearch
[root@server1 ~]# cd /etc/elasticsearch/	#数据文件
[root@server1 elasticsearch]# ls
elasticsearch.keystore  jvm.options        role_mapping.yml  users
elasticsearch.yml       log4j2.properties  roles.yml         users_roles
[root@server1 elasticsearch]# ll elasticsearch.yml 	#主配置文件
-rw-rw---- 1 root elasticsearch 2847 Feb 29  2020 elasticsearch.yml
#开启了9200端口,但是只支持本机,外部没有开启监听端口
[root@server1 elasticsearch]# netstat -antlp	
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3203/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3375/master         
tcp        0      0 172.25.25.21:22         172.25.25.250:48426     ESTABLISHED 3896/sshd: root@pts 
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      14203/java          
tcp6       0      0 ::1:9200                :::*                    LISTEN      14203/java          
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      14203/java          
tcp6       0      0 ::1:9300                :::*                    LISTEN      14203/java          
tcp6       0      0 :::22                   :::*                    LISTEN      3203/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      3375/master     

修改主配置文件,让其对外进行监控。此时只能本机访问,curl localhost:9200;需要编辑配置文件然后让其对外开放。

3. 1 单机模式

配置单机模式,编辑主配置文件,设定端口。

[root@server1 elasticsearch]# pwd
/etc/elasticsearch
[root@server1 elasticsearch]# vim elasticsearch.yml 
 55 network.host: 0.0.0.0	
 #监听本机所有端口
 68 discovery.seed_hosts: ["server1"]	
 #必须修改此处否则启动不了,日志在/var/log/elasticsearch中
[root@server1 elasticsearch]# systemctl restart elasticsearch
#重启之后此时便可以访问。 在网页中访问:172.25.25.21:9200
[root@server1 elasticsearch]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3203/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3375/master         
tcp        0      0 172.25.25.21:22         172.25.25.250:48426     ESTABLISHED 3896/sshd: root@pts 
tcp6       0      0 :::9200                 :::*                    LISTEN      14385/java          
tcp6       0      0 :::9300                 :::*                    LISTEN      14385/java          
tcp6       0      0 :::22                   :::*                    LISTEN      3203/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      3375/master         

当更改为监听所有端口之后,此时再网页访问时便可顺利访问,还可以看到其中的相应的版本信息。

3. 2 Elasticsearch 集群

集群是一个或多个节点(服务器)的集合,它们共同保存整个数据并提供跨所有节点的联合索引和搜索功能。集群由唯一名称标识,默认情况下为“elasticsearch”,此处修改为“my-es”。

节点是单个服务器,它是集群的一部分,存储数据,并参与集群的索引和搜索功能。就像集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符 (UUID)。如果不想要默认值,可以定义任何想要的节点名称。此名称对于集群管理比较重要,希望识别网络中的哪些服务器对应于 Elasticsearch 集群中的哪些节点。

可以将节点配置为通过集群名称加入特定集群。默认情况下,每个节点都被设置为加入一个名为elasticsearch的集群,这意味着如果同时启动多个节点,它们都将自动形成并加入一个名为elasticsearch的集群。

  • Master:主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。
  • Data Node:主要负责集群中数据的索引和检索,一般压力比较大。
  • Coordinating Node:原来的Client node的,主要功能是来分发请求和合并结果的。所有节点默认就是Coordinating node,且不能关闭该属性。
  • Ingest Node:专门对索引的文档做预处理。
  • Machine learning node:机器学习节点提供了机器学习功能,该节点运行作业并处理机器学习 API 请求.

集群部署
此处用到3台主机,三台主机名分别为server1、server2、server3;将之前的单机模式进行更改为集群中的一个。

[root@server1 elasticsearch]# vim elasticsearch.yml
 17 cluster.name: my-es					#集群名称
 23 node.name: server1					#主机名需要解析
 33 path.data: /var/lib/elasticsearch	#数据目录
 37 path.logs: /var/log/elasticsearch	#日志目录
 43 bootstrap.memory_lock: true			#锁定内存分配
 55 network.host: 0.0.0.0				#设定访问权限
 59 http.port: 9200						#http服务端口
 68 discovery.seed_hosts: ["server1","server2","server3"]	
 #指定集群中的主节点
 72 cluster.initial_master_nodes: ["server1", "server2","server3"]	
 #指定集群引导时的初始主节点

直接运行内存较大,如果内存不太够,可以将内存锁定打开。如果在配置文件中已经将内存锁定打开,此处需要修改系统的资源限制文件和修改systemd启动文件。

[root@server1 ~]# vim /etc/security/limits.conf 
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch    -      nofile  65535
elasticsearch    -      nproc 4096
[root@server1 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[Service]		#在service语句块下添加
 41 LimitMEMLOCK=infinity

进入配置目录,修改Xmx和Xms;
-Xmx用来设置应用程序(不是JVM)能够使用的最大内存数,如果程序要花很大内存,就需要修改缺省的设置,但是不要超过的机器的内存。
-Xms用来设置程序初始化的时内存栈的大小,增加这个值会提高程序的启动性能。同样不能超过机器内存并且受-Xmx的限制。
Xmx设置不超过物理RAM的50%,以确保有足够的物理RAM留给内核文件系统缓存。但不要超过32G。

[root@server1 elasticsearch]# pwd
/etc/elasticsearch
[root@server1 elasticsearch]# vim jvm.options 
-Xmx1g
-Xms1g

如果电脑性能可以,便可以将swap分区关闭。

[root@server1 ~]# swapoff -a			#禁用swap分区
[root@server1 ~]# vim /etc/fstab 
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
[root@server1 ~]# systemctl daemon-reload	#重新加载然后重启服务
[root@server1 elasticsearch]# systemctl restart elasticsearch.service

设置好第一个节点之后,将所要构成集群的主机之间进行免密设置,以确保三个集群节点间互相复制东西。
server2节点:
安装软件,修改三个文件内容,关闭swap分区。开启节点即可。

[root@server2 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm
[root@server2 ~]# vim /etc/security/limits.conf 
[root@server2 ~]# vim /usr/lib/systemd/system/elasticsearch.service 
[root@server2 ~]# vim /etc/elasticsearch/elasticsearch.yml 
[root@server1 ~]# swapoff -a
[root@server1 ~]# vim /etc/fstab 
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# systemctl start elasticsearch.service 

server3节点:
安装软件,修改三个文件;内存至少为2G,才可以起来,不然不能作内存锁定;关闭swap分区。开启节点即可。

以上集群便搭建完成。

搭建集群时可能遇到的问题:集群无法加入,原因是 cluster uuid 不同所致
解决方案:重新给定集群名字,删除数据目录
rm -fr /var/lib/elasticsearch/*
重启服务

3. 3 cerebro图形化

在创建好集群之后,还需要一个图形化的方式来显示集群信息,以方便操作。

此处采用 docker 的方式来做,再开一台 server4 主机来做构建 docker 环境。docker仓库的搭建详见 docker 的安装与配置.

cerebro官方:https://github.com/lmenezes/cerebro/

[root@server4 docker]# docker pull lmenezes/cerebro
Using default tag: latest
[root@server4 docker]# docker run -d --name cerebro -p 9000:9000 lmenezes/cerebro
[root@server4 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
077a77740261        lmenezes/cerebro    "/opt/cerebro/bin/ce…"   15 seconds ago      Up 14 seconds       0.0.0.0:9000->9000/tcp   cerebro
[root@server4 docker]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3257/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3357/master         
tcp        0      0 172.25.25.24:22         172.25.25.250:43076     ESTABLISHED 3949/sshd: root@pts 
tcp6       0      0 :::9000                 :::*                    LISTEN      5784/docker-proxy   
tcp6       0      0 :::22                   :::*                    LISTEN      3257/sshd           
tcp6       0      0 ::1:25 

将其运行起来之后,便可进行网页访问测试:http://172.25.25.24:9000

可以看到此时server1是master,此时便可在此来查看节点的一些信息。

3. 4 Elasticsearch-head 图形化

elasticsearch-head插件来图形化展示.

head 插件本质上是一个nodejs的工程,因此需要安装node.

[root@server4 ~]# ls
elasticsearch-head-master  master.zip  nodejs-9.11.2-1nodesource.x86_64.rpm
[root@server4 ~]# yum install -y unzip bzip2	
#此处的bzip2是为了在后续执行cnmp时自动解压的工具
[root@server4 ~]# rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm 
[root@server4 ~]# npm install -g cnpm --registry=https://registry.npm.taobao.org
#解压后进入,更换npm源
[root@server4 ~]# cnpm -v	#查看版本
[root@server4 ~]# unzip master.zip 
[root@server4 elasticsearch-head-master]# pwd
/root/elasticsearch-head-master
[root@server4 elasticsearch-head-master]# cnpm install 

在安装完node之后,调用程序没有问题之后再来修改配置文件;

[root@server4 _site]# pwd
/root/elasticsearch-head-master/_site
[root@server4 _site]# vim app.js 编辑配置文件,
#修改ES主机ip和端口
4374                         this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://172.25.25.21:9200";

[root@server4 elasticsearch-head-master]# cnpm run start &	
#打入后台运行,此时虽然可以访问,但是不能正常连接。
[1] 7466
[root@server4 elasticsearch-head-master]# 
> elasticsearch-head@0.0.0 start /root/elasticsearch-head-master
> grunt server

(node:7492) ExperimentalWarning: The http2 module is an experimental API.
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100


此时再连接9100时提示连接不到,是因为主节点配置文件中没有开启跨域;此时编辑需要连接的配置文件:

[root@server1 elasticsearch]# pwd
/etc/elasticsearch
[root@server1 elasticsearch]# vim elasticsearch.yml 
 59 http.port: 9200
 60 http.cors.enabled: true            	# 允许跨域
 61 http.cors.allow-origin: "*"			# *表示支持所有域名
[root@server1 elasticsearch]# systemctl restart elasticsearch

此时发现已经发生了变化。

3. 5 索引、分片和副本

索引:

索引是具有某些相似特征的文档的集合。索引由名称(必须全部小写)标识,在对其中的文档执行索引、搜索、更新和删除操作时,该名称用于引用索引。

分片:

索引可能会存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用 1TB 磁盘空间的 10 亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独处理来自单个节点的搜索请求。

Elasticsearch 提供了将索引细分为多个称为分片的功能。
创建索引时,可以简单地定义所需的分片数量。
每个分片本身就是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。

分片很重要,主要有两个原因:
1、它允许水平拆分/缩放内容量
2、它允许跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量
分片的分布机制以及它的文档如何聚合回搜索请求完全由 Elasticsearch 管理,并且对用户是透明的。

副本:

Elasticsearch 允许将索引分片的一个或多个副本制作成所谓的副本分片,或简称为副本。
复制之所以重要,主要有两个原因:
1、它在分片/节点发生故障时提供高可用性。出于这个原因,重要的是要注意副本分片永远不会与复制它的原始/主分片在同一节点上分配。
2、它允许扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。

每个索引都可以拆分为多个分片。索引也可以没有副本,或有多个副本。复制后,每个索引将具有主分片和副本分片。可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,可以随时动态更改副本数,但事后无法更改分片数。

创建索引:

查看索引
查看主分区

查看辅助分区

3. 6 Elasticsearch节点优化

在生产环境下,如果不修改 elasticsearch 节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。
默认情况下,elasticsearch 集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。

节点角色是由以下属性控制:(以下是默认值)
node.master: true
node.voting_only: false
node.data: true
node.ingest: true
node.ml: true
xpack.ml.enabled: true
search.remote.connect: true

  • node.master:这个属性表示节点是否具有成为主节点的资格
    注意:此属性的值为true,并不意味着这个节点就是主节点。 因为真正的主节点,是由多个具有主节点资格的节点进行选 举产生的。

  • node.data:这个属性表示节点是否存储数据。

  • node.ingest: 是否对文档进行预处理。

  • search.remote.connect:是否禁用跨集群查询

第一种组合:(默认)
node.master: true
node.data: true
node.ingest: true
search.remote.connect: true
这种组合表示这个节点即有成为主节点的资格,又存储数据。
如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。
测试环境下这样做没问题,但实际工作中不建议这样设置。

第二种组合:(Data node)
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
这个节点称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。

第三种组合:(master node)
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。
这个节点我们称为master节点。

第四种组合:(Coordinating Node)
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是作为一个协调节点,主要是针对海量请求的时候可以进行负载均衡。

第五种组合:(Ingest Node)
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是 ingest 节点,对索引的文档做预处理。

生产集群中可以对这些节点的职责进行划分;建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。
在根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。
所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。

节点需求
master节点:普通服务器即可(CPU、内存 消耗一般)
data节点:主要消耗磁盘、内存。
path.data: data1,data2,data3 这样的配置可能会导致数据写入不均匀,建议只指定一个数据路径,磁盘可以使用raid0阵列,而不需要成本高的ssd。
Coordinating节点:对cpu、memory要求较高。

让 server1 为 master,只作为 master不存数据:

[root@server1 elasticsearch]# pwd
/etc/elasticsearch
[root@server1 elasticsearch]# vim elasticsearch.yml 

 23 node.name: server1
 24 node.master: true	#master
 25 node.data: false	#不存数据
 26 node.ml: false		#机器学习
 27 node.ingest: true	#预处理
之前加过参数此时需要清理后才能重启成功;
[root@server1 bin]# pwd
/usr/share/elasticsearch/bin
[root@server1 bin]#  ./elasticsearch-node repurpose
------------------------------------------------------------------------

    WARNING: Elasticsearch MUST be stopped before running this tool.

14:35:55.913 [main] WARN  org.elasticsearch.cluster.metadata.MetaData - Adding unknown custom object with type index_lifecycle
14:35:55.920 [main] WARN  org.elasticsearch.cluster.metadata.MetaData - Adding unknown custom object with type licenses
Found 1 shards in 1 indices to clean up
Use -v to see list of paths and indices affected
Node is being re-purposed as master and no-data. Clean-up of shard data will be performed.
Do you want to proceed?
Confirm [y/N] y
Node successfully repurposed to master and no-data.
[root@server1 elasticsearch]# systemctl restart elasticsearch

server2配置:
 22 #
 23 node.name: server2
 24 node.master: true
 25 node.data: true
 26 node.ml: false
 27 node.ingest: false
[root@server2 elasticsearch]# systemctl restart elasticsearch.service

server3配置:
 22 #
 23 node.name: server3
 24 node.master: true
 25 node.data: true
 26 node.ml: false
 27 node.ingest: false
 28 
[root@server3 elasticsearch]# systemctl restart elasticsearch.service

此时访问时便可看到相应的设置。

节点扩容

安装对应的软件包,修改配置文件内容,启动服务之后便可自动加入集群。

删除节点
在删除某一节点前需要先将该节点的分片进行迁移,用以下方法集群会自动把指定节点上的分片迁移到其他数据节点

# curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'

  "transient" : 
    "cluster.routing.allocation.exclude._ip" : "172.25.0.13"
  
'
《新程序员》:云原生和全面数字化实践 50位技术专家共同创作,文字、视频、音频交互阅读

以上是关于ELK企业级日志分析平台的主要内容,如果未能解决你的问题,请参考以下文章

企业运维之 ELK日志分析平台(Elasticsearch)

Linux企业运维——ELK日志分析平台(上)安装与配置ES图形化管理插件

Linux企业运维——ELK日志分析平台(上)安装与配置ES图形化管理插件

ELK企业级日志分析平台

ELK企业级日志分析系统

ELK企业级日志分析系统