1.ELK日志收集系统概述

2.ELK技术栈概述

3.Elasticsearch入门与集群

2.ELK技术栈概述

2.1.什么是ELK
ELK 不是一个单独的技术,而是一套技术组合,是由 elasticsearchlogstashkibana 组合而成的。
ELK 是一套开源免费、功能强大的日志分析管理系统。
ELK 可以将我们的系统日志、网站日志、应用系统日志等各种日志进行收集、过滤、清洗,然后进行集中存放并可用于实时检索、分析。
E: elasticsearch 数据存储;
L: logstash 数据采集、数据清洗、数据过滤;
K: kibana 数据分析、数据展示;

2.2.什么是EFK
简单来说就是将 Logstash 替换成了 filebeat,那为什么要进行替换?
因为 logstash 是基于 JAVA 开发的,在收集日志时会大量的占用业务系统资源,从而影响正常线上业务。
而替换成 filebeat 这种较为轻量的日志收集组件,会让业务系统的运行更加的稳定。

2.3.什么是ELFK

2.4 ELK能收集那些日志

  • 代理HaproxyNginx
  • webNginxTomcatHttpdPHP
  • dbmysqlredismongoelasticsearch
  • 存储nfsglusterfsfastdfs
  • 系统messagesecurity
  • 业务app

3.Elasticsearch入门与集群
3.1 什么是Elasticsearch
Elasticsearch 是一个分布式 RESTful 风格的搜索和数据分析引擎
3.2 Elasticsearch的主要功能
数据存储,数据搜索,数据分析。
3.3 Elasticsearch相关术语介绍
3.3.1 文档 Document
Document 文档就是用户存在 es 中的一些数据,它是
es 中存储的最小单元。(类似于表中的一行数据。)注意:每个文档都有一个唯一的 ID 表示,可以自行指定,如果不指定 es 会自动生成。
3.3.2 索引 index
索引其实是一堆文档 Document 的集合。(它类似数据库的中的一个表)
3.3.3 字段 Filed
在 ES 中,Document就是一个 Json Object,一个Json Object其实是由多个字段组成的,每个字段它有不同的数据类型。
3.3.4 Elasticsearch 术语总结
ES索引、文档、字段关系小结:
一个索引里面存储了很多的 Document 文档,一个文档就是一个json object,一个json object是由多个不同或相同的 filed 字段组成
3.4 Elasticsearch操作方式
ES 的操作和我们传统的数据库操作不太一样,它是通过 RestfulAPI 方式进行操作的,其实本质上就是通过 http 的方式去变更我们的资源状态;
通过 URI 指定要操作的资源,比如 Index、Document;
通过 Http Method 指定要操作的方法,如 GET、POST、PUT、DELETE;
常见操作 ES 的两种方式:Curl、Kibana DevTools
3.4.1 curl 操作 Elasticsearch

# 通过curl命令来完成索引的创建
curl -XPUT
'http://127.0.0.1:9200/yang_index/_doc/1'
\
-H "Content-Type: application/json" \
-d '{
"name":"yang",
"age":18,
"salary": 1000000
}'

3.4.2 kibana devtools 操作Elasticsearch
3.4.2.1 安装配置kibana
①.安装kibana

[root@es-node1 ~]# rpm -ivh kibana-7.8.1-x86_64.rpm

② 配置kibana

[root@kibana ~]# grep "^[a-Z]" /etc/kibana/kibana.yml
server.port: 5601 #kibana默认监听端口
server.host: "0.0.0.0" #kibana监听地址段
elasticsearch.hosts: ["http://localhost:9200"] # kibana丛coordinating节点获取数据
i18n.locale: "zh-CN" #kibana汉化

③.启动kibana

[root@kibana ~]# systemctl start kibana
[root@kibana ~]# systemctl enable kibana

3.4.2.2 Elasticsearch 索引api
①.添加索引

PUT /yangtao_index

②.删除索引

