文章目录
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}"
}
}
}