首页 文章 精选 留言 我的

精选列表

搜索[百万tokens],共7479篇文章
优秀的个人博客,低调大师

领英全球华人程序员学堂即将免费开课,预计吸引百万精英程序员一起打造 “向上的力量”

网上有一个热门话题叫“在中国程序员能不能干一辈子”,点赞最多的几条讨论一致回答:可以。 说得好像“35 岁危机”不存在似的。 仔细看内容才会发现,点赞其实代表着一个个“愿望”,点赞越多,越能反应程序员群体的集体情绪。 在热门讨论中,老程序员一针见血地指出了这个群体的职场真相: 面试过程中,一道普通的工程实践题目,能刷掉一半的人。考察 C++ 新标准,又能刷掉一半。 “找工作难,招人更难”的现象可见一斑,不仅程序员难找到合适的工作,公司也难招到能力达标的程序员。 1 在互联网的带动下,程序员这个具有高度技术门槛的行业,一直带着“劳动力密集型”的标签,海量招人的互联网大厂尤其尴尬。 在一定程度上,这种高需求造成了程序员之间的能力水平差别巨大。 因此,面试官需要把大量的资源和精力放在筛选环节,再加上行当本身的技术性,跟有效求职者建立直接对话的机会往往被人为设限。 然而,需求端的瓶颈远没有到来。 随着全产业信息化开始,各行各业对程序员的需求只会越来越大,招聘难的情况也只会愈演愈烈,企业招聘的方式方法亟待更新。 工信部 2020 统计数据显示,自 2020 年上半年以来,程序员招聘需求高于全行业职位招聘需求。埃文斯数据显示,截至目前,中国有近 700 万程序员,但仍然有 800-1300 万的人才缺口。预计到 2023 年底,中国将成为程序员增长最快的国家。 数字背后,对企业来说有更重要的现实。 在 21 世纪的第三个 10 年,企业经营面临着更严苛的环境,对未来的预期难觅标的。高质量发展不是理想,更是存续下去的要求。 拆解到人力资源管理上,HR 不仅要及时把人招进来,更重要的是及时把有价值的人招进来并且留住。 2 最能感受到水温变化的,最终还是程序员群体。 过去一年,随着数字化、智能化趋势的来临,传统工具升级,自动驾驶上路,国产操作系统、芯片、数据库等领域也开始飞速发展。 程序员的能力要求顺势被抬升,程序员需要掌握大数据、云计算、物联网以及人工智能等一系列技术。无数从业者感叹——学不完的技术,跟不动的技术潮流。 这就造成了程序员群体的两个特点,一方面,3 年内跳槽率达到 50% +;另一方面,人人都有强烈的学习愿望。 CSDN《2021-2022 中国开发者调查报告》显示,57% 的程序员参加在线课程学习;55% 的程序员愿意付费学习,提升自己的专业技能;42% 的程序员每周学习 1-5 个小时。 今天的互联网上,很难找到一个社区,其中的学习氛围比程序员社区更浓厚。在 GitHub、V2EX、CSDN、51CTO 等垂直社区,每一天都有海量的技术交流内容被生产和传播。 领英发现,除了论坛形式的交互学习探索,程序员在职场进阶中的重点诉求还包括大厂知名产品的实际工程应用、高潜力商业化技术应用探讨、实际招聘中的人才技能需求,以及持续掌握优质机会。 3 在这样的背景下,领英面向全球华人程序员推出“向上的力量”公益项目——领英全球华人程序员学堂。 它向有志于在产业技术领域提升专业技能的华人程序员进行免费赋能,并向其推介来自中国领先企业的优质工作机会。因此这次活动对于有着“招人难”烦恼的 HR 和公司来说,也会是一个填补自身人才空缺的好机会,在这里找到的人才,绝对拥有过硬的专业技能。 领英全球华人程序员学堂将带来一系列面向应用和实践的高质量内容,讲师团队由领英特聘,包括来自国际 Top 研究机构的 Leader,顶尖公司技术领军人物以及知名院校科研技术专家。敬请期待领英大咖导师团队阵容! 全球华人程序员将在领英免费获得 10 门精品课程,内容涵盖大厂知名产品的实际工程应用、高潜力商业化技术应用探讨和热招技能解析。 这次领英“向上的力量”公益项目也致力于打造一个行业交流高地。所有学员在免费学习之外,将会获得热招职位推荐,通过彼此交互探讨加深人脉池。这对于广大 HR 集体来说也会是一个福音。大量拥有达标技能的程序员将汇集于一处,可以很大程度上缓解“招人难”的难题。 课程学完之后,学员能通过在线测试获得领英认证,并参加未来一年举行的毕业典礼,与授课导师面对面交流,使本次课程更加具有含金量,让学员成为合格的业内人才。 4 领英平台全球华人程序员人才储备已超过 500 万,海外华人程序员人才储备已超过 180 万。 整个项目将获得领英站内外的资源支持,覆盖 20 余家科技开发类媒体, 曝光量预计达到一千万以上,实现对一百余万名程序员的精准覆盖。 因此,“向上的力量”公益项目——领英全球华人程序员学堂也是企业强势打造全球技术雇主品牌的绝佳机会。 我们诚邀您一起,成为“向上的力量”。 扫描二维码或阅读原文 即刻了解参与领英全球华人程序员学堂! ▼

优秀的个人博客,低调大师

