ELK01

ELK基础架构

image.png

EFK架构

image.png

使用EFK收集那些日志
容器:docker
代理:Haproxy、nginx
web: Nginx、redis、mongo、elasticsearch
存储:nfs、glusterfs、fastdfs
系统:message、security
业务:app

ELFK架构

image.png

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
image.png
image.png

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
image
假设: node1所在机器宕机导致服务终止,此时集群会如何处理?

1.node2和node3发现node 1无法响应一段时间后会发起master选举 ,比如这里选择node2为
master节点。此时集群状态变为Red。
image
2.node2发现主分片P0未分配,将node3_上的R0提升为主分片。此时由于所有的主分片都正常分配,
集群状态变为Yellow。
image
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的计算就完全不一样了。

11

文档的创建流程

image

2、文档的读取流程

image

3.文档批量创建的流程?

image

4.文档批量读取的流程?

image

你可能感兴趣的:(ELK01)