ElasticSearch学习

ES学习笔记

Solr是一个搜索程序: Application
Lucene是一个搜索程序库: Library
Elasticsearch是一个分布式搜索引擎: Distributed Search Engine

ES安装

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.2-shell-x86_64.tar.gz
# 解压
tar xzvf elasticsearch-7.5.2-shell-x86_64.tar.gz
# 解压JDK11
tar xzvf jdk-11.0.2_linux-x64_bin.tar.gz -C /opt/app

# 系统需要修改的配置参数
vim /etc/security/limits.conf
*    soft   nofile    65536
*    hard   nofile    65536 
*    soft   nproc     4096
*    hard   nproc     4096

vim /etc/sysctl.conf
vm.max_map_count=262144

sysctl -p

Elasticsearch启停脚本

vim start_es.sh
#!/bin/bash
JAVA_HOME=/opt/app/jdk-11
ES_HOME=/opt/app/elasticsearch-7.5.2
PATH=$JAVA_HOME/bin:$ES_HOME/bin:$PATH
echo -e "\e[32m ***************************** JDK版本信息 ***************************** \e[0m"
java -version
echo -e "\e[32m ************************ 开始启动elasticsearch ************************ \e[0m"
nohup elasticsearch &

# 停止脚本
vim stop_es.sh
#!/bin/bash
pid=`jps | grep Elasticsearch | awk -F' ' '{print $1}'`
kill -9 $pid

Kibana 安装

Kibana是一个开源的分析与可视化平台,设计出来用于与Elasticsearch一起使用的。你可以用Kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用不同的图表、表格、地图等Kibana能够很轻松的展示高级数据分析与可视化。

配置文件kibana.yml

server.port: 5601 # kibana启动的端口
server.host: 0.0.0.0 # 允许哪些机器可以访问
elasticsearch.hosts: ["http://localhost:9200"] # elasticsearch的ip

启停脚本

vim start_kibana.sh
#!/bin/bash
nohup /opt/app/kibana-6.6.0/bin/kibana &

vim stop_kibana.sh
#!/bin/bash
pid=`ps -ef | grep kibana | grep -v grep | awk -F' ' '{print$2}'`
kill -9 $pid

Elasticsearch 基础概念

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于Restful web接口。

ES和关系型数据库对比:

ES关系型数据库
索引index数据库database
类型type表table
文档document行row
字段field列column

分片shrads(默认配置有5个)
因为ES是一个分布式的搜索引擎,所以index通常都会分解成不同部分,而这些分布在不同节点的数据就是分片。ES自动管理和组织分片,并在必要的时候对分片数据再平衡分配,所以用户基本上不用担心分片的处理细节。

副本分片replicas(默认配置有1个)
主要目的是为了故障转移。如果持有主分片的节点挂了,一个副本分片就会晋升为主分片的角色。

创建一个索引

PUT /school

增加一个文档

- /索引/类型/id
POST /school/student/1
{
	"name": "alice",
	"age": 23,
	"email": "alice@qq.com"
}

检索文档

GET /school/student/1

- 只显示指定的字段
GET /school/student/1?_source=name

- 只显示source中的内容
GET /school/student/1/_source

- 获取头信息
HEAD /school/student/1

删除文档

DELETE /school/student/1

使用RESTful操作Elasticsearch

REST通常是开发的一种约定,当所有的开发者都遵从这种约定的时候,可以大大简化开发的沟通成本。REST其核心操作只有POST,GET,PUT,DELETE四种,正好可以对应CURD(CREATE、READ、UPDATE、DELETE)四种数据操作。

操作说明
POST /uri更新或新增一个没有ID的资源
DELETE /uri/xxx删除资源
PUT /uri/xxx更新或新增一个含ID的资源
GET /uri/xxx获取资源

内置REST接口

方法说明
GET /_cluster/health获取集群健康状态
GET /taoli/_search查询索引所有数据
GET /taoli/_mapping查询索引的映射
GET /taoli/_settings查询索引的配置信息
POST /taoli/_open打开索引
POST /taoli/_close关闭索引

logstash安装及配置

什么是logstash

