关于基础架构:Terraform-改善基础架构的十个最佳实践

Terraform 是一种十分风行的开源 IaC(基础设施即代码)工具,用于定义和提供残缺的基础设施。Terraform 于 2014 年推出,其采用率已在寰球范畴内快速增长,越来越多的开发人员正在学习 Terraform 并尝试在其组织中部署基础设施。  如果您曾经开始应用 Terraform,则必须采纳最佳实际来更好地配置生产基础设施。本文章将总结10个对于 Terraform 改善基础架构的最佳实际。  结构化当您应用 Terraform 解决大型生产基础设施我的项目时,须要遵循适当的目录构造来应答我的项目中可能呈现的复杂性。倡议为不同目标建设独自的目录。如果您在开发、暂存和生产环境中应用 Terraform,请为每个环境设置独自的目录。  Terraform 配置也应该是离开的,因为通过一段时间后,一直增长的基础设施的配置将变得更加简单。  geekflare@geekflare:~$ tree terraform_project/terraform_project/├── dev│ ├── main.tf│ ├── outputs.tf│ └── variables.tf├── modules│ ├── ec2│ │ ├── ec2.tf│ │ └── main.tf│ └── vpc│ ├── main.tf│ └── vpc.tf├── prod│ ├── main.tf│ ├── outputs.tf│ └── variables.tf└── stg├── main.tf├── outputs.tf└── variables.tf6 directories, 13 files  您能够在文件 main.tf 自身内编写所有的 Terraform 代码(模块、资源、变量、输入),同时为变量和输入设置独自的 Terraform 代码使其更具可读性和易于了解。  命名规定Terraform 中应用命名规定让资源易于了解、高深莫测。  例如,假如您要为我的项目中的不同环境创立三个不同的工作区。与其将环境命名为env1 、env2 、env3 ,不如尝试应用dev、stage、prod 来命名。从名称自身来看,很显著每个环境都代表着不同的工作空间。资源、变量、模块等的也遵循相似的规定。  ...

June 9, 2023 · 2 min · jiezi

必看java后端亮剑诛仙最全知识点

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧。 这里,我大体根据基础、Java基础、Java进阶给分了下类,挑的也都是最常用最重要的工具。 这篇文章耗费了我大量的精力,你要是觉得好,请不要吝啬你的赞。如果你认同,可以关注我的微信公众号xjjdog,里面讲的就是这些内容。我会尝试更加系统化。 最新的内容会在github持续更新,添加新的精选相关文章。地址: https://github.com/sayhiai/javaok基础知识数据结构基本的数据结构是非常重要的,无论接触什么编程语言,这些基本数据结构都是首先要掌握的。具体的实现,就体现在java的集合类中。这些数据结构,就是这些复杂工具的具体原始形态,要烂记于心。 培训机构一般没有时间普及基础知识,通过算法和数据结构,“通常”能够一眼看出是否是经过培训。 常用算法算法是某些大厂的门槛。毫无疑问,某些参加过ACM的应届生,能够秒杀大多数工作多年的码农。算法能够培养逻辑思维能力和动手能力,在刚参加工作的前几年,是非常大的加分项。但随着工作年限的增加,它的比重在能力体系中的比重,会慢慢降低。 算法的学习方式就是通过不断的练习与重复。不精此道的同学,永远不要试图解决一个没见过的问题。一些问题的最优解,可能耗费了某个博士毕生的精力,你需要的就是理解记忆以及举一反三。最快的进阶途径就是刷leetcode。 对于普通研发,排序算法和时间复杂度是必须要掌握的,也是工作和面试中最常用的。时间充裕,也可涉猎动态规划、背包等较高阶的算法知识,就是下图的左列。 书籍《算法导论》 《编程之美》 《数学之美》 数据库基础 MySQLMySQL是应用最广的关系型数据库。除了了解基本的使用和建模,一些稍底层的知识也是必要的。 MySQL有存储引擎的区别。InnoDB和MyISAM是最常用的,优缺点应该明晓。ACID是关系型数据库的基本属性,需要了解背后的事务隔离级别。脏读、幻读问题的产生原因也要了解。 为了加快查询速度,索引是数据库中非常重要的一个结构,B+树是最常用的索引结构。因字符集的问题,乱码问题也是经常被提及的。 专业的DBA通常能帮你解决一些规范和性能问题,但并不总是有DBA,很多事情需要后端自己动手。 书籍《MySQL技术内幕——InnoDB存储引擎》 《高性能MySQL》 《高可用MySQL》 网络基础网络通信是互联网时代最有魅力的一个特点,可以说我们的工作和生活,每时每刻都在和它打交道。 连接的三次握手和四次挥手,至今还有很多人非常模糊。造成的后果就是对网络连接处于的状态不慎了解,程序在性能和健壮性上大打折扣。 HTTP是使用最广泛的协议,通常都会要求对其有较深入的了解。对于Java来说,熟悉Netty开发是入门网络开发的捷径。 爬虫是网络开发中另外一个极具魅力的点,但建议使用python而不是java去做。 书籍《HTTP权威指南》 《TCP/IP详解 卷一》 操作系统 Linux科班出身的都学过《计算机组成机构》这门课,这非常重要,但很枯燥。结合Linux理解会直观的多。鉴于目前大多数服务器环境都是Linux,提前接触能够相辅相成。 需要搞清楚CPU、内存、网络、I/O设备之间的交互和速度差别。对于计算密集型应用,就需要关注程序执行的效率;对于I/O密集型,要关注进程(线程)之间的切换以及I/O设备的优化以及调度。这部分知识是开发一些高性能高可靠中间件的前提,无法绕过。 对于Linux,首先应该掌握的就是日常运维,包括常用命令的使用和软件安装配置。正则也是必须要掌握的一个知识点。 脚本编程对后端来说是一个非常大的加分项。它不仅能增加开发效率,也能在一些突发问题上使你游刃有余。 书籍《UNIX环境高级编程(第3版)》 《鸟哥的Linux私房菜》 《Linux内核设计与实现》 《Linux命令行大全》 相关文章《Linux上,最常用的一批命令解析(10年精选)》 Java基础JVMJava程序员的最爱和噩梦。以oracle版本为准,各个jvm版本之间有差别。JVM的知识包含两方面。一个是存储级别的,一个是执行级别的。 以存储为例,又分为堆内的和堆外的两种,各有千秋。垃圾回收器就是针对堆内内存设计的,目前最常用的有CMS和G1。JVM有非常丰富的配置参数来控制这个过程。在字节码层面,会有锁升级以及内存屏障一类的知识,并通过JIT编译来增加执行速度。 JVM还有一个内存模型JMM,用来协调多线程的并发访问。JVM的spec非常庞大,但面试经常提及。 另外,jdk还提供了一系列工具来窥探这些信息。包含jstat,jmap,jstack,jvisualvm等,都是最常用的。 书籍《深入理解Java虚拟机》 JDK现在,终于到了java程序员的核心了:JDK,一套依据jvm规范实现的一套API。我们平常的工作,就是组合这些API,来控制程序的行为。 jdk的代码非常庞大,内容也非常繁杂。最重要的大体包括:集合、多线程、NIO、反射、文件操作、Lambda语法等。这部分内容加上下面的SSM,基本上就是大多数小伙伴玩耍的地方。 假如说数据结构和算法是理论,这里就是支撑理论的实现。Java玩的好不好,就是说这里。 书籍《Effective Java 中文版》 《数据结构与算法分析:Java语言描述》 SSM你可能会用SSM开发项目,觉得编程无非就这些东西。设计模式烂记于心,IOC、AOP手到擒来。这里集中了大部分同行,有些可能到此为止就Ok了,因为有些同学接下来的重点是项目管理,而不是技术。 SSM最擅长的是Web开发。目前的表现形式逐渐多样化,随着前后端分离的盛行,Restful这种有着明确语义的模式逐渐流行。 书籍《Head First 设计模式》 《Spring揭秘》 《SpringBoot揭秘》 《MyBatis技术内幕》 《深入剖析Tomcat》 ...

