关系型 -------- 非关系型
MySQL ?--? NoSQL
Database ----> Index
Table ----> Type
Row ----> Document
Column ----> Filed

ELK组成:

  • E:是指Elasticsearch,完成数据的存储和检索
  • L:是Logstash,完成数据的采集、过滤及解析
  • K:Kibana,以WEB方式展示

curl 命令

访问一个网页
curl http://www.baidu.com

显示头信息
curl -I http://www.baidu.com

显示详细的交互信息
curl -v http://www.baidu.com

把网页内存保存为文件
curl -o urfile http://www.baidu.com

禁用 防火墙,禁用 selinux

elasticsearch 安装
1、安装 openjdk 包
yum install -y java-1.8.0-openjdk-devel

验证
java -version
jps

安装 elasticsearch
rpm -ivh elasticsearch-2.3.4.rpm

修改配置文件启动服务
network.host: ip.xx.xx.xx
systemctl start elasticsearch

验证
systemctl status elasticsearch
netstat -ltunp

通过浏览器访问
http://192.168.4.11:9200/

elasticsearch 集群安装
在多台机器上安装部署 java-1.8.0-openjdk-devel,elasticsearch-2.3.4.rpm
修改 hosts 文件,保证所有机器通过名称能 ping 通集群中的其他机器

禁用防火墙 和 selinux
禁用防火墙 和 selinux
禁用防火墙 和 selinux

在所有节点修改配置文件 /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk01
node.name: node5
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3", "node5"]

启动所有节点的 elasticsearch 服务
通过浏览器可以访问任意节点的 http://ip.xx.xx.xx:9200/

验证集群是否正常,访问
http://192.168.4.15:9200/_cluster/health?pretty

{
"cluster_name" : "my-elk01", #集群名称
"status" : "green", # 表示正常
"timed_out" : false,
"number_of_nodes" : 5, #当前节点数量
"number_of_data_nodes" : 5,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}

插件的安装 head kopf bigdesk
1 拷贝插件 zip 包到一个目录
2 /usr/share/elasticsearch/bin/plugin install file:///插件的位置/插件包.zip 安装

3 验证:
安装完成以后可以通过
/usr/share/elasticsearch/bin/plugin list 看到我们已经安装的插件的名称

4 访问head 插件
它展现ES集群的拓扑结构
可以通过它来进行索引(Index)和节点(Node)级别的操作
它提供一组针对集群的查询API,并将结果以json和表格形式返回
它提供一些快捷菜单,用以展现集群的各种状态
http://192.168.4.11:9200/_plugin/head/

5 kopf 插件安装
kopf是一个ElasticSearch的管理工具,它提供了对ES集群操作的API。
/usr/share/elasticsearch/bin/plugin install file:///xxx-kopf.zip

访问地址
http://192.168.4.11:9200/_plugin/kopf/

6 bigdesk 插件安装
bigdesk是elasticsearch的一个集群监控工具
可以通过它来查看es集群的各种状态,
如:cpu、内存使用情况,索引数据、搜索情况,http连接数等。
/usr/share/elasticsearch/bin/plugin install file:///bigdesk-xxx.zip

访问地址
http://192.168.4.11:9200/_plugin/bigdesk/

使用RESTful API操作elasticsearch
curl -XPUT 'http://192.168.4.11:9200/school/' -d '{
"settings":{
"index":{
"number_of_shards": 5,
"number_of_replicas": 1
}
}
}'

获取索引配置信息:
curl -XGET 'http://192.168.4.11:9200/school/_settings/'
curl -XGET 'http://192.168.4.11:9200/_all/_settings/'

创建文档
curl -XPUT 'http://192.168.4.11:9200/school/students/1' -d '{
"title": "devops",
"name":{
"first": "guzhang",
"last": "wu"
},
"age": 25
}'

查询文档信息
curl -XGET 'http://192.168.4.11:9200/school/students/1'
curl -XGET 'http://192.168.4.11:9200/school/students/1?_source=name,age'

更新文档信息
curl -XPOST 'http://192.168.4.11:9200/school/students/1/_update' -d '{
"doc":{
"age": 30
}
}'