搜索引擎恶意广告驱动 Ledger 定向钓鱼攻击风险与全域防护研究 —— 基于 2026 年 Odaily 三百万美元失窃事件实证

2026 年 8 月 Odaily 发布链上安全调查机构 Specter 专项监测报告,披露单一黑产团伙依托搜索引擎付费恶意广告(Malvertising)持续投放仿 Ledger 官方推广链接,搭建标准化定向钓鱼作战体系,截至预警发布累计窃取加密资产总价值突破 300 万美元,相关恶意推广素材截图完成取证后平台下架全部涉事付费广告。本次攻击区别于传统邮件、社群分发类钓鱼,以搜索引擎商业推广流量入口为核心欺诈载体,利用广告展示域名伪装、竞价置顶流量垄断、AiTM 中间人反向代理、助记词诱导窃取形成完整闭环,击穿硬件钱包离线私钥隔离的传统安全认知。本文以 Odaily 公开报道为核心实证素材,完整拆解搜索引擎恶意广告型钓鱼全链路实施逻辑,从黑产广告投放、仿冒站点交互、资产凭证窃取、链上资金洗白四个阶段解析技术与流量操纵机理;分层梳理搜索引擎平台、Ledger 硬件钱包厂商、终端用户、Web3 安全基础设施四大主体存在的结构性防护短板;结合反网络钓鱼技术专家芦笛提出的 “广告前置审核 - 站点实时拦截 - 客户端刚性约束 - 用户分层宣教” 四维协同防御理论,构建适配搜索引擎流量欺诈场景的闭环分层防护框架,提出可落地的平台广告规则改造、钱包底层安全加固、行业情报共享、标准化用户操作规范实施方案。研究证实,硬件钱包芯片级隔离仅能抵御终端本地恶意程序,无法应对依托商业流量渠道的精准社会工程钓鱼;搜索引擎现有广告审核静态机制存在天然滞后性,单一主体防护无法阻断完整欺诈链路,必须打通平台、硬件厂商、安全审计机构、投资者多方联动机制,同步完成技术管控与常态化反诈认知培育,才能系统性降低付费广告类定向钓鱼造成的资产失窃规模。研究结论可为搜索引擎广告风控迭代、硬件钱包产品安全升级、Web3 行业反诈体系建设提供实证依据与标准化落地路径。

优秀的个人博客,低调大师

百万级高并发mongodb集群性能数十倍提升优化实践(上篇)-19年mongodb中文社区年度一等奖

