
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
监控平台的使用对于软件程序员维护软件运行是有很大的帮助作用的,而本文我们就通过案例分析来简单了解一下,监控平台架构与应用方法。
1.监控数据结构优化
海量的监控数据实时地从各个服务器上报到监控引擎中。先我们要保证监控数据尽可能的小:这样才能传输的更快、更多。
不需要的数据不要上报
采用ProtoBuf序列化,尽可能的降低数据序列化带来的性能消耗,保证序列化后的数据的体量要小
2.连续的内存还是分布的内存
监控引擎接收到上报的监控数据后,先要将数据缓存到内存中,这时有两种选择:一直连续写?分布并行写?孰优孰劣?
一直连续写:内存相对来说是连续的,但这是暂时的,当数据到达一定数量后,很多集合要Double扩容,内存瞬间的压力会很大!同时,数据写入是并发的,要保证线程安全,防止写入失败!
分布并行写:以空间换时间,同时降低了并行写入产生的锁争用问题,同时可以避免内存Double、频繁扩容的问题,的劣势就是,内存占用多一点,需要实现内存的分布式管理
监控数据必须快速、及时的得到处理,实时性要求很高,同时,内存的成本基本可控,因此,我们选择了分布并行写的策略!
3.内存存储的Sharding设计
在内存存储的设计上,我们借鉴了数据库Sharding的思路。为什么要做Sharding?假如将所有的监控数据都存储在一个内存集合中,每一类监控项在采样时,都要访问这个内存集合,线程争用很大,
必须加锁控制,此时会产生类似数据库阻塞的“内存线程阻塞”。因此:
按监控项做垂直拆分:每个监控项拥有自己单独的内存存储空间。内存的ShardingKey就是监控项。这样的设计,提升了内存操作的并行度,同时减少了锁争用。采样的各个线程操作各自的内存,只有线
程内存的计算处理,采样线程间没有交叉争用。一个监控项一个内存存储后,数据写入和采样数据读取依然有线程争用问题!数据在实时不断的写入,同时采样线程在实时指定TimeWindow的数据进行采样。
继续优化改进。
按时间做水平拆分:每一个监控项一个内存存储,同时再按分钟进行水平拆分,每分钟又是一个单独的子存储。即一个内存槽下60个槽点。每分钟一个槽点。
此时,监控数据接收时,先根据监控数据对应的监控项,定位到对应的内存槽,二步根据监控数据上的时间,定位到具体分钟槽点。数据写入的速度又提升了。同时,采样线程读取指定TimeWindow
下的数据时,可以快速根据时间纬度,找到指定的槽点。读取的速度也提升了!
4.内存中读写分离设计
将内存中监控数据的读写分开,降低数据的读写争用。
数据写线程:实时并行写入各个内存槽和槽点中(监控项和时间纬度)
采样读线程:读取指定监控项对应的TimeWindow下的数据。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。