10. Elastcisearch 7.4 集群部署

Elastcisearch 7.4 集群部署

文章目录

0. 没有日志分析工具之前,运维工作存在哪些痛点?

痛点1: 生产出现故障后,运维需要不停的查看各种不同的日志进行分析?

痛点2:  项目上线出现错误,如何快速定位问题?如果后端节点过多,日志分散怎么办?

痛点3:  开发人员需要实时查看日志但又不想给服务器的登陆权限,怎么办?难道每天帮开发取日志?

痛点4: 如何在海量的日志中快速的提取我们想要的数据?比如:PV, UV,  TOP10的URL?如果分析的日志数据量大,那么势必会导致速度慢,难度增大,最终则会导致我们无法快速的获取到想要的指标

痛点5: cdn公司需要不停的分析,那分析说明?主要分析命中率,为什么?因为我们给用户承诺的命中率是90%上,如果没有达到90%,我们就要分析数据为什么没有被命中,为什么没有被缓存下来

1. 使用ELK日志分析系统之后

如上所有的痛点都可以使用日志分析系统ELK解决,通过ELK,将运维所有服务器日志,业务系统日志都收集到一个平台下,然后提取想要的内容,比如错误信息,警告信息等,当过滤到这种信息,就马上告警,告警后,运维人员就能马上定位是那台机器,哪个业务系统出现了问题,出现了什么问题。

2. ELK 基础架构

在这里插入图片描述

ELK Stack不是一个单独的技术,它由以下组件组合而成
E: Elastcisearch 负责存储收集过来的日志;数据存储 ---java 
L: Logstash 日志数据收集 ( 数据解析 数据转换 ) 数据输出 java 
K: Kibana 负责过滤,数据分析,绘图进行日志数据可视化展示

3. EFK 基础架构

在这里插入图片描述

E:elastcisearch 数据搜索 数据存储 java 
L: Logstash 数据收集 ( 数据解析 数据转换 ) 数据输出 java 
F: Filebeat 数据采集 (简单的数据处理 ) <--go语言开发
K: Kibana 数据分析 数据展示

logstash与filebeat的区别?
logstash是用java语言开发的,比较重量级,当采集的数据量特别大时,会占用系统很大的内存 相同的日志:600M
filebeat是采用golang语言开发的,较轻量;相同的日志:50M

4. 使用EFK收集哪些日志?

容器: docker
代理: Haproxy, nginx
web: nginx , tomcat,httpd,php
db:  mysql ,redis,mongo,elasticsesarch
存储: nfs,glusterfs,fastdfs
系统: message,security
业务: app

5.ELFK 的组成工具简介

开源实时日志分析 ELK 平台由 Elasticsearch、 Logstash 和 Kibana 三个开源工具组成。现在新增一个 FileBeat,它是一个轻量级的日志收集处理工具(Agent),FileBeat 占用资源少,适合于在各个服务器上搜集日之后传输给 Logstash 。

Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

FileBeat 隶属于 Beats。目前 Beats 包括四种工具。

Packetbeat 搜集网络数据流量
Topbeat 搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据
Filebeat 搜集文件数据
Winlogbeat 搜集 Windows 事件日志数据
工作原理 :在需要收集日志的所有服务上部署 filebeat(不推荐使用 logstash 来收集日志,因为 logstash 相对来说极为耗费系统内存),logstash 用于监控并过滤收集日志,日志收集在一起交给全文搜索服务 ElasticSearch ,可以用 ElasticSearch 进行自定义搜索通过 Kibana 来结合自定义搜索进行页面展示。

6. ES基本介绍

6.1 什么是Elasticsearch?

Elasticsearch 是一个分布式,RESTful(curl命令操作系统) 风格的搜索和数据分析引擎

6.2 Elasticsearch 主要功能

数据存储,数据搜索,数据分析

6.3 Elasticsearch 术语:文档Document

