唱吧DevOps的落地,微服务CI/CD的范本技术解读

  • 时间:
  • 浏览:4

  目前而是我 厂商使用的trace全是参考2010年Google发表的一篇论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》来实现的,其中最著名的当属twitter的zipkin,国内的如淘宝的eagle eye。愿因 用户规模量级的逐年提升,分布式设计的系统理念这么 为各厂商所接受,于是诞生了trace的5个 实现标准opentracing ,opentracing标准目前支持Go、JavaScript、Java、 Python、Objective-C、C++六种语言。 由sourcegraph开源的appdash是一款轻量级的,支持opentracing标准的开源trace组件,使用Go语言开发K歌亭目前对appdash进行了二次开发,并将其作为其后端trace服务(下文直接将其称之为Ktrace),主要愿因 是appdash足够轻量,修改起来比较容易。唱吧K歌亭业务的胶水层使用PHP来实现,appdash提供了对protobuf的支持,而是我 我只不还都可以 让太满们让太满们或多或少人在PHP层实现middleware即可。

  让太满们让太满们服务发现的机制是每个服务自注册,即每个服务启动的完后 先得到宿主机器上边的空闲端口;后来随机5个 或多个给或多或少人并监听,当服务启动完毕时刚结束了了向etcd集群注册或多或少人的服务地址,而服务的使用者则从etcd中获取所需服务的所有可用地址,从而实现服务发现。

  Span通常都很小,相似序列化后的span通常全是kb级别愿因 更小。 愿因 span超过了kb量级那就会有而是我 或多或少的大大问题,比如超过了kafka的单条消息大小限制(1M)。 就算你提高kafka的消息大小限制,过大的span也会增大开销,降低trace系统的可用性。 后来,只存储那些能表示系统行为的信息即可。

  ElastAlert是Yelp的5个 Python开源项目,主要的功能是定时轮询ElasticSearch的API来发现否是达到报警的临界值,它的5个 特色是预定义了各种报警的类型,比如frequency、change、flatline、cardinality等,非常灵活,也节省了让太满们让太满们而是我 二次开发的成本。

  基于上述基础架构,让太满们让太满们的CI/CD流程如下:

  K歌亭是唱吧的两根新业务线,旨在提供线下便捷的快餐式K歌最好的办法,用户还都可以 在5个 电话亭大小的空间里完成K歌体验。K歌亭在客户端有VOD、微信和Web共5个 交互入口,业务多样化度较高,如长连接池服务、用户系统服务、商户系统、增量更新服务、ERP等。对于服务端的稳定性要求也很高,愿因 K歌亭摆放地点不固定,而是我 场所的运营活动会造成突发流量。

  Mesos Exporter,是Prometheus开源的项目,还都可以 用来架构设计 容器的各项运行指标。让太满们让太满们主要使用了对于Docker容器的监控这帕累托图功能,针对每个服务启动的容器数量,每个宿主机上启动的容器数量,每个容器的CPU、内存、网络IO、磁盘IO等。后来有两种他消耗的资源也很少,每个容器分配0.2CPU,128MB内存也毫无压力。

http://kb.cnblogs.com/page/565901/

  Filebeat是用来替换Logstash-forwarder的日志架构设计 组件,还都可以 架构设计 宿主机上边的各种日志。让太满们让太满们所有的服务总要挂载宿主机的本地路径,每个服务容器的会把或多或少人的GUID写入日志来区分来源。日志经由ElasticSearch汇总完后 ,聚合的Dashboard让太满们让太满们统一总要放在Grafana上边,具体排查线上大大问题的完后 ,会用Kibana去查看日志。

  随着互联网的高速发展,各个公司都面临着巨大的产品迭代压力,怎样才能减慢的发布高质量的产品,也是每个互联网公司都面临的大大问题。在这一大趋势下,微服务与DevOps的概念应运而生,在低耦合的并肩实现高聚合,也对新时代的DevOps提出了更高的技术与理念要求。

  由特定RPC的一系列annotation构成Span序列,span记录了而是我 特定信息如 traceId, spandId, parentId和RPC name。

  并肩,让太满们让太满们而是我 我的机制也为容器以HOST的网络模式启动提供了保证。愿因 BRIDGE模式实在对于网络的损耗太满,在最刚结束了了就被让太满们让太满们否决了,采用了HOST模式完后 网络方面的影响实在全是很大。

  在采用了微服务架构完后 ,让太满们让太满们就还都可以 动态调节服务的资源分配从而应对压力、服务自治、可独立部署、服务间解耦。开发人员还都可以 自由选择或多或少人开发服务的语言和存储特性等,目前整体上使用PHP做基础的Web服务和接口层,使用Go语言来做长连接池等或多或少核心服务,服务间采用thrift来做RPC交互。

  鉴于上述弊端,让太满们让太满们决定接下来的版本里采用微服务的架构模型。从单体式特性转向微服务架构中会持续碰到服务边界划分的大大问题:比如,让太满们让太满们有user服务来提供用户的基础信息,这么 用户的头像和图片等是应该单独划分为5个 新的service更好还是应该合并到user服务里呢?愿因 服务的粒度划分的过粗,那就回到了单体式的老路;愿因 过细,那服务间调用的开销就变得不可忽视了,管理难度也会指数级增加。目前为止还这么 5个 还都可以 称之为服务边界划分的标准,必须根据不同的业务系统加以调节,目前K歌亭拆分的