August 18, 2019 · 1 min · jiezi

阿里研究员吴翰清世界需要什么样的智能系统

阿里妹导读:吴翰清,被大家亲切地称为“小黑”“道哥”。他是阿里巴巴研究员,更是一位“白帽黑客”。15岁,考入西安交大少年班,毕业后应聘阿里。23岁,成为阿里最年轻的高级技术专家。32岁,被评选为2017年度全球35位35岁以下的青年科技创新人才(TR35)。网上有许多关于他的猜测,然而,他始终保持低调,专注于自己热爱的事业。2014年之后,他几乎不再写文章;但在今天,他有话想说,关于自己,关于科技,关于未来,说给你听,说给世界听。 不得不说的话在过去的18个月里,我拒绝了所有的采访,投入了全部的精力专心在做一件事情。所以我想先借着这篇文章澄清一下18个月以来网上的所有关于我的新闻、抖音视频等,都是好事者编撰的我的段子,用来吸取流量的假新闻。这些假新闻让我很苦恼,因为这些新闻将我描绘成为了我最不想成为的人,里面的我是一个符号,而不是真实的我。我为此专门给今日头条写过信,要求审核并过滤这类不实传播,但只清净了一个月。我想再进一步只有向监管部门反馈,以及继续保留法律追责的权利。 这些未经我许可的新闻和视频,将我描绘成了一个无所不能的人,连带着马老师也受到了牵连。我想有没有我,马老师都睡得很安稳。阿里的安全是上千名工程师共同努力的结果,我一个人的力量在其中的贡献极其微薄。我也从没有黑过阿里的网站,只是以前因为工作性质在授权的情况下对阿里的业务系统做过很多的安全测试。我们不应该捧吹以破坏为目的的黑客,那是犯罪,是我最不想成为的人。我过去的工作是对抗黑客攻击,打击网络犯罪,因此以破坏系统的黑客来描述曾经的我,是对我最大的羞辱。真正的黑客精神是挑战权威,追求开放、自由,而并非入侵计算机系统。我想是时候终止这些不正确的传播了。 至于我过去取得的一点不足为人道的成就,我想99%的读者都没搞明白我为什么会在2017年被评为 MIT TR35,大家只是在看个热闹,鼓鼓掌。但我不需要这样的掌声,我不需要大家为我个人鼓掌,我希望大家是为我的作品鼓掌。这也是为什么在2014年以后我几乎不再写文章的原因。我希望大家记住的是我的作品,我对社会的贡献,而非我个人的成长轨迹。从这个角度来看,我对自己还非常不满意,人们关注我的经历多过我的作品,所以我还得加倍努力。 就我个人来说,从2017年下半年开始,我离开了网络安全领域,进入到了今天大家所说的人工智能领域。我带领团队在浙江,在上海,在重庆建设了很多关键的基础设施系统。尤其是2018年在上海做的事情,倾注了我的所有心血,我从来没有如此认真地做过一件事情,结果也很好。只是这些事情并不曾对外宣传,故不为外人所知。这18个月来关于我个人的假新闻满天飞,让我哭笑不得,因为这些段子手连我最引以为豪的事情都没搞清楚。 所以我今天决定写一篇文章,作为一名工程师,我想把我对未来的判断写下来,也许可以帮助一些人少走一点弯路。只代表个人的看法,不代表公司的观点。 科技的进步是为了解放生产力我将生产力的进步分为五个阶段:体力劳动,机械化,电气化,信息化,智能化。其中每一次科技的进步,都会带来生产力的解放,对社会的改变是巨大的。 在140年前发生的第二次科技革命,让电力深入到各行各业。自从中央发电站和交流电变压器等关键技术构建的电力基础设施成型后,获取电力的成本逐渐降低,各种各样的电气应用开始涌现,人们获取到了新的、稳定的能源。 我们现在知道电力最早是应用在电话、电报、电灯上的,也正是电气照明这一需求,拉动了电力基础设施的发展。因为在当时电力的用途比较单调,并没有今天这么琳琅满目的电器。在100年前爱迪生通用电气与威斯汀豪斯之间的主要竞争就是聚焦在电气照明领域。我们很难说在这个过程中,到底是电灯泡更重要,还是发电站更重要。我曾经比喻说当前云计算面临的窘境,就是「中央发电站」已经造出来了,我们有单集群上万台服务器规模的算力基础设施,但是「电灯泡」在哪里却没有找到。我们用「中央发电站」在点「煤气灯」,今天托管在云计算上的业务,大多数依然是「信息化系统」。而理想中的会消耗大量算力的应用,应当是「智能化系统」。我们一直在苦苦追寻云计算的「电灯泡应用」,却求之不得。 这里需要讲清楚「信息化系统」和「智能化系统」的区别。我认为「信息化系统」的本质是编辑数据库,一个业务系统如果存在大量人工交互,依赖于人提交表单来完成业务,那么就是一个信息化系统。而我理想中的「智能化系统」,应该是以自动完成任务为目的,以任务作为输入,以完成的结果作为输出,中间的过程应该是机器高度自动化完成的。以其完成任务的复杂度,来评价其智能程度的高低。 从这个角度看,「智能手机」并不智能,依然是个「信息化系统」。市面上形形色色的智能系统也都只是冠上了智能的名号在鱼目混珠。我并不是说「信息化系统」没有价值,信息化系统很有价值,但不是下个时代的东西。自从计算机技术发展以来,产生的各色各样的信息化系统极大地改变了世界,完成了从「电气化」到「信息化」转型升级的重要一步。这就是我们看到各色各样的计算机系统开始应用在各个领域,帮助人们更加高效的管理工作和提供服务。 互联网在这一过程中扮演了放大作用。我认为互联网本身并不是生产力,互联网只是连接了成千上万个信息化系统,从而具备了规模效应。互联网是规模经济,能让一个系统的价值实现上千倍、上万倍的放大,但是生产力是信息化系统本身提供的。能够接收互联网连接服务的终端,是浏览器,是 iOS 和 Android,这些端的演进本身是重要的。百度通过互联网连接了人和信息,腾讯通过互联网连接人和人,阿里通过互联网连接了人和信息化服务。但是这些都不是下一个时代的东西。 下一个时代会发生的事情,首先是出现智能化系统对信息化系统的升级换代,然后会出现通过互联网连接所有智能化系统的公司。智能化对信息化的升级换代,是一次巨大的生产力进步,处于社会变革中的商业公司的结局是适者生存。从历史来看,在信息化时代的PC操作系统升级换代到移动操作系统,其过程就是天翻地覆的。苹果的iPhone 发布之后,所有的开发者都不再给微软的 Windows 写软件,而转去给 iOS 写软件,对微软带来了强烈的冲击,如果不是微软后来又抓住了云计算的机遇,就很可能会从此一蹶不振。从商业发展的角度看类似事件一定会发生,在信息化时代的庞然大物很可能随着一次生产力的变革就变得无足轻重。那么现在所有的问题在于,未来世界需要的智能系统到底是什么? 让机器获得智能,一直是计算机科学家孜孜以求的事情。在过去简单的专家系统,依靠经验和规则,也能处理简单的任务。但有一个弊病是对于专家经验未覆盖的异常情况,机器就不知道怎么处理了。所以后来出现了数据驱动诞生的智能。 我们看到当机器具备一定的智能后,就能处理相对简单的任务,从而部分地解放人的生产力,此时增加机器规模就等同于增加人力的规模。而机器智能和人的智能又各有所长,机器运算量大且不知疲倦,因此对于很多工作都有可能做到精细化管理。这往往能带来成本的节约。 比如在过去公交车的排班是按照经验,在一个线路里设置好公交车的数量,但是如果市民的出行情况发生波动时,公交车的供需关系之间一定会存在差异,有的线路会繁忙,有的线路则会空闲,从而出现资源的浪费。要解决这一问题需要先统计清楚每辆公交车每一趟的精确载客人数,再依靠机器智能精细化的调度公交车到不同的线路,就能在同等资源下实现效率最优。因此使用机器智能的好处是显而易见的。 五年前做不出大规模的机器智能系统我们看到在生产力发展的过程中,从信息化到智能化的这一转型升级正在到来,已经到了爆发的前夜。这得益于四项技术的成熟:云计算、大数据、IoT、网络连接技术。 我们知道机器智能当前的发展是得益于对脑科学的研究,以及算力的进步,让神经网络进化到了深度学习,从而在视觉、语音等领域有了重大突破。算力的重要性毋庸置疑,但是光有算力依然难以在实际的应用中取得成功,还需要其他几项技术的成熟。在当前的技术环境来说,云计算为智能提供了足够的算力,是算力基础设施;大数据技术提供了数据处理的方法论和工具,是数据基础设施(当前还没有垄断性的数据基础设施,碎片化严重);IoT 技术将智能设备的成本降到了足够低,为部署丰富的神经元感知设备提供了基础;网络连接技术,从4G到5G,为数据的高速传输提供了重要基础。 如果有科技树这种说法的话,那么机器智能的大规模应用,就需要先点亮前四个技术,这是基础。在五年以前,这几项技术的成本是制约我们将智能技术大规模应用的主要瓶颈。到今天已经逐渐成熟了。 在一项新技术刚出现的时候,我们往往会遇到两个问题。 第一个问题是人才的稀缺性问题。我们知道一个懂深度学习或其他机器智能技术的博士生刚毕业的年薪可能比得上一个工作了十年的程序员。业界各处都需要机器智能,供不应求。 第二个问题是技术的成本问题。新技术刚出来的成本一定是昂贵的,就像云计算刚出来的时候也是先解决能力问题,再解决效率问题。我前些时看一个报告,AWS 的 EC2 推出到现在连续降价了57次。我们熟知的摩尔定律,计算的性能每18个月翻一倍,也就意味着同等算力的硬件每18个月会降一半的成本。机器智能作为新技术也有同样的规律,在一开始我们不要指望它的成本会足够便宜到能进入千家万户,新技术的普及需要时间。只是我们往往迫不及待。 这两个问题决定了机器智能在一开始的时候,应该首先被应用在对社会效率撬动最大的那个点上。从商业上我们要找到这样的场景,来让这项技术脱离实验室,走向社会,通过商业来源源不断的滋养这项技术的迅速成长。 世界需要什么样的机器智能系统这两个问题随着时间的推移很快就能解决。但今天产业界真正碰到的问题我认为是搞偏了方向。这体现在两个方面。 第一个问题是未来不应该存在一个「人工智能」的产业,我们今天的分类就分错了。就像自电力基础设施诞生以来,各行各业都需要用电,因此电力成为了一个关键生产要素。我认为未来智能也是一个关键生产要素,每个行业都需要,因此不需要单独划分一个人工智能产业。单独搞了一个人工智能产业,反倒不知道这些公司在干什么了,这些公司自己也产生了困惑。最终应该像今天的零售业一样,每个做零售的都有个电商部门,会通过互联网来做营销和销售。未来每个企业也应该有一个部门,就是负责他们的智能系统的建设与训练。要像训练宠物一样训练智能系统,使他具备智能。这不是某一家人工智能公司要做的事情,而是每家公司都要自己做的事情。 第二个问题和机器智能技术的发展有关。因为最近这次机器智能的热点是从深度学习开始,在视觉、语音等领域有了巨大突破,因此产业化后的企业往往都是在做视觉、语音、自然语言处理等工作。但是我们千万别忘了完整的人脑智能是从「感知」到「行动」,并通过不断的反馈完成高频率的协同,最终诞生了智能。 只做「感知」是一个巨大的误区,从技术上讲没有问题,但是从商业上讲创造的社会价值就很有限了,因为其解放的生产力相对是有限的。 从生产力发展的角度来讲,评判一个智能系统的社会价值,应该以它解放生产力的多少来衡量。只做「感知」就是只能看,但是做了这么多大型项目后,我发现所有的价值创造都是在于「处置」环节。因此只做感知,很难讲清楚投入产出是否值得,但是一旦开始进入到「行动」环节,就会开始解放生产力,价值是可被量化的。这里的行动,是机器智能实现了对人力或其他设备的调度。 实际上从技术发展的角度看,我们早就拥有了让机器智能做决策的能力。搜索引擎和个性化推荐,就是典型的通过机器智能做决策。通过每天处理海量的数据,最终实现精细化的匹配。 所以我认为一个完整的「智能系统」,是包含了「感知」与「行动」,其中支撑行动的是决策和调度的技术。而衡量这个智能系统是否有价值的标准,是看其解放的生产力的多少。 遗憾的是,到今天为止我认为业界并不存在一个理想的「智能系统」。业界当前的状态我称之为「有智能,没系统」。很多人工智能的创业公司拥有局部的智能能力,比如视觉、语音、NLP、知识图谱、搜索、推荐等中的一项或多项技术,但是很少有公司有完整的技术栈。而像 BAT 等公司具备完整的技术栈,但是却并没有将所有的技术整合成为「感知」+「行动」的一个完整系统,而是各项技术以碎片化的形式存在。尤其是将所有技术应用到某一个具体场景中解决某一个具体问题的,更是寥寥无几,而这正是催生出这一智能系统的关键所在。所以这是一个工程化的问题,工程化的挑战在于整合所有智能技术,实现完整的「感知」+「行动」能力,并有效的控制成本,实现对开发者友好的接口。 在智能技术的角度来看,「自动驾驶」和「智能音箱」是两个完整的从「感知」到「行动」闭环的场景。我认为这两个场景可以用来打磨机器智能技术,但是当前在商业上比较难成功。「自动驾驶」解放了所有的驾驶员,对解放生产力的价值非常明显,但是因为受制于今天城市的道路基础设施,因此对老城市的意义不大。今天城市的道路不是为自动驾驶设计的,也很难容纳下自动驾驶的汽车。因此自动驾驶更适合航空、航海、物流等领域,商业范围一下小了很多。「智能音箱」综合了多项机器智能技术,其核心技术「对话机器人」被称为人工智能领域的圣杯,想要做好难度相当之大。但是「智能音箱」当前的阶段对家庭中各种任务的生产力解放极其有限,价值很难讲清楚,最后沦为玩物的可能性比较大。尽管如此,随着时间的推移,随着基础设施的更新换代,这两项技术也会逐渐焕发出他们的生命力。 如果用航空业来比喻的话,今天的智能技术,就好比造飞机,市面上已经有了很多零件和引擎,但是所有的厂商都拿着零件当飞机卖,客户以为他买了一架飞机,其实只是买了个零件(因为生产力并没有得到多大的解放)。而今天真正的难点在于飞机设计图纸都还没有。 所以我打算先画一张,造架飞机玩玩。 构建智能时代飞机想要真正飞上天,还需要几个东西。 首先是飞行员。飞行员不一定要懂得怎么造飞机,造飞机是个门槛很高的活。但是飞行员要懂得怎么开飞机,最后还要让人人都能坐飞机。我认为飞行员就是未来各个企业里智能部门的员工,他们负责训练买来的智能系统,让智能系统真正具备智能。由于各个企业拥有的数据的不同,以及「飞行员」技能的高低和责任心,最后的各个企业的智能系统的聪明程度也会出现差异。世界是丰富多彩的。 其次是航道。我认为航道依然是基础设施提供商的,包括运营商、云计算厂商等。 最后是机场。机场需要负责所有航班的调度和协同,为所有的飞机提供服务。这是最有意思的地方。我认为「机场」是最后真正的商业模式,就像苹果的 AppStore一样。 我认为在智能时代的「机场」,最重要的工作是给机器智能系统提供服务,而并非给人提供服务。 想象一下未来互联网里,70%-80%的人口是机器智能,他们处理了未来世界的绝大多数工作,而每一个机器智能又是有一个主人的。其主人可以是个人,也可以是组织,但都是有主权的。每一个机器智能存在的目标都是为了完成某个或多个任务。那么为所有的机器智能提供服务,就会是一个巨大的商业模式。 机器智能系统的自动协同是通往未来的关键路径 同时我也认为当前的机器智能产业,过于重视人与机器的交互,而忽视了机器与机器的交互。而后者才是更重要的事情。因为人与机器的交互依然是回到了信息化系统的老路上去,而机器与机器的自动协同,则是在进一步将智能系统的价值实现规模放大。 因此未来有必要给所有的机器智能定义一套语言,他们之间的交流可以像人一样拥有自己的语言,实现简单的逻辑。而所有机器智能之间的交互与协同,是不需要人工干预的,就像你家的孩子与邻居家的孩子自己会去玩耍一样,你不需要干预到他们的交流之中,他们自己会各取所需地完成各自的任务。 以「一网通办」的业务举例。在当前一网通办的主流实现办法是将政府各委办局的数据实现全量汇聚后,进行数据治理,并梳理流程,重塑业务。这种大数据应用的思路依然是停留在信息化建设的老路上,其弊端是想推动新技术落地的前提是流程先改革,同时各个不同地区的高度定制化导致很难在全国实现规模化的产品。但其实也可以有另外一种智能化的建设思路,让每个委办局自己建一个机器智能系统,其任务就是代替公务员处理各自的窗口业务。当市民来提交一个申请时,经过认证后,该委办局的机器智能系统就根据所需材料,自行向其他委办局的机器智能系统发出协同请求,经过几轮机器智能之间的交流和协同之后,市民很快就得到了他想要的结果。这种多个机器智能系统之间自动协同的机制,对流程的冲击明显会小很多。 机器智能之间的交互与协同需要通过网络连接到一起,但安全性是可控的,因为是业务之间的协同,而并非数据本身发生了交换。因为每一个机器智能都有自己的主人,所有的训练过程也都发生在其主体内部,因此数据并不需要被拿出来交换共享。主人可以设定机器智能什么能说,什么不能说,所有的安全控制都发生在智能系统内部,而一旦连接到互联网要与其他机器智能协同或使用「机场」提供的服务,就会转为「默认不信任」模式。 至于机器智能系统到底部署在公共云还是专有云,这并不是一个重要的问题,主人爱部署在哪里就部署在哪里。所以时至今日,云计算依然有被管道化的危险,就像运营商被互联网内容提供商管道化一样,未来云计算厂商也可能会被智能厂商管道化。因为云计算和大数据都不是智能。 A组也因此,为了以上这些构想,我受命在阿里云成立「A组」。「A组」成立的使命就是为了构建出这一机器智能系统,让智能时代更快的到来。 我认为这是一件需要整个社会共同努力三十到五十年的事情,就像在过去的三十到五十年我们在信息化建设上付出的所有努力一样。 ...