Document 文档就是用户存在es中的一些数据,他是es 存储的最小单元(类似与Table中的一行数据)
注意:每个文档都有一个唯一的id表示,可以自行指定,如果不指定es会自动生成

6.4 Elasticsearch 术语:索引index

索引其实是一堆文档Document的集合(他类似于数据库中的一个table)

6.5 Elasticsearch 术语:索引 字段filed

在ES中,Document就是一个Json object,一个Json object其实是由多个字段组成的,每个字段它有不同的数据类型
字符串:text(不分词),keyword(分词)
数值型:long,intrger,short,byte,double,float
布尔:boolean
日期:date
二进制:binary
范围类型:integer_range,float_range,long_range,double_range,date_range

6.6 ES索引,文档,字段关系?

一个索引里面存储了很多的Document文档,一个文档就是json object,一个json object是由多个不同或相同的filied字段组成,而每一个字段都有自己的类型(字符串[text不分词;keyword ]、数值型、布尔值、日期、二进制等)

6.7 ES操作方式

ES的操作和我们传统的数据库操作不太一样,它是通过RestfulAPI方式进行对ES进行操作,其实本质上就是通过httpd的方式去变更我们的资源状态

通过URL的方式指定要操作的资源,比如 index,Document等。
通过http Method 指明资源操作方法,如GET,POST,PUT,DELETE 等

常见的ES的两种方式:curl 命令行,kibana DEVTools工具

6.8 ES单机安装

#1.安装Java环境
[root@es1 ~]# yum install java -y
[root@es1 ~]# rpm -qa java*
java-1.8.0-openjdk-headless-1.8.0.252.b09-2.el7_8.x86_64
java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
javapackages-tools-3.4.1-11.el7.noarch

#2. 安装elasticsearch-7.4
[root@es1 opt]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm 
#3. 修改jvm配置
[root@es1 opt]# vim /etc/elasticsearch/jvm.options 
-Xms512m 
-Xmx512m   #实验环境 生产环境最少内存一半以上   官方建议最高32Gb

#4. 启动elasticsearch并设置开机自启   
[root@es1 ~]# systemctl start elasticsearch.service
[root@es1 ~]# systemctl enable elasticsearch.service

#5.检查端口,默认9200
[root@es1 ~]# netstat -lntp
[root@es1 ~]# netstat -lntp |grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      21566/java          
tcp6       0      0 ::1:9200                :::*                    LISTEN      21566/java 

