美团数据平台Kerberos优化实战

背景

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户端、服务器端的应用程序提供强大的认证服务。

作为一种可信任的第三方认证服务,Kerberos是通过传统的密码技术(如:共享密钥)执行认证服务的,被Client和Server同时信任。KDC是对该协议中第三方认证服务的一种具体实现,一直以来都是美团数据平台的核心服务之一,在Hive、HDFS、YARN等开源组件的权限认证方面有着广泛的应用。该服务将认证的密钥事先部署在集群的节点上,集群或者新节点启动时,相应节点使用密钥得到认证。只有被认证过节点才能被集群所接纳。企图冒充的节点由于没有相关密钥信息,无法与集群内部的节点通信,从而有效的确保了数据的安全性、节点的可信赖性。

但随着平台业务的快速增长,当前线上KDC的处理能力不足和不能可靠监控的问题被凸显的日益严重:线上单台KDC服务器最大承受QPS是多少?哪台KDC的服务即将出现压力过大的问题?为什么机器的资源非常空闲,KDC的压力却会过大?如何优化?优化后瓶颈在哪儿?如何保证监控指标的全面性、可靠性和准确性?这都是本文需要回答的问题。从本次优化工作达成的最终结果上来看,单台服务器每秒的处理性能提升16倍左右,另外通过共享内存的方式设计了一个获取KDC各项核心指标的接口,使得服务的可用性进一步提升。

为方便大家,表1总结并解释了本文中后续会涉及到一些专业名词的简称:

表1 专业名词解释

图1为美团数据平台KDC当前服务架构,目前整个KDC服务部署在同一个IDC。

图1 KDC主体流程图

KDC原理介绍

Client、 KDC和Server在认证阶段主要有Client和KDC的AS、Client和KDC的TGS以及Client和Server的交互三个过程,下文将详细介绍三个过程的交互,其中图2中的步骤1和2、3和4、5和6分别对应下文的A、B、C三部分:

图2 KDC原理图

A. Client和AS的交互

  1. 用户以明文的形式发送自己的信息、以及想要申请的TGT Principal(默认为KDC的TGT:krbtgt/REALM@REALM)等信息给AS服务;
  2. AS服务验证该用户信息存在数据库中后,给客户端返回两大块信息:
    • 使用用户的密钥加密其申请的TGT和一个Session Key返回用户,用户得到加密信息后,使用自己密钥解密得到其申请的TGT和Session Key(后续都简称 SKCandK)。
    • 以KDC自身密钥加密用户申请的TGT、SKCandK、用户自己信息等;简称{TGT}Ktgs,该部分信息被Client保存在本地。

B. Client和TGS的交互

  1. Client访问TGS获取访问网路中某一Server的ticket请求。Client端会把第一部分中保存在本地的{TGT}Ktgs和用SKCandK加密的客户端信息发送KDC的TGS模块;
  2. TGS收到请求后,检查请求Server存在数据库中后,用自己的密钥解密得到TGT中的SKCandK,然后便可以解密得到用户的信息并验证其合法性;通过后,TGS会生成一个新的Session Key,简称SKCandS;同时返回两部分信息:
    • 用SKCandK加密的SKCandS、能够访问Service的ticket等信息。
    • 用Service密钥加密的Client info、SKCandS等信息,简称{ TService }KService

C. Client和Server的交互

  1. Client拿到访问Service的ticket后,向Service发起请求,同时将两部分信息发送给Server:1)通过SKCandS加密的Client info等信息。2)第二部分TGS返回客户端的{ TService }K Service; =1>
  2. Server端收到Client的请求信息后,用自己的密钥解密获取到TService信息,就能够解密SKCandS加密的客户端信息,和TService中的客户端信息进行对比,通过后,整个KDC认证过程结束,Client和Service进行正常的服务通信。

主要优化工作

通过对KDC原理的分析,很容易判断只有前两部分才可能直接给KDC服务带来压力,因此本文涉及到的工作都将围绕上一部分的前两个环节展开分析。本次优化工作采用Grinder这一开源压测工具,分别对AS、TGS两个请求过程,采用相同机型(保证硬件的一致性)在不同场景下进行了压力测试。

优化之前,线上KDC服务启动的单进程;为最低风险的完成美团和点评数据的融合,KDC中keytab都开启了PREAUTH属性;承载KDC服务的部分服务器没有做RAID。KDC服务出现故障时,机器整体资源空闲,怀疑是单进程的处理能力达到上限;PREAUTH属性进一步保证提升了KDC服务的安全性,但可能带来一定的性能开销;如果线上服务器只加载了少量的keytab信息,那么没有被加载到内存的数据必然读取磁盘,从而带来一定的IO损耗。

