ELK基础架构
EFK架构
使用EFK收集那些日志
容器:docker
代理:Haproxy、nginx
web: Nginx、redis、mongo、elasticsearch
存储:nfs、glusterfs、fastdfs
系统:message、security
业务:app
ELFK架构
1.elasticsearch基本使用
索引、文档、字段
elasticsearch与mysql对比
ES:一个索引里面,可以存储多个document文档,一个文档是由多个字段组织在一起的
MySQL:一个表里面,有多个数据,每个数据是由多个不同类型的字段组织在一起的
2ES单机安装
[root@es-node1 ~]# yum install java -y
[root@es-node1 ~]# rpm -ivh elasticsearch-7.4.0x86_64.rpm kibana-7.4.0-x86_64.rpm
[root@es-node1 ~]# vim /etc/elasticsearch/jvm.options -Xms512m
#实验环境 生产环境最少内存一半以上 官方建议 最高 32Gb -Xmx512m
[root@es-node1 ~]# systemctl enable elasticsearch.service
[root@es-node1 ~]# systemctl start elasticsearch.service
#测试es是否启动
[root@es-node1 ~]# curl 127.0.0.1:9200
{
"name" : "node1",
"cluster_name" : "my-oldxu",
"cluster_uuid" : "FF5RjxfgRWe0F6E8bHxYPA",
"version" : {
"number" : "7.4.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "22e1767283e61a198cb4db791ea66e3f11ab9910",
"build_date" : "2019-09-27T08:36:48.569419Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
#修改kibana的配置
[root@es-node1 ~]# vim /etc/kibana/kibana.yml server.host: "0.0.0.0" i18n.locale: "zh-CN"
#启动kibana
[root@es-node1 ~]# systemctl enable kibana
[root@es-node1 ~]# systemctl start kibana
#访问kibana
输入ip+端口
3.ES索引基本操作
#创建索引
PUT /oldxu_es
#查看索引
GET _cat/indices
#删除索引
DELETE /oldxu_es
#给oldxu_es索引引入一个文档
POST /oldxu_es/_doc/1
{
"name": "oldxu",
"age": 18,
"salary": 100000000
}
#获取指定的id数据
GET /oldxu_es/_doc/1
#获取所有的文档 默认前10个
GET /oldxu_es/_search
#模糊查询
GET /oldxu_es/_search
{
"query": {
"term": {
"name": "oldxu"
}
}
}
#删除指定id的文档
DELETE /oldxu_es/_doc/1
#批量创建
POST _bulk
{"index":{"_index":"tt","_id":"1"}}
{"name":"oldxu","age":"18"}
{"create":{"_index":"tt","_id":"2"}}
{"name":"oldqiang","age":"30"}
{"delete":{"_index":"tt","_id":"2"}}
{"update":{"_id":"1","_index":"tt"}}
{"doc":{"age":"20"}}
#一次查询多个文档
GET _mget
{
"docs": [
{
"_index": "tt",
"_id": "1"
},
{
"_index": "tt",
"_id": "2"
}
]
}
4.ES集群环境搭建
配置集群
删除所有的es相关的数据 (集群无法组件的情况)
[root@es-node1 ~]# rm -rf /var/lib/elasticsearch/*
[root@es-node1 ~]# systemctl stop elasticsearch.service [root@es-node1 ~]# systemctl stop kibana
配置node1
[root@es-node1 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: node1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
scp -rp /etc/elasticsearch/elasticsearch.yml [email protected]:/etc/elasticsearch/elasticsearch.yml
scp -rp /etc/elasticsearch/elasticsearch.yml [email protected]:/etc/elasticsearch/elasticsearch.yml
scp /etc/elasticsearch/jvm.options [email protected]:/etc/elasticsearch/jvm.options
scp /etc/elasticsearch/jvm.options [email protected]:/etc/elasticsearch/jvm.options
配置node2
[root@es-node2 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: node2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
配置node3
[root@es-node3 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: node3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162", "10.0.0.163"]
启动所有节点
systemctl start elasticsearch
通过 curl 检查集群环境是否正常
curl http://10.0.0.163:9200/_cluster/health?pretty
kibana
GET /_cluster_health
5.cerebro状态检查
cerebro插件来检查整个集群的环境 默认监听9000端口
[root@es-node1 ~]# rpm -ivh cerebro-0.8.5-1.noarch.rpm
[root@es-node1 ~]# vim /etc/cerebro/application.conf
data.path = "/tmp/cerebro.db"
[root@es-node1 ~]# systemctl enable cerebro
6.集群节点
1.cluster
state
主要记录如下信息:
节点信息,比如节点名称、节点连接地址等
索引信息,比如索引名称、索引配置信息等
2.master角色: 负责控制整个集群的操作, 通过cluter_status状态维护集群.
选举: cluster.initial_master_nodes master-eligible
可以不参与选举: node.master: false cluster_state: 节点信息 索引信息
es集群中只能有一个master书点, master节点用于控制整个集群的操作。
我们的cluster state存储在每个节点上,但只能由master维护最新版本并同步给其他节点。
master节点是通过集群中所有节点选举产生的,(10.0.0.161,10.0.0.162,10.0.0.163)可以通node.master: true (默认为true)
3.data角色: 存储数据 (默认都是data节点) 关闭data: node.data: false 存储数据的书点即为data节点,默认节点都是data类型,相关配置node .data: true (默认为true )
当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的书点,称为data节点。
4.coordinating角色 : 处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消。
coordinating节点主要将请求路由到正确的节点处理,比如创建索引的请求路由到master节点.
7.ES集群分片副本.
1、如何提高es集群系统的可用性?
1.服务可用性:
1 )2个节点的情况下,允许其中1个节点停止服务
2 )多个节点的情况下,坏节点不能超过一半以上
2.数据可用性:
1 )副本(replication )解决,这样每个节点上都有完备的数据。
2 )服务可用性如下图所示, node2_上是oldxu_ index索引的一个完整副本数据。
2.如何增大es集群系统的容量?
1.如何将数据分布所有节点上?的
1 )引入分片(shard )解决问题
2.什么是分片,分片是es.支持Pb级数据的基石
2 )分片存储了索引的部分数据,可以分布在任意节点上
3 )分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用
4 )副本分片的数据由主分片同步,可以有多个,从而提高读取数据的吞吐量
5 )注意:主分片数在索引创建时指定且后续不允许在更改,默认ES7分片数为1个
3.如下图所示:在3个节点的集群中创建oldxu_index 索引,指定3个分片,和1个副本。(cerebro创建测试)
8.ES集群状态检查
Cluster Health 获取集群的健康状况,整个集群状态包括以下三种
1)green 健康状况,指所有主副分片都正常分配
2)yellow指所有主分片都正常分配,但是有副本分片未正常分配
3)red 有主分片未分配,表示索引不完备,写也有可能有问题,(但不代表不能存储数据和读取数据)
4)可以通过 GET _cluster/health?pretty=true 方式获取集群状态
shard = hash(routing) % number_of_primary_shards
# hash 算法保证将数据均匀分散在分片中
# routing 是一个关键参数,默认是文档id,也可 以自定义。
# number_of_primary_shards 主分片数
# 注意:该算法与主分片数相关,一但确定后便不能更改主分片。 # 因为一旦修改主分片修改后,Share的计算就完全不一样了。
9.ES集群故障转移
所谓故障转移指的是,当集群中有节点发生故障时,这个集群是如何进行自动修复的。
ES集群是由3个节点组成,如下图所示,此时集群状态是green
假设: node1所在机器宕机导致服务终止,此时集群会如何处理?
1.node2和node3发现node 1无法响应一段时间后会发起master选举 ,比如这里选择node2为
master节点。此时集群状态变为Red。
2.node2发现主分片P0未分配,将node3_上的R0提升为主分片。此时由于所有的主分片都正常分配,
集群状态变为Yellow。
3.Node2将P0和P1生成新的副本R0、R1 ,此时集群状态变为Green。
ES文档路由原理(重要)
ES文档分布式存储,当-一个文档存储至ES集群时,存储的原理是什么样的?
如图所示,当我们想一个集群保存文档时, Document1是如何存储到分片P1的?选择P1的依据是什么?
![image](https://upload-images.jianshu.io/upload_images/17821044-4c37287ff19515e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其实是有一个文档到分片的映射算法,其目是使所有文档均匀分布在所有的分片上,那么是什么
算法呢?随机还是轮询呢?这种是不可取的,因为数据存储后,还需要读取,那这样的话如何读
取呢?
实际上,在ES中,通过如下的公式计算文档对应的分片存储到哪个书点,计算公式如下
shard = hash(routing) % number_ of_ primary_ _shards
# hash 算法保证将数据均匀分散在分片中
# routing 是一个关键参数,默认是文档id,也可以自定义。
# number_ of_ primary_ shards 主分片数
#注意:该算法与主分片数相关,一但确定后便不能更改主分片。
#因为一旦修改主分片修改后,Share的计算就完全不一样了。