#6.使用curl测试
[root@es1 ~]# curl 127.0.0.1:9200
{
  "name" : "es1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "MPZfkqTMTDeDZ01ycfGRDg",
  "version" : {
    "number" : "7.4.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

#7.安装并修改kibana的配置
[root@es1 opt]# rpm -ivh kibana-7.4.0-x86_64.rpm 
[root@es1 opt]# vim /etc/kibana/kibana.yml 
server.host: "0.0.0.0"
i18n.locale: "zh-CN"

#8.启动kibana
[root@es1 opt]# systemctl start kibana.service
[root@es1 opt]# systemctl enable kibana.service
[root@es1 opt]# yum install lsof -y
[root@es1 opt]# lsof -i:5601
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    21944 kibana   18u  IPv4  58665      0t0  TCP *:esmagent (LISTEN)

#9.通过http://ip:5601 访问kibana

在这里插入图片描述

在这里插入图片描述

6.9 ES 索引API

es 有专门的index api,用于创建,更新,删除所有配置等

#1. 创建一个索引
PUT /cwq_es

#2. 查看所有的索引
GET _cat/indices

#3. 删除索引
DELETE /cwq_es

#4.给cwq_es索引录入一个文档
POST /cwq_es/_doc/2
{
  "name": "cwq",
  "age": 18,
  "salary": 8888888
}

POST /cwq_es/_doc/
{
  "name": "c",
  "age": 10,
  "salary": 6666
}

#5.获取所有的文档 默认前10个
GET /cwq_es/_search

#6.获取指定的id数据
GET /cwq_es/_doc/1

#7.模糊查询
GET /cwq_es/_search
{
  "query": {
    "term": {
      "name": "cwq"
    }
  }
}

#8.删除指定id的文档
DELETE /cwq_es/_doc/1

#9.批量创建文档(es 允许通过_bulk一次创建多个文档,从而减少网络传输开销,提升写入速率)
POST _bulk
{"index":{"_index":"tt","_id":"1"}}
{"name":"cwq","age":"18"}
{"create":{"_index":"tt","_id":"2"}}
{"name":"abc","age":"3"}
{"delete":{"_index":"tt","_id":"2"}}
{"update":{"_id":"1","_index":"tt"}}
{"doc":{"age":"11"}}

#10.一次查询多个文档
GET _mget
{
  "docs": [
    {
      "_index": "tt",
      "_id": "1"
    },
    {
      "_index": "tt",
      "_id": "2"
    }
  ]
}

7. ES集群部署

7.1 es 支持集群模式,是一个分布式系统,优点如下

1.增大系统的容量,如内存,磁盘,使得es集群可以支持PB级的数据
2.提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务

7.2 es 集群如何组成

ELasticsearch 集群是由多个节点组成的,通过clueter.name 设置集群名称,用于区分其他集群,每个节点通过node.name 指定节点的名称

7.3 ES集群环境部署

  1. 环境规划
主机名IP地址配置
es-1192.168.10.922C4G
es-2192.168.10.932C4G
es-3192.168.10.942C4G
kibana192.168.10.952C4G
  1. 集群部署
#1.在es1-3执行
yum install java 
rpm -ivh elasticsearch-7.4.0-x86_64.rpm

#2. 删除所有的es相关的数据 (不然会出现集群无法组件的情况)
[root@es1 ~]# rm -rf /var/lib/elasticsearch/*
[root@es1 ~]# systemctl stop elasticsearch.service 
[root@es1 ~]# systemctl stop kibana

#3.配置es1
[root@es1 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.10.92", "192.168.10.93","192.168.10.94"]
cluster.initial_master_nodes: ["192.168.10.92", "192.168.10.93","192.168.10.94"]

#4.es1拷贝文件至另外两台机器
[root@es1 ~]# scp -rp /etc/elasticsearch/elasticsearch.yml root@192.168.10.93:/etc/elasticsearch/elasticsearch.yml 
[root@es1 ~]# scp -rp /etc/elasticsearch/elasticsearch.yml root@192.168.10.94:/etc/elasticsearch/elasticsearch.yml 

#5.es1同时拷贝jvm文件至另外两台机器
[root@es1 ~]# scp -rp /etc/elasticsearch/jvm.options root@192.168.10.93:/etc/elasticsearch/jvm.options
[root@es1 ~]# scp -rp /etc/elasticsearch/jvm.options root@192.168.10.94:/etc/elasticsearch/jvm.options
 
#6.配置es2
[root@es2 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.10.92", "192.168.10.93","192.168.10.94"]
cluster.initial_master_nodes: ["192.168.10.92", "192.168.10.93","192.168.10.94"]

#7.配置es3
[root@es3 opt]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.10.92", "192.168.10.93","192.168.10.94"]
cluster.initial_master_nodes: ["192.168.10.92", "192.168.10.93","192.168.10.94"]

#8. 启动所有节点es服务
systemctl start elasticsearch
systemctl enable elasticsearch

#9.通过curl 检查集群是否正常
[root@es1 ~]# curl http://192.168.10.92:9200/_cluster/health?pretty
{
  "cluster_name" : "my-es",     #集群名称
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,        #3个节点
  "number_of_data_nodes" : 3,
  "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
}

#10.kibana检查集群环境是否正常
GET /_cluster_health
#11. 安装cerebro 插件来检查整个集群的环境;默认监听9000端口
[root@es1 ~]# rpm -ivh cerebro-0.8.5-1.noarch.rpm 

#12. 修改配置文件:
[root@es ~]# vim /etc/cerebro/application.conf
data.path = "/tmp/cerebro.db"

#13. 启动cerebro
[root@es ~]# systemctl start cerebro
[root@es ~]# systemctl enable cerebro

#14.通过浏览器访问cerebro  ip:9000

在这里插入图片描述

在这里插入图片描述

8. ES节点类型

8.1 es集群中节点类型介绍

cluster  state
master
Date
coordinating

8.2 Cluster State :ES 集群相关的数据称为cluster state,主要记录如下信息

1.节点信息,比如节点名称、节点连接地址等
2.索引信息,比如索引名称、索引配置信息等

8.3 Master 节点

1.es集群中只能有一个master书点, master节点用于控制整个集群的操作。
2.我们的cluster state存储在每个节点上,但只能由master维护最新版本并同步给其他节点。
3.master节点是通过集群中所有节点选举产生的,(10.0.0.161,10.0.0.162,10.0.0.163)可以通node.master: true (默认为true)

8.4 Data节点----(所有都默认为true)---->是用来存储数据的

1.存储数据的节点即为data节点,默认节点都是data类型,相关配置node .data: true (默认为true )
2.当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为data节点。

8.5 Coordinating节点

1.处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消。

2.coordinating节点主要将请求路由到正确的节点处理,比如创建索引的请求路由到master节点.

8.6 es 节点类型总结

master角色: 负责控制整个集群的操作, 通过cluter_status状态维护集群.
选举: cluster.initial_master_nodes master-eligible
可以不参与选举: node.master: false cluster_state: 节点信息 索引信息
data角色: 存储数据 (默认都是data节点) 关闭data: node.data: false
coordinating角色 : 负责路由 不能取消

9. ES集群分片副本

9.1 如何提高es集群系统的可用性?

1.服务可用性:
(1) 2个节点的情况下,允许其中1个节点停止服务
(2) 多个节点的情况下,坏节点不能超过一半以上

2.数据可用性:
(1)副本(replication)解决,这样每个节点上都有完备的数据。
(2) 服务可用性如下图所示, node2_上是chengyinwu_ index索引的一个完整副本数据。

9.2 如何增大es集群系统的容量

1.如何将数据分布所有节点上?
(1)引入分片(shard )解决问题

2.什么是分片,分片是es.支持Pb级数据的基石
(2)分片存储了索引的部分数据,可以分布在任意节点上
(3)分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用
(4)副本分片的数据由主分片同步,可以有多个,从而提高读取数据的吞吐量
(5)注意:主分片数在索引创建时指定且后续不允许在更改,默认ES7分片数为1个

3.在3个节点的集群中创建chengyinwu_index 索引,指定3个分片,和1个副本。(cerebro创建测试)

img

9.3 目前一共有3个ES节点,如果此时增加一个新节点是否能提高cwq_ index 索引数据容量

不能,因为cwq_ index 只有3个分片,已经分布在3台节点上,那么新增的第四个节点对于
oldxu_index而言是无法使用到的。所以也无法带来数据容量的提升。

9.4 目前一共有3个ES节点,如果增加副本数是否能提高cwq_ index 的读吞量

不能,因为新增的副本还是会分布在这es1、es2、 es3、 这三个节点上的,还是使用了相
同的资源,也就意味着有读请求来时,这些请求还是会分配到es1、es2、 es3上进行处
理也就意味着,还是利用了相同的硬件资源,所以不会提升读取的吞吐量。

9.5 如果要需要增加读吞吐量,怎么办

增加读吞吐量还是需要添加节点,比如在增加三个节点es4、es5、 es6 ,那么将原来的
R0、R1、 R2分别迁移至新增的三个节点上,当有读请求来时会被分配es4、es5、es6,
也就意味着有新的CPU、内存、I0 ,这样就不会在占用es1、es2、 es3的硬件资源,
那么这个时候读吞吐量才会得到真正的提升。

总结:分片数和副本的设定很重要,需要提前规划好
1.过小会导致后续无法通过增加节点实现水平打容
2.设置分片过大会导致一 个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。

10. ES集群健康检查

Cluster Health获取集群的健康状态,整个集群状态包括以下三种:
1 ) green健康状态,指所有主副分片都正常分配
2 ) yellow指所有主分片都正常分配,但是有副本分片未正常分配
3 ) red有主分片未分配,表示索引不完备,写也可能有问题。 (但不代表不能存储数据和读取数据)
4 ) 可以通过 GET_cluster/health?pretty=true 方式获取集群状态