关于作者前滴滴出行技术专家,现任OPPO文档数据库mongodb负责人,负责oppo千万级峰值TPS/十万亿级数据量文档数据库mongodb研发和运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发。后续持续分享《MongoDB内核源码设计、性能优化、最佳运维实践》,Github账号地址:https://github.com/y123456yz1.背景线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性。该集群采用mongodb天然的分片模式架构,数据均衡的分布于各个分片中,添加片键启用分片功能后实现完美的负载均衡。集群每个节点流量监控如下图所示:从上图可以看出集群流量比较大,峰值已经突破120万/秒,其中delete过期删除的流量不算在总流量里面(delete由主触发删除,但是主上面不会显示,只会在从节点拉取oplog的时候显示)。如果算上主节点的delete流量,总tps超过150万/秒。 2.软件优化在不增加服务器资源的情况下,首先做了如下软件层面的优化,并取得了理想的数倍性能提升:1.业务层面优化2.Mongodb配置优化3.存储引擎优化2.1 业务层面优化该集群总文档数百亿条,每条文档记录默认保存三天,业务随机散列数据到三天后任意时间点随机过期淘汰。由于文档数目很多,白天平峰监控可以发现从节点经常有大量delete操作,甚至部分时间点delete删除操作数已经超过了业务方读写流量,因此考虑把delete过期操作放入夜间进行,过期索引添加方法如下:Db.collection.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )上面的过期索引中expireAfterSeconds=0,代表collection集合中的文档的过期时间点在expireAt时间点过期,例如:db.collection.insert( {//表示该文档在夜间凌晨1点这个时间点将会被过期删除"expireAt": new Date('July 22, 2019 01:00:00'), "logEvent": 2,"logMessage": "Success!"} )通过随机散列expireAt在三天后的凌晨任意时间点,即可规避白天高峰期触发过期索引引入的集群大量delete,从而降低了高峰期集群负载,最终减少业务平均时延及抖动。 Delete过期Tips1: expireAfterSeconds含义 在expireAt指定的绝对时间点过期,也就是12.22日凌晨2:01过期Db.collection.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )db.log_events.insert( { "expireAt": new Date(Dec 22, 2019 02:01:00'),"logEvent": 2,"logMessage": "Success!"}) 2.在expireAt指定的时间往后推迟expireAfterSeconds秒过期,也就是当前时间往后推迟60秒过期db.log_events.insert( {"createdAt": new Date(),"logEvent": 2,"logMessage": "Success!"} )Db.collection.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 60 } ) Delete过期Tips2: 为何mongostat只能监控到从节点有delete操作,主节点没有? 原因是过期索引只在master主节点触发,触发后主节点会直接删除调用对应wiredtiger存储引擎接口做删除操作,不会走正常的客户端链接处理流程,因此主节点上看不到delete统计。 主节点过期delete后会生存对于的delete oplog信息,从节点通过拉取主节点oplog然后模拟对于client回放,这样就保证了主数据删除的同时从数据也得以删除,保证数据最终一致性。从节点模拟client回放过程将会走正常的client链接过程,因此会记录delete count统计,详见如下代码: 官方参考如下: https://docs.mongodb.com/manual/tutorial/expire-data/ 2.2 Mongodb配置优化(网络IO复用,网络IO和磁盘IO做分离)由于集群tps高,同时整点有大量推送,因此整点并发会更高,mongodb默认的一个请求一个线程这种模式将会严重影响系统负载,该默认配置不适合高并发的读写应用场景。官方介绍如下:2.2.1 Mongodb内部网络线程模型实现原理mongodb默认网络模型架构是一个客户端链接,mongodb会创建一个线程处理该链接fd的所有读写请求及磁盘IO操作。Mongodb默认网络线程模型不适合高并发读写原因如下: 在高并发的情况下,瞬间就会创建大量的线程,例如线上的这个集群,连接数会瞬间增加到1万左右,也就是操作系统需要瞬间创建1万个线程,这样系统load负载就会很高。 此外,当链接请求处理完,进入流量低峰期的时候,客户端连接池回收链接,这时候mongodb服务端就需要销毁线程,这样进一步加剧了系统负载,同时进一步增加了数据库的抖动,特别是在PHP这种短链接业务中更加明显,频繁的创建线程销毁线程造成系统高负债。 一个链接一个线程,该线程除了负责网络收发外,还负责写数据到存储引擎,整个网络I/O处理和磁盘I/O处理都由同一个线程负责,本身架构设计就是一个缺陷。 2.2.2 网络线程模型优化方法为了适应高并发的读写场景,mongodb-3.6开始引入serviceExecutor: adaptive配置,该配置根据请求数动态调整网络线程数,并尽量做到网络IO复用来降低线程创建消耗引起的系统高负载问题。此外,加上serviceExecutor: adaptive配置后,借助boost:asio网络模块实现网络IO复用,同时实现网络IO和磁盘IO分离。这样高并发情况下,通过网络链接IO复用和mongodb的锁操作来控制磁盘IO访问线程数,最终降低了大量线程创建和消耗带来的高系统负载,最终通过该方式提升高并发读写性能。2.2.3 网络线程模型优化前后性能对比在该大流量集群中增加serviceExecutor: adaptive配置实现网络IO复用及网络IO与磁盘IO做分离后,该大流量集群时延大幅度降低,同时系统负载和慢日志也减少很多,具体如下:2.2.3.1 优化前后系统负载对比验证方式:1.该集群有多个分片,其中一个分片配置优化后的主节点和同一时刻未优化配置的主节点load负载比较:未优化配置的load优化配置的load2.2.3.2 优化前后慢日志对比验证方式:该集群有多个分片,其中一个分片配置优化后的主节点和同一时刻未优化配置的主节点慢日志数比较: 同一时间的慢日志数统计: 未优化配置的慢日志数(19621): 优化配置后的慢日志数(5222): 2.2.3.3 优化前后平均时延对比验证方式:该集群所有节点加上网络IO复用配置后与默认配置的平均时延对比如下:从上图可以看出,网络IO复用后时延降低了1-2倍。2.3 wiredtiger存储引擎优化从上一节可以看出平均时延从200ms降低到了平均80ms左右,很显然平均时延还是很高,如何进一步提升性能降低时延?继续分析集群,我们发现磁盘IO一会儿为0,一会儿持续性100%,并且有跌0现象,现象如下:从图中可以看出,I/O写入一次性到2G,后面几秒钟内I/O会持续性阻塞,读写I/O完全跌0,avgqu-sz、awit巨大,util次序性100%,在这个I/O跌0的过程中,业务方反应的TPS同时跌0。此外,在大量写入IO后很长一段时间util又持续为0%,现象如下:总体IO负载曲线如下:从图中可以看出IO很长一段时间持续为0%,然后又飙涨到100%持续很长时间,当IO util达到100%后,分析日志发现又大量满日志,同时mongostat监控流量发现如下现象:从上可以看出我们定时通过mongostat获取某个节点的状态的时候,经常超时,超时的时候刚好是io util=100%的时候,这时候IO跟不上客户端写入速度造成阻塞。有了以上现象,我们可以确定问题是由于IO跟不上客户端写入速度引起,第2章我们已经做了mongodb服务层的优化,现在我们开始着手wiredtiger存储引擎层面的优化,主要通过以下几个方面:1.cachesize调整2.脏数据淘汰比例调整3.checkpoint优化 2.3.1 cachesize调整优化(为何cacheSize越大性能越差)前面的IO分析可以看出,超时时间点和I/O阻塞跌0的时间点一致,因此如何解决I/O跌0成为了解决改问题的关键所在。找个集群平峰期(总tps50万/s)查看当时该节点的TPS,发现TPS不是很高,单个分片也就3-4万左右,为何会有大量的刷盘,瞬间能够达到10G/S,造成IO util持续性跌0(因为IO跟不上写入速度)。继续分析wiredtiger存储引擎刷盘实现原理,wiredtiger存储引擎是一种B+树存储引擎,mongodb文档首先转换为KV写入wiredtiger,在写入过程中,内存会越来越大,当内存中脏数据和内存总占用率达到一定比例,就开始刷盘。同时当达到checkpoint限制也会触发刷盘操作,查看任意一个mongod节点进程状态,发现消耗的内存过多,达到110G,如下图所示:于是查看mongod.conf配置文件,发现配置文件中配置的cacheSizeGB: 110G,可以看出,存储引擎中KV总量几乎已经达到110G,按照5%脏页开始刷盘的比例,峰值情况下cachesSize设置得越大,里面得脏数据就会越多,而磁盘IO能力跟不上脏数据得产生速度,这种情况很可能就是造成磁盘I/O瓶颈写满,并引起I/O跌0的原因。此外,查看该机器的内存,可以看到内存总大小为190G,其中已经使用110G左右,几乎是mongod的存储引起占用,这样会造成内核态的page cache减少,大量写入的时候内核cache不足就会引起磁盘缺页中断,引起大量的写盘。解决办法:通过上面的分析问题可能是大量写入的场景,脏数据太多容易造成一次性大量I/O写入,于是我们可以考虑把存储引起cacheSize调小到50G,来减少同一时刻I/O写入的量,从而规避峰值情况下一次性大量写入的磁盘I/O打满阻塞问题。 2.3.2 存储引擎dirty脏数据淘汰优化调整cachesize大小解决了5s请求超时问题,对应告警也消失了,但是问题还是存在,5S超时消失了,1s超时问题还是偶尔会出现。因此如何在调整cacheSize的情况下进一步规避I/O大量写的问题成为了问题解决的关键,进一步分析存储引擎原理,如何解决内存和I/O的平衡关系成为了问题解决的关键,mongodb默认存储因为wiredtiger的cache淘汰策略相关的几个配置如下:wiredtiger淘汰相关配置 默认值 工作原理eviction_target 80 当用掉的内存超过总内存的百分比达到eviction_target,后台evict线程开始淘汰eviction_trigger 95 当用掉的内存超过总内存的eviction_trigger,用户线程也开始淘汰eviction_dirty_target 5 当cache中脏数据比例超过eviction_dirty_target,后台evict线程开始淘汰eviction_dirty_trigger 20 当cache中脏数据比例超过eviction_dirty_trigger, 用户线程也开始淘汰evict.threads_min 4 后台evict线程最小数evict.threads_max 4 后台evict线程最大数 调整cacheSize从120G到50G后,如果脏数据比例达到5%,则极端情况下如果淘汰速度跟不上客户端写入速度,这样还是容易引起I/O瓶颈,最终造成阻塞。 解决办法: 如何进一步减少持续性I/O写入,也就是如何平衡cache内存和磁盘I/O的关系成为问题关键所在。从上表中可以看出,如果脏数据及总内占用存达到一定比例,后台线程开始选择page进行淘汰写盘,如果脏数据及内存占用比例进一步增加,那么用户线程就会开始做page淘汰,这是个非常危险的阻塞过程,造成用户请求验证阻塞。平衡cache和I/O的方法: 调整淘汰策略,让后台线程尽早淘汰数据,避免大量刷盘,同时降低用户线程阀值,避免用户线程进行page淘汰引起阻塞。优化调整存储引起配置如下: eviction_target: 75%eviction_trigger:97%eviction_dirty_target: %3eviction_dirty_trigger:25%evict.threads_min:8evict.threads_min:12 总体思想是让后台evict尽量早点淘汰脏页page到磁盘,同时调整evict淘汰线程数来加快脏数据淘汰,调整后mongostat及客户端超时现象进一步缓解。 2.3.3 存储引擎checkpoint优化调整存储引擎得checkpoint检测点,实际上就是做快照,把当前存储引擎的脏数据全部记录到磁盘。触发checkpoint的条件默认又两个,触发条件如下:1.固定周期做一次checkpoint快照,默认60s2.增量的redo log(也就是journal日志)达到2G当journal日志达到2G或者redo log没有达到2G并且距离上一次时间间隔达到60s,wiredtiger将会触发checkpoint,如果在两次checkpoint的时间间隔类evict淘汰线程淘汰的dirty page越少,那么积压的脏数据就会越多,也就是checkpoint的时候脏数据就会越多,造成checkpoint的时候大量的IO写盘操作。如果我们把checkpoint的周期缩短,那么两个checkpoint期间的脏数据相应的也就会减少,磁盘IO 100%持续的时间也就会缩短。checkpoint调整后的值如下:checkpoint=(wait=25,log_size=1GB)2.3.4 存储引擎优化前后IO对比通过上面三个方面的存储引擎优化后,磁盘IO开始平均到各个不同的时间点,iostat监控优化后的IO负载如下:从上面的io负载图可以看出,之前的IO一会儿为0%,一会儿100%现象有所缓解,总结如下图所示:2.3.5 存储引擎优化前后时延对比优化前后时延对比如下(注: 该集群有几个业务同时使用,优化前后时延对比如下):从上图可以看出,存储引擎优化后时间延迟进一步降低并趋于平稳,从平均80ms到平均20ms左右,但是还是不完美,有抖动。3 服务器系统磁盘IO问题解决3.1 服务器IO硬件问题背景如第3节所述,当wiredtiger大量淘汰数据后,发现只要每秒磁盘写入量超过500M/s,接下来的几秒钟内util就会持续100%,w/s几乎跌0,于是开始怀疑磁盘硬件存在缺陷。从上图可以看出磁盘为nvMe的ssd盘,查看相关数据可以看出该盘IO性能很好,支持每秒2G写入,iops能达到2.5W/S,而我们线上的盘只能每秒写入最多500M。 3.2 服务器IO硬件问题解决后性能对比于是考虑把该分片集群的主节点全部迁移到另一款服务器,该服务器也是ssd盘,io性能达到2G/s写入(注意:只迁移了主节点,从节点还是在之前的IO-500M/s的服务器)。 迁移完成后,发现性能得到了进一步提升,时延迟降低到2-4ms/s,三个不同业务层面看到的时延监控如下图所示:从上图时延可以看出,迁移主节点到IO能力更好的机器后,时延进一步降低到平均2-4ms。虽然时延降低到了平均2-4ms,但是还是有很多几十ms的尖刺,鉴于篇幅将在下一期分享大家原因,最终保存所有时延控制在5ms以内,并消除几十ms的尖刺。此外,nvme的ssd io瓶颈问题原因,经过和厂商确认分析,最终定位到是linux内核版本不匹配引起,如果大家nvme ssd盘有同样问题,记得升级linux版本到3.10.0-957.27.2.el7.x86_64版本,升级后nvme ssd的IO能力达到2G/s以上写入。 4 总结及遗留问题通过mongodb服务层配置优化、存储引擎优化、硬件IO提升三方面的优化后,该大流量写入集群的平均时延从之前的平均数百ms降低到了平均2-4ms,整体性能提升数十倍,效果明显。但是,从4.2章节优化后的时延可以看出,集群偶尔还是会有抖动,鉴于篇幅,下期会分享如果消除4.2章节中的时延抖动,最终保持时间完全延迟控制在2-4ms,并且无任何超过10ms的抖动,敬请期待,下篇会更加精彩。此外,在集群优化过程中采了一些坑,下期会继续分析大流量集群采坑记。 注意: 文章中的一些优化方法并不是一定适用于所有mongodb场景,请根据实际业务场景和硬件资源能力进行优化,而不是按部就班。

