ELK整理

一、ELK介绍

ELK是Elasticsearch,logash,kibana的结合。
Elasticsearch的功能:

1.搜索
2.全文检索
3.分析数据
4.处理海量数据PB,对海量数据进行近实时的处理(ES可以自动将海量数据分散到多台服务器上去存储和检索)
5.高可用高性能分布式搜索引擎数据库

Elasticsearch的应用场景:

1.网页搜索
2.新闻搜索
3.商品标签
4.日志收集分析展示

二、 Elasticsearch的安装部署

1、依赖于java,所以首先安装java环境-jdk

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

修改环境变量

vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_112
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

source /etc/profile使之立即生效
使用java –version查看是否能看到版本号,如可以代表安装配置正确,如不可以,安装有问题

[root@localhost ~]# java -version
java version "1.8.0_112"

2、 Elasticsearch的安装

首先创建elasticsearch用户, Elasticsearch不支持root用户运行

useradd elsearch

解压安装包到当前的/opt/es目录下

tar -xvf elasticsearch-6.5.4.tar.gz -C /opt/es/

添加用户及用户组权限到安装目录

chown -R elsearch:elsearch /opt/es/

修改配置文件

vim config/jvm.options   #java虚拟机配置
-Xms512m   #最小内存使用
-Xmx512m   #最小内存使用
(配置要求:不要超过30G,性能反而会降低,官方规定。
这个没有具体的值,要根据业务需求来取值,一般要预留50%给内存)


vim  config/elasticsearch.yml 
bootstrap.memory_lock: true   #内存锁定,和上述的jvm.options 文件有关,开启这一项jvm.options 才有效
network.host:0.0.0.0


vim /etc/sysctl.conf
vm.max_map_count=655360     #单个进程中的最大线程数


vim /etc/security/limits.conf
elsearch soft nofile 65536
elsearch hard nofile 65536
elsearch hard nproc 4096
elsearch soft nproc 4096

启动ES服务

su - elsearch
cd /opt/es/elasticsearch-6.5.4/bin/
./elasticsearch -d
jps
14197 Jps
9815 Elasticsearch

然后在网页上查看,出现以下页面表示启动成功
在这里插入图片描述
遇到的问题:

1、当切换到普通用户时,看日志就会出现权限过低,是因为elasticsearch在root用户时已经启动了一次,所以要在log目录下,删掉所有属主都是root的文件。
2、当出现了failed to obtain时,就是节点绑定失败,可以在data目录下删掉nodes目录,注意这一动作是要在服务停掉之后才能进行的。
3、出现Failed to clear cache for realms表示清除区域缓存失败,解决方案:等一会儿重新刷新一下网页就可以了

3、Elasticsearch-head插件的安装

交互方式

curl命令:
最繁琐
最复杂
最容易出错
不需要安装任何软件,只需要有curl命令

比如看集群状态:

curl 192.168.119.158:9200/_cat/health
1619358638 13:50:38 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%

kibana
查看数据以及报表格式丰富
操作很简单
需要java环境和安装配置kibana

es-head插件
查看数据方便
操作相对容易
需要node环境

所以我们要安装es-head插件
我们用chrome插件的方式安装
打开谷歌浏览器的扩展程序
在这里插入图片描述
将包解压至同名目录,然后拖在此处
在这里插入图片描述
安装成功后会出现如下画面
在这里插入图片描述
点击这里就可以看到啦
在这里插入图片描述

4、插入,查询,更新和删除数据

插入:

curl -XPUT  'localhost:9200/vipinfo/user/1?pretty' -H 'Content-Type: application/json' -d' {
	"first_name": "zhang",
	"last_name" : "ya",
	"age" : 18,
	"about" : "I like to collect rock albums", "interests": [ "music" ]
}'

curl -XPUT  'localhost:9200/vipinfo/user/2?pretty' -H 'Content-Type: application/json' -d' {
	"first_name": "ya",
	"last_name" : "zhang",
	"age" : 28,
	"about" : "I like to collect rock albums", "interests": [ "music" ]
}'

查询:

查询指定文档数据
curl -XGET 'localhost:9200/vipinfo/user/1?pretty'
curl -XGET 'localhost:9200/vipinfo/user/2?pretty’

按条件查询文档数据
curl -XGET 'localhost:9200/vipinfo/user/_search?q=last_name:ya&pretty'
curl -XGET 'localhost:9200/vipinfo/user/_search?q=age:28&pretty'