10.1需求 : 通过shell脚本获取集群状态信息

[root@es1 ~]# curl -s http://192.168.10.92:9200/_cluster/health?pretty=true |grep "status" |awk '{print $1}'
"status"


curl http://172.16.1.163:9200/_cluster/health? pretty=true
{
  "cluster_name" : "my-chengyinwu",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 4,
  "active_shards" : 8,
  "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
}

11. ES集群故障转移

所谓故障转移指的是,当集群中有节点发生故障时,这个集群是如何进行自动修复的。
ES集群是由3个节点组成,如下图所示,此时集群状态是green

11.1 假设node1所在机器宕机导致服务终止,此时集群会如何处理

1.node2和node3发现node 1无法响应一段时间后会发起master选举 ,比如这里选择node2为master节点。此时集群状态变为Red。

img

2.node2发现主分片P0未分配,将node3_上的R0提升为主分片。此时由于所有的主分片都正常分配,集群状态变为Yellow。

在这里插入图片描述

3.Node2将P0和P1生成新的副本R0、R1 ,此时集群状态变为Gree

12. ES文档路由原理(重要)

ES文档分布式存储,当一个文档存储至ES集群时,存储的原理是什么样的?
如图所示,当我们想一个集群保存文档时, Document1是如何存储到分片P1的?选择P1的依据是什么?