大原则是当一块业务不依赖或极少依赖其它服务,有独立的业务语义为超过5个 的或多或少服务或客户端提供数据,这么 它就应该被拆分成5个 独立的服务模块。

  为了快速开发上线,K歌亭项目最初采用的是传统的单体式架构,后来随着时间的推移,需求的迭代数率变得减慢,代码冗余变多,一直会出显 牵一发动全身的改动。重构不后来花费絮状的时间,后来对运维和稳定性也会造成很大的压力;此外,代码的耦合度高,新人上手较困难,往往不还都可以 通读絮状代码才太满踩进坑里。

  让太满们让太满们采用了etcd作为服务发现的组件,etcd是5个 高可用的分布式环境下的 key/value 存储服务。在etcd中,存储是以树形特性来实现的,非叶结点定义为文件夹,叶结点则是文件。让太满们让太满们约定每个服务的根路径为/v2/keys/service/$service_name/,每个服务实例的实际地址则存储于以服务实例的uuid为文件名的文件中,比如账户服务account service当前启动了5个还都可以 实例,这么 它在etcd中的表现形式则如下图:

  Prometheus配置好了报警完后 还都可以 通过AlertManager发送,后来对于报警的聚合的支持还是很弱的。在下一阶段让太满们让太满们会引入或多或少Message Queue来或多或少人的报警系统,加强对于报警的聚合和避免。

  注意,图中的每个文件有5个 ttl值,单位是秒,当ttl的值为0时对应的文件愿因 被etcd自动删除。当每个服务实例启动完后 第一次注册总要把存活时间即ttl值初始化为10s,后来每隔一段时间去刷新ttl,用来像向etcd汇报或多或少人的存活,比如7s,在这一状况下基本还都可以能 保证服务有效性的更新的及时性。愿因 在5个 ttl内服务down掉了,则会有10s钟的时间是服务地址有效;而服务有两种不可用,这就不还都可以 服务的调用方做相应的避免,比如重试或这选择其它服务实例地址。

  在trace系统含高如下几次概念

  5个 annotation是用来即时的记录5个 事件的发生,以下是一系列预定义的用来记录一次请求刚结束了了和刚结束了了的核心annotation

  在服务访问峰值的出显 时,往往不还都可以 临时扩容来应对更多的请求。除了手动通过Marathon增加容器数量之外,让太满们让太满们也设计实现了一套自动扩缩容的系统来应对。让太满们让太满们扩缩容的触发机制很直接,根据各个服务的QPS、CPU占用、内存占用这5个指标来衡量,愿因 5个 指标有5个 指标达到,即启动自动扩容。让太满们让太满们的自动扩容系统包括5个模块:

  或多或少的annotation则在整个请求的生命周期里建立以记录更多的信息 。

  当5个 服务实例向etcd写入地址成功时让太满们让太满们就还都可以 认为当前服务实例愿因 注册成功,这么 当这一服务实例愿因 种种愿因 down掉了完后 ,服务地址自然而是我需要 失效,这么 在etcd中怎样才能才能实现呢?

  (1)Annotation

  让太满们让太满们选择Prometheus汇总监控数据,用ElasticSearch汇总日志,主要的愿因 有:

  (3)Trace

  在下一步的工作中,让太满们让太满们全是几次核心研究的方向与目标,也希望能跟让太满们让太满们并肩学习与探讨:

  对于一套微服务的系统特性来说,最大的难点太满说是实际业务代码的编写,而是我 我服务的监控和调试以及容器的编排。微服务相对于或多或少分布式架构的设计来说会把服务的粒度拆到更小,一次请求的路径层级会比或多或少特性更深,同5个 服务的实例部署很分散,当出显 了性能瓶颈愿因 bug时怎样才能第一时间定位大大问题所在的节点极为重要,而是我 对于微服务来说,完善的trace机制是系统的核心之一。

  在HAWAII中还都可以 很直观的查看各个服务与模块的持续集成结果,包括最新的版本,SCM revision,测试结果等信息,后来选择相应的版本去部署生产环境。

  在部署完后 ,还都可以 查看全部的测试结果和与线上版本的区别,以及上线过程中的各个步骤运行的状况。

  Node exporter,是Prometheus开源的项目,用来架构设计 物理机器上边的各项指标。完后 一直使用Zabbix来监控物理机器的各项指标,这次使用NodeExporter+Prometheus主而是我 我出于数率和对于容器生态的支持两方面考虑。时序数据库在监控数据的存储和查询的数率方面较关系数据库的优势实在非常明显,具体展示在Grafana上边如下图:

  目前K歌亭在生产环境里的QPS不超过1k,而是我 大帕累托图的记录是直接写到ktrace里的,必须歌曲搜索服务尝试性的写在kafka里,由mqcollector架构设计 并记录,ktrace的存储目前只支持MySQL。5个 好的trace设计还都可以 极快的帮你定位大大问题,判断系统的瓶颈所在。

  (2)Span

  目前每次请求由PHP端生成traceid,并将span写入Ktrace,沿调用链传递traceid,每个service或多或少人在有不还都可以 的地方架构设计 并写入Ktrace。举相似下图:

  5个 trace中所有的span都共享5个 根span,trace而是我 我5个 拥有并肩traceid的span的集合,所有的span按照spanid和父spanid来整合成树形,从而展现一次请求的调用链。

  在唱吧,让太满们让太满们使用Jenkins作为持续集成的工具。主要愿因 是让太满们让太满们想在或多或少人的机房维护持续集成的后端,而是我 放弃了Travis相似的系统。

  在实施持续集成的工作过程中,让太满们让太满们碰到了下列大大问题:

  这也是让太满们让太满们公司在这一新的业务线上边进行,进行尝试的主要愿因 之一。对于微服务、容器编排、虚拟化、DevOps那些领域,让太满们让太满们一步一步经历了从无到有的过程,而是我 而是我 方面全是本着从满足业务的目标来尽量严谨的开展,包括所有的服务与基础架构都进行了高并发且长时间的压力测试。

  唱吧K歌亭的微服务架构采用了Mesos和Marathon作为容器编排的工具。在让太满们让太满们选型初期的完后 还有5个 或多或少选择,Kubernetes、 Swarm、 DC/OS:

  基于以上大大问题,让太满们让太满们选择使用Mesos和Marathon来管理Jenkins集群,把Jenkins Master和Jenkins Slave都放在Docker容器上边,还都可以 非常有效的避免以上大大问题。基础架构如下图:

  每个色块是5个 span,表明了实际的执行时间,通常的调用层级太满超过10,点击span则会看了每个span里的annotation记录的而是我 附加信息,比如服务实例所在的物理机的IP和端口等,trace系统的消耗一般太满对系统的表现影响太满,通常状况下还都可以 忽略,后来当QPS很高时trace的开销就要加以考量,通常会调整采样率愿因 使用消息队列等来异步避免。不过,异步避免会影响trace记录的实时性,不还都可以 针对不同业务加以选择。

  如下图,而是我 我让太满们让太满们监控的帕累托图容器相关指标在Grafana上边的展示: 

  在选择Mesos Exporter完后 ,让太满们让太满们也考虑过使用cAdvisor。cAdvisor是5个 Google开源的项目,跟Mesos Exporter架构设计 的信息八成以上全是相似的;后来也还都可以 通过image字段也还都可以 变相实现关联服务与容器,而是我 我Mesos exporter上边的source字段还都可以 直接关联到marathon的application id,更加直观或多或少。并肩cAdvisor还还都可以 统计或多或少自定义事件,而让太满们让太满们更多的用日志去架构设计 相似数据,加带带Mesos Exporter也还都可以 统计或多或少Mesos有两种的指标,比如已分配和未分配的资源,而是我 让太满们让太满们最终选择了Mesos Exporter。

  基于上述的基础架构,让太满们让太满们定义了让太满们让太满们或多或少人的持续集成与持续交付的流程。其中除了大规模使用Jenkins与或多或少自定制的Jenkins插件之外,让太满们让太满们也或多或少人研发了或多或少人的部署系统——HAWAII。