July 15, 2019 · 1 min · jiezi

蚂蚁金服SOFA开源负责人鲁直不只是中间件未来会开源更多

摘要: 蚂蚁金服开源也不只是 SOFA 中间件框架,未来会开源更多的东西,包括 AI 方面的一些技术,也希望整个社区能够多关注蚂蚁金服在开源上面未来的举措。本文转载自微信公众号:Linux中国,原作者:王兴宇 近日,技术媒体Linux中国的创始人王兴宇对蚂蚁金服SOFA开源负责人鲁直,就SOFA 5、ServiceMesh、Serverless、Seata等技术内容进行了探讨,以下为专访文章。 虽然我和鲁直在微信上已经联系很久了,但这还是第一次见面。交谈中,我了解到鲁直是2009 年加入阿里巴巴工作,已经有十年了。刚开始是在1688.COM 做业务系统,对中间件技术非常感兴趣,也会经常研究各种中间件的实现和功能。后来在 2013年时,为了更深入地学习研究中间件框架,转到了蚂蚁金服中间件团队,从那个时候开始就一直在做 SOFA。 目前鲁直在SOFA的团队主要负责的工作包括几个部分。其中一个主要部分就是 SOFA 开源相关的工作。SOFA 的产品体系非常广,包括已经对外开源的部分、内部整个微服务体系,以及 SOFA 框架等等——而这些开源相关的工作主要是由鲁直负责推动的。 当然,作为技术负责人,鲁直既要带技术团队也要做技术工作。谈及这一点,鲁直说: “我觉得做技术管理,跟普通的管理不太一样,因为技术管理最重要的一个点是除了管理之外,还要保持一定的技术判断力和敏锐度。对一些新技术,包括团队中遇到一些重大的技术问题,你都要有一些方向性的判断。虽然最后不一定是你具体解决的,但是在整个团队的技术攻坚和技术选型上,要一起确立方向。” 我以前也做过十余年的技术管理,我很能够感受这种情况,重大问题技术负责人更要迎难而上。 SOFA 5 落子 Service Mesh就我了解的情况,现在 SOFA 已经发展到了 SOFA5 了。在 SOFA4阶段,主要的任务是将开源体系捋清楚了,然后开始按步骤地开源;到现在发展到了 SOFA5。我想知道从 SOFA4 发展到 SOFA5,是什么让蚂蚁金服中间件团队判断 SOFA4 的阶段性目标已经达成,可以迈进到新的 SOFA5 阶段了呢? “从整个业界趋势上来讲,SOFA4 的架构相对来说还是偏传统一些,更多是对我们之前的技术框架的整理和梳理。在这个阶段,SOFA 的代码经过了非常多的优化和重构,才达到了对外开源的要求,从而 SOFA 走上了开源核心的模式,逐步分阶段的将各个部分进行了开源。”鲁直讲到,“但是,从我们对业界的整体判断上来说,未来无疑是云的时代,所以说要考虑怎么让所有的业务系统能够提供云的能力,比如说 Serverless。” 接着这个话题,鲁直讲了他对云计算的理解:“一方面云计算肯定要为整个业务的发展提供更加方便的基础资源,可以不用去关心底层的基础设施。Serverless字面的意思就是说‘无服务器’——我不用关心服务器怎么来的,不用关心基础设施,只要关心业务代码就可以了。那反过来对于云服务商来说,经过了这一层抽象,其资源利用率会更高,可以有更多的利润空间,这是一个双赢的局面。对于用户来讲,这种好处是实实在在的,可以更少关注基础设施,只关心代码就可以了。” “我们希望在 SOFA5 的方向上,在这个新的迭代中,去让业务——包括让未来我们开源出来各种功能、各样服务模式——都更多地去关心自己的业务代码,而不用再过多地关心基础设施。”鲁直说, 在 SOFA5 中,一个重要的方向就是 Service Mesh这个方向,这将是 SOFA5 中非常重要的特性。鲁直强调了其对 Service Mesh 技术的看好:“我认为 Service Mesh 是迈向未来往前走的非常关键的一步,让业务不用再关心基础设施。通过 Service Mesh,我们可以将很多技术能力直接放到基础设施里面,而业务可以不用感知到这一层。原来可能需要花几个小时或者更多的时间解决的基础设施问题,现在可以通过 Service Mesh解决掉。” ...

