log4net异步写入日志_微信支付万亿日志在Hermes中的实践

097f88d560a3ac9c454990b9183aaadb.png
导语 | 微信支付日志系统利用 Hermes 来实现日志的全文检索功能,自从接入以来,日志量持续增长。目前单日入库日志量已经突破万亿级,单集群日入库规模也已经突破了万亿,存储规模达 PB 级。本文将介绍微信支付日志系统在 Hermes 上的实践,希望与大家一同交流。文章作者:宋新村,腾讯大数据高级运维工程师。

一、业务规模

目前微信支付日志单日最大入库总量已达到万亿级,单日入库存储量达 PB 级,而在春节等重大节假日预计整个日入库规模会有进一步的增长。

微信支付日志业务采用的 Hermes 集群,单集群日入库规模也已经突破了万亿级每天,节点部署有二百多台,单集群存储总量达到 PB 级。另外,每天的检索查询并发在 6000 左右:

0c03145543ac0f12f2dac114555e5134.png

在如此海量日志存储规模下,整个微信支付日志查询 SLA 达到了 4 个 9,95% 的耗时小于 5s。

6d69dfec0045419f7caa97d534b00248.png

二、存算分离

a22ac65336d3e1852c2151e3ec285d65.png

Hermes 底层存储采用 HDFS 来实现,所有的存储相关的策略都由专业的 HDFS 的能力来提供,包括:

1. 数据多副本容灾


日志默认存储 2 副本容灾,针对历史数据可以灵活的降低副本来减少存储成本,而针对非常重要的日志数据也可以灵活的增加副本来提高数据容灾能力。

2. 磁盘故障容错

单磁盘或单机故障 HDFS 可自动迁移副本,整个容错过程对上层计算层透明。

3. 冷热分级

利用 HDFS 提供的异构存储能力,结合 Hermes 本身的按天分区存储,可以非常方便的实现数据的冷热分级。冷热分级后的数据对上层业务透明,业务无需关注数据本身的存储情况

4. EC编码


HDFS 3.0 版本之后支持 EC 编码,进一步降低存储成本,目前暂时未在线上实践。

通过采用这种存算分离的架构,一方面可以简化上层的计算层的设计;另一方面计算层计算索引的时候只需计算单份即可实现多副本容灾,从而极大的减少计算层的 CPU、内存资源消耗,使得写入 QPS 成倍提升。

三、异步索引合并

Hermes 本身采用类 LSM 的数据写入模式,数据先写入内存+WAL,积累到一定数量后再批量刷写到 HDFS 进行持久化存储。节点故障时,系统通过回滚 WAL 进行数据恢复,从而确保整个写入为高效的顺序写入。

这种高效的写入方式带来的一个问题就是:随着数据的不断刷写,会产生大量的小的索引,从而对查询和 HDFS 存储造成较大的压力。

Hermes 本身会不断的对小的索引进行合并,降低索引文件的个数;而在夜间低峰期,我们也会对历史的分区数据进行一次较大的合并粒度,从而尽可能的提高整个系统的查询效率。微信支付业务的合并时间点选取的是凌晨 2~6 点,避开了凌晨 0~1 点的除夕红包高峰。

0daf3c4300fe8b62286d6bdd198dd12b.png

四、索引与数据分离

日志等业务场景的一个重要的特点就是:先按照分词+字段信息进行检索,然后拉取完整的一整行日志进行分析。

针对这种场景,传统的列存往往存在行存信息获取效率较低,而索引和数据混存又会存在合并索引时读写 IO 放大严重的问题。

为此,Hermes 除了会对日志进行分词构建索引之外,还可以额外配置存储一份完整的日志行存信息:

7bc131d4413c68497c3cfd0b710c5f7d.png

如上图所示,通过将索引和数据分离存储,索引目录里只存储倒排索引,行数据里同一个分片里每个索引目录相应的行数据。通过每个索引目录的 Offset 和 RowId,在 RowData 中读取结果数据。