删除文档信息
curl -XDELETE 'http://192.168.4.14:9200/school/students/1'

批量导入数据
curl -XPOST 'http://192.168.4.14:9200/_bulk' --data-binary @shakespeare.json
curl -XPOST 'http://192.168.4.14:9200/_bulk' --data-binary @logs.jsonl
curl -XPOST 'http://192.168.4.14:9200/accounts/act/_bulk?pretty' --data-binary @accounts.json

批量查询数据
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
}
]
}'

json 是什么,格式怎么书写

1 昨天已经搭建好 elasticsearch 集群
清除所有 index
导入 logs.jsonl 日志

mapping:
映射:创建索引的时候,可以预先定义字段的类型及相关属性。
作用:这样会让索引建立得更加的细致和完善。
分类:静态映射和动态映射。
动态映射:自动根据数据进行相应的映射。
静态映射:自定义字段映射数据类型。

kibana部分

1.kibana的概念及特点。
概念:数据可视化平台工具
特点:

  • 灵活的分析和可视化平台
  • 实时总结和流数据的图表
  • 为不同的用户显示直观的界面
  • 即时分享和嵌入的仪表板

2.kibana的安装配置。
rpm -ivh kibana-4.5.2-1.x86_64.rpm

#配置 kibana
/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

通过图形页面展示,注意时间是 2015 年,需要调整时间才能正常显示

logstash部分

3.logstash的概念及特点。
概念:logstash是一个数据采集、加工处理以及传输(输出)的工具。
特点:

  • 所有类型的数据集中处理
  • 不同模式和格式数据的正常化
  • 自定义日志格式的迅速扩展
  • 为自定义数据源轻松添加插件

安装Logstash
rpm -ivh logstash-2.3.4-1.noarch.rpm
Logstash 依赖 java 环境,需要安装 java-1.8.0-openjdk

安装之后,创建第一个测试的配置文件
/etc/Logstash/logstash.conf
input{ stdin{} }
filter{ }
output{ stdout{} }

使用 logstash -f logstash.conf 启动,如果输入数据能看到返回证明 logstash 安装正确

logstash 数据处理结构
| -------------------------logstash---------------------------|
{数据源} -->{ input{数据接收} -- filter{数据处理} -- output{数据发送} } --> {ES集群}
|--------------------------logstash---------------------------|

布尔值类型: ssl_enable => true
字节类型: bytes => "1MiB"
字符串类型: name => "xkops"
数值类型: port => 22
数组: match => ["datetime","UNIX"]
哈希: options => {key1 => "value1",key2 => "value2"}
编码解码: codec => "json"
路径: file_path => "/tmp/filename"
注释: #

条件判断:
等于: ==
不等于: !=
小于: <
大于: >
小于等于: <=
大于等于: >=
匹配正则: =~
不匹配正则: !~
包含: in
不包含: not in
与: and
或: or
非与: nand
非或: xor
复合表达式: ()
取反符合: !()

logstash-file 插件: 从文件读取,在屏幕输出
file插件字段解释:
codec => #可选项,默认是plain,可设置其他编码方式。
discover_interval => #可选项,logstash多久检查一下path下有新文件,默认15s。
exclude => #可选项,排除path下不想监听的文件。
sincedb_path => #可选项,记录文件以及文件读取信息位置的数据文件。~/.sincedb_xxxx
sincedb_write_interval => #可选项,logstash多久写一次sincedb文件,默认15s.
stat_interval => #可选项,logstash多久检查一次被监听文件的变化,默认1s。
start_position => #可选项,logstash从哪个位置读取文件数据,默认从尾部,值为:end。初次导入,设置为:beginning。
path => #必选项,配置文件路径,可定义多个。
tags => #可选项,在数据处理过程中,由具体的插件来添加或者删除的标记。
type => #可选项,自定义处理时间类型。比如nginxlog。

input{
file{
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-access"
path => ["/tmp/blog","/tmp/alog"]
type => 'filelog'
}
}

filter{ }
output{ stdout{} }