April 30, 2019 · 2 min · jiezi

美团容器平台架构及容器技术实践

本文根据美团基础架构部/容器研发中心技术总监欧阳坚在2018 QCon(全球软件开发大会)上的演讲内容整理而成。背景美团的容器集群管理平台叫做HULK。漫威动画里的HULK在发怒时会变成“绿巨人”,它的这个特性和容器的“弹性伸缩”很像,所以我们给这个平台起名为HULK。貌似有一些公司的容器平台也叫这个名字,纯属巧合。2016年,美团开始使用容器,当时美团已经具备一定的规模,在使用容器之前就已经存在的各种系统,包括CMDB、服务治理、监控告警、发布平台等等。我们在探索容器技术时,很难放弃原有的资产。所以容器化的第一步,就是打通容器的生命周期和这些平台的交互,例如容器的申请/创建、删除/释放、发布、迁移等等。然后我们又验证了容器的可行性,证实容器可以作为线上核心业务的运行环境。2018年,经过两年的运营和实践探索,我们对容器平台进行了一次升级,这就是容器集群管理平台HULK 2.0。把基于OpenStack的调度系统升级成容器编排领域的事实标准Kubernetes(以后简称K8s)。提供了更丰富可靠的容器弹性策略。针对之前在基础系统上碰到的一些问题,进行了优化和打磨。美团的容器使用状况是:目前线上业务已经超过3000个服务,容器实例数超过30000个,很多大并发、低延时要求的核心链路服务,已经稳定地运行在HULK之上。本文主要介绍我们在容器技术上的一些实践,属于基础系统优化和打磨。美团容器平台的基本架构首先介绍一下美团容器平台的基础架构,相信各家的容器平台架构大体都差不多。首先,容器平台对外对接服务治理、发布平台、CMDB、监控告警等等系统。通过和这些系统打通,容器实现了和虚拟机基本一致的使用体验。研发人员在使用容器时,可以和使用VM一样,不需要改变原来的使用习惯。此外,容器提供弹性扩容能力,能根据一定的弹性策略动态增加和减少服务的容器节点数,从而动态地调整服务处理能力。这里还有个特殊的模块——“服务画像”,它的主要功能是通过对服务容器实例运行指标的搜集和统计,更好的完成调度容器、优化资源分配。比如可以根据某服务的容器实例的CPU、内存、IO等使用情况,来分辨这个服务属于计算密集型还是IO密集型服务,在调度时尽量把互补的容器放在一起。再比如,我们可以知道某个服务的每个容器实例在运行时会有大概500个进程,我们就会在创建容器时,给该容器加上一个合理的进程数限制(比如最大1000个进程),从而避免容器在出现问题时,占用过多的系统资源。如果这个服务的容器在运行时,突然申请创建20000个进程,我们有理由相信是业务容器遇到了Bug,通过之前的资源约束对容器进行限制,并发出告警,通知业务及时进行处理。往下一层是“容器编排”和“镜像管理”。容器编排解决容器动态实例的问题,包括容器何时被创建、创建到哪个位置、何时被删除等等。镜像管理解决容器静态实例的问题,包括容器镜像应该如何构建、如何分发、分发的位置等等。最下层是我们的容器运行时,美团使用主流的Linux+Docker容器方案,HULK Agent是我们在服务器上的管理代理程序。把前面的“容器运行时”具体展开,可以看到这张架构图,按照从下到上的顺序介绍:最下层是CPU、内存、磁盘、网络这些基础物理资源。往上一层,我们使用的是CentOS7作为宿主机操作系统,Linux内核的版本是3.10。我们在CentOS发行版默认内核的基础上,加入一些美团为容器场景研发的新特性,同时为高并发、低延时的服务型业务做了一些内核参数的优化。再往上一层,我们使用的是CentOS发行版里自带的Docker,当前的版本是1.13,同样,加入了一些我们自己的特性和增强。HULK Agent是我们自己开发的主机管理Agent,在宿主机上管理Agent。Falcon Agent同时存在于宿主机和容器内部,它的作用是收集宿主机和容器的各种基础监控指标,上报给后台和监控平台。最上一层是容器本身。我们现在主要支持CentOS 6和CentOS 7两种容器。在CentOS 6中有一个container init进程,它是我们开发容器内部的1号进程,作用是初始化容器和拉起业务进程。在CentOS 7中,我们使用了系统自带的systemd作为容器中的1号进程。我们的容器支持各种主流编程语言,包括Java、Python、Node.js、C/C++等等。在语言层之上是各种代理服务,包括服务治理的Agent、日志Agent、加密Agent等等。同时,我们的容器也支持美团内部的一些业务环境,例如set信息、泳道信息等,配合服务治理体系,可以实现服务调用的智能路由。美团主要使用了CentOS系列的开源组件,因为我们认为Red Hat有很强的开源技术实力,比起直接使用开源社区的版本,我们希望Red Hat的开源版本能够帮助解决大部分的系统问题。我们也发现,即使部署了CentOS的开源组件,仍然有可能会碰到社区和Red Hat没有解决的问题。从某种程度上也说明,国内大型互联公司在技术应用的场景、规模、复杂度层面已经达到了世界领先的水平,所以才会先于社区、先于Red Hat的客户遇到这些问题。容器遇到的一些问题在容器技术本身,我们主要遇到了4个问题:隔离、稳定性、性能和推广。隔离包含两个层面:第一个问题是,容器能不能正确认识自身资源配置;第二个问题是,运行在同一台服务器上的容器会不会互相影响。比如某一台容器的IO很高,就会导致同主机上的其他容器服务延时增加。稳定性:这是指在高压力、大规模、长时间运行以后,系统功能可能会出现不稳定的问题,比如容器无法创建、删除,因为软件问题发生卡死、宕机等问题。性能:在虚拟化技术和容器技术比较时,大家普遍都认为容器的执行效率会更高,但是在实践中,我们遇到了一些特例:同样的代码在同样配置的容器上,服务的吞吐量、响应时延反而不如虚拟机。推广:当我们把前面几个问题基本上都解决以后,仍然可能会碰到业务不愿意使用容器的情况,其中原因一部分是技术因素,例如容器接入难易程度、周边工具、生态等都会影响使用容器的成本。推广也不是一个纯技术问题,跟公司内部的业务发展阶段、技术文化、组织设置和KPI等因素都密切相关。容器的实现容器本质上是把系统中为同一个业务目标服务的相关进程合成一组,放在一个叫做namespace的空间中,同一个namespace中的进程能够互相通信,但看不见其他namespace中的进程。每个namespace可以拥有自己独立的主机名、进程ID系统、IPC、网络、文件系统、用户等等资源。在某种程度上,实现了一个简单的虚拟:让一个主机上可以同时运行多个互不感知的系统。此外,为了限制namespace对物理资源的使用,对进程能使用的CPU、内存等资源需要做一定的限制。这就是Cgroup技术,Cgroup是Control group的意思。比如我们常说的4c4g的容器,实际上是限制这个容器namespace中所用的进程,最多能够使用4核的计算资源和4GB的内存。简而言之,Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术(rootfs是容器文件系统层技术)。美团的解法、改进和优化隔离之前一直和虚拟机打交道,但直到用上容器,才发现在容器里面看到的CPU、Memory的信息都是服务器主机的信息,而不是容器自身的配置信息。直到现在,社区版的容器还是这样,比如一个4c4g的容器,在容器内部可以看到有40颗CPU、196GB内存的资源,这些资源其实是容器所在宿主机的信息。这给人的感觉,就像是容器的“自我膨胀”,觉得自己能力很强,但实际上并没有,还会带来很多问题。上图是一个内存信息隔离的例子。获取系统内存信息时,社区Linux无论在主机上还是在容器中,内核都是统一返回主机的内存信息,如果容器内的应用,按照它发现的宿主机内存来进行配置的话,实际资源是远远不够的,导致的结果就是:系统很快会发生OOM异常。我们做的隔离工作,是在容器中获取内存信息时,内核根据容器的Cgroup信息,返回容器的内存信息(类似LXCFS的工作)。CPU信息隔离的实现和内存的类似,不再赘述,这里举一个CPU数目影响应用性能例子。大家都知道,JVM GC(垃圾对象回收)对Java程序执行性能有一定的影响。默认的JVM使用公式“ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)” 来计算做并行GC的线程数,其中ncpus是JVM发现的系统CPU个数。一旦容器中JVM发现了宿主机的CPU个数(通常比容器实际CPU限制多很多),这就会导致JVM启动过多的GC线程,直接的结果就导致GC性能下降。Java服务的感受就是延时增加,TP监控曲线突刺增加,吞吐量下降。针对这个问题有各种解法:显式的传递JVM启动参数“-XX:ParallelGCThreads”告诉JVM应该启动几个并行GC线程。它的缺点是需要业务感知,为不同配置的容器传不同的JVM参数。在容器内使用Hack过的glibc,使JVM(通过sysconf系统调用)能正确获取容器的CPU资源数。我们在一段时间内使用的就是这种方法。其优点是业务不需要感知,并且能自动适配不同配置的容器。缺点是必须使用改过的glibc,有一定的升级维护成本,如果使用的镜像是原生的glibc,问题也仍然存在。我们在新平台上通过对内核的改进,实现了容器中能获取正确CPU资源数,做到了对业务、镜像和编程语言都透明(类似问题也可能影响OpenMP、Node.js等应用的性能)。有一段时间,我们的容器是使用root权限进行运行,实现的方法是在docker run的时候加入‘privileged=true’参数。这种粗放的使用方式,使容器能够看到所在服务器上所有容器的磁盘,导致了安全问题和性能问题。安全问题很好理解,为什么会导致性能问题呢?可以试想一下,每个容器都做一次磁盘状态扫描的场景。当然,权限过大的问题还体现在可以随意进行mount操作,可以随意的修改NTP时间等等。在新版本中,我们去掉了容器的root权限,发现有一些副作用,比如导致一些系统调用失败。我们默认给容器额外增加了sys_ptrace和sys_admin两个权限,让容器可以运行GDB和更改主机名。如果有特例容器需要更多的权限,可以在我们的平台上按服务粒度进行配置。Linux有两种IO:Direct IO和Buffered IO。Direct IO直接写磁盘,Buffered IO会先写到缓存再写磁盘,大部分场景下都是Buffered IO。我们使用的Linux内核3.X,社区版本中所有容器Buffer IO共享一个内核缓存,并且缓存不隔离,没有速率限制,导致高IO容器很容易影响同主机上的其他容器。Buffer IO缓存隔离和限速在Linux 4.X里通过Cgroup V2实现,有了明显的改进,我们还借鉴了Cgroup V2的思想,在我们的Linux 3.10内核实现了相同的功能:每个容器根据自己的内存配置有对应比例的IO Cache,Cache的数据写到磁盘的速率受容器Cgroup IO配置的限制。Docker本身支持较多对容器的Cgroup资源限制,但是K8s调用Docker时可以传递的参数较少,为了降低容器间的互相影响,我们基于服务画像的资源分配,对不同服务的容器设定不同的资源限制,除了常见的CPU、内存外,还有IO的限制、ulimit限制、PID限制等等。所以我们扩展了K8s来完成这些工作。业务在使用容器的过程中产生core dump文件是常见的事,比如C/C++程序内存访问越界,或者系统OOM的时候,系统选择占用内存多的进程杀死,默认都会生成一个core dump文件。社区容器系统默认的core dump文件会生成在宿主机上,由于一些core dump文件比较大,比如JVM的core dump通常是几个GB,或者有些存在Bug的程序,其频发的core dump很容易快速写满宿主机的存储,并且会导致高磁盘IO,也会影响到其他容器。还有一个问题是:业务容器的使用者没有权限访问宿主机,从而拿不到dump文件进行下一步的分析。为此,我们对core dump的流程进行了修改,让dump文件写到容器自身的文件系统中,并且使用容器自己的Cgroup IO吞吐限制。稳定性我们在实践中发现,影响系统稳定性的主要是Linux Kernel和Docker。虽然它们本身是很可靠的系统软件,但是在大规模、高强度的场景中,还是会存在一些Bug。这也从侧面说明,我们国内互联网公司在应用规模和应用复杂度层面也属于全球领先。在内核方面,美团发现了Kernel 4.x Buffer IO限制的实现问题,得到了社区的确认和修复。我们还跟进了一系列CentOS的Ext4补丁,解决了一段时间内进程频繁卡死的问题。我们碰到了两个比较关键的Red Hat版Docker稳定性问题:在Docker服务重启以后,Docker exec无法进入容器,这个问题比较复杂。在解决之前我们用nsenter来代替Docker exec并积极反馈给RedHat。后来Red Hat在今年初的一个更新解决了这个问题。https://access.redhat.com/errata/RHBA-2017:1620是在特定条件下Docker Daemon会Panic,导致容器无法删除。经过我们自己Debug,并对比最新的代码,发现问题已经在Docker upstream中得到解决,反馈给Red Hat也很快得到了解决。https://github.com/projectatomic/containerd/issues/2面对系统内核、Docker、K8s这些开源社区的系统软件,存在一种观点是:我们不需要自己分析问题,只需要拿社区的最新更新就行了。但是我们并不认同,我们认为技术团队自身的能力很重要,主要是如下原因:美团的应用规模大、场景复杂,很多问题也许很多企业都没有遇到过,不能被动的等别人来解答。对于一些实际的业务问题或者需求(例如容器内正确返回CPU数目),社区也许觉得不重要,或者不是正确的理念,可能就不会解决。社区很多时候只在Upstream解决问题,而Upstream通常不稳定,即使有Backport到我们正在使用的版本,排期也很难进行保障。社区会发布很多补丁,通常描述都比较晦涩难懂。如果没有对问题的深刻理解,很难把遇到的实际问题和一系列补丁联系起来。对于一些复杂问题,社区的解决方案不一定适用于我们自身的实际场景,我们需要自身有能力进行判断和取舍。美团在解决开源系统问题时,一般会经历五个阶段:自己深挖、研发解决、关注社区、和社区交互,最后贡献给社区。性能容器平台性能,主要包括两个方面性能:业务服务运行在容器上的性能。容器操作(创建、删除等等)的性能。上图是我们CPU分配的一个例子,我们采用的主流服务器是两路24核服务器,包含两个Node,每个12核,算上超线程共48颗逻辑CPU。属于典型的NUMA(非一致访存)架构:系统中每个Node有自己的内存,Node内的CPU访问自己的内存的速度,比访问另一个Node内存的速度快很多(差一倍左右)。过去我们曾经遇到过网络中断集中到CPU0上的问题,在大流量下可能导致网络延时增加甚至丢包。为了保证网络处理能力,我们从Node0上划出了8颗逻辑CPU用来专门处理网络中断和宿主机系统上的任务,例如镜像解压这类高CPU的工作,这8颗逻辑CPU不运行任何容器的Workload。在容器调度方面,我们的容器CPU分配尽量不跨Node,实践证明跨Node访问内存对应用性能的影响比较大。在一些计算密集型的场景下,容器分配在Node内部会提升30%以上的吞吐量。按Node的分配方案也存在一定的弊端:会导致CPU的碎片增加,为了更高效地利用CPU资源。在实际系统中,我们会根据服务画像的信息,分配一些对CPU不敏感的服务容器跨Node使用CPU资源。上图是一个真实的服务在CPU分配优化前后,响应延时的TP指标线对比。可以看到TP999线下降了一个数量级,所有的指标都更加平稳。性能优化:文件系统针对文件系统的性能优化,第一步是选型,根据统计到的应用读写特征,我们选择了Ext4文件系统(超过85%的文件读写是对小于1M文件的操作)。Ext4文件系统有三种日志模式:Journal:写数据前等待Metadata和数据的日志落盘。Ordered:只记录Metadata的日志,写Metadata日志前确保数据已经落盘。Writeback:仅记录Metadata日志,不保证数据比Metadata先落盘。我们选择了Writeback模式(默认是oderded),它在几种挂载模式中速度最快,缺点是:发生故障时数据不好恢复。我们大部分容器处于无状态,故障时在别的机器上再拉起一台即可。因此我们在性能和稳定性中,选择了性能。容器内部给应用提供可选的基于内存的文件系统tmpfs,可以提升有大量临时文件读写的服务性能。如上图所示,在美团内部创建一个虚拟机至少经历三步,平均时间超过300秒。使用镜像创建容器平均时间23秒。容器的灵活、快速得到了显著的体现。容器扩容23秒的平均时间包含了各个部分的优化,如扩容链路优化、镜像分发优化、初始化和业务拉起优化等等。接下来,本文主要介绍一下我们做的镜像分发和解压相关的优化。上图是美团容器镜像管理的总体架构,其特点如下:存在多个Site。支持跨Site的镜像同步,根据镜像的标签确定是否需要跨Site同步。每个Site有镜像备份。每个Site内部有实现镜像分发的P2P网络。镜像分发是影响容器扩容时长的一个重要环节。跨Site同步:保证服务器总能从就近的镜像仓库拉取到扩容用的镜像,减少拉取时间,降低跨Site带宽消耗。基础镜像预分发:美团的基础镜像是构建业务镜像的公共镜像,通常有几百兆的大小。业务镜像层是业务的应用代码,通常比基础镜像小很多。在容器扩容的时候如果基础镜像已经在本地,就只需要拉取业务镜像的部分,可以明显的加快扩容速度。为达到这样的效果,我们会把基础镜像事先分发到所有的服务器上。P2P镜像分发:基础镜像预分发在有些场景会导致上千个服务器同时从镜像仓库拉取镜像,对镜像仓库服务和带宽带来很大的压力。因此我们开发了镜像P2P分发的功能,服务器不仅能从镜像仓库中拉取镜像,还能从其他服务器上获取镜像的分片。从上图可以看出,随着分发服务器数目的增加,原有分发时间也快速增加,而P2P镜像分发时间基本上保持稳定。Docker的镜像拉取是一个并行下载,串行解压的过程,为了提升解压的速度,我们美团也做了一些优化工作。对于单个层的解压,我们使用并行解压算法替换Docker默认的串行解压算法,实现上是使用pgzip替换gzip。Docker的镜像具有分层结构,对镜像层的合并是一个“解压一层合并一层,再解压一层,再合并一层”的串行操作。实际上只有合并是需要串行的,解压可以并行起来。我们把多层的解压改成并行,解压出的数据先放在临时存储空间,最后根据层之间的依赖进行串行合并。前面的改动(并行解压所有的层到临时空间)导致磁盘IO的次数增加了近一倍,也会导致解压过程不够快。于是,我们使用基于内存的Ramdisk来存储解压出来的临时文件,减轻了额外文件写带来的开销。做了上面这些工作以后,我们又发现,容器的分层也会影响下载加解压的时间。上图是我们简单测试的结果:无论对于怎么分层的镜像并行解压,都能大幅提升解压时间,对于层数多的镜像提升更加明显。推广推广容器的第一步是能说出容器的优势,我们认为容器有如下优势:轻量级:容器小、快,能够实现秒级启动。应用分发:容器使用镜像分发,开发测试容器和部署容器配置完全一致。弹性:可以根据CPU、内存等资源使用或者QPS、延时等业务指标快速扩容容器,提升服务能力。这三个特性的组合,可以给业务带来更大的灵活度和更低的计算成本。因为容器平台本身是一个技术产品,它的客户是各个业务的RD团队,因此我们需要考虑下面一些因素:产品优势:推广容器平台从某种程度上讲,自身是一个ToB的业务,首先要有好的产品,它相对于以前的解决方案(虚拟机)存在很多优势。和已有系统打通:这个产品要能和客户现有的系统很好的进行集成,而不是让客户推翻所有的系统重新再来。原生应用的开发平台、工具:这个产品要易于使用,要有配合工作的工具链。虚拟机到容器的平滑迁移:最好能提供从原有方案到新产品的迁移方案,并且容易实施。与应用RD紧密配合:要提供良好的客户支持,(即使有些问题不是这个产品导致的也要积极帮忙解决)。资源倾斜:从战略层面支持颠覆性新技术:资源上向容器平台倾斜,没有足够的理由,尽量不给配置虚拟机资源。总结Docker容器加Kubernetes编排是当前容器云的主流实践之一,美团容器集群管理平台HULK也采用了这样的方案。本文主要分享了美团在容器技术上做的一些探索和实践。内容主要涵盖美团容器云在Linux Kernel、Docker和Kubernetes层面做的一些优化工作,以及美团内部推动容器化进程的一些思考,欢迎大家跟我们交流、探讨。作者简介欧阳坚,2006年毕业于清华大学计算机系,拥有12年数据中心开发管理经验。曾任VMware中国Staff Engineer,无双科技CTO,中科睿光首席架构师。现任美团基础架构部/容器研发中心技术总监,负责美团容器化的相关工作。招聘信息美团点评基础架构团队诚招Java高级、资深技术专家,Base北京、上海。我们是集团致力于研发公司级、业界领先基础架构组件的核心团队,涵盖分布式监控、服务治理、高性能通信、消息中间件、基础存储、容器化、集群调度等技术领域。欢迎有兴趣的同学投送简历到 liuxing14@meituan.com。

