elasticsearch 集群搭建

java8

业务需求场景

​ 线上服务日志过多,为了方便监控系统运行状况,场景举例:


服务关系介绍

  • A 服务网关
  • B 具体服务
  • C 拉取服务信息的集群(master work)
  • 拉取信息(这里意为获取视频流 .h264)

运行逻辑概括

  • A服务网关

  • C服务调用网关,获取通行证

  • 然后用C的work服务携带通行证去B 拉取信息存到消息队列,供下游算法执行相应的业务处理

目前存在问题

  • 拉取信息超时错误代码(404,408…)
  • 拉取信息失败(设置重试时间,一定时间后重试拉取)
  • 获取网关通行证失败(c服务同一时间大量的去请求网关获取通行证,导致网关队列堵塞,处理不过来)
  • c服务增加任务失败,无响应

拉取信息超时的原因总结

1.获取网关通行证失败,或者获取不到,为此设置失败重试,直到拿到通行证为止

以上方案导致 网关会莫名其妙的挂掉,后面优化了网关的服务

2.拉取信息失败

原因当视频流不完整的时候体现为糊化,卡顿,由于我们拉取信息的代码逻辑是,不要糊化的视频,所以一旦出现卡顿糊化现象,也就是一秒二十四帧,丢了一帧,我们会全部抛弃之后的所有,知道抓到下一个I帧,也就是所谓的关键帧才会往消息队列里面存,这就导致了,提供服务信息的B平台看到有一点卡顿,而C平台则直接跳好几秒的情况,而一旦超过三秒没有收到数据包,则认为断流,系统将会主动断开连接,重新请求获取通行证,这样主动断开的操作是为了节约内存消耗,让没有拉取到信息的任务不在占用运行空间,给其他任务使用

3.获取网关通行证失败

​ 这个可能原因是网关承受不住那么大的并发访问,导致一直阻塞内存飙升,网关不是我负责的,我也不清楚具体什么原因但是大致是因为并发太大承受不住的问题

4.c服务增加任务失败,无响应

这个问题主要是由第三个问题影响的蝴蝶效应,网关处理不过来,C新加的任务需要请求网关,然后一直在A的等待队列里面,没有任何回应,也没有错误代码,就卡在网关这里了,最后导致C服务也挂掉了

以上问题的排查步骤,都需要去机器上grep一下日志,查看当前点位是什么状态,如果请求成功,还要去work机器上,看看是因为拉取失败,还是真的没有信息,步骤繁琐,还要查询任务分配到集群的那个机器上,排查时间长,效率低,所以考虑不熟elk集群进行监控任务

Elk 部署前提,需要jdk支持

以下默认你已成功安装jdk

Elasticsearch 安装最新版 logstash 最新版 kibana 最新版 (20190407日官网下载最新稳定版本)

首先安装Elasticsearch

这里需要注意几点,Elasticsearch默认不支持root用户运行,需要新建普通用户

1
2
3
4
新建用户
adduser elk
设置密码
passwd elk

解压 Elasticsearch

进入 Elasticsearch/conf/Elasticsearch.yml

修改配置文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 设置服务名称
cluster.name: elasticsearch_setsun//# 集群的节点名称,默认也会创建一个,自己设置也是可以的
node.name: "node-1"
// 这个参数控制的是,一个节点需要看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量,大致意思就是如果master挂掉了,则从这里查看还有几台具有master资格的机器,然后选取一台,如果低于两个,则集群可能就挂掉了,就变成单机了
discovery.zen.minimum_master_nodes: 2
// 这个属性表示节点是否存储数据
node.data: true
// 是elasticsearch侦听的地方
#network.bind_host: 0.0.0.0
// 集群通信端口
transport.tcp.port: 9300
// http监听端口
http.port: 9200
// 是否开启跨域访问
http.cors.enabled: true
// 跨域请求匹配
http.cors.allow-origin: "*"
//集群组件进行通信的地址//#network.publish_host: 127.0.0.//
// 这个参数是用来同时设置bind_host和publish_host上面两个参数。
network.host: 0.0.0.0
// 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["IP:9300","IP:9300","IP:9300","IP:9300"]

bootstrap.memory_lock: false

bootstrap.system_call_filter: false

xpack.security.enabled: false
// 这个必须设置,不设置的话,外网放不到,应该是初始化master节点
cluster.initial_master_nodes: ["node-1"]

剩下的直接拷贝写好的配置文件到其他机器上就可以了

1
2
3
4
// 批量拷贝配置文件至其他机器的Elasticsearch
pscp /home/Elasticsearch/Elasticsearch.yml -h host_list /home/Elasticsearch/Elasticsearch.yml
// 批量执行Elasticsearch服务
pssh -h host_list -i "/home/Elasticsearch/bin/elasticsearch -d"

然后到服务机器上安装logstash 解压之后配置文件如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
input {

file {
// 日志文件的路径
path => "/log/VCS/Camera/Log/CameraManager_log_current.log*"
start_position => "beginning"
}
}

filter {
grok {
// 过滤正则表达式
match => { "message" => "(.+error.+)"}

}

}

output {

//stdout {

//# codec => rubydebug

// # }
elasticsearch {
hosts => ["33.90.129.59:9200"]
index => "lcc-%{+YYYYMMdd}"
manage_template => true
template_overwrite => true
}
}
1
2
3
4
步骤同上批量拷贝配置文件至其他服务机器上/home/logstash/conf
pscp /home/logstash/conf/logstash.conf -h host_list /home/logstash/conf/
批量启动
pssh -h host_list -i "/home/logstash/bin/logstash -f /home/logstash/conf/logstash.conf"

Kibana 直接解压启动,默认配置就可以 , nohup /home/kibana/bin/kibana &

访问IP:5601即可看到数据

坚持原创技术分享,您的支持将鼓励我继续创作!