文章目录
ELK部署
ELK组成
-
Elasticsearch: 负责日志检索和储存(数据库)
-
Node: 装有一个ES服务器的节点
-
Cluster: 有多个Node组成的集群
-
Index: 拥有相似特征的文档的集合
-
Type: 一个索引中可以定义一种或多种类型
-
Document: 一个可被搜索的基础信息单元
-
Filed: 是ES的最小单位,相当于数据的某一列
-
Shards: 索引的分片,每一个分片就是一个Shard
-
Replicas: 索引的拷贝
-
-
Logstash: 负责日志的收集和分析、处理 (程序)
- 类型
- 布尔值类型
- 字节类型
- 字符串类型
- 数值类型
- 数组
- 哈希(键值对)
- 注释 #
- 逻辑判断
- 包含: in
- 不包含: notin
- 与: and
- 或:or
- 非与: nand
- 非或: xor
- 类型
-
Kibana: 负责日志的可视化 (Web服务器网页展示)
ELK作用
- 分布式日志数据集中式查询和管理
- 系统监控,包含系统硬件和应用各个组件的监控
- 故障排查
- 安全信息和事件管理
- 报表功能
ELK安装软件
- CentOS7-1804.iso (相关依赖)
- elasticsearch-2.3.4.rpm
- filebeat-1.2.3-x86_64.rpm
- kibana-4.5.2-1.x86_64.rpm
- logstash-2.3.4-1.noarch.rpm
前置配置
5台节点机 1.41~45
**插曲: ssh到1.41上 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! **
#解决 之前机器删掉了
for i in {1..5}
do
ssh-kengen -R 192.168.1.4$i
done
单机安装
#1.41
vim /etc/hosts #添加解析
===============================
192.168.1.41 xxx-0001 #主机名
======================================
yum -y install java-1.8.0-openjdk elasticsearch #安装JDK 和 elast Java开发的
vim /etc/elasticsearch/elasticsearch.yml
=============================
network.host: 0.0.0.0 #54行 监听所有地址
====================================
systemctl enable --now elasticsearch.service #启动并开机自启
#查看下
ss -nutlp | grep 9200
tcp LISTEN 0 50 [::]:9200 [::]:* users:(("java",pid=1267,fd=93))
#访问测试
curl http://localhost:9200/
{
"name" : "Blur",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.3.4",
"build_hash" : "e455fd0c13dceca8dbbdbb1665d068ae55dabe3f",
"build_timestamp" : "2016-06-30T11:24:31Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
#OK
Elasticsearch集群安装
#proxy 跳板机
#剧本安装
vim inventory
======================
[es]
192.168.1.[41:45]
========================
#定义角色
ansible-galaxy init roles/es
#任务
vim roles/es/tasks/main.yaml
============================
---
# tasks file for roles/es
- name: 发送hosts
copy: src=hosts dest=/etc/hosts force=yes
- name: 安装el..
yum: name=java-1.8.0-openjdk
- yum: name=elasticsearch
- template: src=elasticsearch.yml dest=/etc/elasticsearch/elasticsearch.yml force=yes
- name: 启动服务
service: name=elasticsearch enabled=yes state=restarted
===================================================================
vim roles/es/files/hosts #主机名解析 应该用魔法变量获取的 先用静态的
====================================
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 ecs-host ecs-host
192.168.1.41 es-0001
192.168.1.42 es-0002
192.168.1.43 es-0003
192.168.1.44 es-0004
192.168.1.45 es-0005
=========================================
vim roles/es/template/elasticsearch.yml #定义配置文件 要顶格 配置文件是yaml格式
==========================================
cluster.name: my-es #17 配置集群名字
node.name: {{ansible_hostname}} #23 当前主机名字
network.host: 0.0.0.0 #54 监听所有地址
discovery.zen.ping.unicast.hosts: ["es-0001","es-0002"] #自动发现 不用写全
==========================================================================
vim es_install.yml #安装
========================
- hosts: es
roles:
- es
=============================
ansible-playbook es_install.yml #执行即可
测试 访问任意节点的9200端口 /_cluster/health?pretty
#访问测试
curl http://192.168.1.41:9200/_cluster/health?pretty
{
"cluster_name" : "my-es",
"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
}
#elasticsearch集群OK
可以发现测试集群命令还是比较麻烦的 所以可以安装插件帮助
插件
插件命令在 /usr/share/elasticsearch/bin/plugin
命令为:
-
plugin install 安装
-
plugin remove 删除
-
plugin list 查看
-
kopf插件
- 是一个Elasticsearch的管理工具
- 它提供了对ES集群操作的API
-
bigdesk插件
- 是Elasticsearch的一个集群监控工具
- 可以通过它来查看es集群的各种状态,如:cpu、内存使用情况、http连接数
-
head插件
- 展现ES集群的拓扑结构,可以通过它来进行索引Index和节点Node级别的操作
- 提供一组针对集群的API,并以Json和表格形式返回
- 它提供一些快捷菜单,用以展现集群的各种状态
#es-0005测试
#安装三个插件 必须是url路径
/usr/share/elasticsearch/bin/plugin install file:///root/elasticsearch-head-master.zip
/usr/share/elasticsearch/bin/plugin install file:///root/elasticsearch-kopf-master.zip
/usr/share/elasticsearch/bin/plugin install file:///root/bigdesk-master.zip
#查看安装的插件
/usr/share/elasticsearch/bin/plugin list
Installed plugins in /usr/share/elasticsearch/plugins:
- bigdesk
- kopf
- head
浏览器访问查看
绑定了ELB 监听后端服务器的9200端口
http://ip:9200/_plugin/head
节点信息情况 JSON格式显示
http://ip:9200/_plugin/kopf 控制集群的API
带星的选举出的
http://ip:9200/_plugin/bigdesk 监控集群信息 图表
Elasticsearch管理 (增删改查)
使用json格式进行交互
- PUT -------------- 增
- DELETE -------------- 删
- POST ------------- 改
- GET --------------- 查
#查看el集群主节点信息
curl http://192.168.1.45:9200/_cat/master?v
id host ip node
1nicvZBETp2h7wivUHGIFA 192.168.1.44 192.168.1.44 es-0004
#查看标签描述
curl http://192.168.1.45:9200/_cat/master?help
id | | node id
host | h | host name
ip | | ip address
node | n | node name
创建索引
#es-0001
curl -XPUT http://es-0001:9200/mytest -d \ #X指定请求头 /mytest创建index为mytest
'{
"settings": {
"index": {
"number_of_shards": 5, #指定分片为5 有5个节点
"number_of_replicas": 1 #指定副本数为1
}
}
}'
{"acknowledged":true} #成功添加
验证
**索引被分成了0~4五份 总共两份 所以上面的副本数为1 **
索引源数据框深色,复制数据浅
增加数据
curl -XPUT http://es-0001:9200/mytest/fruits/1 -d \ #指定索引 类型 id
'{
"品种": "西瓜",
"重量": "8斤"
}'
curl http://es-0001:9200/mytest/fruits/2 -d \
'{
"品种": "香蕉",
"描述": "很贵的香蕉"
}'
head插件查看
命令行查看
curl -XGET http://es-0001:9200/mytest/fruits/1?pretty
{
"_index" : "mytest",
"_type" : "fruits",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"品种" : "西瓜",
"重量" : "8斤"
}
}
数据修改
curl -XPOST http://es-0001:9200/mytest/fruits/1/_update -d \
'{"doc": { "描述": "很便宜的西瓜"}}'
#修改成功
{"_index":"mytest","_type":"fruits","_id":"1","_version":2,"_shards":{"total":2,"successful":2,"failed":0}}
#查看
#head插件直接查看
#或者
curl -xGET http://es-0001:9200/mytest/fruits/1?pretty
{
"_index" : "mytest",
"_type" : "fruits",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"品种" : "西瓜",
"重量" : "8斤",
"描述" : "很便宜的西瓜" #描述信息出来了
}
}
删除数据
#删除一条
curl -XDELETE http://es-0001:9200/mytest/fruits/1
#删除索引
curl -XDELETE http://es-0001:9200/mytest
#删除索引后直接添加数据 可以 索引又被创建了
Kibana安装
192.168.1.46
vim /etc/hosts
=======================
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 ecs-host ecs-host
192.168.1.41 es-0001
192.168.1.42 es-0002
192.168.1.43 es-0003
192.168.1.44 es-0004
192.168.1.45 es-0005
192.168.1.46 kibana
==================================
#配置解析 数据存储在el里面
yum install -y kibana #安装
vim /opt/kibana/config/kibana.yml #修改配置文件 yaml格式
========================================
server.port: 5601 #2 服务端口
server.host: "0.0.0.0" #5 监听所有地址
elasticsearch.usr: "http://es-0001:9200" #15 el地址
kibana.index: ".kibana" #23 索引
kibana.defaultAppId: "discover" #26 默认首页
============================================
systemctl enable --now kibana
添加ELB监听5601
访问ip:5601/status 查看status
状态OK
导入数据测试
culr -XPUT http://es-0001:9200/_bulk --data-binary @logs.jsonl #指定json格式日志文件 logs.jsonl
head插件查看
导入到数据库中成功
在kibana中创建索引 @timestamp
修改时间戳
饼图制作
Field是日志里面的
Add可以在上一次基础上再次选择
Logstash安装
192.168.1.47
vim /etc/hosts
=======================
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 ecs-host ecs-host
192.168.1.41 es-0001
192.168.1.42 es-0002
192.168.1.43 es-0003
192.168.1.44 es-0004
192.168.1.45 es-0005
192.168.1.47 logstash
============================
#安装JDK和logstash
yum -y install java-1.8.0-openjdk logstash
#创建配置文件 logstash配置需要手写
touch /etc/logstash/logstash.conf
logstash.conf
-
input{数据输入}
input { stdin {} }
-
filter{过滤规则}
filter { }
-
output{数据导出}
output { stdout {} }
继续
vim /etc/logstash/logstash.conf
===================================
input {
stdin {}
}
filter {}
output {
stdout {}
}
===========================================
#测试 命令-f指定配置文件 可以通过--help查看帮助
/opt/logstash/bin/logstash -f /etc/logstash/logstash.conf
abc #输入abc
2021-03-16T07:49:00.612Z logstash abc #输出abc 因为没写过滤
Logstash插件
官方手册地址
https://www.elastic.co/guide/en/logstashcurrent/index.html
#查看插件
/opt/logstash/bin/logstash-plugin list
.....
logstash-filter-xml
logstash-input-beats
logstash-input-couchdb_changes
logstash-input-elasticsearch
logstash-input-eventlog
....
#修改配置文件输入输出
vim /etc/logstash/logstash.conf
==============================
input {
stdin { codec => "json" }
}
filter {}
output {
stdout { codec => "json" }
}
=================================
/opt/logstash/bin/logstash -f /etc/logstash/logstash.conf
{"a": "test","b": "var"} #输入
{"a":"test","b":"var","@version":"1","@timestamp":"2021-03-16T08:05:43.113Z","host":"logstash"}
#输出 json格式时间戳 主机
#可以设置输出为rubydebug 竖行输出 方便查看
配置
vim /etc/logstash/logstash.conf
=========================================
input {
stdin { codec => "json" }
file {
path => ["/tmp/test.log"] #指定那个文件获取,数组 可以多个路径
type => "apachelog" #打标签 提供一个字符串标签
#定义记录读取文件位置的文件的路径,不定义会生成在家目录下
sincedb_path => "/var/lib/logstash/sincedb-access"
#读取新文件从头还是尾开始读取 [beginning | end]
start_position => "beginning"
}
file {
path => ["/tmp/check.log"]
type => "nginxlog"
#设置成/dev/null 方便测试
sincedb_path => "/dev/null"
}
}
filter {
grok { #grok 正则模块
match => { #匹配IPxxx.xxx.xxx.xxx
"message" => "(?<client_ip>(25[0-5]|2[0-4]\d|1?\d?\d.){3(25[0-5]|2[0-4]\d|1?\d?\d))"
#最后输出会有 "client_ip": xxx.xxx.xxx.xxx
}
}
}
output {
stdout { codec => "json" }
}
=======================================================
filebeat安装
在web服务器上 收集数据给logstash处理 5044端口