ELK 是什么?
? ELK 其实并不是一款软件, 而是一整套解决方案, 是
三个软件产品的首字母缩写
Elasticsearch: 负责日志检索和储存
Logstash: 负责日志的收集和分析处理
Kibana: 负责日志的可视化
这三款软件都是开源软件, 通常是配合使用, 而且又
先后归于 Elastic.co 公司名下, 故被简称为 ELK
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: 索引的拷贝
S 与关系型数据库的对比
在 ES 中, 文档归属于一种 类型 (type) , 而这些类型
存在于索引 (index) 中, 类比传统关系型数据库
DB -> Databases -> Tables -> Rows -> Columns
关系型
数据库
表
行
列
- ES -> Indices -> Types -> Documents -> Fields
- ES
索引
类型
文档
域(字段)
Elasticsearch 部分
? 安装第一台 ES 服务器
设置主机名称和 ip 对应关系
解决依赖关系
安装软件包
修改配置文件
启动服务
检查服务
步骤 1, 设置 ip 与主机名称对应关系
配置 /etc/hosts
192.168.4.11 node1
? 步骤 2, 安装 JDK
Elasticsearch 要求至少 Java 7
一般推荐使用 OpenJDK 1.8
配置好安装源以后, 我们先解决依赖关系
yum install -y java-1.8.0-openjdk
步骤 3
安装 ES
rpm ivh elasticsearch-2.3.4-1.noarch
? 步骤 4
修改配置文件
- elasticsearch.yml
- network.host: 0.0.0.0
步骤 5
启动服务, 设置自启动
- systemctl enable elasticsearch
- systemctl start elasticsearch
验证:
netstat ltunp
能够看到 9200,9300 被监听
通过浏览器或 curl 访问 9200 端口
curl http://192.168.4.11:9200/
ES 集群配置
ES 集群配置也很简单, 只需要对配置文件做少量的修
改即可, 其他步骤和单机完全一致
ES 集群配置文件
- cluster.name: my-es
- node.name: node1
- network.host: 0.0.0.0
- discovery.zen.ping.unicast.hosts: ["node1", "node2",
- "node3"]
ES 集群配置
集群中的所有节点要相互能够 ping 通, 要在所有集群
机器上配置 /etc/hosts 中的主机名与 ip 对应关系
集群中所有机器都要安装 java 环境
cluster.name 集群名称配置要求完全一致
node.name 为当前节点标识, 应配置本机的主机名
discovery 为集群节点机器, 不需要全部配置
配置完成以后启动所有节点服务(有可能会有一定的
延时, 需要等待几十秒)
ES 集群配置
验证集群, 使用 ES 内置字段 _cluster/health
- curl http://192.168.4.11: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 和表
格形式返回
它提供一些快捷菜单, 用以展现集群的各种状态
ES 常用插件
? 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 指令
访问地址
- http://192.168.4.1:9200/_plugin/head/
- http://192.168.4.1:9200/_plugin/kopf/#!/cluster
- http://192.168.4.1:9200/_plugin/bigdesk/#nodes
HTTP 与 RESTful API
curl 参数
-A 修改请求 agent , 告诉浏览器版本等
-X 设置请求方法
-i 显示返回头信息
ES RESTful API 部分
? Elasticsearch 提供了一系列 RESTful 的 API
检查集群节点索引的健康度状态和统计
管理集群节点索引的数据及元数据
对索引进行 CRUD 操作及查询操作
执行其他高级操作如分页排序过滤等
? POST 或 PUT 数据使用 json 格式
? json
JSON 的全称是 JavaScript Object Notation, 意
思是 JavaScript 对象表示法, 它是一种基于文本, 独立
于语言的轻量级数据交换格式
json 传输的就是一个字符串
python 中对应的 字符串, 列表, 字典都可以转换成
对应的 json 格式
? Rest API 的简单使用
_cat API 查询集群状态, 节点信息
v 参数显示详细信息
http://192.168.4.15:9200/_cat/health?v
help 显示帮助信息
http://192.168.4.15:9200/_cat/health?help
? Rest API 的简单使用
nodes 查询节点状态信息
http://192.168.4.15:9200/_cat/nodes?v
索引信息
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/aa/1 -d
- {
- "settings":{
- "index":{
- "number_of_shards":5,
- "number+of_replicas":1
- }
- }
- }
增加
curl -XPUT http://192.168.4.11:9200 / 索引名称 / 类型名称 / id -d JSON
增加 JSON 串
- curl -XPUT http://192.168.4.11:9200/school/students/1 -d
- {
- "nsd1710": "devops",
- "js":{
- "bn": "dd",
- "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=nam
- e,age
? RESTful API 删除
删除刚才创建的文档
curl -XDELETE http://192.168.4.14:9200/school/students/1
删除 school
curl -XDELETE http://192.168.4.14:9200/school
kibana 安装
? kibana 是什么
数据可视化平台工具
? 特点:
灵活的分析和可视化平台
实时总结和流数据的图表
为不同的用户显示直观的界面
即时分享和嵌入的仪表板
? kibana 安装
kibana 的安装非常简单, 我们使用 rpm 方式安装
rpm ivh kibana-4.5.2-1.x86_64.rpm
kibana 默认安装在 /opt/kibana 下面, 配置文件在
/opt/kibana/config/kibana.yml
我们只需要修改少量的配置就可以启动
? 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
? kibana.yml 的配置
除 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-binarybr/>@logs.jsonl
- gzip d shakespeare.json.gz
- curl -XPOST http://192.168.4.14:9200/_bulk --data-binary
- @shakespeare.json
使用 _bulk 批量导入数据
导入没有有 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/_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 按钮
logstash 部分
文档地址
https://github.com/logstash-plugins
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 }
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
复合表达式: ()
取反符合: !()
logstash 的第一个配置文件
- /etc/logstash/logstash.conf
- input{
- stdin{}
- }
- filter{ }
- output{
- stdout{}
- }
? 启动并验证
logstash f logstash.conf
? logstash 插件
上页的配置文件使用了 logstash-input-stdin 和
logstash-output-stdout 两个插件, logstash 还有
filter 和 codec 类插件, 查看插件的方式是
/opt/logstash/bin/logstash-plugin list
? codec 类插件
常用的插件: plainjsonjson_linesrubydebug
multiline 等
我们还使用刚刚的例子, 不过这次我们输入 json 数据
我们设置输入源的 codec 是 json, 在输入的时候选择
rubydebug
? codec 类插件
- input{
- stdin{ codec => "json" }
- }
- filter{ }
- output{
- stdout{ codec => "rubydebug" }
- }
我们输入普通数据和 json 对比
{"a": 1, "c": 3, "b": 2}
? codec 类插件
练习 output 和 input 配置
练习 在 input 不指定类型 json 输出结果
练习 在 output 不指定 rubydebug 的输出结果
同时指定以后的输出结果
? input file 插件
- file{
- start_position => "beginning" #新文件读取从头开始, end 为尾开始
- sincedb_path => "/var/lib/logstash/sincedb-access" #记录上次读取位置的文件
- path => [/tmp/alog, /tmp/blog] #读取文件的路径
- type => filelog #日志文件类型
- }
sincedb_path 记录读取文件的位置
start_position 配置第一次读取文件从什么地方开始
? input tcp 和 udp 插件
- tcp{
- host => "0.0.0.0"
- port => 8888
- type => "tcplog"
- }
- udp{
- host => "192.168.4.16"
- port => 9999
- type => "udplog"
- }
- ? tcp & udp
使用 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 & udp 练习
发送 tcp 数据
sendmsg tcp 192.168.4.10 8888 tcp msg
发送 udp 数据
sendmsg udp 192.168.4.10 9999 udp msg
? syslog 插件练习
- syslog{
- host => "192.168.4.10"
- port => 514
- type => "syslog"
- }
/etc/rsyslog.conf 配置向远程发送数据
- 74 local0.info @@192.168.4.10:514 # 2 个 @@是 tcp 发送
- 75 authpriv.info @192.168.4.10:514 #1 个 @是 UPD 发送
- systemctl restart rsyslog.service
写 syslog , 查看状态
logger -p local0.info -t test_logstash test message #local0 系统等级向日志文件写入信息
? 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>[^\"]+)\"
正则宏路径:
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/
input redis 插件
- redis{
- host => redis-server
- port => 6379
- data_type => list
- key => lb
- codec => json
- }
生产环境往往理由 redis 来做缓冲, 这里给出配置
? output ES 插件
- if [type] == "weblog"{
- elasticsearch {
- hosts => ["192.168.4.15:9200"]
- index => "weblog"
- flush_size => 2000 #2000 时写入
- idle_flush_time => 10 #空闲 10 秒写入
- }}
调试成功后, 把数据写入 ES 集群
? input filebeats 插件
- beats {
- port => 5044
- codec => "json"
- }
这个插件主要用来接收 beats 类软件发送过来的数据,
由于 logstash 依赖 java 环境, 而且占用资源非常大,
我们往往不希望所有集群的机器都部署 java 环境安装
logstash, 而使用更轻量的 filebeat 替代
? filebeat 安装与配置
使用 rpm 安装 filebeat
rpm -ivh filebeat-1.2.3-x86_64.rpm
修改配置文件 /etc/filebeat/filebeat.yml
设置开机运行
systemctl enable filebeat
开启服务
systemctl start filebeat
? 修改配置文件 /etc/filebeat/filebeat.yml
数据指针文件
- /var/lib/filebeat/registry
- paths:
- 15 - /root/logs.jsonl
- 72 document_type: weblog
183,188 注释
- output:
- 278 logstash:
- 280 hosts: ["192.168.4.10:5044"]
- CLOUD 02: elk
来源: http://www.bubuko.com/infodetail-2510281.html