Logstash是一个开源的数据收集引擎,它具有实时数据传输能力。可以统一过滤来自不同源的数据,并按照开发者制定的规范输出到目的地,支持正则表达式。
由于日志文件来源多(如:系统日志,服务器日志,tomcat日志,nginx日志等),且内容杂乱,不便于人进行观察。因此,我们可以使用logstash对日志文件进行收集和统一过滤,变成可读性高的内容。

安装logstash

# 解压
tar xzvf logstash-6.6.0.tar.gz

# 启动脚本
start_logstash.sh
#!/bin/bash
nohup /opt/app/logstash-6.6.0/bin/logstash -f /opt/app/logstash-6.6.0/config/logstash.conf &

logstash的插件分类

在logstash目录下有一个Gemfile,里面有logstash已经安装好的插件

  • input 输入
  • codecs 解码
  • filters 过滤
  • outputs 输出

在github上有更多插件:https://github.com/logstash-plugins

logstash安装插件

# 安装插件
yum -y install ruby
# 下载gem
wget -b https://rubygems.org/rubygems/rubygems-2.6.12.zip
# 安装ruby 2.6版本
ruby setup.rb
gem -v
# 切换ruby源
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
# 修改~/.gemrc 文件,增加 ssl_verify_mode: 0配置,以便于RubyGems可以忽略SSL证书错误。
# 现在就可以安装logstash的插件了
./logstash-plugin install logstash-output-mongodb
./logstash-plugin list

使用logstash的input和filter

插件详情:https://www.elastic.co/guide/en/logstash/6.6/index.html

配置logstash,输出到控制台

vim config/logstash.conf

