一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种集群环境下告警日志的记录方法、装置、设备及产品与流程

2022-02-20 14:25:28 来源:中国专利 TAG:


1.本发明涉及微服务技术领域,尤其涉及一种集群环境下告警日志的记录方法、装置、设备及产品。


背景技术:

2.微服务架构很大程度上解决了传统单体架构带来的高部署成本、高改动成本、低部署频率等问题,微服务的快速扩容、弹性伸缩等特性也与目前火热的容器与云计算技术十分投契,但微服务的引入使得应用的部署数量上升为多个,系统的复杂度成倍提升,出现问题后的排查难度也随之提升,因此对于微服务系统而言,日志的合理记录就变的十分重要,因为漏洞(bug)的解决,数据的统计等都要依赖日志进行。
3.通常情况下,分布式及集群环境下的日志收集工作可以使用elk (elastic search、logstash、kibana)完成,但elk本身较复杂,在技术层面,其组件数量多,学习、部署和维护的成本均比较高;在业务层面,在集群环境中,每个集群节点都会向外上报告警消息,各节点中同一条告警日志的序号是全局唯一的,各节点上报的告警日志序号在节点内部是有序递增的,但各节点之间的告警日志序号是无序的且会出现重复,因此需要对所有节点上报的无序重复告警日志进行有序无重复的记录,elk没有提供可行的解决方案,仍然需要对 logstash进行定制化开发。
4.因此,鉴于业内常用的elk与记录告警日志需求的不契合,需要提供一种新的集群环境下告警日志记录方案。


技术实现要素:

5.本发明提供一种集群环境下告警日志的记录方法、装置、设备及产品,用以解决现有技术中elk与记录告警日志需求的不契合的缺陷,实现在部署的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。
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.初始化模块,用于初始化所述记录者节点的文件引用和最大告警序号计数器;其
中,所述文件引用指向第一告警日志文件,所述第一告警日志文件为正在书写的且用于记录所述告警日志的文件,所述最大告警序号计数器的值为目前已记录的最后一条告警日志的序号;
33.记录模块,用于拉取已上报的所述告警日志,并根据已拉取的所述告警日志的序号的值与所述最大告警序号计数器的值的对应关系,通过所述文件引用将所述告警日志记录至所述第一告警日志文件中。
34.本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种集群环境下告警日志的记录方法的步骤。
35.本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种集群环境下告警日志的记录方法的步骤。
36.本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种集群环境下告警日志的记录方法的步骤。
37.本发明提供的集群环境下告警日志的记录方法、装置、设备及产品,关于告警日志的收集放弃使用elk,通过在部署的集群环境中选举出记录者节点,通过该记录者节点拉取所有节点上报的告警日志,并根据已拉取的告警日志的序号的值与最大告警序号计数器的值的对应关系,通过文件引用记录告警日志,在不额外引入复杂度的同时,高可用且高性能的完成告警日志的记录,实现在部署的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。
附图说明
38.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
39.图1是本发明提供的集群环境下告警日志的记录方法的流程示意图;
40.图2是本发明提供的集群环境下告警日志的记录方法中步骤 s200具体的流程示意图;
41.图3是本发明提供的集群环境下告警日志的记录方法中步骤 s300具体的流程示意图;
42.图4是本发明提供的集群环境下告警日志的记录方法中步骤 s500具体的流程示意图;
43.图5是本发明提供的集群环境下告警日志的记录装置的结构示意图;
44.图6是本发明提供的集群环境下告警日志的记录装置中加锁模块具体的结构示意图;
45.图7是本发明提供的集群环境下告警日志的记录装置中上报模块具体的结构示意图;
46.图8是本发明提供的集群环境下告警日志的记录装置中记录模块具体的结构示意图;
47.图9是本发明提供的电子设备的结构示意图。
具体实施方式
48.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
49.通常情况下,分布式及集群环境下的日志收集工作可以使用elk 完成,但elk本身较复杂,在技术层面,其组件数量多,学习、部署和维护的成本均比较高;在业务层面,对所有节点上报的无序重复告警日志进行有序无重复的记录,elk没有提供可行的解决方案,仍然需要对logstash进行定制化开发。
50.下面结合图1描述本发明的集群环境下告警日志的记录方法,该方法包括以下步骤:
51.s100、部署集群环境,该方法的集群环境中部署有缓存中间件。优选的,缓存中间件为redis(远程字典服务)。该方法的集群环境中还部署了消息中间件kafka以及处理线程的工具包juc等组件。
52.s200、确定集群环境的节点中的记录者节点,即选举出集群环境所有节点中的记录者节点,该记录者节点用于进行告警日志的记录。
53.s300、所有节点向记录者节点上报告警日志。
54.s400、初始化记录者节点的文件引用file和最大告警序号计数器。该方法中,文件引用file指向第一告警日志文件,第一告警日志文件为正在书写的且用于记录告警日志的文件;最大告警序号计数器的值为目前已记录的最后一条告警日志的序号,同时,该序号也是目前已记录的告警日志的最大序号。
55.s500、拉取已上报的告警日志,并根据已拉取的告警日志的序号的值与最大告警序号计数器的值的对应关系,通过文件引用file将告警日志记录至第一告警日志文件中。
56.为了提高在第一告警日志文件中进行历史告警信息搜索的效率,对每个第一告警日志文件的大小进行了限制,同时,将第一告警日志文件的命令规律为alarm-n.log,n为该第一告警日志文件中记录的第一条告警日志对应的序号的值。当第一告警日志文件的大小超出预设大小时,按照第一告警日志文件的命名规律生成下一个(新的)告警日志文件并更新文件引用file,即生成了第二告警日志文件,并且将该第二告警日志文件作为第一告警日志文件,由于该第二告警日志文件作为第一告警日志文件后供后续拉取的告警日志写入,可以理解的是,此时文件引用file指向的就是该第二告警日志文件。
57.本发明的集群环境下告警日志的记录方法,关于告警日志的收集放弃使用elk,通过在部署的集群环境中选举出记录者节点,通过该记录者节点拉取所有节点上报的告警日志,并根据已拉取的告警日志的序号的值与最大告警序号计数器的值的对应关系,通过文件引用 file记录告警日志,在不额外引入复杂度的同时,高可用且高性能的完成告警日志的记录,实现在部署的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。并且,可以为集群或分布式环境下的告警日志记录提供一种轻量级的解决思路。
58.本发明的集群环境下告警日志的记录方法,具体的是通过部署在集群环境中的分
布式锁、缓存中间件redis、消息中间件kafka以及处理线程的工具包juc的阻塞队列的协同配合,在不额外引入复杂度的同时,高可用且高性能的完成告警日志的记录,实现了在部署上述组件的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。
59.下面结合图2描述本发明的集群环境下告警日志的记录方法,步骤s200具体包括以下步骤:
60.s210、集群环境的所有节点通过缓存中间件redis竞争分布式锁。
61.s220、竞争成功的节点为记录者节点,且,记录者节点开启守护线程。且,在该方法中,竞争成功的节点具有预设锁有效期,守护线程为每隔预设时间后对分布式锁重新设置预设锁有效期。
62.s230、竞争失败的节点在预设休眠时间内进行休眠(sleep),并在预设休眠时间结束后(sleep结束后)重新竞争分布式锁。
63.以预设锁有效期为30秒,预设时间为10秒,预设休眠时间为 10秒举例说明。在步骤s200中,集群启动时,所有节点都通过缓存中间件redis的setnxex命令竞争分布式锁即加锁,锁键值对的值为每个节点随机生成的通用唯一识别码(universally uniqueidentifier,uuid),由于缓存中间件redis的单线程特性,有且只有一个节点能成功设置,此时认为成功竞争到键值对的节点为记录者节点,因此该记录者节点在整个集群环境中只有一个,并由该记录者节点负责记录所有节点上报的告警日志,竞争失败的节点会休眠10秒,休眠结束后再次尝试加锁。
64.节点争到锁时即持有锁时会具有30秒的锁有效期,同时持有锁的节点会开启守护线程,守护线程每10秒对锁重新设置30秒的有效期。因此,即使记录者节点宕机后,最多30秒后,其持有的锁会因为过期而自动释放,集群环境中的其他节点可以再次竞争出新的记录者节点。
65.下面结合图3描述本发明的集群环境下告警日志的记录方法,步骤s300具体包括以下步骤:
66.s310、节点从本地第一队列中拉取用户的告警日志。在该方法中,本地第一队列为消息中间件kafka中的队列queue1。
67.s320、当节点接收到用户的告警同步请求后,将拉取到的告警日志存放至本地第二队列。在该方法中,本地第二队列为本地共享的处理线程的工具包juc中的阻塞队列queue2。
68.s330、缓存中间件的第三队列获取存放在本地第二序列的告警日志。在该方法中,缓存中间件redis的第三队列为缓存中间件redisserver中的队列queue3。
69.步骤s300中,对所有节点而言,告警日志的来源是同一个消息中间件kafka中的队列queue1。因此,当有告警日志产生后会存放在消息中间件kafka中的队列queue1的尾部,当集群启动后,节点上部署的告警管理应用开始对外提供服务,当某节点收到一个用户的告警同步请求后,该节点将从该用户上次告警同步期间同步的最后一条告警日志的下一条告警日志开始,发送告警日志给用户;如果该用户是首次登录,则从消息中间件kafka中的队列queue1的头部即第一条告警日志开始,依次顺序地为该用户同步所有的告警日志。
70.每个用户与节点建立的连接都是一个独立的线程,每个连接在连接保持期间发送给对应的用户的每条告警日志最终都要上报给记录者节点进行日志记录,在线程内部上报
的流程如下:
71.节点从kafka队列queue1拉取告警后,在发送告警日志给对应的用户后,将该告警日志写进一个本地共享的处理线程的工具包juc中的阻塞队列queue2中,循环此流程,并继续拉取下一条告警;
72.每个节点在启动时会开启一个获取线程,该获取线程尝试从本地共享的处理线程的工具包juc中的阻塞队列queue2中获取告警日志,获取到告警日志后,会发送至缓存中间件redisserver中的队列queue3。
73.当本地共享的处理线程的工具包juc中的阻塞队列queue2中无数据时线程会挂起避免忙循环,当本地共享的处理线程的工具包juc中的阻塞队列queue2有告警日志会重新唤醒获取线程。通过本地共享的处理线程的工具包juc中的阻塞队列queue2进行一次中转可以避免在给用户同步告警日志时频繁与缓存中间件redis交互影响吞吐量,即先将已发送给用户的告警日志存放到本地队列后再异步的发送至缓存中间件redis。
74.经过步骤s100至步骤s400的处理后,告警日志的记录者节点已被选定,待记录的全部告警日志也已存放在了缓存中间件redisserver中的队列queue3。下面结合图4描述本发明的集群环境下告警日志的记录方法,步骤s500具体包括以下步骤:
75.s510、记录者节点从第三队列拉取并移除告警日志,步骤s510可以理解为批量地从缓存中间件redisserver中的队列queue3的头部拉取并移除n条告警日志,此过程通过缓存中间件redis进行确保拉取和移除的原子性。
76.拉取到n条告警日志后,假设当前告警日志的序号的值为b,已记录的最大告警序号计数器的值为a,在每条告警日志记录前都需要比较自身序号b与已记录的最大告警序号计数器的值a,不同的比较结果有不同的处理方式:
77.s520、若当前告警日志的序号的值不大于最大告警序号计数器的值时(b≤a),舍弃当前告警日志。当步骤s520的情况出现时,表示该告警日志在当前用户登录之前已被发送给别的用户,且该告警日志已被记录进日志文件,因此直接舍弃该告警日志,不计入告警日志文件中。
78.s530、若当前告警日志的序号的值为最大告警序号计数器的值加一时(b=a 1),通过文件引用file将当前告警日志追加写入第一告警日志文件的最后一行,且,将最大告警序号计数器的值加一。当步骤s530的情况出现时,通过文件引用file将序号为b告警日志追加写入第一告警日志文件的最后一行,并将最大告警序号计数器的值a更新为a 1。
79.s540、若当前告警日志的序号的值大于最大告警序号计数器的值加一时(b》a 1),将序号为当前告警日志的序号的值减一(b-1)至最大告警序号计数器的值加一(a 1)对应的所有告警日志补写到第一告警日志文件的末尾,之后,通过文件引用file将当前告警日志追加写入第一告警日志文件的最后一行,且,将最大告警序号计数器的值更新为当前告警日志的序号的值。步骤s540的情况很少出现,出现时一般代表网络抖动导致告警日志从本地共享的处理线程的工具包juc中的阻塞队列queue2发送至缓存中间件redisserver中的队列queue3的请求失败,因此,首先需要通过数据库查询并补写序号a 1至b-1的所有告警日志,在补写完成后,再通过文件引用file将序号为b告警日志追加写入第一告警日志文件的最后一行,并将最大告警序号计数器的值a更新为b。
80.可以理解的是,步骤s500中,在拉取的n条告警日志全部写入后,检测此时的第一
告警日志文件的大小是否超出预设大小,若超出,按照第一告警日志文件的命名规律生成下一个(新的)告警日志文件并更新文件引用file,即生成了第二告警日志文件,并且将该第二告警日志文件作为第一告警日志文件,此时文件引用file指向的就是该第二告警日志文件,后续再拉取的告警日志将写入到该第二告警日志文件也就是新的第一告警日志文件中。
81.下面对本发明提供的集群环境下告警日志的记录装置进行描述,下文描述的集群环境下告警日志的记录装置与上文描述的集群环境下告警日志的记录方法可相互对应参照。
82.下面结合图5描述本发明的集群环境下告警日志的记录装置,该装置包括:
83.部署模块100,用于部署集群环境,该装置的集群环境中部署有缓存中间件。优选的,缓存中间件为redis(远程字典服务)。该装置的集群环境中还部署了消息中间件kafka以及处理线程的工具包 juc等组件。
84.加锁模块200,用于确定集群环境的节点中的记录者节点,即选举出集群环境所有节点中的记录者节点,该记录者节点用于进行告警日志的记录。
85.上报模块300,用于通过所有节点向记录者节点上报告警日志。
86.初始化模块400,用于初始化记录者节点的文件引用file和最大告警序号计数器。该装置中,文件引用file指向第一告警日志文件,第一告警日志文件为正在书写的且用于记录告警日志的文件;最大告警序号计数器的值为目前已记录的最后一条告警日志的序号,同时,该序号也是目前已记录的告警日志的最大序号。
87.记录模块500,用于拉取已上报的告警日志,并根据已拉取的告警日志的序号的值与最大告警序号计数器的值的对应关系,通过文件引用file将告警日志记录至第一告警日志文件中。
88.为了提高在第一告警日志文件中进行历史告警信息搜索的效率,对每个第一告警日志文件的大小进行了限制,同时,将第一告警日志文件的命令规律为alarm-n.log,n为该第一告警日志文件中记录的第一条告警日志对应的序号的值。当第一告警日志文件的大小超出预设大小时,按照第一告警日志文件的命名规律生成下一个(新的)告警日志文件并更新文件引用file,即生成了第二告警日志文件,并且将该第二告警日志文件作为第一告警日志文件,由于该第二告警日志文件作为第一告警日志文件后供后续拉取的告警日志写入,可以理解的是,此时文件引用file指向的就是该第二告警日志文件。
89.本发明的集群环境下告警日志的记录装置,关于告警日志的收集放弃使用elk,通过在部署的集群环境中选举出记录者节点,通过该记录者节点拉取所有节点上报的告警日志,并根据已拉取的告警日志的序号的值与最大告警序号计数器的值的对应关系,通过文件引用file记录告警日志,在不额外引入复杂度的同时,高可用且高性能的完成告警日志的记录,实现在部署的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。并且,可以为集群或分布式环境下的告警日志记录提供一种轻量级的解决思路。
90.本发明的集群环境下告警日志的记录装置,具体的是通过部署在集群环境中的分布式锁、缓存中间件redis、消息中间件kafka以及处理线程的工具包juc的阻塞队列的协同配合,在不额外引入复杂度的同时,高可用且高性能的完成告警日志的记录,实现了在部署上述组件的集群环境中异步无阻塞且有序无重复的记录所有节点上报的告警日志。
91.下面结合图6描述本发明的集群环境下告警日志的记录装置,加锁模块200具体包括:
92.第一加锁单元210,用于集群环境的所有节点通过缓存中间件 redis竞争分布式锁。
93.第二加锁单元220,用于竞争成功的节点为记录者节点,且,记录者节点开启守护线程。且,在该装置中,竞争成功的节点具有预设锁有效期,守护线程为每隔预设时间后对分布式锁重新设置预设锁有效期。
94.第三加锁单元230,用于竞争失败的节点在预设休眠时间内进行休眠(sleep),并在预设休眠时间结束后(sleep结束后)重新竞争分布式锁。
95.以预设锁有效期为30秒,预设时间为10秒,预设休眠时间为 10秒举例说明。在步骤s200中,集群启动时,所有节点都通过缓存中间件redis的setnxex命令竞争分布式锁即加锁,锁键值对的值为每个节点随机生成的uuid,由于缓存中间件redis的单线程特性,有且只有一个节点能成功设置,此时认为成功竞争到键值对的节点为记录者节点,因此该记录者节点在整个集群环境中只有一个,并由该记录者节点负责记录所有节点上报的告警日志,竞争失败的节点会休眠10秒,休眠结束后再次尝试加锁。
96.节点争到锁时即持有锁时会具有30秒的锁有效期,同时持有锁的节点会开启守护线程,守护线程每10秒对锁重新设置30秒的有效期。因此,即使记录者节点宕机后,最多30秒后,其持有的锁会因为过期而自动释放,集群环境中的其他节点可以再次竞争出新的记录者节点。
97.下面结合图7描述本发明的集群环境下告警日志的记录装置,上报模块300具体包括:
98.第一上报单元310,用于通过节点从本地第一队列中拉取用户的告警日志。在该装置中,本地第一队列为消息中间件kafka中的队列 queue1。
99.第二上报单元320,用于当节点接收到用户的告警同步请求后,将拉取到的告警日志存放至本地第二队列。在该装置中,本地第二队列为本地共享的处理线程的工具包juc中的阻塞队列queue2。
100.第三上报单元330,用于通过缓存中间件的第三队列获取存放在本地第二序列的告警日志。在该装置中,缓存中间件redis的第三队列为缓存中间件redis server中的队列queue3。
101.上报模块300中,对所有节点而言,告警日志的来源是同一个消息中间件kafka中的队列queue1。因此,当有告警日志产生后会存放在消息中间件kafka中的队列queue1的尾部,当集群启动后,节点上部署的告警管理应用开始对外提供服务,当某节点收到一个用户的告警同步请求后,该节点将从该用户上次告警同步期间同步的最后一条告警日志的下一条告警日志开始,发送告警日志给用户;如果该用户是首次登录,则从消息中间件kafka中的队列queue1的头部即第一条告警日志开始,依次顺序地为该用户同步所有的告警日志。
102.每个用户与节点建立的连接都是一个独立的线程,每个连接在连接保持期间发送给对应的用户的每条告警日志最终都要上报给记录者节点进行日志记录,在线程内部上报的流程如下:
103.节点从kafka队列queue1拉取告警后,在发送告警日志给对应的用户后,将该告警
日志写进一个本地共享的处理线程的工具包juc 中的阻塞队列queue2中,循环此流程,并继续拉取下一条告警;
104.每个节点在启动时会开启一个获取线程,该获取线程尝试从本地共享的处理线程的工具包juc中的阻塞队列queue2中获取告警日志,获取到告警日志后,会发送至缓存中间件redis server中的队列 queue3。
105.当本地共享的处理线程的工具包juc中的阻塞队列queue2中无数据时线程会挂起避免忙循环,当本地共享的处理线程的工具包juc 中的阻塞队列queue2有告警日志会重新唤醒获取线程。通过本地共享的处理线程的工具包juc中的阻塞队列queue2进行一次中转可以避免在给用户同步告警日志时频繁与缓存中间件redis交互影响吞吐量,即先将已发送给用户的告警日志存放到本地队列后再异步的发送至缓存中间件redis。
106.经过部署模块100至初始化模块400的处理后,告警日志的记录者节点已被选定,待记录的全部告警日志也已存放在了缓存中间件 redis server中的队列queue3。下面结合图8描述本发明的集群环境下告警日志的记录装置,记录模块500具体包括:
107.第一记录单元510,用于通过记录者节点从第三队列拉取并移除告警日志,第一记录单元510可以理解为批量地从缓存中间件redisserver中的队列queue3的头部拉取并移除n条告警日志,此过程通过缓存中间件redis进行确保拉取和移除的原子性。
108.拉取到n条告警日志后,假设当前告警日志的序号的值为b,已记录的最大告警序号计数器的值为a,在每条告警日志记录前都需要比较自身序号b与已记录的最大告警序号计数器的值a,不同的比较结果有不同的处理方式:
109.第二记录单元520,用于若当前告警日志的序号的值不大于最大告警序号计数器的值时(b≤a),舍弃当前告警日志。当第二记录单元520的情况出现时,表示该告警日志在当前用户登录之前已被发送给别的用户,且该告警日志已被记录进日志文件,因此直接舍弃该告警日志,不计入告警日志文件中。
110.第三记录单元530,用于若当前告警日志的序号的值为最大告警序号计数器的值加一时(b=a 1),通过文件引用file将当前告警日志追加写入第一告警日志文件的最后一行,且,将最大告警序号计数器的值加一。当第三记录单元530的情况出现时,通过文件引用file 将序号为b告警日志追加写入第一告警日志文件的最后一行,并将最大告警序号计数器的值a更新为a 1。
111.第四记录单元540,用于若当前告警日志的序号的值大于最大告警序号计数器的值加一时(b》a 1),将序号为当前告警日志的序号的值减一(b-1)至最大告警序号计数器的值加一(a 1)对应的所有告警日志补写到第一告警日志文件的末尾,之后,通过文件引用 file将当前告警日志追加写入第一告警日志文件的最后一行,且,将最大告警序号计数器的值更新为当前告警日志的序号的值。第四记录单元540的情况很少出现,出现时一般代表网络抖动导致告警日志从本地共享的处理线程的工具包juc中的阻塞队列queue2发送至缓存中间件redis server中的队列queue3的请求失败,因此,首先需要通过数据库查询并补写序号a 1至b-1的所有告警日志,在补写完成后,再通过文件引用file将序号为b告警日志追加写入第一告警日志文件的最后一行,并将最大告警序号计数器的值a更新为b。
112.可以理解的是,记录模块500中,在拉取的n条告警日志全部写入后,检测此时的第一告警日志文件的大小是否超出预设大小,若超出,按照第一告警日志文件的命名规律生
成下一个(新的)告警日志文件并更新文件引用file,即生成了第二告警日志文件,并且将该第二告警日志文件作为第一告警日志文件,此时文件引用file指向的就是该第二告警日志文件,后续再拉取的告警日志将写入到该第二告警日志文件也就是新的第一告警日志文件中。
113.图9示例了一种电子设备的实体结构示意图,如图9所示,该电子设备可以包括:处理器(processor)810、通信接口(communicationsinterface)820、存储器(memory)830和通信总线840,其中,处理器810,通信接口820,存储器830通过通信总线840完成相互间的通信。处理器810可以调用存储器830中的逻辑指令,以执行集群环境下告警日志的记录方法,该方法包括以下步骤:
114.s100、部署集群环境;其中,所述集群环境中部署有缓存中间件;
115.s200、确定所述集群环境的节点中的记录者节点;
116.s300、所有所述节点向所述记录者节点上报告警日志;
117.s400、初始化所述记录者节点的文件引用和最大告警序号计数器;其中,所述文件引用指向第一告警日志文件,所述第一告警日志文件为正在书写的且用于记录所述告警日志的文件,所述最大告警序号计数器的值为目前已记录的最后一条告警日志的序号;
118.s500、拉取已上报的所述告警日志,并根据已拉取的所述告警日志的序号的值与所述最大告警序号计数器的值的对应关系,通过所述文件引用将所述告警日志记录至所述第一告警日志文件中。
119.此外,上述的存储器830中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。
120.另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的集群环境下告警日志的记录方法,该方法包括以下步骤:
121.s100、部署集群环境;其中,所述集群环境中部署有缓存中间件;
122.s200、确定所述集群环境的节点中的记录者节点;
123.s300、所有所述节点向所述记录者节点上报告警日志;
124.s400、初始化所述记录者节点的文件引用和最大告警序号计数器;其中,所述文件引用指向第一告警日志文件,所述第一告警日志文件为正在书写的且用于记录所述告警日志的文件,所述最大告警序号计数器的值为目前已记录的最后一条告警日志的序号;
125.s500、拉取已上报的所述告警日志,并根据已拉取的所述告警日志的序号的值与所述最大告警序号计数器的值的对应关系,通过所述文件引用将所述告警日志记录至所述第一告警日志文件中。
126.又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的集群环境下告警日志的记录方法,该方法包括以下步骤:
127.s100、部署集群环境;其中,所述集群环境中部署有缓存中间件;
128.s200、确定所述集群环境的节点中的记录者节点;
129.s300、所有所述节点向所述记录者节点上报告警日志;
130.s400、初始化所述记录者节点的文件引用和最大告警序号计数器;其中,所述文件引用指向第一告警日志文件,所述第一告警日志文件为正在书写的且用于记录所述告警日志的文件,所述最大告警序号计数器的值为目前已记录的最后一条告警日志的序号;
131.s500、拉取已上报的所述告警日志,并根据已拉取的所述告警日志的序号的值与所述最大告警序号计数器的值的对应关系,通过所述文件引用将所述告警日志记录至所述第一告警日志文件中。
132.以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
133.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
134.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献