ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写。
– Elasticsearch:负责日志检索和储存
– Logstash:负责日志的收集和分析、处理
– Kibana:负责日志的可视化
– 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK
ELK组件在海量日志系统的运维中,可用于解决:
– 分布式日志数据集中式查询和管理
– 系统监控,包含系统硬件和应用各个组件的监控
– 故障排查
– 安全信息和事件管理
– 报表功能
Elasticsearch
ElasticSearch 是一个基于 Lucene 的搜索服务器。
它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful API 的 web 接口。
Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
主要特点
– 实时分析
– 分布式实时文件存储,并将每一个字段都编入索引
– 文档导向,所有的对象全部是文档
– 高可用性,易扩展,支持集群(Cluster)、分片(Shards)和复制 (Replicas)
– 接口友好,支持 JSON
ES 没有什么
Elasticsearch 没有典型意义的事务.
Elasticsearch 是一种面向文档的数据库。
Elasticsearch 没有提供授权和认证特性
相关概念:
– Node: 装有一个 ES 服务器的节点。
– Cluster: 有多个Node组成的集群
– Document: 一个可被搜素的基础信息单元
– Index: 拥有相似特征的文档的集合
– Type: 一个索引中可以定义一种或多种类型
– Filed: 是 ES 的最小单位,相当于数据的某一列
– Shards: 索引的分片,每一个分片就是一个 Shard
– Replicas: 索引的拷贝
ES 与关系型数据库的对比
– 在 ES 中,文档归属于一种 类型 (type) ,而这些类型
存在于索引 (index) 中,类比传统关系型数据库
– DB -> Databases -> Tables -> Rows -> Columns
– 关系型 数据库 表 行 列
– ES -> Indices -> Types -> Documents -> Fields
– ES 索引 类型 文档 域(字段)
安装 JDK和elasticsearch-2.3.4.rpm
yum -y install elasticsearch-2.3.4.rpm
yum -y install java-1.8.0-openjdk
设置主机名称和 ip 对应关系
vim /etc/hosts
192.168.4.20 kibana
192.168.4.15 es2
192.168.4.21 es3
192.168.4.50 es5
192.168.4.11 es1
192.168.4.14 es4
修改配置文件
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: es-abc
node.name: es1
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["es1", "es2","es3"]
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: es-abc
node.name: es2
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["es1", "es2","es3"]
.......
clook主机不装包不配置
启动服务,设置自启动
systemctl enable elasticsearch
systemctl start elasticsearch
验证:
netstat –ltunp |grep :9200
netstat –ltunp |grep :9300
http://192.168.4.12:9200/_cluster/health?pretty
{
"cluster_name" : "my-es",
"status" : "green",
...... ...... ......
"number_of_nodes" : 5,
"number_of_data_nodes" : 5,
...... ...... ......
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
ES 集群验证
– 返回字段解析
– status“ : ”green“ 集群状态,绿色为正常,×××表示有问题但不是很严重,红色表示严重故障
– “number_of_nodes” : 5, 表示集群中节点的数量
– "number_of_data_nodes" : 5,
– ...... ...... ......
– "task_max_waiting_in_queue_millis" : 0,
– "active_shards_percent_as_number" : 100.0
– }
ES 常用插件
head 插件:
– 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作
– 它提供一组针对集群的查询API,并将结果以json和表格形式返回
– 它提供一些快捷菜单,用以展现集群的各种状态
kopf 插件:
– 是一个ElasticSearch的管理工具
– 它提供了对ES集群操作的API
bigdesk 插件:
– 是elasticsearch的一个集群监控工具
– 可以通过它来查看es集群的各种状态,如:cpu、内存
使用情况,索引数据、搜索情况,http连接数等
ES 插件安装、查看
– 查看安装的插件
/usr/share/elasticsearch/bin/plugin list
– 安装插件
/usr/share/elasticsearch/bin/plugin install ftp://192.168.4.254/head.zip
/usr/share/elasticsearch/bin/plugin install file:///tmp/kopf.zip
– 这里必须使用 url 的方式进行安装,如果文件在本地,我们也需要使用 file:// 的方式指定路径,
例如文件在/tmp/xxx 下面,我们要写成 file:///tmp/xxx 删除使用 remove 指令。
例:
cd /usr/share/elasticsearch/bin
./plugin install http://192.168.4.254/es-plugins/bigdesk-master.zip
./plugin install http://192.168.4.254/es-plugins/elasticsearch-head-master.zip
./plugin install http://192.168.4.254/es-plugins/elasticsearch-kopf-master.zip
./plugin list
Elasticsearch提供了一系列RESTful的API
– 检查集群、节点、索引的健康度、状态和统计
– 管理集群、节点、索引的数据及元数据
– 对索引进行CRUD操作及查询操作
– 执行其他高级操作如分页、排序、过滤等
POST 或 PUT 数据使用 json 格式
json
– JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,
它是一种基于文本,独立于语言的轻量级数据交换格式。
– json 传输的就是一个字符串
– python 中对应的 字符串,列表,字典都可以转换成对应的 json 格式
Rest API 的简单使用
– _cat API 查询集群状态,节点信息
– v 参数显示详细信息
curl -X GET http://192.168.4.15:9200/_cat/health?v
– help 显示帮助信息
curl -X GET http://192.168.4.15:9200/_cat/health?help
– nodes 查询节点状态信息
curl -X GET http://192.168.4.15:9200/_cat/nodes?v
– 索引信息
curl -X GET http://192.168.4.15:9200/_cat/indices?v
HTTP Methods 和 RESTful API 设计
– HTTP Methods 也叫 HTTP Verbs, 它们是 HTTP 协议的一部分,
主要规定了 HTTP 如何请求和操作服务器上的资源,常见的有GET, POST等
– HTTP Methods 一共有九个,分别是 GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH
HTTP Methods
– 在RESTful API 设计中,常用的有POST,GET,PUT,PATCH 和 DELETE。分别对应对资源的创建,获取,
修改,部分修改和删除操作。
– 我们默认访问 ES API 的方法是 GET,如果要对数据库增加、删除、修改数据我们还要使用对应的方法。
– GET 查询
– POST 增加
– PUT 更改
– DELETE 删除
RESTful API 增加
– 创建一个 school(Index)(可以认为是库名) 和一个 students (Type)(表名)
– 并增加一条信息
curl -XPUT 'http://192.168.4.11:9200/school/students/1' -d
'{
"title": "devops",
"name":{
"first": "guzhang",
"last": "wu"
},
"age": 25
}'
RESTful API 更改
– 修改 school 下面 students 的第一个文档中的 age 信
息,从 25 修改为 30
curl -XPOST
'http://192.168.4.11:9200/school/students/1/_update' -d
'{
"doc":{ #格式
"age": 30 #修改的内容
}
}'
RESTful API 查询
– 查询刚刚创建的文档信息
curl –XGET 'http://192.168.4.11:9200/school/students/1‘
– 只查询 name 和 age
curl -XGET 'http://192.168.4.11:9200/school/students/1?_source=name,age'
RESTful API 删除
– 删除刚才创建的文档
curl -XDELETE 'http://192.168.4.11:9200/school/students/1'
– 直接删除 school
curl -XDELETE 'http://192.168.4.11:9200/school'
Kibana 安装
– kibana 的安装非常简单,我们使用 rpm 方式安装
rpm –ivh kibana-4.5.2-1.x86_64.rpm
– kibana 默认安装在 /opt/kibana 下面,配置文件在
/opt/kibana/config/kibana.yml
– 我们只需要修改少量的配置就可以启动
kibana.yml 的配置
vim /opt/kibana/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.4.13:9200"
kibana.index: ".kibana"
kibana.defaultAppId: "discover"
elasticsearch.pingTimeout: 1500
elasticsearch.requestTimeout: 30000
elasticsearch.startupTimeout: 5000
– 除 elasticsearch.url 需要配置为我们 ES 集群的地址之外,其他保持默认值就可以了
– 设置开机启动
systemctl enable kibana
– 启动服务
systemctl start kibana
– web 访问 kibana
http://192.168.4.20:5601/
使用 _bulk 批量导入数据
– 批量导入数据使用 POST 方式,数据格式为 json,url编码使用 data-binary
– 导入含有 index 配置的 json 文件
gzip –d logs.jsonl.gz
curl -XPOST 'http://192.168.4.14:9200/_bulk' --data-binary @logs.jsonl
gzip –d shakespeare.json.gz
curl -XPOST 'http://192.168.4.14:9200/_bulk' --data-binary @shakespeare.json
– 导入没有有 index 配置的 json 文件
– 我们需要在 uri 里面制定 index 和 type
gzip –d accounts.json.gz
curl -XPOST 'http://192.168.4.14:9200/accounts/act/_bulk?pretty' --data-binary @accounts.json
数据批量查询
数据批量查询使用 GET
curl -XGET 'http://192.168.4.11:9200/accounts/act/2'
或curl -XGET 'http://192.168.4.11:9200/_mget?pretty' -d '{
"docs":[
{
"_index": "accounts",
"_type:": "act",
"_id": 1
}
{
"_index": "accounts",
"_type:": "act",
"_id": 2
}
{
"_index": "shakespeare",
"_type:": "scene",
"_id": 1
}
]
}'
map 映射
mapping:
– 映射:创建索引的时候,可以预先定义字段的类型及相关属性。
– 作用:这样会让索引建立得更加的细致和完善。
– 分类:静态映射和动态映射。
– 动态映射:自动根据数据进行相应的映射。
– 静态映射:自定义字段映射数据类型。
kibana 里选择日志
– 支持通配符 *
– 我们这里选择 logstash-*
– 在下面的 Time-field 选择 @timestramp 作为索引
– 然后点 create 按钮
导入成功以后选择 discover,修改一下时间来显示。
logstash
– logstash是一个数据采集、加工处理以及传输的工具
logstash 特点:
– 所有类型的数据集中处理
– 不同模式和格式数据的正常化
– 自定义日志格式的迅速扩展
– 为自定义数据源轻松添加插件
logstash 安装
– Logstash 依赖 java 环境,需要安装 java-1.8.0-
openjdk
– Logstash 没有默认的配置文件,需要手动配置
– logstash 安装在 /opt/logstash 目录下
rpm -ivh logstash-2.3.4-1.noarch.rpm
logstash 工作结构
– { 数据源 } ==>
– input { } ==>
– filter { } ==>
– output { } ==>
– { ES }
input{}=收集数据
filter{}=整理数据
output{}=存放数据到哪儿
logstash 里面的类型
– 布尔值类型: ssl_enable => true
– 字节类型: bytes => "1MiB"
– 字符串类型: name => "xkops"
– 数值类型: port => 22
– 数组: match => ["datetime","UNIX"]
– 哈希: options => {k => "v",k2 => "v2"}
– 编码解码: codec => "json"
– 路径: file_path => "/tmp/filename"
– 注释: #
logstash 条件判断
– 等于: ==
– 不等于: !=
– 小于: <
– 大于: >
– 小于等于: <=
– 大于等于: >=
– 匹配正则: =~
– 不匹配正则: !~
– 包含: in
– 不包含: not in
– 与: and
– 或: or
– 非与: nand
– 非或: xor
– 复合表达式: ()
– 取反符合:!()
cat <&0 >&1
从标准输入stdin(0)度入数据,在标准输出stdout(1)显示出来
rpm -ivh logstash-2.3.4-1.noarch.rpm
创建一个配置文件/etc/logstash/logstash.conf
cd /etc/logstash
vim logstash.conf
input{
stdin{}
}
output{
stdout{}
}
/opt/logstash/bin/logstash -f logstash.conf 启动
logstash 插件
– 上页的配置文件使用了 logstash-input-stdin 和logstash-output-stdout 两个插件,logstash 还有filter 和 codec 等插件,查看插件的方式是/opt/logstash/bin/logstash-plugin list
codec类插件
– 常用的插件:plain、json、json_lines、rubydebug、multiline等
– sincedb_path 记录读取文件的位置
– start_position 配置第一次读取文件从什么地方开始
vim /etc/logstash/logstash.conf
input{
file{ #文件格式
start_position => "beginning" #删除sincedb_path路径从头读取数据
sincedb_path => "/var/lib/logstash/sincedb-access" #记录文件数据读到多少行,多少字节。
path => ["/tmp/a.log","/tmp/b.log"] #读取文件的路径
type => 'filelog' #文件类型日志格式
}
}
filter{}
output{
stdout{ codec => "rubydebug" }
}
vim /tmp/a.log
aaaaaaaaaaaa
vim /tmp/b.log
bbbbbbbbbbbbbbb
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
tcp & udp 插件
vim /etc/logstash/logstash.conf
input{
tcp{
host => "0.0.0.0"
port => 8888
type => "tcplog"
}
udp{
host => "0.0.0.0"
port => 9999
type => "udplog"
}
}
filter{}
output{
stdout{ codec => "rubydebug" }
}
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
使用 shell 脚本,对 tcp 指定端口发送数据
function sendmsg(){
if (( $# == 4 )) && [ $1 == "tcp" -o $1 == "udp" ];then
exec 9<>/dev/$1/$2/$3
echo "$4" >&9
exec 9<&-
else
echo "$0 (tcp|udp) ipaddr port msg"
fi
}
– 发送 tcp 数据
– sendmsg tcp 192.168.4.10 8888 ‘tcp msg’
– 发送 udp 数据
– sendmsg udp 192.168.4.10 9999 ‘udp msg’
syslog 插件
input{
syslog{
host => "192.168.4.10"
port => 514
type => "syslog"
}
}
filter{}
output{
stdout{ codec => "rubydebug" }
}
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
– rsyslog.conf 配置向远程发送数据
local0.info @@192.168.4.10:514
– 写 syslog ,查看状态
logger -p local0.info -t testlogs 'hello word'
filter grok插件
– 解析各种非结构化的日志数据插件
– grok 使用正则表达式把飞结构化的数据结构化
– 在分组匹配,正则表达式需要根据具体数据结构编写
– 虽然编写困难,但适用性极广
– 几乎可以应用于各类数据
grok{match => [“message”,“%{IP:ip}, (?<key>reg)”]}
grok 正则分组匹配
– 匹配 ip 时间戳 和 请求方法
"(?<ip>(\d+\.){3}\d+) \S+ \S+
(?<time>.*\])\s+\"(?<method>[A-Z]+)"]
– 使用正则宏
%{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} [%{HTTPDATE:timestamp}\] \"%{WORD:verb}
– 最终版本
%{COMMONAPACHELOG} \"(?<referer>[^\"]+)\"
\"(?<UA>[^\"]+)\"
cat /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns (宏路径)
input redis 插件
– 生产环境往往理由 redis 来做缓冲,这里给出配置
vim /etc/logstash/logstash.conf
input{
redis{
host => 'redis-server'
port => '6379'
data_type => 'list'
key => 'lb'
codec => 'json'
}
filter{
grok{match => [“message”,"(?<ip>(\d+\.){3}\d+)"]}
}
output{
stdout{ codec => "rubydebug" }
}
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
output ES 插件
– 调试成功后,把数据写入 ES 集群
vim /etc/logstash/logstash.conf
input{
file{
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-access"
path => ["/tmp/a.log"]
type => 'filelog'
}
file{
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-access"
path => ["/tmp/.log"]
type => 'weblog'
}
}
filter{
grok{match => [“message”,"(?<ip>(\d+\.){3}\d+)"]}
}
output{
if [type] == "filelog"{
elasticsearch {
hosts => ["192.168.4.33:9200","192.168.4.12:9200"] #将数据存在elasticsearch集群上
index => "weblog"
flush_size => 2000
idle_flush_time => 10
}
}
cp /etc/httpd/logs/error_log /tmp/a.txt
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
filebeat 安装与配置
– 使用 rpm 安装 filebeat
rpm -ivh filebeat-1.2.3-x86_64.rpm
– 修改配置文件 /etc/filebeat/filebeat.yml
vim /etc/filebeat/filebeat.yml
paths:
- /root/logs.jsonl
document_type: weblog
... ...
paths:
- /root/accounts.json
document_type: account
output:
logstash:
hosts: ["192.168.4.10:5044"]
– 设置开机运行
systemctl enable filebeat
– 开启服务
systemctl start filebeat
input filebeats 插件
– 这个插件主要用来接收 beats 类软件发送过来的数据,由于 logstash 依赖 java 环境,而且占用资源非常大,我们往往不希望所有集群的机器都部署 java 环境安装logstash,而使用更轻量的 filebeat 替代。
vim /etc/logstash/logstash.conf
input{
beats {
port => 5044
codec => "json"
}
}
filter{
grok{match => [“message”,"%{COMMONAPACHELOG}"]}
}
output{
elasticsearch {
hosts => ["192.168.4.33:9200","192.168.4.12:9200"]
index => "weblog"
flush_size => 2000
idle_flush_time => 10
}
}
/opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动
ELK的搭建
原创
©著作权归作者所有:来自51CTO博客作者期待美好的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:装饰器
下一篇:docker的搭建及使用
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
ELK 日志分析
ELK初步部署
elasticsearch nginx linux ELK -
安装ELK(Docker Compose)
通过docker compose方式搭建ELK环境
elasticsearch docker 配置文件