因此本文中,对以下三个条件进行变动,分别进行了测试:

  1. 对承载KDC服务的物理机型是否做RAID10;
  2. 请求的keytab在库中是否带有PRAUTH属性;
  3. KDC是否启动多进程(多进程设置数目和物理机核数一致)。(实际测试工作中进行了多次测试)

A. Client和AS交互过程的压测

表2为AS压测的一组平均水平的测试数据,使用的物理机有40核,因此多进程测试启动40个进程。

表2 AS压测

分析表2中的数据,很容易提出如下问题从而需要进一步探索:

1. 比较表2中第一行和第二行、第三行和第四行,主机做不做RAID为什么对结果几乎无影响?

该四组(测试结果为49、53、100和104所在表2中的行)数据均在达到处理能力上限一段时间后产生认证失败,分析机器的性能数据,内存、网卡、磁盘资源均没有成为系统的瓶颈,CPU资源除了某个CPU偶尔被打满,其他均很空闲。分析客户端和服务端的认证日志,服务端未见明显异常,但是客户端发现大量的Socket Timeout错误(测试设置的Socket超时时间为30s)。由于测试过程中,客户端输出的压力始终大于KDC的最大处理能力,导致KDC端的AS始终处于满负荷状态,暂时处理不了的请求必然导致排队;当排队的请求等待时间超过设置的30s后便会开始超时从而认证出错,且伴随机器某一CPU被打满(如图3)。 显然KDC单进程服务的处理能力已经达到瓶颈且瓶颈存在单核CPU的处理能力,从而决定向多进程方向进行优化测试。

图3 单进程KDC打满某一CPU

图4为本次压力测试的一个通用模型,假设KDC单位时间内的最大处理能力是A,来自客户端的请求速率稳定为B且 B>A ;图中黄色区域为排队的请求数,当某一请求排队超过30s,便会导致Socket Timedout错误。

图4 AS处理能力和Client压力模型

2. 比较表2中第1和3行、第2和4行、第7和8行相比,为什么有PREAUTH属性的认证QPS大致是无该属性处理能力的一半?

如果Client的keytab在KDC的库中不带有PREAUTH这一属性,Client发送请求,KDC的AS模块验证其合法性之后返回正确的结果;整个过程只需要两次建立链接进行交互便可完成。如果带有PREAUTH属性,意味着该keytab的认证启动了Kerberos 5协议中的 pre-authentication概念:当AS模块收到Client的请求信息后;故意给Client返回一个错误的请求包,Client会“领悟到”这是KDC的AS端需要进行提前认证;从而Client获取自己服务器的时间戳并用自己的密钥加密发送KDC,KDC解密后和自身所在服务器的时间进行对比,如果误差在能容忍的范围内;返回给Client正确的TGT响应包;过程如图5所示。

图5 库中keytab有无preauth属性的区别

3. 根据对问题2的分析,表2中第5和7行的值的比例应该近似为1:2,为什么第5行的值只有115,结果和理论差距如此之大?

KDC的库中对客户端的keytab开启PREAUTH属性,客户端每认证一次,KDC需要将该次认证的时间戳等信息写到本次磁盘的BDB数据库的Log中;而关闭PREAUTH属性后,每次认证只需要从库中读取数据,只要给BDB数据库分配的内存足够大,就可以最大程度的减少和本次磁盘的交互。KDC40进程且开启PRAUTH,其AS处理能力的QPS只有115,分析机器性能的相关指标,发现瓶颈果然是单盘的IO,如图6所示。使用BDB提供的工具,查看美团数据平台KDC服务的BDB缓存命中率为99%,如图7所示:

图6 无RAID多KDC进程服务器磁盘IO

图7 美团KDC缓存命中率

4. KDC AS处理能力在多进程做RAID条件下,有无preauth属性,KDC服务是否有瓶颈?如果有在哪里?

经多次实验,KDC的AS处理能力受目前物理机CPU处理能力的限制,图8为有PREAUTH属性的CPU使用情况截图,无PREAUTH结果一致。

图8 40进程有PREAUTH,AS对CPU资源的使用情况

B. Client和TGS交互过程的压测

表3为TGS压测的一组平均水平的测试数据:

表3 TGS压测

分析表3中的数据,可以发现KDC对TGS请求的处理能力和主机是否做RAID无关,结合KDC中TGS的请求原理,就较容易理解在BDB缓存命中率足够高的条件下,TGS的请求不需要和本次磁盘交互;进一步做实验,也充分验证了这一点,机器的磁盘IO在整个测试过程中,没有大的变化,如图9所示,操作系统本身偶尔产生的IO完全构不成KDC的服务瓶颈。KDC单进程多进程的对比,其处理瓶颈和AS一致,均受到CPU处理能力的限制(单进程打满某一CPU,多进程几乎占用整台机器的CPU资源)。从Kerberos的设计原理分析,很容易理解,无论KDC库中的keytab是否带有PREAUTH属性,对TGS的处理逻辑几乎没有影响,压测的数据结果从实际角度验证了这一点。

图9 TGS压测,IO资源的使用情况

C. 其他问题

Client和KDC的交互,支持TCP和UDP两种协议。在网络环境良好的情况下,两种协议的KDC的测试结果理论上和实际中几乎一致。但是在原生代码中,使用TCP协议,在客户端给KDC造成一定压力持续6s左右,客户端开始认证出错,在远未达到超时时限的情况下,Client出现了socket reset类的错误。KDC查看内核日志,发现大量possible SYN flooding on port 8089(KDC的服务端口). Sending cookies,且通过netstat -s发现机器的xxxx times the listen queue of a socket overflowed异常增高,种种现象表明可能是服务端的半连接队列、全连接队列中的一个或者全部被打满。主要原理如图10所示:

图10 半连接、全连接原理图

发现KDC服务所在服务器:半队列/proc/sys/net/ipv4/tcp_max_syn_backlog为2048

全队列:1)系统参数/proc/sys/net/core/somaxconn=65535,查看代码listen()函数的传入值为5。

故而判断TCP的瓶颈在于全队列,因此目标为将listen函数的第二个backlog参数变成可控可传入。

KDC可监控的设计和实现

开源社区对Kerberos实现的KDC完全没有对外暴露可监控的接口,最初线上的场景主要通过检索Log进行相关指标的监控,在统计服务QPS、各种错误的监控等方面,存在准确准确监控难的尴尬局面。为了实现对KDC准确、较全面的监控,对KDC进行了二次开发,设计一个获取监控指标的接口。对监控的设计,主要从以下三个方面进行了考虑和设计。

A. 设计上的权衡

  1. 监控的设计无论在什么场景下,都应该尽可能的不去或者最小程度的影响线上的服务,本文最终采用建立一块共享内存的方式,记录各个KDC进程的打点信息,实现的架构如图11所示。每个KDC进程对应共享内存中的一块区域,通过n个数组来存储KDC n个进程的服务指标:当某个KDC进程处理一个请求后,该请求对监控指标的影响会直接打点更新到其对应的Slot 数组中。更新的过程不受锁等待更新的影响,KDC对监控打点的调用仅仅是内存块中的更新,对服务的影响几乎可以忽略不计。相比其他方式,在实现上也更加简单、易理解。
  2. 纪录每个KDC进程的服务情况,便于准确查看每个进程的对请求的处理情况,有助于定位问题多种情况下出现的异常,缩短故障的定位时间。例如:能够准确的反应出每个进程的请求分布是否均匀、请求处理出现异常能够定位到具体是某个进程出现异常还是整体均有异常。

图11 KDC监控设计的整体架构

B. 程序的可扩展性

任何指标的采集都是随着需求进行变更的,如果程序设计上不具有良好的扩展性,会后续的指标扩展带来很大的困扰。第一版KDC监控指标的采集只区分请求的成功与失败两种类型,美团数据平台KDC库中所有的keytab都具有PREAUTH属性。根据上文可知,去掉PREAUTH属性后,AS请求的QPS能够提升一倍。后续随着服务规模的进一步增长,如果AS请求的处理能力逐步成为瓶颈,会考虑去掉PREAUTH属性。为了准确监控去掉PREAUTH属性这一过程是否有、有多少请求出现错误,需要扩展一个监控指标,因此有了KDC监控的第二版。整个过程只需要修改三个地方,完成两个功能的实现:

  1. 添加指标 ;
  2. 打点逻辑的添加。

整个修改过程简单明了,因此,该KDC监控程序的设计具有非常好的扩展性。图12为监控指标的罗列和注释:

图12 KDC监控指标及含义

C. 接口工具kstat的设计

获取KDC监控指标的接口工具主要分为两种:

  1. 获取当前每个KDC进程对各个指标的累积值,该功能是为了和新美大的监控平台Falcon结合,方便实现指标的上报实现累加值和分钟级别速率值的处理;
  2. 获取制定次数在制定时间间隔内每个进程监控指标的瞬时速率,最小统计间隔可达秒级,方便运维人员登陆机器无延迟的查看当前KDC的服务情况,使其在公司监控系统不可用的情况下分析服务的当前问题。具体使用见图13 。

图13 kstat的使用帮助和两种功能使用样例

总结

通过本次对KDC服务的压测实验和分析,总结出KDC最优性能的调整方案为:

  1. KDC服务本身需要开启多进程和以充分利用多核机器的CPU资源,同时确保BDB的内存资源足够,保证其缓存命中率达到一定比例(越高越好,否则查询库会带来大量的磁盘读IO);
  2. 选择的物理机要做RAID,否则在库中keytab带有PREAUTH属性的条件下,会带来大量的写,容易导致磁盘成为KDC的性能瓶颈。通过建立一块共享内存无锁的实现了KDC多进程指标的收集,加上其良好的扩展性和数据的精确性,极大的提高了KDC服务的可靠性。

相比原来线上单进程的处理能力,目前单台服务器的处理性能提升10+倍以上。本次工作没有详细的论述TCP协议中半队列、全队列的相关参数应该如何设定才能达到最优,和服务本身结合到一起,每个参数的变更带来的影响具体是啥?考虑到TCP本身的复杂性,我们将在未来的文章中详细讨论这个问题。

参考文档

  • http://blog.csdn.net/m1213642578/article/details/52370705
  • http://grinder.sourceforge.net/
  • http://www.cnblogs.com/Orgliny/p/5780796.html
  • http://www.zeroshell.org/kerberos/Kerberos-operation/
  • http://blog.csdn.net/wulantian/article/details/42418231

作者简介

  • 鹏飞,美团基础数据部数据平台大数据SRE组,离线计算组SRE负责人,2015年11月加入美团。

招聘信息

如果你对如何保证海量数据服务的稳定性、海量服务器大规模运维感兴趣,想亲历互联网大数据的爆发式增长,请和我们一起。欢迎加入美团数据平台大数据SRE组。有兴趣的同学可以发送简历到:chenpengfei#meituan.com。

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

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

相关文章

Android官方开发文档Training系列课程中文版:如何避免ANR?

原文地址:http://android.xsoftlab.net/training/articles/perf-anr.html#anr 尽管你写代码可能通过了世界上所有的性能测试,但是它还是可能会让人感觉到卡顿。当应用卡的不成样子时,系统会给你弹一个”Application Not Responding”的对话框…

预训练语言模型真的是世界模型?

文 | 子龙自GPT、BERT问世以来,预训练语言模型在NLP领域大放异彩,刷新了无数榜单,成为当前学界业界的心头爱,其主体结构——Transformer——也在逐步的运用于其他领域的任务中,常见的如与CV的跨界,也有相对…

monk js_对象检测-使用Monk AI进行文档布局分析

原文链接:https://blog.csdn.net/weixin_26752075/article/details/108494230 monk js 计算机视觉 (Computer Vision) 介绍 (Introduction) This is an article on how Object Detection can help us in predicting various regions of a document. It can be usefu…

LeetCode 2019 力扣杯全国秋季编程大赛

文章目录1. 比赛结果2. 题目解析2.1 猜数字 Easy2.2 分式化简 Esay2.3 机器人大冒险 Medium2.4 覆盖 Hard2.5 发 LeetCoin Hard1. 比赛结果 2019.9.24晚,第一次参加线上比赛 比赛排名结果:582/1541,做出了2道题。。。 我证明了:…

美团广告实时索引的设计与实现

背景 在线广告是互联网行业常见的商业变现方式。从工程角度看,广告索引的结构和实现方式直接决定了整个系统的服务性能。本文以美团的搜索广告系统为蓝本,与读者一起探讨广告系统的工程奥秘。 领域问题 广告索引需具备以下基本特性: 层次化的…

论文浅尝 - AAAI2020 | 多通道反向词典模型

论文笔记整理:朱珈徵,天津大学硕士,自然语言处理方向。链接:https://arxiv.org/pdf/1912.08441.pdf动机反向词典将一段描述作为输入,并一起输出与该描述匹配的其他词,具有重要实用价值和自然语言处理研究价…