通过索引和数据的分离,索引目录刷盘次数和个数降低 68%,内存使用量降低 70%,磁盘使用量降低 14%,检索性能提升 80%。

c53fc22b0fef9f3b23631b3a638d7f6b.png

五、存储冷热分级

微信支付 90% 的日志模块都是数据量非常小的长尾模块。因此适当的引入一些高性能的 SSD 设备来加速这些存储较小的业务的查询是非常合适的,而为了可以尽可能的减少 SSD 的成本,需要对业务的数据进行冷热分级。

Hermes 本身的数据冷热分级是利用 HDFS 的异构存储能力来实现的,通过配置不同的副本放置策略,可以灵活的指定副本使用的存储类型,而整个过程对上层业务透明。

HDFS 异构存储策略如下所示:

538688f88275e23596d3fa3456c3e2e4.png

HDFS 异构存储在 Hermes 中的实践:

e1dbc505efbac6e2aac134465ea34278.png

六、历史分区副本降级

Hermes 底层存储采用 HDFS 多副本来进行数据容灾,一般默认会存储两副本。目前微信支付的日志最长的保存周期为 30 天,存储数据量非常大。

为了尽可能的降低业务的存储成本,在同业务协商沟通之后,了解到一般三天之前的日志的查询需求很低,对于日志的稳定性可以降低一些,因此 Hermes 运维侧直接对三天前的数据进行例行降副本操作,从而使得整个存储的成本直接降低 70% 以上,整个降副本操作对上层计算层和业务层都是透明的,业务对此没有任何感知。

7375b3696e529733f719737f807316d1.png

七、日志批量导出

微信支付的同事经常会有批量导出指定时间段的命中某些关键词的日志的需求:

1ff6fb2df356db5304396f9b37e711bd.png

为此 Hermes 提供批量异步导出日志到 HDFS 等存储介质的功能,用户提交导出请求后,系统会把所有命中的日志导出一份到 TDW HDFS 上面,用户再用 TDW HDFS 客户端或者通过 Hermes 的接口机拖走就行。


TDW HDFS 上面用户的日志导出文件:

c9a4d2bc3334653c254d2b44222b9a0c.png

八、结语

微信支付接入 Hermes 以来,日志量规模从最初的百亿规模增长至现在的万亿级规模,对整个 Hermes 本身的存储能力、扩展能力、容灾能力和资源规划能力都持续提出挑战。

好在 Hermes 本身优秀的存储架构使得可以在海量业务数据规模下灵活的对业务的数据进行翻转腾挪,从而从容的应对业务持续提出的各种挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Axis2调用Web Service

本文作为使用Axis2创建Web Service的后篇,主要介绍如何使用Axis2调用Web Service。有关准备工作详情请参考前篇的内容。 在Eclipse的Packge Explorer中右键点击New,选择Other项,新建一个Axis2 Code Genrateor向导。点击Next,打开向…

LeetCode 旋转数组 系列

旋转数组系列,多数是排序数组进行了旋转,可以使用二分查找。做一个集合,如还有缺失的,可以留言指出,一起加油! LeetCode 33. 搜索旋转排序数组(二分查找) LeetCode 81. 搜索旋转排…

如何并行运行程序

参考了官方文档, torch.nn.parallel.DataParallel 以及https://zhuanlan.zhihu.com/p/102697821 在运行此DataParallel模块之前,并行化模块必须在device_ids [0]上具有其参数和缓冲区。在执行DataParallel之前,会首先把其模型的参数放在devi…

matlab打开笔记本摄像头_matlab窗口调用摄像头

更改”.m“文件:function varargout untitled1(varargin)% UNTITLED1 MATLAB code for untitled1.fig% UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing% singleton*.%% H UNTITLED1 returns the handle to a new UNTITLED…

session过期后登陆页面跳出iframe页面问题

登陆页面增加javascript:function window.onload(){if(window.parent.length>0)window.parent.locationlocation;}转载于:https://www.cnblogs.com/shenyunjun420/archive/2009/09/29/1576400.html