也可以在网页界面根据条件查询

更新有两种方法:
1、PUT更新,需要填写完整的信息

curl -XPUT 'localhost:9200/vipinfo/user/2?pretty' -H 'Content-Type: application/json' -d'
{
    "first_name" : "zhang",
    "last_name": "ya",
    "age" : 27,
    "about" : "i love my cat", "interests": [ "sports", "music" ]
}

2、POST更新,只需要填写需要更改的信息

curl -XPOST 'localhost:9200/vipinfo/user/2?pretty' -H 'Content-Type: application/json' -d'
{
    "age" : 29
}

三、集群的搭建

1、将三个节点搭建成功

启动三台虚拟机,修改其配置文件
vim config/elasticsearch.yml

cluster.name: es-clusters    #集群名称
node.name: node02     #三者分别是node01 node02 node03
network.host: 0.0.0.0
http.port: 9200        #端口号
discovery.zen.ping.unicast.hosts: ["192.168.119.158", "192.168.119.163","192.168.119.164"]
discovery.zen.minimum_master_nodes: 2
node.master: true   #配置当前节点是否具有可选为master节点的资格,默认值为true
node.data: true     #配置当前节点是否允许存储数据,默认值为true
http.cors.enabled: true   #设置运行跨域访问,默认为false
http.cors.allow-origin: "*"   #设置跨域访问的允许范围

分别启动三个节点,在页面刷新就可以看到集群状态了
在这里插入图片描述
启动遇到的问题:

1、SettingsException[Failed to load settings from /opt/es/elasticsearch-6.5.4/config/elasticsearch.yml]; nested: AccessDeniedException[/opt/es/elasticsearch-6.5.4/config/elasticsearch.yml];
这是elasticsearch.yml的权限问题,可以查看其属主组是root而不是elsearch,所以要修改用户
2、failed to send join request to master
是因为复制的elasticsearch文件夹下包含了data文件中实例一的节点数据,需要把data文件下的文件清空。删除es集群data数据库文件夹下所有文件即可,然后重启服务

创建5分片,1副本,主分片尽量分布在不同的服务器上,主分片负责读与写,副分片只有读。
在这里插入图片描述

集群状态:

green 所有索引数据都存在,副本满足条件,所有数据都完整
yellow 所有索引数据完整,但是副本不满足条件
red 数据不完整,有的索引数据有丢失

2、故障转移

因为刚才node2为主节点,现在我们停掉node2看主副分片以及主副节点会发生什么变化
在这里插入图片描述

因为我们规定了5分片,1副本,所以当一个节点挂掉之后,其余节点也要满足1副本。所以两者应该是一样的分片数。

为什么下图的健康状态为黄色呢?

黄色表示所有索引数据完整,但是副本不满足条件,可以看到index2,index3的副本数规定为2,现在挂掉一个节点,副本数变成1了,副本数不满足条件,所以呈黄色状态。

在这里插入图片描述
调整限制的限定条件

1.索引一旦创建以后,分片数就固定死了,不能调整了
2.但是副本数可以动态调整

比如将上图index2,index3两个副分片改为一个幅分片

curl -XPUT 'localhost:9200/index2/_settings?pretty' -H 'Content-Type: application/json' -d'         
{
"settings" : { 
  "number_of_replicas" : 1
 } 
}'


curl -XPUT 'localhost:9200/index3/_settings?pretty' -H 'Content-Type: application/json' -d'         
{
"settings" : { 
  "number_of_replicas" : 1
 } 
}'

下列健康值就变成了绿色啦!
在这里插入图片描述
下面我们创造红色健康值,红色:数据不完整,有的索引数据有丢失。将index1的副本数由1变为0,然后再停掉该节点
改变副本数的命令如下:

curl -XPUT 'localhost:9200/index1/_settings?pretty' -H 'Content-Type: application/json' -d'         
{
"settings" : { 
  "number_of_replicas" : 0   #将副本数变为0
 } 
}'

停掉一个节点后,健康值变红了,这是因为数据有缺失,3个分片现在只剩2个分片了。
在这里插入图片描述
所以想要服务器尽可能不宕机,就将副本数设置多一点(2副本),0副本不安全!

四、kibana的安装以及使用

Kibana是对 Elasticsearch索引中的数据进行搜索、查看、交互操作的工具,可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。比es-head更加的可视化。