November 16, 2018 · 1 min · jiezi

Logan:美团点评的开源移动端基础日志库

前言Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务。同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利。Logan已经稳定迭代了一年多的时间。目前美团点评绝大多数App已经接入并使用Logan进行日志收集、上传、分析。近日,我们决定开源Logan生态体系中的存储SDK部分(Android/iOS),希望能够帮助更多开发者合理的解决移动端日志存储收集的相关痛点,也欢迎更多社区的开发者和我们一起共建Logan生态。Github的项目地址参见:https://github.com/Meituan-Di…。背景随着业务的不断扩张,移动端的日志也会不断增多。但业界对移动端日志并没有形成相对成体系的处理方式,在大多数情况下,还是针对不同的日志进行单一化的处理,然后结合这些日志处理的结果再来定位问题。然而,当用户达到一定量级之后,很多“疑难杂症”却无法通过之前的定位问题的方式来进行解决。移动端开发者最头疼的事情就是“为什么我使用和用户一模一样的手机,一模一样的系统版本,仿照用户的操作却复现不出Bug”。特别是对于Android开发者来说,手机型号、系统版本、网络环境等都非常复杂,即使拿到了一模一样的手机也复现不出Bug,这并不奇怪,当然很多时候并不能完全拿到真正完全一模一样的手机。相信很多同学见到下面这一幕都似曾相识:用(lao)户(ban):我发现我们App的XX页面打不开了,UI展示不出来,你来跟进一下这个问题。你:好的。于是,我们检查了用户反馈的机型和系统版本,然后找了一台同型号同版本的手机,试着复现却发现一切正常。我们又给用户打个电话,问问他到底是怎么操作的,再问问网络环境,继续尝试复现依旧未果。最后,我们查了一下Crash日志,网络日志,再看看埋点日志(发现还没报上来)。你内心OS:奇怪了,也没产生Crash,网络也是通的,但是为什么UI展示不出来呢?几个小时后……用(lao)户(ban):这问题有结果了吗?你:我用了各种办法复现不出来……暂时查不到是什么原因导致的这个问题。用(lao)户(ban):那怪我咯?你:……如果把一次Bug的产生看作是一次“凶案现场”,开发者就是破案的“侦探”。案发之后,侦探需要通过各种手段搜集线索,推理出犯案过程。这就好比开发者需要通过查询各种日志,分析这段时间App在用户手机里都经历了什么。一般来说,传统的日志搜集方法存在以下缺陷:日志上报不及时。由于日志上报需要网络请求,对于移动App来说频繁网络请求会比较耗电,所以日志SDK一般会积累到一定程度或者一定时间后再上报一次。上报的信息有限。由于日志上报网络请求的频次相对较高,为了节省用户流量,日志通常不会太大。尤其是网络日志等这种实时性较高的日志。日志孤岛。不同类型的日志上报到不同的日志系统中,相对孤立。日志不全。日志种类越来越多,有些日志SDK会对上报日志进行采样。面临挑战美团点评集团内部,移动端日志种类已经超过20种,而且随着业务的不断扩张,这一数字还在持续增加。特别是上文中提到的三个缺陷,也会被无限地进行放大。查问题是个苦力活,不一定所有的日志都上报在一个系统里,对于开发者来说,可能需要在多个系统中查看不同种类的日志,这大大增加了开发者定位问题的成本。如果我们每天上班都看着疑难Bug挂着无法解决,确实会很难受。这就像一个侦探遇到了疑难的案件,当他用尽各种手段收集线索,依然一无所获,那种心情可想而知。我们收集日志复现用户Bug的思路和侦探破案的思路非常相似,通过搜集的线索尽可能拼凑出相对完整的犯案场景。如果按照这个思路想下去,目前我们并没有什么更好的方法来处理这些问题。不过,虽然侦探破案和开发者查日志解决问题的思路很像,但实质并不一样。我们处理的是Bug,不是真实的案件。换句话说,因为我们的“死者”是可见的,那么就可以从它身上获取更多信息,甚至和它进行一次“灵魂的交流”。换个思路想,以往的操作都是通过各种各样的日志拼凑出用户出现Bug的场景,那可不可以先获取到用户在发生Bug的这段时间产生的所有日志(不采样,内容更详细),然后聚合这些日志分析出(筛除无关项)用户出现Bug的场景呢?个案分析新的思路重心从“日志”变为“用户”,我们称之为“个案分析”。简单来说,传统的思路是通过搜集散落在各系统的日志,然后拼凑出问题出现的场景,而新的思路是从用户产生的所有日志中聚合分析,寻找出现问题的场景。为此,我们进行了技术层面的尝试,而新的方案需要在功能上满足以下条件:支持多种日志收集,统一底层日志协议,抹平日志种类带来的差异。日志本地记录,在需要时上报,尽可能保证日志不丢失。日志内容要尽可能详细,不采样。日志类型可扩展,可由上层自定义。我们还需要在技术上满足以下条件:轻量级,包体尽量小API易用没有侵入性高性能横空出世在这种背景下,Logan横空出世,其核心体系由四大模块构成:日志输入日志存储后端系统前端系统最佳实践日志输入常见的日志类型有:代码级日志、网络日志、用户行为日志、崩溃日志、H5日志等。这些都是Logan的输入层,在不影响原日志体系功能的情况下,可将内容往Logan中存储一份。Logan的优势在于:日志内容可以更加丰富,写入时可以携带更多信息,也没有日志采样,只会等待合适的时机进行统一上报,能够节省用户的流量和电量。以网络日志为例,正常情况下网络日志只记录端到端延时、发包大小、回包大小字段等等,同时存在采样。而在Logan中网络日志不会被采样,除了上述内容还可以记录请求Headers、回包Headers、原始Url等信息。日志存储Logan存储SDK是这个开源项目的重点,它解决了业界内大多数移动端日志库存在的几个缺陷:卡顿,影响性能日志丢失安全性日志分散Logan自研的日志协议解决了日志本地聚合存储的问题,采用“先压缩再加密”的顺序,使用流式的加密和压缩,避免了CPU峰值,同时减少了CPU使用。跨平台C库提供了日志协议数据的格式化处理,针对大日志的分片处理,引入了MMAP机制解决了日志丢失问题,使用AES进行日志加密确保日志安全性。Logan核心逻辑都在C层完成,提供了跨平台支持的能力,在解决痛点问题的同时,也大大提升了性能。为了节约用户手机空间大小,日志文件只保留最近7天的日志,过期会自动删除。在Android设备上Logan将日志保存在沙盒中,保证了日志文件的安全性。详情请参考:美团点评移动端基础日志库——Logan后端系统后端是接收和处理数据中心,相当于Logan的大脑。主要有四个功能:接收日志日志解析归档日志分析数据平台接收日志客户端有两种日志上报的形式:主动上报和回捞上报。主动上报可以通过客服引导用户上报,也可以进行预埋,在特定行为发生时进行上报(例如用户投诉)。回捞上报是由后端向客户端发起回捞指令,这里不再赘述。所有日志上报都由Logan后端进行接收。日志解析归档客户端上报的日志经过加密和压缩处理,后端需要对数据解密、解压还原,继而对数据结构化归档存储。日志分析不同类型日志由不同的字段组合而成,携带着各自特有信息。网络日志有请求接口名称、端到端延时、发包大小、请求Headers等信息,用户行为日志有打开页面、点击事件等信息。对所有的各类型日志进行分析,把得到的信息串连起来,最终汇集形成一个完整的个人日志。数据平台数据平台是前端系统及第三方平台的数据来源,因为个人日志属于机密数据,所以数据获取有着严格的权限审核流程。同时数据平台会收集过往的Case,抽取其问题特征记录解决方案,为新Case提供建议。前端系统一个优秀的前端分析系统可以快速定位问题,提高效率。研发人员通过Logan前端系统搜索日志,进入日志详情页查看具体内容,从而定位问题,解决问题。目前集团内部的Logan前端日志详情页已经具备以下功能:日志可视化。所有的日志都经过结构化处理后,按照时间顺序展示。时间轴。数据可视化,利用图形方式进行语义分析。日志搜索。快速定位到相关日志内容。日志筛选。支持多类型日志,可选择需要分析的日志。日志分享。分享单条日志后,点开分享链接自动定位到分享的日志位置。Logan对日志进行数据可视化时,尝试利用图形方式进行语义分析简称为时间轴。每行代表着一种日志类型。同一日志类型有着多种图形、颜色,他们标识着不同的语义。例如时间轴中对代码级日志进行了日志类别的区分:利用颜色差异,可以轻松区分出错误的日志,点击红点即可直接跳转至错误日志详情。个案分析流程用户遇到问题联系客服反馈问题。客服收到用户反馈。记录Case,整理问题,同时引导用户上报Logan日志。研发同学收到Case,查找Logan日志,利用Logan系统完成日志筛选、时间定位、时间轴等功能,分析日志,进而还原Case“现场”。最后,结合代码定位问题,修复问题,解决Case。定位问题结合用户信息,通过Logan前端系统查找用户的日志。打开日志详情,首先使用时间定位功能,快速跳转到出问题时的日志,结合该日志上下文,可得到当时App运行情况,大致推断问题发生的原因。接着利用日志筛选功能,查找关键Log对可能出问题的地方逐一进行排查。最后结合代码,定位问题。当然,在实际上排查中问题比这复杂多,我们要反复查看日志、查看代码。这时还可能要借助一下Logan高级功能,如时间轴,通过时间轴可快速找出现异常的日志,点击时间轴上的图标可跳转到日志详情。通过网络日志中的Trace信息,还可以查看该请求在后台服务详细的响应栈情况和后台响应值。未来规划机器学习分析。首先收集过往的Case及解决方案,提取分析Case特征,将Case结构化后入库,然后通过机器学习快速分析上报的日志,指出日志中可能存在的问题,并给出解决方案建议;数据开放平台。业务方可以通过数据开放平台获取数据,再结合自身业务的特性研发出适合自己业务的工具、产品。平台支持PlatformiOSAndroidWebMini ProgramsSupport√√√√目前Logan SDK已经支持以上四个平台,本次开源iOS和Android平台,其他平台未来将会陆续进行开源,敬请期待。测试覆盖率由于Travis、Circle对Android NDK环境支持不够友好,Logan为了兼容较低版本的Android设备,目前对NDK的版本要求是16.1.4479499,所以我们并没有在Github仓库中配置CI。开发者可以本地运行测试用例,测试覆盖率可达到80%或者更高。开源计划在集团内部已经形成了以Logan为中心的个案分析生态系统。本次开源的内容有iOS、Android客户端模块、数据解析简易版,小程序版本、Web版本已经在开源的路上,后台系统,前端系统也在我们开源计划之中。未来我们会提供基于Logan大数据的数据平台,包含机器学习、疑难日志解决方案、大数据特征分析等高级功能。最后,我们希望提供更加完整的一体化个案分析生态系统,也欢迎大家给我们提出建议,共建社区。ModuleOpen SourceProcessingPlanningiOS√ Android√ Web √ Mini Programs √ Back End √Front End √团队介绍周辉,项目发起人,美团点评资深移动架构师。姜腾,项目核心开发者。立成,项目核心开发者。白帆,项目核心开发者。招聘点评平台移动研发中心,Base上海,为美团点评集团大多数移动端提供底层基础设施服务,包含网络通信、移动监控、推送触达、动态化引擎、移动研发工具等。同时团队还承载流量分发、UGC、内容生态、整合中心等业务研发,长年虚位以待有志于专注移动端研发的各路英雄。欢迎投递简历:hui.zhou#dianping.com。

October 12, 2018 · 1 min · jiezi