LeetCode 1143. 最长公共子序列(动态规划)

1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新…

【DKN】(四)train.py

内容 try: #不用多言, 获得该模块下的model_name函数Model getattr(importlib.import_module(f"model.{model_name}"), model_name)config getattr(importlib.import_module(config), f"{model_name}Config") except AttributeError:print(…

用promise封装ajax_ES6-promise封装AJAX请求

【摘要】ES6-promise封装AJAX请求考必过小编为大家整理了关于ES6-promise封装AJAX请求的信息,希望可以帮助到大家!ES6-promise封装AJAX请求标签:const状态码setreject对象响应状态ISErequest// 接口地址:https://api.apiopen.top/getJoke// 1…

REST和SOAP Web Service的比较(写得非常清晰易懂,转载于此)

本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系!REST似乎在一夜间兴起了,这可能引起一些争议,反对者可…

LeetCode 1249. 移除无效的括号(栈+set / deque)

1. 题目 给你一个由 (、) 和小写字母组成的字符串 s。 你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。 请返回任意一个合法字符串。 有效「括号字符串」应当符合以下 任意一条 要求&…

【DKN】(七)dataset.py【未完】

内容 里面有的函数在这里https://blog.csdn.net/qq_35222729/article/details/119882362 try:config getattr(importlib.import_module(config), f"{model_name}Config") except AttributeError:print(f"{model_name} not included!")exit()class BaseDa…

php raabitmq中间件_rabbitMQ消息中间件环境配置及原理了解

视频教程一、Docker 入门Docker是什么?Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任 何流行的 Linux 机器上。为什么要使用 Docke…

CSS 中的定位:relative,absolute

今天碰到一个定位问题,问题解决不好,于是花了大量的时间,调试了好久,得出了一些结果:1、如果有两个不交叉的盒子位于一个大盒子里面,位于上边的盒子的定位为relative,而下边的那个盒子的定位则是…

【DKN】(六)KCNN.py

内容 import torch import torch.nn as nn import torch.nn.functional as F from src.model.general.attention.additive import AdditiveAttentiondevice torch.device("cuda:0" if torch.cuda.is_available() else "cpu")class KCNN(torch.nn.Module):…

北京精雕现状_6秒精密加工,日本走下神坛,北京精雕也做了一个!

各位社友还记得吗,机械社区之前分享过——日本6秒的精密加工火遍制造业圈子~▲点击上图 查看日本怎么用6s让世界惊奇在一阵惊呼赞叹中,一部分人也表示不服!比如,国内一位牛人也展示了他的产品。一起看看视频介绍吧——而近日&…

LeetCode 859. 亲密字符串

1. 题目 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。 示例 1: 输入: A "ab", B "ba" 输出&#xff1a…

ASP.Net快速开发新闻系统 在线播放

http://www.so138.com/sov/d19a5913-88cf-4abf-a487-69293bb0c403.html转载于:https://www.cnblogs.com/freedom831215/archive/2009/10/03/1577631.html

【DKN】(五)attention.py

感觉还是挺简单,这里只是方便之后回来瞅瞅 import torch import torch.nn as nn import torch.nn.functional as Fclass Attention(torch.nn.Module):"""Attention Net.Input embedding vectors (produced by KCNN) of a candidate news and all of…

小米扫地机器人充电座指示灯不亮_小米扫地机器人常见问题处理 充电后无法取电怎么办?...

与其他科技领域一样,人工智能领域也得到蓬勃发展。如今人工智能已经无处不在。专家把人工智能比作电力,因为它是一种可能改变各行各业的资源。诚然,每个领域都有一些特别重要的技术,例如随着生活的水平的提高,扫地机器…

Enterprise Library 4.1 快速上手(图)

简介: 关于Enterprise Library 的概念,网上可以很容易的找到,在这里要做的是如何快速的打通Enterprise Library 4.1的使用, 让咱们可以用最短的时间使用起来,并且在需要的时候在此基础上再花时间延伸,这是学…