优秀的个人博客,低调大师

【沉淀】一张表的设计优化节省了两百万,客户不断盛誉……,这背后他究竟做对了什么?——记访谈阿里云汪建明

《沉淀》是云栖社区展示专家风采的人物栏目。它呈现每个专家独一无二的人生经历、认识和感悟的同时,也能帮助你沉淀技术,收获对技术和人生的判断。我们的想法是:“若你想精进为一个很厉害的人,不妨细细品味这些技术牛人背后的沉淀。” 如果你想了解这些云栖专家更多分享时,请点击云栖专家频道,当然我们也欢迎你往前走一步,成为我们的云栖专家(https://yq.aliyun.com/expert),与技术大牛一起“煮酒论英雄”。 “客户第一”是阿里巴巴“六脉神剑”中排名第一的价值观,它除了要求阿里人服务好客户之外,也要求阿里的同学时时刻刻去了解客户的所思所想,不断地挑战自己,用不同的视角给客户创造更多新的价值。 在阿里云数据库DBA专家服务组里,就有一位技术人是“客户第一”的典范。因为他的存在,有客户放心地说:“我们才安心地把业务放在云上。”;也是因为他,客户非常感激:“如果没有他的帮助,可能会出现更加严重的问题。” 在服务态度上,有客户称赞他高效、负责;也有人对他的敬业动容:“感谢汪建明经常利用自己的休息时间来帮助我们查找和解决问题”。在专业上,有人赞赏他有高手风范,接手后不仅迅速找到了问题发生的原因,在半个小时之内还提出了解决方案,并帮他们完成了大部分的调优工作,及时阻止了问题向更加严重方向发展…… 对于这些称赞,他没有一丝一毫地骄傲,反而不断地总结和反思,提炼出客户服务三步骤:了解客户诉求、做到情绪沟通以及坦诚方案风险。面对一时情绪上难以平复,“刁难任性”的客户,他真正做到:客户虐我千百遍,我待客户如初恋,问及乐观心态的原因,他笑称:“客户虐我们,恰恰说明他们爱我们,离不开我们。” 尤为值得一提的是他的技术,在上一家公司,他仅仅对一张核心表的设计优化,就为公司节约了30TB的SAN空间开销,带来的直接经济成本节约是两百多万人民币。为此,公司直接把他调往美国总部。 他,就是阿里云数据库专家服务组的汪建明,花名“风移”。第14期《沉淀》人物栏目,用时半个多月的时间,去走近这位在SQL Server数据库行业钻研十年的技术专家,将他的沉淀和别具匠心呈现给大家。 技能和职场快、准、狠的背后 汪建明说,数据是公司的生命线,而数据库是数据的最后一道防线,你对自己的所有操作的后果、风险一定要心中有底。 汪建明,目前在阿里云RDS负责数据库管理、运维、产品设计、研发,以及专家服务等。上一段工作经历,他是在新蛋(Newegg)成都公司做DBA。因为工作出色,几年后,他就被调到美国新蛋加州总部,负责集团数据库管理、运维、设计、性能调校,以及大数据平台建设。后者中,包括Hadoop、Hbase、Hive、Prosto和Phoenix等。 回顾这段较为顺利的职场经历,他把原因归结为四个字:“先知先觉”。他说,自己读大三时,就已经在企业里实习,摸爬滚打,锻炼自己。大四,更是几乎没在学校待过,一边自学大四专业课程,一边公司实习。 他说:“自己虽然累点,但是知识的吸收速度,和对社会、职场的贴近程度更快、准、狠。”在大四所有人都在为找工作东奔西走、忙里忙外时,汪建明已经在实习单位转正。 在转正后的四年里,汪建明做了无数的项目,也开始带领8个人的团队。随后,他转到美国总部。然而初到美国后,却让他有种一夜回到解放前的感觉。 问题体现在口语表达、文化差异、同事相处等方面。为了丰满自己,适应新环境,汪建明白天上班,晚上上语言社区大学语言课程,结束之后,再回家上在线英文课程。这是犹如孩童一般,从头开始一点一滴的重新学习:“如何打电话、如何点餐、如何与人沟通,甚至如何写英文邮件……”汪建明感慨到,文字表达有点苍白无力,其中滋味五味杂陈,只有自己才能体会。在这样的状态下,汪建明坚持一年后,也慢慢适应了新环境和工作节奏。 带来的I/O压力减轻和应用内系统的性能提升,很难用数字去表达 回首在新蛋的工作,汪建明称,因为做的项目太多,有很多都已无法记得特别清楚,唯独有一个记得十分清晰。 那是他发起并领导的一个项目,工作的内容是对一张核心系统表的设计优化。就是这张表,却为公司节约了近30TB的SAN空间开销。这个是直接空间节省,因此带来的I/O压力减轻和应用系统性能提升,很难用数字去表达。而这30TB的空间直接的经济成本是30万美金左右,也就是200万左右人民币。 他指出,这个项目是典型的利用技术手段,为公司节约经济成本投入的很好佐证。项目的背景是关键业务系统大表,表结构的设计有很大问题。具体体现在表字段类型的设计有问题和表主键设计不合理,比如好几个字段的数据类型被设计为CHAR(100), CHAR(800),CHAR(2000)这种数据类型,而表主键则是CHAR(25),这种设计导致的严重问题包括: CHAR数据类型存储了很多无用的空格信息,主键长度过宽,导致表聚集索引、非聚集索引空间占用过大 查询语句性能会消耗更多I/O资源,I/O利用率下降 索引维护工作超时,更进一步导致了查询语句性能低下 过大的表空间甚至导致备份超时,影响备份策略 问题的解决之道,也许并不是特别难,但让汪建明头疼的是:如何在完全不修改现有系统,不影响现有业务系统,在用户业务毫无感知的情况下,把这个项目按时按质量顺利进行;其次是,该表为大表,仅仅是这一个表记录数近1亿,表空间占用近700GB,数据源头同步到近60个数据目的业务子系统中,业务系统错中复制,盘根错节,千头万绪。 基于以上的同步关系,加之该表为公司关键业务系统表,公司里的技术人难以抉择。“我们不会也不可能直接在表数据同步源头直接修改表结构。如果这么操作会导致一个超大的事务,影响到所有业务子系统,对公司业务来说是致命的。” 汪建明道出难以抉择的原因。 这位在大三就在企业摸爬滚打的技术人,并没被问题吓住。他开始着手解决问题,先是理清楚所有业务子系统,该表的数据同步关系;接着,制定好详细的操作步骤,验证方法,不断在测试环境验证这些步骤和方法的可行性。 而当他不断探索,验证方案时,解决思路也就有了:在数据源头库新建一张中间表,中间表的表结构是已经优化好了,最终希望的表结构(CHAR数据类型修改为VARCHAR),不再存在数据类型的问题→在数据源头建立到中间表的Replication→确保正式表和中间表数据一致性→中间表上Update截断CHAR数据类型右边空格→在中间表基础上,参照正是表的同步关系,建立一摸一样的同步链→切换所有下游中间表,将中间表和正式表名字对调(这个过程很快,不到1秒即可完成)→最后切换最终源头表的名字。 当项目成功实施后,统计所有实例上该表空间占用情况,已然从700GB降低到200GB,空间占用降低了近70%,总共节约了近30TB的存储空间。项目总结时,所有人都对他竖起了大拇指。 技术不是僵硬的:“你仿佛看到了客人迎面而来,热情地紧握着你的手,满面微笑不断地说——谢谢。” 在美国待了三年后,汪建明意识到云计算的发展的巨大潜力和未来,他决定回国,并加入阿里。 来到了阿里云后,汪建明担任类似于“救火员”的角色,为客户解忧排难。对于他而言,每天面对的客人从之前的内部用户变成了外部用户,每天也都经历各种稀奇古怪的问题,管理数据实例的规模从几百到成千上万……正是这样异常复杂的环境,却逐渐让这位不善言辞的技术同学逐渐得到客户的认可,以及增强了他们对阿里云的信心。 正如文章开头提到,他受到多家客户表扬,包括复方科技、飞利浦中国、问卷星……等。令汪建明印象最深的是后来遇到的一家A公司。因为CPU持续100%,影响到公司业务无法正常开展,导致A公司的高层非常愤怒,几个工程师已经到了快要被开除的边缘。客户觉得阿里云RDS SQL不行,内部已经在准备着手应用下云或切换为MySQL。 而在他介入之后,通过分析“病原”。包括,闻:电话听取客户的抱怨、激动、怒吼和倾诉;问:询问“病状”表象,进一步确认“病原”;切:有针对性的实地考察,再次肯定“病原”。一系列组合拳后, 很快定位到CPU 100%的根源,开出治病良方。从索引缺失、索引碎片、Non SARG查询、数据类型隐式转化等角度,快速帮助用户解决问题,CPU也从100%降低到15%,查询语句时快时慢、卡顿和超时现象消失,应用恢复稳定正常。而更重要的是,那几个技术员不用被老板开除了,客户重新建立了对阿里云RDS SQL Server的信心,对阿里云充满感激,并发来热情洋溢的表扬信。 这次“行医”也颠覆了汪建明对技术的看法,他原以为技术是僵硬的,是死的,没有任何情感和情怀。“但从这个Case,我感受到了技术之外的魅力和情感。”他进一步述说,“在我看来‘简单’的技术问题,可能会要了客人的‘命’,也有可能要了技术人员的‘命’。而我们善用平时总结的技术知识点,运筹帷幄,一整套组合拳下去以后,客人反馈给我们的是有情感、有温度、有画面感的具体形象(你仿佛看到了客人迎面而来,热情的紧握着你的手,满面微笑的不断说,谢谢)。” “这个或许就是技术带来的魅力,技术带来的情感,技术带给我们的成就感。”说完之后,他头转过来,从他的眼神中,云栖社区的编辑也看到了亮光。 如何炼就火眼金睛 如何做性能优化,汪建明表示,性能优化是数据库综合能力的体现。它涉及到数据库方方面面的知识和理论,比如:数据库设计(包括很多方面的设计)、查询语句写法、索引优化等。他觉得举一个实例比较好理解:“很多用户对于高CPU使用率问题是束手无策,我们可以从索引缺失、索引碎片、数据类型转化、non-SARG查询、统计信息、参数嗅探等角度多管齐下,很快就可以解决CPU高使用率的问题。” 而对于如何像他一样炼就一双火眼金睛,他也从以下角度给了两个诚恳的建议: 1.端正态度,不要操之过急。遇到任何问题,多想,多测试,多问为什么,要和问题死磕到底,不找到问题的根源死不罢休。多向高手学习,学习他们对数据库的理解、学习他们对问题的思考方式和解决方法; 2.多总结。按照类型总结,吃透一类问题(比如高CPU使用率的问题),那么涉及到这类问题的方方面面做到烂熟于心,信手拈来; 对于从事数据库行业的同学,他也给出一个忠告——和数据库打交道,一定要打起十二分精神。他说,数据是所有公司的生命线,而数据库是数据的最后一道防线,你对自己的所有操作的后果、风险一定要心中有底。 “试着问自己,如果这个操作导致了XX严重后果,有办法把数据救回来吗?数据会丢吗?丢多少?比如:我们经常遇到的Case是用户一个Update语句下去,忘记写WHERE条件,导致所有数据被Update,又或者是删除测试环境的数据,不小心连接到了产品环境等。”他说,类似的情况比比皆是,所以一定要小心再小心。 客户服务的三个有效步骤 每次帮客户解决完问题,汪建明并不是就此结束,而是会反复揣摩和进一步思考:如何能做的更好,如何能帮客户进步,让他们自己能避免一些问题发生。 在如何做的更好上,他提炼出客户服务三个有效步骤: 清楚客户需求:了解客户的诉求、需求点、痛点在哪里,客人迫切需要解决什么问题?如果客人是头痛,你却医脚。医术再高明,也解决不了客人的痛点。 情绪沟通:稳定客人的情绪,缓解客人的抱怨,控制客人的影响,做好舆情防范。在严重问题面前,最好能够当面和客人沟通,其次电话,再次即时聊天工具。 风险管理:坦诚解决方案的风险,让客人清晰、明了、理解问题解决方案的风险点,给足客人心里预期。 他还说:“我们不能要求客户,拥有像阿里云DBA那么牛逼的组合拳来面对问题。所以,有的时候,看到客人对我们产品的误解的时候——RDS SQL不行啊,要下云啊,又好气又好笑(这里笑没有贬低的意思,是苦笑)。气的是客人对RDS SQL产品本身研究不够深入,而武断下结论,甚至因此开除自己的员工;苦笑的是实际是一个不难的问题,却把我们的客人逼的焦头烂额,无从下手。” 为了让客户也能进步,汪建明哪怕是在客户服务结束后,也会对每一个问题都刨根问底,希望找到客户经常犯的问题的共性。他接受云栖社区访谈时,给出了自己的思考: 一切数据库技术问题的“祸根”或者说根源,可以归结为数据库的设计问题。比如:数据库架构的设计、分库分表的设计、读写分离的设计、表结构的设计、表字段类型的选择、索引的设计、索引维护策略的设计、统计信息维护等等; 对如何写出高性能的SQL语句没有感觉,开发人员往往是功能优先而忽视性能。比如:确保比较运算符两段的数据类型一致、WHERE字句中使用函数、Non-SARG查询等; 对SQL Server商业数据库能力边界没有信心。很多客人会问,SQL Server是不是不行了啊,是不是处理不了啊,是不是已经达到处理的边界了啊,Hold不住了啊等等问题。汪建明认为,这些类似的问题是很可笑的。如果SQL Server数据库用的好的话,PB级别不在话下。他之前的公司,单台实例的SQL Server数据量达到20TB以上的数据量,照样稳定高效运行。“现在公有云用户没有谁达到了这个量级吧?”他反问。 至于如何实践,汪建明说:“除了自己不断学习,不断总结,也可以多看看云栖社区上的技术分享和总结。”他说,站在前人的肩膀上,总会站得更高,看得更远,少走弯路,更快成熟。为此,他还把自己十多年的沉淀和针对性的总结,做成专题,详情参见链接: https://yq.aliyun.com/topic/98。 他也指出:“当然,作为阿里云RDS这个角色,如何将我们的经验、总结,以及我们对数据库本身的理解,沉淀出产品来,使得用户入门的门槛更低,运维、设计、管理更为方便,也是我们必须要突破的重点和难点。目前也有一些服务出来,包括专家诊断、专家服务和个性化的培训服务等,详情参见专家服务: https://promotion.aliyun.com/ntms/act/clouddba.html。”他也表示,自己实际上不是一个人在“战斗”,背后也有一排排同样专业的技术大牛,这么多人构成了ApsaraDB专家服务多样化、个性化、全面和周到的服务体系。 结束语:知行合一 在最后,我们聊到对技术的理解。他说,不论是技术人,还是技术型公司,都需要对技术的执着追求、对任何问题死磕到底的工匠精神,戒骄戒躁;以技术解放生产力问题,用技术提高生产率,优化产品质量。 “这就是我对技术和对技术从业人员需要具备的特质的理解。”说完后,汪建明又补充, 这里还想借王国维人生的三个境界,进一步来阐述他对技术的认知。 第一层境界:昨夜西风凋碧树,独上高楼,望尽天涯路。他解读,但凡活好,技术牛逼的技术从业人员都有明确目标,执着的追求。“独上高楼”,登高望远,讲的就是对目标和方向的明确,一旦找准方向,哪怕独自前行,风雨征程,也绝不退缩,永不放弃; 第二层境界:衣带渐宽终不悔,为伊消得人憔悴。任何成大器者、大学问者,都不是轻而易举,唾手可得的。坚定信念,一番辛勤劳动,废寝忘食,孜孜以求,直至“衣带渐宽终不悔”。汪建明还描述到:“此刻,我脑海中浮现这样的画面:在无数个孤独的夜晚、夜深人静、唯有码农还在挑灯夜战,陶醉在代码的世界里,醉心于诗一般美妙的代码逻辑中,为着对技术的追求苦战到底。”他说,所以你会发现现实中的码农都是骨瘦如柴、满脸倦意、不修边幅、睡眼惺忪,邋里邋遢(汪建明笑称这里都是贬义词褒用啊,哈哈),这是“为伊消得人憔悴”的体现; 第三层境界:众里寻他千百度,蓦然回首,那人却在灯火阑珊处。最后一个境界,可谓是苦尽甘来,在我们持续专注、沉下心来、潜心研究、下足功夫、融会贯通、有所发现、有所成就,我们自然会达到浮躁渐去,成就、成果自然就会在“灯火阑珊”处。这是我们坚定信念、戒骄戒躁、执着追求的必然结果。 言之至此,笔者想起,访谈中多次在钉钉上找他,他无一例外的都说:“晚上回答你,现在在撸代码。”用“撸串”中的那个“撸”来形容代码,从字面就可以感受到那股欢快劲。当然,我们也可以想象出,那个时候或许他正干劲十足地死磕某个技术问题。 技术之外,笔者也翻出其中有一位客户写给汪建明的夸奖邮件: “今天如果没有你的帮助,我们的RDS可能会出现更加严重的问题。风移同学接手后,迅速找到了问题发生的原因。在半个小时之内,不但提出了解决方案,还帮我们完成了大部分的调优工作,及时阻止了问题向更加严重方向发展。调优完成后,他还持续观察了很长一段时间,确保问题得到了解决。他又将处理步骤和思路发邮件给我们,并通过电话给我们详细讲解。交流过程中,我们的同学也向风移同学咨询了一些日常工作的疑惑,他也不厌其烦的为我们的同学一一解答。无论从技术的专业程度和工作敬业程度上风移同学都是无可挑剔的。” 从上段表扬信,我们不难看出,他是如何践行客户第一——那是真的全身心投入,解决客户的每一个小问题,急客户之急,想客户之想。像他这样,客户怎么会不放心,怎么会不感动,怎么会不成为阿里云的忠实Fans,并用他们自己的行动来为阿里云站台。 不论是技术,还是服务上,汪建明都无一彰显着四个字——知行合一。知行合一,是天底下最容易,也是最难的事。而这点,你能做到吗?(本期接受访谈的云栖专家/ 风移;文/我是主题曲哥哥) 《沉淀》第十三期:【[沉淀]访谈阿里孙伟光:多行善事莫问前程的他,将计算集群的CPU利用率从30%提升到70%+】做事情不能单单盯着KPI,不是KPI的事情不做。 《沉淀》第十二期:【[沉淀]从网络中间件到搜索,从移动开发到分布式计算平台,阿里高级专家李睿博谈自己的折腾路】整个过程我觉得还是爱最重要。有爱才有勇气才有希望。我是真的爱写代码。从小学就开始爱,到现在快三十年了也还爱。 《沉淀》第十一期:【[沉淀]阿里高级专家应答:各种数据在一个统一计算平台上的融合,才能产生更大的价值】阿里巴巴这种超大数据体量上才会遇到的独特挑战,让应答在技术上有了更清晰的认识,一定要夯实分布式系统的基础。“只有把基础夯实了,才能支持上层各种计算场景在大体量上的实现,让各种新的算法在‘阿里体量’上真正发挥潜力。”

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册