1、解压安装包

tar -xvf kibana-6.5.4-linux-x86_64.tar.gz -C /opt/es

2、修改配置文件

vim config/kibana.yml
server.host: "192.168.119.158"  #对外暴露服务的地址
elasticsearch.url: "http://192.168.119.158:9200"  #配置Elasticsearch

3、启动

./bin/kibana  

4、通过浏览器进行访问

http://192.168.119.158:5601/app/kibana

以下是通过浏览器访问的画面
在这里插入图片描述
下图中画框的索引不能删!删了做的kibana的图表都没了,切记!
在这里插入图片描述

五、使用filebeat收集日志

收集nginx日志:
1、安装并启动Nginx

tar -xf  nginx-1.18.0.tar.gz -C /opt/es
#安装编译支持库后编译安装
yum -y install pcre-devel zlib-devel gcc
./configure
make && make install
cd /usr/local/nginx/sbin
./nginx

通过网页访问nginx,可以在/usr/local/nginx/logs/access.log里查看到访问记录
在这里插入图片描述

2、安装filebeat

tar  -xf filebeat-6.5.4-linux-x86_64.tar.gz -C /opt/es

3、启动filebeat
如若是rpm安装的,就可以systemctl启动
如果是tar包安装的filebeat,那就./filebeat -e -c 文件启动即可。创建以下文件意为输出到Elasticsearch