DELETE /yangtao_index

③.查看索引

GET _cat/indices

3.4.2.3 Elasticsearch 文档api
①.创建文档 document

#创建一个文档(指定ID)
POST /oldxu_index/_doc/1
{
"username": "oldxu",
"age": 18,
"salary": 1000000
}

创建文档不指定ID

②.查询文档
查询文档,指定要查询的文档id

查询文档,搜索所有文档,用_search

# 查询指定的内容
GET /oldxu_index/_search
{
"query": {"match": {
"user": "oldxu"
}}
}

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

#批量创建document
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"}}

④.批量查询文档
es允许通过 _mget 一次查询多个文档。

#批量查询document
GET _mget
{
"docs": [
{
"_index": "tt",
"_id": "1"
},
{
"_index": "tt",
"_id": "2"
}
]
}

3.5 Elasticsearch集群搭建
3.5.1 Elasticsearch集群的好处
es天然支持集群模式,其好处主要有两个:
1.能够增大系统的容量,如内存、磁盘,使得 es集群可以支持PB级的数据;
2.能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务;

3.5.2 Elasticsearch集群搭建
①.环境准备

主机名称 ip地址
es-node1 192.168.1.43
es-node2 192.168.1.90
es-node3 192.168.1.39
②.所有集群节点都需要安装es软件
 yum localinstall -y elasticsearch-7.8.1-x86_64.rpm

③.配置node节点
node1节点

[root@rongbiz-43 ~]# grep ^[a-z] /etc/elasticsearch/elasticsearch.yml 
cluster.name: rongbiz
node.name: node-1
path.data: /es
path.logs: /var/log/elasticsearch
network.host: 192.168.1.43
http.port: 9200
discovery.seed_hosts: ["192.168.1.43", "192.168.1.90","192.168.1.39"]
cluster.initial_master_nodes: ["192.168.1.43", "192.168.1.90","192.168.1.39"]

node2节点

[root@rstx-90 ~]# grep ^[a-z] /etc/elasticsearch/elasticsearch.yml
cluster.name: rongbiz
node.name: node-2
path.data: /es
path.logs: /var/log/elasticsearch
network.host: 192.168.1.90
http.port: 9200
discovery.seed_hosts: ["192.168.1.43", "192.168.1.90","192.168.1.39"]
cluster.initial_master_nodes: ["192.168.1.43", "192.168.1.90","192.168.1.39"]

node3节点

[root@jumpserver ~]# grep ^[a-z] /etc/elasticsearch/elasticsearch.yml
cluster.name: rongbiz
node.name: node-3
path.data: /es
path.logs: /var/log/elasticsearch
network.host: 192.168.1.39
http.port: 9200
discovery.seed_hosts: ["192.168.1.43", "192.168.1.90","192.168.1.39"]
cluster.initial_master_nodes: ["192.168.1.43", "192.168.1.90","192.168.1.39"]

④.验证

[root@jumpserver ~]# curl http://192.168.1.39:9200/_cat/master
qgHrj_ZTS4yZPaYCmaMzJg 192.168.1.90 192.168.1.90 node-2

[root@jumpserver ~]# curl http://192.168.1.39:9200/_cat/nodes
192.168.1.43 25 96 1 0.03 0.18 0.17 dilmrt - node-1
192.168.1.90 10 96 0 0.04 0.11 0.18 dilmrt * node-2
192.168.1.39 27 94 0 0.00 0.05 0.11 dilmrt - node-3

3.5.3 Elasticsearch集群健康监测
Cluster Health 获取集群的健康状态,整个集群状态
包括以下三种:
1. green 健康状态,指所有主副分片都正常分配
2. yellow 指所有主分片都正常分配,但是有副本分片未正常分配
3. red 有主分片未分配,表示索引不完备,写可能有问题。(但不代表不能存储数据和读取数据)