拒绝暴力调参!推荐一个模型Debug神器!

近些年深度学习在视觉、自然语言处理、语音等各个技术方向都诞生了不少创新应用,如智能识别医疗图像中的病灶,辅助医生做病情诊断;智能判别生产线上有质量问题的产品,减轻人工质检压力;对政务、金融等流程中的证件票据…

论文浅尝 - IJCAI2020 | Mucko:基于事实的多层跨模态知识推理视觉问答

论文笔记整理:陈卓,浙江大学计算机科学与技术系,博士研究生。论文链接:https://arxiv.org/pdf/2006.09073代码:https://github.com/astro-zihao/mucko发表会议:IJCAI 2020任务定义及背景VQA(视觉…

LeetCode 40. 组合总和 II(排列组合 回溯)

1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重…

质量运营在智能支付业务测试中的初步实践

背景 毋庸置疑,质量是决定产品能否成功、企业能否持续发展的关键因素之一。对于“质量时代”下的互联网企业,如何在快速迭代的节奏中兼顾质量,真正落地“人人重视质量、人人创造质量、人人享受质量”,这是对QA的要求,也…

新手手册:Pytorch分布式训练

文 | 花花机器学习算法与自然语言处理单位 | SenseTime 算法研究员目录0X01 分布式并行训练概述0X02 Pytorch分布式数据并行0X03 手把手渐进式实战A. 单机单卡B. 单机多卡DPC. 多机多卡DDPD. Launch / Slurm 调度方式0X04 完整框架 Distribuuuu0X05 Reference文中所有教学代码和…

Hotel booking酒店预订——数据分析与建模

Hotel booking酒店预订——数据分析与建模:https://zhuanlan.zhihu.com/p/196757364?utm_sourcewechat_session 写文章Hotel booking酒店预订——数据分析与建模(转载翻译自kaggle)海上泊舟数据分析师数据源:https://www.science…

论文浅尝 - ICLR2020 | Pretrained Encyclopedia: 弱监督知识预训练语言模型

论文笔记整理:陈想,浙江大学博士,研究方向为自然语言处理,知识图谱。Wenhan Xiong, Jingfei Du, William Yang Wang, Veselin Stoyanov.Pretrained Encyclopedia: Weakly Supervised Knowledge-Pretrained Language Model来源&…

LeetCode 216. 组合总和 III(排列组合 回溯)

1. 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]]示例 2: 输入: k 3, n 9 输出…

“小众”之美——Ruby在QA自动化中的应用

前言 关于测试领域的自动化,已有很多的文章做过介绍,“黑科技”也比比皆是,如通过Java字节码技术实现接口的录制,Fiddler录制内容转Python脚本,App中的插桩调试等,可见角度不同,对最佳实践的理解…

软考中级 软件设计师资料(考点分析+复习笔记+历年真题+电子版课本)

软考中级 软件设计师资料(考点分析复习笔记历年真题电子版课本): https://blog.csdn.net/weixin_44754772/article/details/113763165 软件设计师是软考中级职称,相比高级的难度而言,中级难度较低,每个人花…

关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、深度学习、语法分析、文本处理...

神器推荐NLP近几年非常火,且发展特别快。像BERT、GPT-3、图神经网络、知识图谱等技术应运而生。我们正处在信息爆炸的时代、面对每天铺天盖地的网络资源和论文、很多时候我们面临的问题并不是缺资源,而是找准资源并高效学习。但很多时候你会发现&#xf…

LeetCode 77. 组合(回溯)

1. 题目 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 示例:输入: n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combin…

论文浅尝 - AAAI2020 | 从异质外部知识库中进行基于图的推理实现常识知识问答...

会议:AAAI2020论文链接:https://arxiv.org/pdf/1909.05311.pdf摘要常识问答旨在回答需要背景知识的问题,而背景知识并未在问题中明确表达。关键的挑战是如何从外部知识中获取证据并根据证据做出预测。最近的研究要么从昂贵的人类注释中生成证…

插件化、热补丁中绕不开的Proguard的坑

文章主体部分已经发表于《程序员》杂志2018年2月期,内容略有改动。 ProGuard简介 ProGuard是2002年由比利时程序员Eric Lafortune发布的一款优秀的开源代码优化、混淆工具,适用于Java和Android应用,目标是让程序更小,运行更快&…