【Edda】Netflix云资源服务追踪调研报告

目录

介绍

架构

源码架构图

核心模块

关键内容

RestFul矩阵参数

总结及思考

edda源码树及描述


介绍

Edda是一项Netflix开发的用于云资源追踪的开源服务,可通过AWS API轮询您的AWS资源并记录结果。它使您可以快速搜索资源,并显示资源随着时间的变化。

架构

Edda是一个Scala应用程序,可以在单个实例上运行,也可以扩展到负载均衡器后面运行的许多实例,以实现高可用性。Edda当前支持的数据存储是MongoDB,它也具有足够的通用性,可以与Edda服务一起在单个实例上运行,也可以扩展为包含大型复制集。当作为集群运行时,Edda将自动选择一个领导者,然后执行所有AWS轮询(默认情况下每60秒一次)并保留数据。其他辅助服务器将刷新其内存记录(默认情况下每30秒刷新一次)并处理REST请求。

源码架构图

 

核心模块

Crawler:使用SDK轮询AWS资源信息,具体包括实例信息、负载均衡、告警、镜像等等合计15种资源信息。

BeanMapper:将AWS Bean 映射成Scala对象

Record:核心伴生对象,主要是维护了从AWS取到的数据信息及相关时间等等记录,内部的stime用来判断是否更新本地内存中的资源信息

Collection:核心集合,内部维护了一个Map作为缓存信息,这个Map存放的就是可提供查询的信息,供Restful接口资源调用;同时它作为leader时是 SDK 轮询的发起者,作为worker时是内存的同步者

Observable:观察者对象,被Crawler所集成,即触发观察者们(SDK)的资源轮询

Queryable:作为一个可被条件查询的集合对象,Collection内部的Map存放的Value就是一个Queryable,它提供了对Record的查询

Datastore:各项持久化数据,包括了从内存到mongo持久化的Record数据、DynamoDB和S3上存储的持久化活动记录等等

Resource:提供自定义条件的RestFul资源查询,即向外服务的接口

Elector:领导选举父类,包括了edda集群中leader的选举,DynamoDB、MongoDB相关选举(与edda数据同步相关)

关键内容

1.edda自行选择leader,只有leader才会去调用AWS 的 SDK获取资源信息,其他worker主要是进行信息同步和提供RestFul接口查询

2.数据发生变更时才会更新本地Record

3.CollectionRefresher控制爬虫刷新频率,即调用aws频率;同时,从数据源同步数据到本地内存

RestFul矩阵参数

使用矩阵参数可以找到特定的资源,而使用字段选择器则可以仅提取您感兴趣的数据元素

在edda里,总计12个矩阵参数(_all、_since......等等,都是自行实现的),这些参数用来做资源的筛选条件,它使用 Field Selectors 来控制资源的返回信息

例如:

# set the base url
export ASGS="http://localhost:8080/edda/api/v2/aws/autoScalingGroups/edda-v123"

# filter the results to the specified fields
curl "$ASGS;_pp:(autoScalingGroupName,instances:(instanceId,lifecycleState))"

#获取到的数据
{ 
  "autoScalingGroupName" : "edda-v123",
  "instances" : [
    { 
      "instanceId" : "i-0123456789",
      "lifecycleState" : "InService"
    },
    { 
      "instanceId" : "i-012345678a",
      "lifecycleState" : "InService"
    },
    { 
      "instanceId" : "i-012345678b",
      "lifecycleState" : "InService"
    }
  ]
}