检查 ES 集群是否正常运行,可以通过 curl、Cerebro两种方式;
3.5.3.1 curl对Elasticsearch集群健康监测

#通过curl命令检查集群状态
[root@jumpserver ~]# curl http://192.168.1.39:9200/_cluster/health?pretty=true
{
  "cluster_name" : "rongbiz",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 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
}

# 监控ES集群状态脚本
[root@jumpserver ~]# curl -s http://192.168.1.39:9200/_cluster/health?pretty=true | grep "status" |awk -F '"' '{print $4}'
green

3.5.3.2 cerebor对Elasticsearch集群健康监测
可视化 cerebro 工具检查 ES 集群状态!cerebro传送门
PS: Cerebro-0.9.4-1运行环境最低java11 否则无法运行

[root@rongbiz-43 ~]# rpm -ivh cerebro-0.9.4-1.noarch.rpm
[root@rongbiz-43 ~]# vim /etc/cerebro/application.conf
data.path: "/var/lib/cerebro/cerebro.db"
#data.path = "./cerebro.db"
[root@erongbiz-43 ~]# systemctl start cerebro
[root@rongbiz-43 ~]# ss -nutlp|grep 9000
tcp    LISTEN     0      100    [::]:9000               [::]:*                   users:(("java",pid=3080,fd=137))

集群检查效果如下图所示:

https://www.modb.pro/db/233412

3.6 Elasticsearch集群节点类型

  • Cluster state
  • Master
  • Date
  • Coordinating
    ①. Cluster state 集群相关的数据被称为cluster state,会存储在每个节点中,重要的信息有
  • 节点的信息 比如节点的名称,节点的连接信息
  • 索引的信息 索引的名称,索引的配置(分片及副本)
    ②.Master 主控节点
    1.ES集群中只能有一个 master 节点,master节点用于控制整个集群的操作;
    2.Master 主要维护 Cluster State,当有新数据产生后,Master 会将数据同步给其他 Node 节点;
    3.Master节点是通过选举产生的,可以通过node.master: true 指定为Master节点。( 默认true )
    当我们通过API创建索引 PUT /oldxu_index,Cluster State 则会发生变化,由 Master 同步至其他 Node 节点;
    ③.Data
    1.存储数据的节点即为 data 节点,默认节点都是 data 类型,配置node.data: true( 默认为 true )
    2.当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为data节点;
    ④.Coordinating
    1.处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消
  1. coordinating 节点主要将请求路由到正确的节点处理。比如创建索引的请求会由 coordinating路由到 master 节点处理;当配置 node.master:false、node.data:false 则为 coordinating节点

3.7 Elasticsearch集群索引分片副本
①. 提高ES集群可用性
如何提高 ES 集群系统的可用性;有如下两个方面;
1.1 服务可用性:

  • 1)2个节点的情况下,允许其中1个节点停止服务;
  • 2)多个节点的情况下,坏的节点不能超过集群一半以上;

1.2.数据可用性:

  • 1)通过副本 replication 解决,这样每个节点上都有完备的数据。
  • 2)如下图所示,node2上是 oldxu_index 索引的一个完整副本数据。

②. 增大ES集群的容量
2.1.如何增大 ES 集群系统的容量;我们需要想办法将数据均匀分布在所有节点上;引入分片 shard 解决;
2.2.什么是分片,将一份完整数据分散为多个分片存储;

  • 分片是 es 支持 Pb 级数据的基石
  • 分片存储了索引的部分数据,可以分布在任意节点上
  • 分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用
  • 副本分片的数据由主分片同步,可以有多个,用来提高读取数据性能的
    注意:主分片数在索引创建时指定且后续不允许在更改;默认ES7分片数为1个

③. 增加节点能否提高容量
创建索引,设定主分片和副本分片 number_of_shards=3 number_of_replicas=1 主分片和副本分片的数量是6

PUT /oldxu_index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}

动态修改副本分片

PUT /oldxu_index/_settings
{
"number_of_replicas": 9
}