logstash-tcp 插件:从网络读取,在屏幕输出
tcp插件字段解释:
add_field => #可选项,默认{}。
codec => #可选项,默认plain。
data_timeout => #可选项,默认-1。
host => #可选项,默认0.0.0.0。
mode => #可选项,值为["server","client"]之一,默认为server。
port => #必选,端口。
ssl_cacert => #可选项,定义相关路径。
ssl_cert => #可选项,定义相关路径。
ssl_enable => #可选项,默认为false。
ssl_key => #可选项,定义相关路径。
ssl_key_passphrase => #可选项,默认nil
ssl_verify => #可选项,默认false。
tags => #可选项
type => #可选项
input{
tcp{
host => "0.0.0.0"
port => 8888
type => "tcplog"
}
}
filter{ }
output{ stdout{} }

在服务器上启动 logstash , 在客户机上使用 shell 脚本测试
function tcpmsg() {
exec 9<>/dev/tcp/192.168.4.10/8888
echo -ne "${1}\r\n" >&9
exec 9<&-
}

logstash-udp插件:
udp插件字段解释:
add_field => #可选项,默认{}。
host => #可选项,默认0.0.0.0。
queue_size => #默认2000
tags => #可选项
type => #可选项
workers => #默认为2

input{
udp{
host => "192.168.4.10"
port => 9999
}
}
filter{ }
output{ stdout{} }

在服务器上启动 logstash , 在客户机上使用 shell 脚本测试
function udpmsg() {
exec 9<>/dev/udp/192.168.4.10/9999
echo -ne "${1}\r" >&9
exec 9<&-
}

logstash-syslog 插件:

input{
syslog{
host => "192.168.4.10"
port => 514
type => "syslog"
}
}
filter{ }
output{ stdout{} }

在服务器启动 logstash,在客户机修改 /etc/rsyslog.conf 配置问件,添加
. @@192.168.4.10:514
重新启动 rsyslog 服务
systemctl restart rsyslog
使用明令写入 syslog 进行测试
logger -p local0.info -t test_logstash 'test message'
输入命令以后可以在 /var/log/messages 看到,在 logstash 服务器端也同时能看到输出

codec类插件
常用的插件:plain、json、json_lines、rubydebug、multiline等

input{
file{
start_position => "beginning"
sincedb_path => "/dev/null"
path => ["/tmp/alog"]
type => 'filelog'
codec => "json"
}
}
output{
stdout{ codec => "rubydebug" }
}

利用 rubydebug 方便调试,如果输入在文件是 json 在 input 指定编码格式

filter grok插件:解析各种非结构化的日志数据插件
grok有丰富的patterns,查看方式
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns

filter{
grok{
match => ["message","%{IP:ip} %{WORD:method} %{URIPATH:uri} %{NUMBER:bytes} %{NUMBER:duration}"]
}
}

grok 使用正则表达式把飞结构化的数据结构化在分组匹配,正则表达式需要根据具体数据结构编写,虽然编写困难,但适用性极广,几乎可以应用于各类数据

最后是一个完整的 Logstash 的配置文件,使用Logstash 收集数据,格式化以后放入 ES 集群
input{
file{
start_position => "beginning"
sincedb_path => "/dev/null"
path => ["/tmp/alog"]
type => 'filelog'
codec => "json"
}
}

filter{
}
output{
if [type] == "filelog"{
elasticsearch {
hosts => ["192.168.4.15:9200"]
index => "weblog"
flush_size => 2000
idle_flush_time => 10
}}
}

放入集群以后的数据可以通过 kibana 展示
在生产环境中,我们往往还需要配置 redis 用来缓存 或 filebeat 用来收集日志,这里给出简单的配置样例,需要更深入学习的同学请查看官方文档

https://github.com/logstash-plugins

redis 配置
input{
redis{
host => 'redis-server'
port => '6379'
data_type => 'list'
key => 'lb'
codec => 'json'
}
}

filebeat 配置
input {
beats {
port => 5044
codec => "json"
}
}

filebeat 客户端相关配置文件
filebeat:
prospectors:

  paths:
    - /root/logs.jsonl
  document_type: logstash
- 
  paths:
    - /root/shakespeare.json
  document_type: shakespeare
- 
  paths:
    - /root/accounts.json
  document_type: account

registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["192.168.4.10:5044"]
shipper:
logging:
files: