163. Elastcisearch 7.4 集群部署

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

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

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

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

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

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

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

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

3. ELK基础架构

在这里插入图片描述

E:elastcisearch 数据搜索 数据存储 java 
L: Logstash 数据收集 ( 数据解析 数据转换 ) 数据输出 java 
K: Kibana 数据分析 数据展示

4. EFK基础架构

在这里插入图片描述

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

5. 使用EFK收集那些日志?

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

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字段组成

6.7 ES操作方式

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

通过URL的方式指定要操作的资源,比如 index,Document等。

通过http Method 指明资源操作方法,如GET,POST,PUT,DELETE 
常见的ES的两种方式:curl 命令行,kibna,DEVTools

6.8 ES单机安装

1. 安装java环境
[root@es-node1 ~]# yum install java -y
[root@es-node1 ~]# rpm -qa java*
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.232.b09-0.el7_7.x86_64
java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64

2. 安装elasticsearch-7.4
[root@es-node1 ~]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm  kibana-7.4.0-x86_64.rpm 

3. 修改jvm配置    
[root@es-node1 ~]# vim /etc/elasticsearch/jvm.options 
-Xms512m 
-Xmx512m   #实验环境 生产环境最少内存一半以上   官方建议最高32Gb

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

5. 检查端口
[root@es-node1 ~]# netstat -lntup
 tcp6       0      0 :::9200                 :::*     

6. 使用curl测试  
[root@exs-node1 ~]# curl 127.0.0.1:9200
{
  "name" : "es-node1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ssdT5FrjQzGYOWCJLFRZ7w",
  "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"
}

7. 修改kibana的配置
[root@es-node1 ~]# vim /etc/kibana/kibana.yml 
server.host: "0.0.0.0"
i18n.locale: "zh-CN"

8. 启动kibana
[root@es-node1 ~]# systemctl start kibana.service 
[root@es-node1 ~]# systemctl enable kibana.service 


9. 通过http://10.0.0.161:5601 访问kibana

在这里插入图片描述

6.9 ES 索引API

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

1. 创建一个索引
PUT /chengyinwu_es
2. 查看所有的索引
GET _cat/indices
3. 删除索引
DELETE /chengyinwu_es

4.给chengyinwu_es索引录入一个文档

POST /tt/_doc/2
{
  "name": "chengyinwu",
  "age": 18,
  "salary": 1000000000
}

POST /chengyinwu_es/_doc/2
{
  "name": "cheng",
  "age": 35,
  "salary": 100
}

5.获取所有的文档 默认前10个

GET /chengyinwu_es/_search

6.获取指定的id数据

GET /chengyinwu_es/_doc/1

7.模糊查询

GET /chengyinwu_es/_search
{
  "query": {
    "term": {
      "name": "chengyinwu"
    }
  }
}

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

9.批量创建文档(es 容许通过_bulk一次创建多个文档,从而减少网络传输开销,提升写入速率)

POST _bulk
{"index":{"_index":"tt","_id":"1"}}
{"name":"chengyinwu","age":"18"}
{"create":{"_index":"tt","_id":"2"}}
{"name":"baozexu","age":"30"}
{"delete":{"_index":"tt","_id":"2"}}
{"update":{"_id":"1","_index":"tt"}}
{"doc":{"age":"20"}}

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-node1 10.0.0.161 2C4G
es-node2 10.0.0.162 2C4G
es-node3 10.0.0.163 2C4G

2. 集群部署:

1. 所有节点操作:
yum install java 
rpm -ivh elasticsearch-7.4.0-x86_64.rpm


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


3. 配置node1
[root@es-node1 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-chengyinwu
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: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]

4. 拷贝文件至另外两台机器
scp -rp /etc/elasticsearch/elasticsearch.yml  root@172.16.1.162:/etc/elasticsearch/elasticsearch.yml
scp -rp /etc/elasticsearch/elasticsearch.yml  root@172.16.1.163:/etc/elasticsearch/elasticsearch.yml

5. 同时拷贝jvm文件至另外两台机器
scp  /etc/elasticsearch/jvm.options  root@172.16.1.162:/etc/elasticsearch/jvm.options
scp  /etc/elasticsearch/jvm.options  root@172.16.1.163:/etc/elasticsearch/jvm.options


6. 配置node2
[root@es-node2 ~]# grep  "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-chengyinwu
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: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]

7. 配置node3
[root@es-node3 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-chengyinwu
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: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]

8. 启动所有节点
systemctl start elasticsearch

9. 通过 curl  检查集群环境是否正常
curl http://172.16.1.163:9200/_cluster/health?pretty

10. kibana 检查集群环境是否正常
GET /_cluster_health


11. 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"

启动cerebro
[root@es-node1 ~]# systemctl start cerebro
[root@es-node1 ~]# systemctl enable cerebro

在这里插入图片描述
在这里插入图片描述

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创建测试)

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

在这里插入图片描述

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

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

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

在这里插入图片描述

9.5 如果要需要增加读吞吐量,怎么办?
增加读吞吐量还是需要添加书点,比如在增加三个节点node4、node5、 node6 ,那么将原来
的R0、R1、 R2分别迁移至新增的三个节点上,当有读请求来时会被分配node4、node5、
node6 ,也就意味着有新的CPU、内存、I0 ,这样就不会在占用hode1、node2、 node3的硬件资源,那么这个时候读吞吐量才会得到真正的提升。

在这里插入图片描述

总结:分片数和副本的设定很重要,需要提前规划好

1.过小会导致后续无法通过增加节点实现水平打容
2.设置分片过大会导致一 个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。

10 .ES集群健康检查

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

实战1 : 通过Shell脚本获取集群状态信息

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。

在这里插入图片描述

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.添加(扩展集群)节点

环境:web01: 10.0.0.7 web02: 10.0.0.8 内存2G 内核1G
将elasticsearch-7.4.0-x86_64.rpm上传至家目录
两台服务器均执行:

[root@web02 ~]# yum install java -y
[root@web02 ~]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm 
[root@web01 ~]# vim /etc/elasticsearch/elasticsearch.yml 
[root@web01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-oldxu
node.name: node4
node.master: false
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: ["10.0.0.161", "10.0.0.162"]
[root@web02 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-oldxu
node.name: node5
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: ["10.0.0.161", "10.0.0.162"]

[root@web01 ~]# vim /etc/elasticsearch/jvm.options 
......
# Xmx represents the maximum size of total heap space
-Xms512m
-Xmx512m
......
[root@web01 ~]# tail -f /var/log/elasticsearch/my-oldxu.log 
systemctl stop elasticsearch.service
systemctl start elasticsearch.service

在这里插入图片描述

发布了184 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/103965203
7.4
今日推荐