因为最近工作比较忙基本是996的状态还有自己的私事要处理,所以好久没有整理过自己的博客。趁着空闲时间记录下之前工作和平时遇到的问题,便于后面查阅。
这段时间工作之余将之前的风控系统用flink流式框架进行了重写,并计划用Spring cloud与vue admin做一个可视化框架,使这套框架能成为通用的规则处理引擎,后面会专门写文章进行介绍,先放上github地址吧。
工作中之前使用cat组件进行apm性能监控,使用开源版本下来有各种各样的问题,自己增加了些功能,也解决了写bug但是没来及提交问题,后面有时间也下记录吧。在新的项目重构中已经弃用了cat方案,选用了skywalking。
另一方面在对公司项目重构的过程中使用了spring cloud框架,注册中心使用nacos,遇到偶尔情况下应用会疯狂刷日志的情况,这个问题是由于nacos client与nacos server对同一个配置文本进行md5时两端的md5值不一致导致的,服务端的md5值首位0会丢失,解决了这个bug但是也没来得及提交…
这个bug官方在1.3版本中已经解决了,但是将md5加密的方法都进行了重写,没有在老方法基础上进行更改。
最近比较忙是要将公司的项目进行重构并选用了spring cloud框架,网关使用spring cloud gateway,注册中心使用nacos等,使用feign进行协议传输项目基本完成到一定阶段后进行了压测并遇到了一些问题这里记录下遇到的问题。
Spring cloud gateway的调优,spring cloud gateway使用webflux方案底层使用netty框架。在压测过程中网关性能始终上不来,处理能力还不如直接访问应用本身来的快,查阅资料后进行了一些参数调整,调整后的启动参数如下
1 | -Dreactor.netty.pool.maxConnections=1000 |
起主要作用的是对ioWorkerCount值的设置,work是netty处理请求的thread,该值默认等于处理器数量最小值为4。具体的介绍可以看有关netty框架的介绍。
压测过程中还碰到大量并发访问系统过程中,作为fegin server的一端会产生大量的tcp time_wait的连接,这其实是由于tcp client已经断开但是tcp server端还会有一段时间等待断连。这个知识涉及到tcp协议的三次握手与四次挥手,之前只在面试中被问到过,现在总算遇到了场景(逃…)
解决办法是调整系统参数可以解决,调整这些参数也只是为了应对系统大并发,系统并发不是很大的话可以不调整的,在Linux系统/etc/sysctl.conf文件中加入如下值,具体意义可以百度到
1 | net.ipv4.tcp_syncookies = 1 |
还遇到的一个情况是fegin碰到数据发送超时会进行重试,但是有些业务场景尤其是金融相关的情况,即便是网络超时也不进行重试(有可能对方已经收到了数据,但是响应超时,尤其是对接第三方接口的情况下),所以我们关闭了feign的超时重试机制。
一个小改动方面是在使用nacos的过程中,应用的配置信息在启动或者刷新配置的时候会将配置信息打印到日志中,配置信息有可能包含一些敏感信息不符合PCI安全规范,所以也在启动过程中进行屏蔽,启动参数中加入如下
1 | -Dlogging.level.com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder=ERROR |
加入远程nacos并不能生效,加入到bootstrap.properties会生效,但是要所有应用都要改动,所以添加到了启动参数中。另外其实远程生效也是可以实现的这个跟alibaba spring cloud nacos的代码有关,在上面的参数类中都没有加入@refreshscope注解所以不会生效。
随着工作强度加大和年纪增大家庭琐事也会越来越多,也只能靠工作和平时碎片时间进行学习和记录一点东西,下次想写一些自己阅读的一些开源代码和解决的一些开源bug,希望以后自己能多有一些时间多读读书,多动动笔……
]]>要通过树莓派引脚(GPIO)控制led,需要做如下连接:
上图是网上找的一个大概示意图,led的两个引脚一端接地另外一端接GPIO,也可以一端接电源另外一端接GPIO引脚,别管怎么接主要目的就是通过控制GPIO输出高低电平来实现led的亮灭。led需要的电流比较小,所以要加电阻控制下,如果要通过GPIO控制大电流或者电压设备就需要到三极管或者继电器等元器件。
树莓派专门提供了python包RPi.GPIO来控制GPIO引脚,如果复杂功能或者驱动的话需要用到C语言的包,这个大家可以网上自己找下资料。
web后台使用Django的rest framework,前端使用vue框架。
Django后台搭建:
Python3可以直接创建虚拟环境,使用以下命令创建:
1 | mkdir led |
Django rest framework (安装文档)[https://www.django-rest-framework.org],另外要注意安装RPi.GPIO要在树莓派上安装在本地电脑会报错。
vue前端搭建:
前端使用的是vue用的iview框架,这部分网上内容挺多的以下是官方的安装文档,安装之前请先装node环境:
(vue安装)[https://cn.vuejs.org/v2/guide/installation.html#NPM]
###部署
以上都完成了,需要部署在树莓派上,我在树莓派上安装了nginx做转发:
ssh到树莓派上安装nginx,如果安装报网络错误要更换下apt源
1 | sudo apt-get install nginx |
安装完成后将前后台项目拷贝到树莓派上,我的目录是:
后台Django: /home/pi/test/led
前端vue: /home/pi/dist
配置nginx转发,找到nginx的配置目录,增加led.conf文件,并添加如下内入
1 | server { |
启动:
启动nginx: sudo /etc/init.d/nginx start
启动django: python3 manage.py runserver 0.0.0.0:8000 &
Django部署也可以使用nginx+uwsgi方式,这里我就没在弄了,大家可以去网上搜集下资料
实现效果要求网页端和树莓派无线在一个局域网内,想要外网连接实现的话,需要有个域名外加上内网穿透工具实现,代码里都是用ip地址指向的运行的时候要改为实际ip或域名
公司需要开发风控系统之前没有接触过这一块,在网上查询好多资料或得的一些思路,开发的过程也走了些弯路踩了不少坑现在记录下来。
对于风控来说就是提前预防风险降低安全事故的发生,并且能及早发现和封堵;在前期的探索阶段都是利用日志或者离线数据发现规律,在做下面的实时风控系统之前,前期是利用ELK记录的日志数据来查找规律发现一些问题的。
研究风控之前有一些风险是比较常出现的:
风控系统分为实时风控和非实时风控系统,两种用途不太一样实时系统可以快速拦截风险,非实时离线系统可以发现一些未知风险。
离线系统前期更多的是用于数据分析和发现规律,可以利用已知风险数据和一些机器学习的方法发现一些风险点;同时离线数据也可以为实时系统提供信息决策。前期做离线分析的时候用过相关性分析、决策树、k临近算法等等。
实时系统对系统的响应比较高,本次项目就是利用drools规则引擎可以迅速的更改规则不必重新部署就可以做到发现和拦截一些风险访问。
公司访问量比较订单一天大于2000w单,技术框架采用的是kakfa,spark-streaming、drools、redis、postgresql,下面是系统的一个总体框架图
drools规则放置在postgresql数据库可以实时更改规则,redis作为临时数据缓存,加载历史数据可以通过历史发现一些发现,例如交易总不在固定地点、多次查询余额等等;通过运行发现处理速度还是不错的,性能瓶颈主要在缓存数据的获取上,总体运行下来单台redis的处理性能达到每数4w/s左右效率还是不错的。
把部分代码提交到了我的github上。
]]>这周遇到一个bug使用python的requests lib单独运行脚本post数据就成功,结果使用django调用该函数就出问题。在后台打印log发现django调用的时候request.body丢失了部分数据。
代码类似:
1 | body=dict() |
原因是单独调用代码的时候发送的body数据内容都是str类型,而Django调用的时候引入了unicode类型。
1 | test = 'test' |
这个跟python的自身编码问题有关,python3加requests能够解决这个问题,但是项目是python2.7的所以用其它方式解决。在requests lib断点调试下会发现init.py—> api.py—>models.py
1 | self.headers['Content-Length'] = builtin_str(l) #477 line |
将body内的数据转化为str类型解决,或者在增加headers解决
1 | request.post(data = json.dumps(data,ensure_ascii=False),headers={'Content-Length':str(len(data))}) |
贝叶斯公式:$P(A|B)=P(AB)/P(B)$
$P(A|B)$表示在B条件下A事件发生的概率,其中$P(A)$表示先验概率,P(A|B)代表后验概率即在B事件发生之后,我们对A事件概率的重新评估,这使得预估概率更接近真实概率。
]]>最近帮朋友调一个车牌识别的源码开源地址有些地方要改动才能跑起来,该项目是基于opencv、深度学习DNN算法做的车牌识别,该blog主要是记录下踩坑过程。
项目是基于python开发的,但是底层还是依赖opencv的c++库,所以环境搭建最主要的还是opencv的配置;我是基于mac系统做的,开源版本要求opencv版本大于3.3所以用brew install安装的版本不适合。
]]>我们在启动nova-api会使用service openstack-nova-api start命令,查看该服务启动的是/usr/bin/nova-api
nova/cmd/api.py def main(): #启动进程
功能:载入配置文件、启动进程数(默认cpu核数)、根据配置文件中的enabled_apis启动不同WSGIService
nova.conf
enabled_apis=ec2,osapi_compute,metadata
ec2 亚马逊云主机
osapi_compute openstack云主机
metadata 元数据
我们主要看osapi_compute
nova/service.py class WSGIService(service.Service):
功能加载/etc/nova/api-paste.ini(这里用到了deploy模块解释:https://www.cnblogs.com/Security-Darren/p/4087587.html)
etc/nova/api-paste.ini
[composite:osapi_compute]
use = call:nova.api.openstack.urlmap:urlmap_factory
解析url调用 urlmap_factory
nova/api/openstack/urlmap.py
def urlmap_factory(loader, global_conf, **local_conf):
#loader是上面加在的app的loader,这里是osapi_compute
#global_conf = {‘file‘: ‘/etc/nova/api-paste.ini’, ‘here’: ‘/etc/nova’}
#local_conf = {‘/v2’: ‘openstack_compute_api_v21_legacy_v2_compatible’, ‘/‘: ‘oscomputeversions’, ‘/v2.1’: ‘openstack_compute_api_v21’}
该方法将osapi_compute 转换为 openstack_compute_api_v21_legacy_v2_compatible
[composite:openstack_compute_api_v21_legacy_v2_compatible]
use = call:nova.api.auth:pipeline_factory_v21
noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler noauth2 legacy_v2_compatible osapi_compute_app_v21
keystone = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21
nova/api/auth.py
def pipeline_factory_v21(loader, global_conf, **local_conf):
#使用keystone验证 类似Django midware看keystone最后一项osapi_compute_app_v21
[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory
Nova/api/openstack/compute/routes.py
class APIRouterV21(base_wsgi.Router): #最终url解析(flavor、show…)
贴一个调用流程图,新版加入了nova-cell这里是个简易版
先介绍这里,剩下就是nova-conductor、nova-scheduler、nova-coumpute的rpc调用
V2:
Tenant、User、Role
V3
Domain、Project、Group、User、Role
例子:使用OpenStack搭建公司的私有云V2版本的keystone基本够用
Tenant -> 部门,User->用户,Role->权限
现在基于OpenStack构建公有云对每家公司用户来说都会有V2架构,V3多出domain类似公司
Domain->公司,Project->部门,User->用户,Role->权限,Group->组(包含给多个user赋权限)
年初入职新公司做云计算相关开发奈何线上系统都还有没有做监控,所以接手做监控事宜;
监控使用的是zabbix将zabbix服务器安装在openstack云服务集群外,zabbix邮件告警直接在配置页面配置好邮件服务器地址;短信告警通过socket对接的是总行的短信服务。
配置如下:
在图中,Name自行定义;Type选择 Script;Script name填写脚本名称socket_alarm_script.py;Script parameters包含3个参数:{ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE},这3个参数是zabbix启用脚本时自动传给脚本的参数。此3个参数的具体内容将在zabbix文档有具体说明。
帮助某家城商行做互金项目监控,主要有tomcat、nginx、redis、oracle、日记
tomcat、zookeper监控通过jmx接口来获取jvm监控信息,zabbix页面也支持jmx获取。
nginx通过添加 –with-http_stub_status_module参数编译和在配置文件中
1 | server { |
Oracle可以通过orabbix获取,不过我通过pyOrale连接oracle获取的信息
redis通过缓存redis系统信息获取(主要是info里的信息)
本来想用ELK做日志收集监控(城商行不允许这么做),所以选择了zabbix告警日志error信息还好错误信息产生速率不高;
平台每天在不同时间段会产生几个对账文件,需要每天检测一次对账文件是否生成;zabbix 3.0支持固定时间点生成告警(粒度一分钟)
部署选用的ansible,后面补充一些调优配置
]]>搭建的过程参考官方文档和一些blog,版本2.7.4
申请资源的hadoop的master节点申请public ip,datanode节点可以不用申请public ip。
master节点跟datanode节点设置免密码登录。
搭建完成后运行
1 | hadoop namenode -format |
运行不成功,开始报错。
上面这个错误是不能识别集群的hostname,依次做如下修改:
出现这个问题有说是配置文件重载权限问题,但是我将hdfs-site.xml的文件权限设置成777也没有生效,后将此文件中的xml配置写成固定值成功,如下:
1 | <property> |
tmp目录是自己指定的。
完成上述配置后格式化启动成功,发现启动节点数不对或者其他不确定错误,将上面的tmp目录内容清空再试一次即可
放个hadoop配置文件参数介绍
之后就可以在上层跑hive,hsql,spark,storm的组件了,map/reduce的开发跟之前单机版一样。
hadoop,es,spark/storm基本思想差不多都是大化小,小块处理,结果整合,之前记录过。
]]>用u盘做引导安装过程中所有配置选项做好后点击“继续”出现“无法将grub-efi-amd64-signed软件包安装到/target/中。如果没有GRUB启动引导器,所安装的系统将无法启动”出现这个问题是最新的引导都支持efi引导了;解决方法是在启动列表的选项中选择不带efi u盘的启动项。
进入系统后安装kvm manger后使用图形界面结果显示“Spice doesn’t work from Virtual Machine Manager”linux mint18.2是基于Ubuntu的16.04安装后会出现这个bug,解决办法是执行
1 | sudo apt-get install gir1.2-spice-client-gtk-3.0 |
hadoop主要利用Map/Reduce框架进行快速数据处理,就是将上传到hadoop集群的文件进行分片保存在HDFS上(64M),之后利用Map框架进行预处理后交由Reduce框架处理输出结果,如下图(简易图):
利用idea建立maven工程,pom.xml配置如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
之后建立WordCount.java编译生成jar文件。
1 | ackage org.myorg; |
这段代码主要实现了map/reduce处理过程,上节利用命令 -put上传的文件被分配到各个datanode节点。
public void map()按文件行分解为单词输出key/value值
public void reduce()按map传递过来的值统计单词
之后就是在main函数中配置job
上面生成了HadoopTest-1.0-SNAPSHOT.jar
运行命令,会在/user/liuce/output看到输出结果
1 | hadoop jar ./HadoopTest-1.0-SNAPSHOT.jar org.myorg.WordCount /user/liuce/input /user/liuce/output |
eclipse下有插件可以远程连接到hadoop服务器上而不用每次做这些上传删除操作,github上只有2.6版本的高级版本可以自己编译,linux、win下插件都没问题但是macos下一直报错,感觉跟mac系统的目录结构有关一直报找不到job。
]]>系统macos 10.12.4,linux系统大体与此相似
1 | brew insall hadoop |
该命令安装是是最新版(2.8.0)
配置JAVA_HOME(之前已经配置过,java版本1.8)
1、生成公钥,加入authorized_keys
1 | ssh-keygen -t rsa |
这里是使用单节点,brew install的hadoop目录在
/usr/local/Cellar/hadoop/2.8.0
配置文件目录在
/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop
设置副本数为 1:
1 | <configuration> |
设置文件系统访问的端口:
1 | <configuration> |
设置 MapReduce 使用的框架:
1 | <configuration> |
1 | <configuration> |
因为没有将hadoop目录环境变量,所以以下命令需要在/usr/local/Cellar/hadoop/2.8.0/libexec/sbin目录下运行。
1 | start-dfs.sh |
1 | hdfs namenode -format |
1 | hdfs dfs -mkdir /user |
建立好目录后可以使用hadoop命令进行查看了
hadoop fs -ls /user/$(whoami)
1 | jps |
启动后可以在本地浏览器访问以下地址:
利用自带的java程序测试,官方给了一个计算单词个数的代码也可以测试
###建立测试文件上传到HDFS中
在本地建立文件,我创建的文件与内容如下
file01
Hello World Bye World dfss
dfsa
file02
hello test
dfs0
上传文件命令
1 | hdfs dfs -put /User/liuce/input input #修改自己文件目录 |
可以在刚才创建的目录下看到刚才上传的文件:/user/$(whoami)/input #input自动生成的
自带demo程序目录在
/usr/local/Cellar/hadoop/2.8.0/libexec/share/hadoop/mapreduce
运行测试程序
1 | hadoop jar ./hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+' |
测试程序是计算以dfs单词的个数,结果记录在/user/$(whoami)/out/part-r-00000
删除刚才生成的文件
1 | hdfs dfs -rm -r /user/$(whoami)/input |
在推荐两种快速的方式
安装docker,基于docker的hadoop
1 | docker pull sequenceiq/hadoop-docker:2.7.1 |
虚拟机直接启动
访问网站 https://bitnami.com/ 搜索hadoop下载镜像,直接用相应的虚拟机启动。
运行hadoop启动命令就可以了,这种方式也可以方便搭建集群环境。
块存储:是以扇区为基础的,一个或连续的扇区组成一个块,概念来自于物理存储。
文件储存:是多个物理块组成逻辑块后形成文件存储,根据不同的概念及驱动形成入nfs,ext4等文件系统。
对象存储:结合上面两个优点,增加了元数据(metadata)服务器。
这里有个知乎上不错的回答:http://www.zhihu.com/question/21536660
推荐生产环境ceph使用块存储、对象存储
文件级备份:
文件级备份是指在指定某些文件进行备份时,首先会查找每个文件逻辑块,其次物理块,由于逻辑块是分散在物理块上,而物理块也是分散在不同扇区上。需要一层一 层往下查找,最后才完成整个文件复制。文件级备份时比较费时间,效率不高,实时性不强,备份时间长,且增量备份时,单文件某一小部份修改,不会只备份修改 部份,而整个文件都备份。
块级备份:
块级备份是指物理块复制,效率高,实时性强,备份时间短,且增量备份时,只备份修改过的物理块。
hadoop:分布式存储主要适用于一次写入多次读取的场合(后续可能会增加其他数据处理方式),有数据块的概念(64M为一块,可配置),将大文件分割为多个块进行存储;namenode内存中存放datanode数据索引,存储大小瓶颈来自namenode内存大小。
ceph:支持块存储、文件存储、对象存储;与hadoop相似的是块存储,不过更接近于物理块的概念;ceph的块驱动基于RBD(介绍http://www.sebastien-han.fr/blog/2016/03/28/ceph-jewel-preview-ceph-rbd-mirroring)
hadoop的存储也可以换成ceph的块存储不过性能可能会下降。
elasticsearch:更接近于nosql的数据库,不过分布式存储也是切片保存数据(介绍https://kibana.logstash.es/content/elasticsearch/principle/);查询的时候还有hadoop-elasticsearch插件感觉上是将logstash替换为了hadoop(理解的不知道对不对)。
以上是工作中接触过的一些分布式存储的系统,要是想更深层次的理解一些知识还是要看一些理论行的东西如CAP,数据一致性存储等。
以上有什么说的不对的请指正,大家共同学习。
]]>感知机是二分类的线形分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。
定义:假设输入空间(特征空间)是$x \subseteq R^n $,输出空间是$Y={+1,-1}$。输入$x \in \chi$表示实例的特征向量,对应于输入空间(特征空间)的点;输出$y \in Y$实例的类别。由输入空间到输出空间的如下函数
$$f(x) = sign(w.x+b)$$
称为感知机。其中,w和b为感知机模型参数,$w \in R^n$叫做权值(weight)或权值向量(weight vector),$b \in R$叫作偏置(bias),w.x表示w和x的内积。sign是符号函数,即
$$
\begin{equation}
sign(x)=\begin{cases}
+1& x\ge0\\
-1& x<0
\end{cases}
\end{equation}
$$
输入:训练数据集$T={(x_1,y_1),(x_2,y_2,)…(x_N,y_N)}$,其中$x_i \in \chi=R^n,y_i \in Y={-1,+1}$,i=1,2,…N;学习率$\eta(0<\eta\leq1)$;
输出:w,b;感知机模型$f(x)=sign(w*x + b)$.
$$
w \gets w+\eta y_{i}x_i\\
b \gets b+\eta y_i
$$
解释:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整w,b的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。
]]>Sigmoid函数的输入记为z,下面公式用于确定z:
$$
z = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2} + …+ w_{n}x_{n}
$$
书上用的梯度上升算法确定系数w的数值。
$$
w = w + \alpha\delta f(w)
$$
该算法一直迭代找出w的系数,代码里是w(n,1),$\alpha = 0.001$ 循环500次得出系数矩阵。
该函数二维上就是在一些散点中画一条线来划分出不同的特征点,我们要找W就是这条线的系数。
书上给的给出的代码例程不能很好的运行,我做了简单的修改最后结果如下图:
修改过的源码上传到我的GitHub了地址
因为这个解法要迭代全部数据计算量比较大,后面的优化都是为了减少计算量做的比较好理解了就不在这里说明了。
]]>故障原因为:新旧节点的qemu版本存在差异。
1 | rpm -qa | grep kvm |
qemu-kvm-2.5.1-1.1.el7.x86_64
libvirt-daemon-kvm-1.3.1-1.el7.centos.es.x86_64
qemu-kvm-common-2.5.1-1.1.el7.x86_64
1 | rpm -qa | grep kvm |
qemu-kvm-2.5.1-1.el7.es.x86_64
libvirt-daemon-kvm-1.3.1-1.el7.centos.es.x86_64
qemu-kvm-common-2.5.1-1.el7.es.x86_64
openstack虚机热迁移节点要求(摘录三条):
源和目标节点的 CPU 类型要一致。
源和目标节点的 Libvirt 版本要一致。
源和目标节点能相互识别对方的主机名称,比如可以在 /etc/hosts 中加入对方的条目。
迁移失败原因是第2条不满足。
升级qumu版本后解决,blog留作记录。
网上查找发现对于此问题的解释多是因为socket,web连接问题。后经排查后发现stmp协议使用的端口号是25:这里贴一段关于SMTP协议的介绍STMP协议介绍
下面连接邮件服务器一定要写上邮件端口号251
smtp.connect(smtpserver,"25")
最近在腾讯视频上看了部韩国电影《铁线虫入侵》仔细回想发现之前看过不少类似韩国灾难电影这里一并推荐出来吧。
关于人体寄生虫的故事
讲传染病的故事,让人想起之前的非典不过电影比较夸张
号称亚洲首部丧尸片
类似井下求生的故事
大家一起打怪兽
讲述核电站核泄漏的故事
]]>之前公司安全团队用ELK来收集ngnix,tomcat,防火墙等的接入日志来做一些安全风控的告警操作,接手后有次报告说有个IP的机器一直没有产生日志出来,因此做了简单的排查顺便在熟悉下架构。
公司用的审计接入日志的ELK架构图如下:
架构基本属于主流的应用不过logstash吐日志分别到Kafka集群和ossec集群,这样做的目的是Kafka用来削峰,ossec用来做安全分析发现问题后用告警平台发送相应信息到责任人。
因为是在kibana展示上发现部分日志未展示,所以我们先检查了所有logstash shipper节点的日志情况发现日志时间戳连续没问题,es集群里缺少相应时间的部分日志,之后ossec上查看发现有部分日志缺失判定是logstash吐日志出现问题。
排查shipper各个节点时发现一台机器的logstash进程down了,重启后问题解决。
建议后期监控logstash进程或者修改配置。
]]>