input {
  # 从文件读取日志信息
  file {
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
}

filter {

}

output {
  # 标准输出
  stdout {}
}

使用filter插件logstash-filter-mutate

mutate插件的split方法可以将message指定分隔符,将字符串分割成数组

filter {
    mutate {
        split => ["mmm", "|"]
    }
}

使用logstash收集日志信息并在Kibana展示

使用logstash-output-elasticsearch插件,详情:https://www.elastic.co/guide/en/logstash/6.6/index.html

input {
    file {
        path => "/var/log/messages"
        type => "system_message"
        start_position => "beginning"
    }
}

filter {
}

output {
    elasticsearch {
        hosts => ["127.0.0.1:9200"]
        index => "msg-%{+YYYY.MM.dd}"
    }
}

使用logstash收集nginx日志并在kibana展示

nginx安装

登录nginx官网下载源码包nginx.org,此次下载的是nginx-1.19.6版本。
还需要下载pcre,此次下载的是pcre-8.38版本。
还需要下载 zlib,此次下载的是zlib-1.2.11版本.

# 解压源码包
tar xzvf nginx-1.19.6.tar.gz
tar xzvf pcre-8.38.tar.gz 
tar xzvf zlib-1.1.11.tar.gz
# 编译, nginx将被安装在/usr/local/nginx目录
./configure --prefix=/usr/local/nginx --with-pcre=/opt/app/pcre-8.38 --with-zlib=/opt/app/zlib-1.2.11
# 安装
make && make install

使用logstash-filter-grok插件

grok-patterns 内置的正则表达式
cat /usr/local/logstash-6.6.2/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns

input {
	file {
		path => "/usr/local/nginx/logs/access.log"
		type => "nginx_message"
		start_position => "beginning"
	}
}

filter {
	grok {
		match => { "message" => "%{HTTPD_COMBINEDLOG}" }
		remove_field => ["beat","offset","tags","prospector"] # 删除beat中不必要的字段
	}
}

output {
	elasticsearch {
		hosts => ["127.0.0.1:9200"]
		index => "nginx-%{+YYYY.MM.dd}"
	}
}

timestamp时间格式处理

目前在Kibana中显示的时间戳是Kibana的系统时间,而不是日志中的时间,现在就需要将日志中的时间在Kibana的时间戳中显示。
此时就需要使用logstash-filter-date插件

input {
	file {
		path => "/usr/local/nginx/logs/access.log"
		type => "nginx_message"
		start_position => "beginning"
	}
}

filter {
	grok {
		match => { "message" => "%{HTTPD_COMBINEDLOG}" }
	}
	date {
		match => { "timestamp" => "dd/MMM/yyyy:HH:mm:ss Z" }
		target => "@timestamp"
	}
}

output {
	elasticsearch {
		hosts => ["127.0.0.1:9200"]
		index => "nginx-%{+YYYY.MM.dd}"
	}
}

filebeat安装及采集nginx数据

Beats是轻量型的数据采集器

filebeat安装

filebeat不需要JDK环境

# 解压
tar xzvf filebeat-6.6.0-linux-x86_64.tar.gz
# 配置
filebeat.inputs:
- type: log
  enabled: true
  backoff: "1s"
  tail_files: false
  paths:
    - /usr/local/nginx/logs/access.log
output.elasticsearch:
  hosts: ["localhost:9200"]

# backoff:设定多长时间检查文件更新
# tail_files: 如果设置为true,则filebeat将在每个文件的末尾而不是开头读取新文件。当此选项于日志轮换结合使用时,可能会跳过新文件中的第一个日志条目。

filebeat+logstash采集日志

在这里插入图片描述
filebeat的配置

filebeat.inputs:
- type: log
  enabled: ture
  paths:
  	- /usr/local/nginx/logs/access.log
  backoff: "1s"
  tail_files: false
logstash.outputs:
  enabled: true
  hosts: ["localhost: 5044"]

logstash的配置

input {
	beats {
		host => "0.0.0.0"
		port => 5044
	}
}
filter {
	grok {
		match => { "message" => "%{HTTPD_COMBINEDLOG}" }
	}
	date {
		match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
		target => "@timestamp"
	}
}
output {
	elasticsearch {
		hosts => ["127.0.0.1:9200"]
		index => "nginx-%{+YYYY.MM.dd}"
	}
}

采集json格式的日志数据

将nginx日志格式修改为json格式

vim nginx.conf

    log_format log_json '{"remote_addr": "$remote_addr", '
                        '"ident": "-", '
                        '"user": "$remote_user", '
                        '"timestamp": "$time_local", '
                        '"request":  "$request", '
                        '"status": "$status", '
                        '"byte": "$body_bytes_sent", '
                        '"refer":  "$http_referer", '
                        '"agent": "$http_user_agent", '
                        '"x_forwarded": "$http_x_forwarded_for"'
                        '}';
    access_log logs/access-josn.log log_json;

设置filebeat配置文件

# 将采集的日志名改为access-json.log
  paths:
    - /usr/local/nginx/logs/access-json.log

修改logstash配置文件,将filter插件中的grok插件改为json插件

vim logstash.conf

filter {
    json {
        source => "message"
        remove_field => ["beat","offset","tags","prospector"]
    }
    date {
        match => [ "timestamp",  "dd/MMM/yyyy:HH:mm:ss Z" ]
        target => "@timestamp"
    }
}

filebeat同时采集多个日志

filebeat同时收集nginx日志和messages日志

filebeat.inputs:
- type: log
  enabled: true
  backoff: "1s"
  tail_files: false
  paths:
    - /usr/loca/nginx/logs/access-json.log
  fields: # 新添加一个自定义的字段
    filetype: logjson
  fields_under_root: true
- type: log
  enabled: true
  backoff: "1s"
  tail_files: false
  paths:
    - /var/log/messages
  fields: # 新添加一个自定义的字段
    filetype: systemlog
  fields_under_root: true
output.logstash:
  enabled: true
  hosts: ["localhost:5004"]

在logstash中需要如下配置

input {
    beats {
        host => "0.0.0.0"
        port => 5044
    }
}

filter {
    if [filetype] == "logjson" {
        json {
            source => "message"
            remove_field => ["beat","offset","tags","prospector"]
        }
        date {
            match => [ "timestamp",  "dd/MMM/yyyy:HH:mm:ss Z" ]
            target => "@timestamp"
        }
    }
}

output {
    if [filetype] == "logjson" {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "nginx-%{+YYYY.MM.dd}"
        }
    } else if [filetype] == "systemlog" {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "msg-%{+YYYY.MM.dd}"
        }
    }
}

filebeat+redis+logstash收集日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值