腾讯QQ团队开源分布式后台服务引擎msec

HerGrassi 8年前
   <p>毫秒服务引擎(msec, 取英文名Mass Service Engine in Cluster的首字母组合)是腾讯的一个开源框架(将于12月左右开源),适用于在廉价机器组成的集群上开发和运营分布式后台服务。毫秒服务引擎集RPC、名字发现服务、负载均衡、业务监控、灰度发布、容量管理、日志管理、key-value存储于一体,目的是提高开发与运营的效率和质量。</p>    <p>毫秒服务引擎的创作冲动和构建经验,来自QQ后台团队超过10年的运营思考。它是一整套解决方案,但也可以拆分的来使用其中的监控、key-value存储单品。</p>    <h3><strong>架构</strong></h3>    <p>如下图,整个系统由下面几部分组成。</p>    <p><img src="https://simg.open-open.com/show/d244b2e3df164c44898e15d395e45631.jpg"></p>    <p><strong>web console:</strong>整个系统的运营管理中心。主要是:</p>    <ul>     <li> <p>Tomcat提供web管理界面,管理的数据保存在MySQL里。</p> </li>     <li> <p>LB是名字发现服务和负载均衡,remote_shell是远程文件传输与远程命令执行服务。</p> </li>    </ul>    <p><strong>log服务器:</strong>提供业务log的存储和查询服务。Log存储在MySQL表里。</p>    <p>monitor服务器:提供业务上报信息的存储和查询服务。业务上报信息存储在内存里,推荐内存8G~16G。定时dump到磁盘的方式防止数据掉电丢失。</p>    <p><strong>业务运营服务器:</strong>部署开发框架和业务逻辑代码,处理业务请求。</p>    <p><strong>key-value存储服务:</strong>相对整个框架比较独立,按需选用。</p>    <h3><strong>典型用户群体</strong></h3>    <p>使用毫秒服务引擎,用户可以快速拥有一套具备监控、名字发现服务、负载均衡、灰度发布、配置管理、日志、kv存储等功能的系统化的开发与运营框架,特别适合互联网初创公司。</p>    <p>10年的海量服务开发运营经验和教训使得我们深刻的认识到:</p>    <ul>     <li> <p>要尽早规范团队的开发服务框架,避免到了后期,各种开发语言混杂、各类存储组件充斥、重复编码、每个模块形态不统一、文档缺失、监控瘫痪、人员离职造成大量信息丢失,最后积重难返、痛苦不堪。</p> </li>     <li> <p>没有框架来规范,团队的随意性就太大,合作效率就大打折扣,甚至于内耗、反复的挖坑填坑,系统的成败过于依靠人的意识和水平。</p> </li>     <li> <p>规范,不能靠文档、不能靠劳动纪律、不能靠苦口婆心、不能靠人员意识、不能靠运动式的整顿,要靠技术框架上切实的限制与贴心保护。</p> </li>    </ul>    <h3><strong>特点与优势</strong></h3>    <ol>     <li> <p>模块间访问采用RPC的方式,开发者不用关注网络与报文格式,像写单机程序一样开发分布式服务。</p> </li>     <li> <p>负载自动均衡与容错,对于单机故障、局部网络波动等状况自动应对,服务高可用性。</p> </li>     <li> <p>支持C/C++与Java语言,后续还将继续丰富;如果选择C/C++语言,支持协程,兼具开发和运行效率。</p> </li>     <li> <p>Web化的管理界面,在web界面完成配置、发布、监控、日志、Key-value存储集群管理等所有操作。</p> </li>     <li> <p>需要复杂部署的服务器都采用Docker镜像的方式安装,使得部署与上手非常容易。</p> </li>     <li> <p>相比使用其他开源组件拼凑起来的解决方案,毫秒服务引擎更加的体系化,对团队的规范更加到位。</p> </li>    </ol>    <h3><strong>功能初探</strong></h3>    <p><strong>1. 服务标准化</strong></p>    <p>在毫秒服务引擎里,每个服务的配置都被web化的集中管理起来,每个服务都“长”的一样,使得开发和运维的效率大大提高,包括:</p>    <ul>     <li> <p>该服务部署在哪些IP上? <img src="https://simg.open-open.com/show/856b724849b32a678a4915122438ad86.jpg"></p> </li>     <li> <p>一个服务有且只有一个配置文件 <img src="https://simg.open-open.com/show/5cad550d2cf462cf6f11e36a73f4b9bd.jpg"></p> </li>     <li> <p>该服务提供的接口通过Protocol buffer文件来定义 <img src="https://simg.open-open.com/show/51b683649f0481c5f8ab09b4da9e9a91.jpg"></p> </li>     <li> <p>引用了哪些外部库?例如OpenSSL</p> <p><img src="https://simg.open-open.com/show/c47e3814580c1f15026e8f6ff658917f.png"></p> </li>     <li> <p>业务逻辑和基础框架分离,业务逻辑以插件形式提供 <img src="https://simg.open-open.com/show/91eb6cf3e4a589ff13cc9a5f55094ffa.png"></p> </li>    </ul>    <p>每个服务部署的目录结构都是确定的:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ee285f8866be2d05858940b1435bc762.png"></p>    <p>如上图所示。</p>    <ol>     <li> <p>部署的目录都是/msec/一级业务名/二级业务名</p> </li>     <li> <p>都包含bin etc log 等几个目录</p> </li>     <li> <p>bin里面是启停脚本、业务插件msec.so和外部库(如果有)</p> </li>     <li> <p>etc里面是配置文件config.ini</p> </li>     <li> <p>log里面是本地的日志文件</p> </li>    </ol>    <p>另外,程序员不能随意打破上面的方式。例如临时的另外搞一个自己配置文件什么的,他如果这样做,那下次发布的时候目录会被覆盖,个性化的东西会被删除掉。</p>    <p><strong>2. RPC</strong></p>    <p>在毫秒服务引擎里,服务间的调用都是统一的RPC方式,统一采用CallMethod()函数的方式,避免代码千奇百怪;按服务名字调用和接口名调用。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/195d1ae5335b1fde85273fdca3bf96f9.jpg"></p>    <p>RPC背后的路由算法对于单机故障、网络局部波动等异常,自动容错。简单的说,路由算法按一定的规则轮转的选择被调用模块的接口机,并统计过去一段时间的调用成功率、时延信息,根据这些信息调整该接口机被选择到的比例。如果某个接口机故障了,那么就不会发送请求给它,从而实现自动容错。</p>    <p>毫秒引擎框架本身,在RPC执行的时候,就上报了很多基础属性和日志,这样保证了服务监控和告警等运营措施不依赖与人的意识。下图是叫做getMP3List这样一个RPC调用的请求数和成功数,这些是不需要业务开发者工作就自动上报。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8d5b9d050a2ddc82d71a95ba66b1e48f.jpg"></p>    <p>每个请求有唯一ID来标识,通过该ID,毫秒引擎可以在框图中直观的呈现该请求经过的模块、模块间的RPC名字等信息,这个同样不需要业务开发者的工作就自动实现:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/427c990473cdef28e8497d0f3adc879d.png"></p>    <p><strong>3. 灰度发布与监控</strong></p>    <p>在毫秒服务引擎里,可以轻松做到灰度发布和监控。</p>    <p>在服务配置管理页点击“制定发布计划”</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/034c6ca0ddcb38cc8eb28ee360a3778c.png"></p>    <p>选择这一次灰度要发布的目标机器和发布类型:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ea7cbc7c1d0acb48e2f2fb491dc0bd56.png"></p>    <p>在接下来的向导中选择正确版本的配置文件、外部库、业务插件等,这样就完成了发布计划的制作:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ca6955198d1af76b11c3c3e6a194d48a.png"></p>    <p>接着,点击菜单 “运维->发布”,可以查询所有发布计划,对于已经发布的计划,可以做回滚操作。点击详情可以查看发布计划更详细信息,并执行发布:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/01d1563bdf9f7ef3372f5d0a6d6bdb41.jpg"></p>    <p>除了前面提到的RPC和框架本身自动上报的一些信息,还支持业务自定义上报信息(例如我想上报第28级VIP用户登录的次数),且支持对于关键指标的波动、最大值、最小值设置告警:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4470bc1574b893a361e51c6e5e13434d.jpg"></p>    <p><strong>4. KV存储系统</strong></p>    <p>KV存储几乎是互联网后台服务必备的服务。 毫秒服务引擎在redis cluster的基础上提供了一个运维简单的KV存储服务,实现了运维web化,并加上了集群的监控。</p>    <p>集群概要状态查看:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b2d1cfec0cb4cf87e105daf6456f247a.jpg"></p>    <p>可以在web上方便的完成日常的运维操作:新搭集群、扩缩容、故障机器的恢复:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a43deebc3c051c704f487dd25037b6e4.png"></p>    <p>请求量、内存使用、CPU等各种状态信息可直观监控,也可以按IP粒度查看。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e2e8dcc14cd8efd3280dfe8927029a81.jpg"></p>    <h3> </h3>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659598197&idx=1&sn=d32f74909ad70c1841f9fa5637cd893f&scene=0#wechat_redirect</p>    <p> </p>