总结及思考

  • 取到的云资源memory是先存储到本地jvm,是否可借鉴
  • 它并未解决云平台限流问题,只是通过配置控制了自己调用SDK的频率(edda.properties配置为2分钟)
  • edda主要提供的是查询功能,它自己能集群化,此时自行做领导选举,领导通过SDK调用云平台,非领导做信息同步,然后向外提供restFul接口
  • edda源码里大部分代码都是在协调领导选举和保持数据一致性
  • 我们的注册中心可以采用类似轮询SDK方式获取云资源信息
  • 限流问题根本似乎无法解决,只能通过降低频率的方式,如果被限流了我们提供本地旧数据是否可行?
  • 注册中心是否可能集群化去满足查询需求,是否考虑效仿edda一样准备领导选举,只让单个服务调用云SDK(预留)
  • 感觉矩阵参数可读性比较差,需要自行编写矩阵参数拿数据,操作难度大,用起来很麻烦

edda源码树及描述

└── main
    ├── resources
    │   ├── edda.properties                edda相关配置信息
    │   ├── elasticsearch
    │   └── log4j.properties
    ├── scala
    │   └── com
    │       └── netflix
    │           └── edda
    │               ├── aws
    │               │   ├── AwsClient.scala					提供对AWS服务客户端对象的访问
    │               │   ├── AwsCollections.scala				aws收集器对象工厂,提供获取aws上各种信息的抽象方法
    │               │   ├── AwsCrawlers.scala					真实调用aws sdk的封装类,映射到本地bean类
    │               │   ├── DynamoDBElector.scala				领导选举相关
    │               │   ├── DynamoDB.scala						aws DB服务器
    │               │   └── S3CurrentDatastore.scala			管理S3桶数据
    │               ├── basic
    │               │   ├── BasicBeanMapper.scala				javaBean转成scala对象
    │               │   ├── BasicContext.scala					基础上下文
    │               │   ├── BasicRecordMatcher.scala			对内存中的数据做高级查询匹配
    │               │   └── BasicServer.scala					初始化基础服务,初始化集合,启动服务
    │               ├── BeanMapper.scala							bean映射的scala的特征(接口)		
    │               ├── CollectionManager.scala					操作本地内存的manager
    │               ├── CollectionProcessor.scala					集合操作处理器
    │               ├── CollectionRefresher.scala					集合数据刷新,调用处理器去刷新数据
    │               ├── Collection.scala							集合数据对象,提供对集合内部数据的处理
    │               ├── Crawler.scala								爬虫对象类,生成记录,触发观察者事件
    │               ├── Datastore.scala							数据源特征(接口)
    │               ├── elasticsearch
    │               │   ├── ElasticSearchDatastore.scala		els数据源查询相关,如果不是leader则从数据源查询数据,对内存数据刷新
    │               │   └── ElasticSearchElector.scala			领导选举相关
    │               ├── ElectorPoller.scala						领导选举轮询器
    │               ├── Elector.scala								领导选举类
    │               ├── ExecutionContexts.scala					线程池上下文
    │               ├── FileElector.scala							文件领导选举,做测试用的领导选举类
    │               ├── GroupCollection.scala						将组数据添加到集合
    │               ├── MergedCollection.scala					合并而成的集合
    │               ├── mongo
    │               │   ├── MongoDatastore.scala				mongoDb数据源增删改查
    │               │   └── MongoElector.scala					领导选举相关
    │               ├── Observable.scala							观察者抽象类
    │               ├── Queryable.scala							查询者抽象类
    │               ├── RecordMatcher.scala						数据匹配特征,提供一个数据过滤方法
    │               ├── Record.scala								伴生数据对象
    │               ├── RequestId.scala							请求id封装类,相当于一个主键,操作时带着走
    │               ├── resources
    │               │   └── CollectionResource.scala			提供restFulApi查询
    │               ├── StateMachine.scala						通过requestId观察对象状态
    │               ├── Utils.scala								工具类,包括从文件获取参数值等等
    │               └── web
    │                   └── FieldSelectorParser.scala				selector,提供对restFul请求返回值做过滤

 

官网地址:https://netflix.github.io/edda/

RestFul地址:https://netflix.github.io/edda/rest-api/

Field Selectors 文档地址:https://developer.linkedin.com/docs/v1/people/field-selectors

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值