问题:目前一共有3个ES节点,如果此时增加一个新节点是否能提高 oldxu_index 索引数据容量?
答案:不能,因为 oldxu_index 只有3个分片,已经分布在3台节点上,那么新增的第四个节点对于oldxu_index 而言是无法使用到的。所以也无法带来数据容量的提升;
④. 增加副本能否提高读性能
问题:目前一共有3个ES节点,如果增加副本数是否能提高 oldxu_index 的读吞吐量;
答案:不能,因为新增的副本还是会分布在这 node1、node2、node3 这三个节点上的,还是使用了相同的资源,也就意味着有读请求来时,这些请求还是会分配到node1、node2、node3 上进行处理、也就意味着,还是利用了相同的硬件资源,所以不会提升性能;
问题:如果需要增加读吞吐量性能,应该怎么来做;
答案:增加读吞吐量还是需要添加节点,比如在增加三个节点 node4、node5、node6 那么将原来的 R0、R1、R2 分别迁移至新增的三个节点上,当有读请求来时会被分配 node4、node5、node6,也就意味着有新的 CPU、内存、IO,这样就不会在占用node1、node2、node3 的硬件资源,那么这个时候读吞吐量才会得到真正的提升;
⑤. 副本与分片总结
分片数和副本的设定很重要,需要提前规划好
1.过小会导致后续无法通过增加节点实现水平扩容;
2.设置分片过大会导致一个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能;

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

①.模拟节点故障
假设:node1 所在机器宕机导致服务终止,此时集群会如何处理;大体分为三个步骤:

  • 重新选举
  • 主分片调整
  • 副本分片调整
    ②.重新选举
    node2 和 node3 发现 node1 无法响应;一段时间后会发起 master 选举,比如这里选择 node2 为 master 节点;此时集群状态变为 Red 状态;
    ③.主分片调整
    node2 发现主分片 P0 未分配,将 node3 上的 R0 提升为主分片;此时所有的主分片都正常分配,集群状态变为 Yellow状态;
    ④. 副本分片调整
    node2 将 P0 和 P1 主分片重新生成新的副本分片 R0、R1,此时集群状态变为 Green;
    正常节点

    停止一个节点

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

其实是有一个文档到分片的映射算法,其目是使所有文档均匀分布在所有的分片上,那么是什么算法呢?随机还是轮询呢? 这种是不可取的,因为数据存储后,还需要读取,那这样的话如何读取呢?
实际上,在ES 中,通过如下的公式计算文档对应的分片存储到哪个节点,计算公式如下:

shard = hash(routing) %
number_of_primary_shards
# hash 算法保证将数据均匀分散在分片中
# routing 是一个关键参数,默认是文档id,也可以自定义。
# number_of_primary_shards 主分片数
# 注意:该算法与主分片数相关,一但确定后便不能更改主分片。
# 因为一旦修改主分片修改后,Share的计算就完全不一样了

①.文档的创建流程

②.文档的读取流程

③.文档批量创建的流程

④.文档批量读取的流程

3.10 Elasticsearch扩展集群节点
3.10.1 node4节点扩展配置