在这里插入图片描述

其实是有一个文档到分片的映射算法,其目是使所有文档均匀分布在所有的分片上,那么是什么
算法呢?随机还是轮询呢?这种是不可取的,因为数据存储后,还需要读取,那这样的话如何读
取呢?

实际上,在ES中,通过如下的公式计算文档对应的分片存储到哪个节点,计算公式如下
shard = hash(routing) % number_ of_ primary_shards
# hash                                      算法保证将数据均匀分散在分片中
# routing                                   是一个关键参数,默认是文档id,也可以自定义。
# number_ of_ primary_ shards               主分片数
#注意:该算法与主分片数相关,一但确定后便不能更改主分片。
#因为一旦修改主分片修改后,Share的计算就完全不一样了。

13. 文档的创建读取原理

13.1 文档创建流程

在这里插入图片描述

13.2 文档的读取流程

在这里插入图片描述

13.3 文档批量创建的流程?

在这里插入图片描述

13.4 文档批量读取的流程?

在这里插入图片描述

14. 扩展ES集群

环境:web01: 192.168.10.69 web02: 192.168.10.70 内存2G 内核1G

两台服务器均执行以下操作:

[root@web02 ~]# yum install java -y
[root@web02 ~]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm 
[root@web01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es
node.name: node-4
node.master: false  #不参与master选举
node.data: true     #数据节点
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.10.92", "192.168.10.93","192.168.10.94"]


[root@web02 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es
node.name: node-5
node.master: false
node.data: false                #不存数据;只担任路由节点
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.10.92", "192.168.10.93","192.168.10.94"]

测试环境修改;生产环境不要这样配置,好吗? 
vim /etc/elasticsearch/jvm.options 
......
# Xmx represents the maximum size of total heap space
-Xms512m       #实验环境 生产环境最少内存一半以上   官方建议最高32Gb
-Xmx512m
......

systemctl start elasticsearch.service

15.登录cerebro查看ES集群健康状态

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值