vim beats-log-elasticsearch.yml 

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /opt/es/filebeat-6.5.4-linux-x86_64/logs/*.log
  tags: ["web"]
  fields:
    from: nebula
  fields_under_root: true
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["192.168.119.158:9200","192.168.119.163:9200","192.168.119.164:9200"]

向/opt/es/filebeat-6.5.4-linux-x86_64/logs/a.log中添加内容

echo 999 > a.log

在elasticsearch页面中就可以看到启动的filebeat以及输入的内容
在这里插入图片描述
添加的内容也可以看到啦
在这里插入图片描述
4、配置nginx日志文件

vim beats-log-nginx.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log
  tags: ["nginx"]
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["192.168.119.158:9200","192.168.119.163:9200","192.168.119.164:9200"]

启动配置文件,在页面访问nginx,就可以在Elasticsearch看到访问信息了

./filebeat -e -c beats-log-nginx.yml

在这里插入图片描述
在kibana里进行查看,首先将elaticsearch里的索引也加入到kibana的索引里来,如下图
在这里插入图片描述
点击下一步,然后选择此选项,开始创建索引
在这里插入图片描述
在时间里选择this week,然后就能看到访问的数据了
在这里插入图片描述
可以在add filter里添加选项,可以筛选具体的选项,比如此图筛选beat-hostname是elk的
在这里插入图片描述

六、filebeat自定义索引和日志名称

vim //opt/es/filebeat-6.5.4-linux-x86_64/filebeat.yml
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.119.158:9200"]
  index: "nginx-www-access-%{[beat-version]}-%{+yyyy.MM.dd}"  #添加这一行修改索引名

保存修改,重启filebeat发现报错

ERROR   instance/beat.go:800    
Exiting: setup.template.name and setup.template.pattern have to be set if index name is modified.
如果index name被修改了,那么setup.template.name和setup.template.pattern得设置

给filebeat.yml文件添加以下内容

  index: "nginx-www-access-%{[beat-version]}-%{+yyyy.MM.dd}"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"  #匹配以nginx开头的东西
setup.template.enabled: false   #禁用原来的模板
setup.template.overwrite: true   #把自定义的覆盖掉原来的

再启动的时候又提示少了三个包,安装即可

Error loading pipeline: Error loading pipeline for fileset nginx/access: This module requires the following Elasticsearch plugins:
ingest-user-agent, ingest-geoip

#解决:需要在Elasticsearch中安装ingest-user-agent、ingest-geoip插件
#其中,ingest-user-agent.tar、ingest-geoip.tar解压到plugins下
#ingest-geoip-conf.tar解压到config下
三个虚拟机节点都要安装这些插件
scp转发就行了

解决办法如下:
在这里插入图片描述

filebeat收集多个域名日志创建不同索引
思路:

1、nginx日志文件按域名拆分
bbs_access.log tag:bbs
blog_access.log tag:blog
www_access.log tag:www
2、filebeat根据不同的nginx域名日志文件生成不同的索引
nginx-www-access-6.6.0-2019.07
nginx-www-access-6.6.0-2019.07
nginx-www-access-6.6.0-2019.07
如果是tag:www
索引名就叫nginx-www-access-6.6.0-2019.07
如果是tag:bbs
索引名就叫nginx-bbs-access-6.6.0-2019.07

做好以下准备工作:

nginx修改多域名多日志,将日志格式改为json格式
[root@db01 /etc/nginx]# egrep -v "#|^$" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
   log_format	json '{ "time_local": "$time_local", '
                           '"remote_addr": "$remote_addr", '
                           '"referer": "$http_referer", '
                           '"request": "$request", '
                           '"status": $status, '
                           '"bytes": $body_bytes_sent, '
                           '"agent": "$http_user_agent", '
                           '"x_forwarded": "$http_x_forwarded_for", '
                           '"up_addr": "$upstream_addr",'
                           '"up_host": "$upstream_http_host",'
                           '"upstream_time": "$upstream_response_time",'
                           '"request_time": "$request_time"'
    ' }';
    access_log  /var/log/nginx/access.log  json;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
}
[root@db01 /etc/nginx/conf.d]# cat www.conf 
server {
    listen 80;
    server_name  www.oldboy.com;
    location / {
        root /html/www;
        index index.html;
    }
    access_log  /var/log/nginx/www_access.log  json;
}


[root@db01 /etc/nginx/conf.d]# cat bbs.conf 
server {
    listen 80;
    server_name  bbs.oldboy.com;
    location / {
        root /html/bbs;
        index index.html;
    }
    access_log  /var/log/nginx/bbs_access.log  json;
}


[root@db01 /etc/nginx/conf.d]# cat blog.conf 
server {
    listen 80;
    server_name  blog.oldboy.com;
    location / {
        root /html/blog;
        index index.html;
    }
    access_log  /var/log/nginx/blog_access.log  json;
}

mkdir /html/{www,blog,bbs} -p
echo "db01 www" > /html/www/index.html
echo "db01 bbs" > /html/bbs/index.html
echo "db01 blog" > /html/blog/index.html

chown -R nginx:nginx /html/
nginx -t
systemctl restart nginx 

filebeat配置文件:

vim filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/bbs_access.log
   json.keys_under_root: true   #filebeat添加参数直接解析成json格式
   json.overwrite_keys: true
   tags: ["bbs"]
- type: log
  enabled: true
  paths:
    - /var/log/nginx/blog_access.log
   json.keys_under_root: true
   json.overwrite_keys: true
   tags: ["blog"]
- type: log
  enabled: true
  paths:
    - /var/log/nginx/www_access.log
   json.keys_under_root: true
   json.overwrite_keys: true  
   tags: ["www"]
output.elasticsearch:
  hosts: ["10.0.0.51:9200"]
  indices:
    - index: "nginx_www_access-%{[beat-version]}-%{+yyyy.MM}"
      when.contains:
        tags: "www"
    - index: "nginx_bbs_access-%{[beat-version]}-%{+yyyy.MM}"
      when.contains:
        tags: "bbs"
     - index: "nginx_blog_access-%{[beat-version]}-%{+yyyy.MM}"
      when.contains:
        tags: "blog"

setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true     

效果如下图所示:
在这里插入图片描述
filebeat收集多个域名日志创建不同索引的思路就是给日志转成json格式,然后在filebeat.yml里面的input和output里创建索引

filebeat的moudle收集Nginx日志
moudle的引出

filebeat代替logstash,filebeat不依赖java环境,但是它必须把日志转化成json格式才可以,那有的文件转化不了json格式呢?这时就推出了moudle

配置步骤:
1、配置相关modules参数

vim filebeat.yml
filebeat.inputs:
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s

output.elasticsearch:
  hosts: ["192.168.119.158:9200"]

2、查看模块

./filebeat modules list
Enabled:
nginx

3、modules文件的变化

由nginx.yml.disabled变成了nginx.yml,相当于一个mv

将filebeat的模块路径改为nginx的日志路径,还要将上面nginx.conf的access路径由json改为main,还要将子配置的json改为main
然后再./filebeat setup -e

为什么要加入kafka或者redis缓存?
所有日志全部由filebeat交给es,es压力太大,处理不过来日志数据就会丢失,所以要加入缓存,redis不能直接给es。logsatch要从redis里面取数据然后交给es,就算es挂了,只要redis不挂,数据就不会丢

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值