[root@node4 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: es-node4
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: # 内网IP
#bootstrap.memory_lock: true
node.data: true # data节点
node.master: false # 不参与master选举
discovery.seed_hosts: ["172.16.1.161","172.16.1.162", "172.16.1.163"]

3.10.2 node5节点扩展配置

[root@node5 ~]# grep "^[a-Z]"
/etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: es-node5
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
#bootstrap.memory_lock: true
network.host: # 内网IP
node.data: false # data节点
node.master: false # 不参与master选举
discovery.seed_hosts: ["172.16.1.161","172.16.1.162", "172.16.1.163"]

3.10.3 节点扩展检查
通过 cerebor检查集群扩展后的状态;如果出现集群无法加入、或者加入集群被拒绝,尝试删除/var/lib/elasticsearch 下的文件,然后重启 es;

PS:如果将 data节点修改为 Coordinating 节点;需要清理数据,否则无法启动;

# repurpose 重新调整
[root@web02 ~]# /usr/share/elasticsearch/bin/elasticsearchnode repurpose
-------------------------------------------
-----------------------------
WARNING: Elasticsearch MUST be stoppedbefore running this tool.

Found 1 indices (1 shards and 1 index metadata) to clean up
Use -v to see list of paths and indices affected
Node is being re-purposed as no-master and no-data. Clean-up of index data will be performed.
Do you want to proceed?
Confirm [y/N] y
Node successfully repurposed to no-master and no-data.

3.11 Elasticsearch扩展集群节点
3.11.1 内核参数优化

# 对于操作系统,需要调整几个内核参数
[root@node ~]# vim /etc/sysctl.conf
fs.file-max=655360 # 设定系统最大打开
文件描述符数,建议修改为655360或者更高,
vm.max_map_count = 262144 # 用于限制一个进程
可以拥有的虚拟内存大小,建议修改成262144或更高。
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1000 65535
net.ipv4.tcp_max_tw_buckets = 400000
[root@node ~]# sysctl -p
# 调整最大用户进程数(nproc),调整进程最大打开文件
描述符(nofile)
[root@node ~]# rm -f
/etc/security/limits.d/20-nproc.conf # 删
除默认nproc设定文件
[root@node ~]# vim
/etc/security/limits.conf
* soft nproc 20480
* hard nproc 20480
* soft nofile 65536
* hard nofile 65536

3.11.2 配置参数优化

# 1.锁定物理内存地址,避免es使用swap交换分区,频繁
的交换,会导致IOPS变高。
[root@es-node ~]# vim /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true
#2.配置elasticsearch启动参数
[root@es-node ~]# sed -i '/\[Service\]/aLimitMEMLOCK=infinity' /usr/lib/systemd/system/elasticsearch.service
[root@es-node ~]# systemctl daemon-reload
[root@es-node ~]# systemctl restart elasticsearch

3.11.3 JVM参数优化
JVM内存具体要根据 node 要存储的数据量来估算,为了保证性能,在内存和数据量间有一个建议的比例:像一般日志类文件,1G 内存能存储48G~96GB数据;
jvm堆内存最大不要超过31GB;
其次就是主分片的数量,单个控制在30-50GB;

假设总数据量为1TB,3个node节点,1个副本;那么实际要存储的大小为2TB,因为有一个副本的存在;2TB / 3 = 700GB,然后每个节点需要预留20%的空间,意味着每个node要存储大约 850GB 的数据;按照内存与存储数据的比率计算:
850GB/48=17GB,小于31GB,因为 31*48=1.4TB 及每个Node可以存储1.4TB数据,所以3个节点足够;
850GB/30=30个主分片,因为要尽量控制主分片的大小为30GB;

假设总数据量为2TB,3个node节点,1个副本;那么实际要存储的大小为4TB,因为有一个副本的存在;
4TB/3 = 1.4TB,然后每个节点需要预留20%的空间出来,意味着每个node要存储大约 1.7TB 的数据;
按照内存与存储数据的比率计算:

1.7TB/48=32GB 大于31G,因为 31*48=1.4TB及每个Node最多存储1.4TB数据,所以至少需要4个节点;1.5TB/30G=50个主分片,因为要尽量控制主分配存储的大小为30GB;

[root@es-node ~]# vim
/etc/elasticsearch/jvm.options
-Xms31g # 最小堆内存
-Xmx31g # 最大堆内存
#可根据服务器内存大小,修改为合适的值。一般设置为服
务器物理内存的一半最佳,但最大不能超过32G
# 每天1TB左右的数据量的服务器配置
16C 64G 6T 3台EC

posted @ 2022-12-06 11:42  老夫聊发少年狂88  阅读(238)  评论(0编辑  收藏  举报