OpenStack CDNaaS - Poppy介绍

来源:互联网 发布:速拓必达医疗器械软件 编辑:程序博客网 时间:2024/06/14 17:44

作者: 赵怡


一、CDN简介

在介绍Openstack poppy组件前先介绍一下CDN。

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。

 

CDN的技术原理

1. 传统访问方式

在描述CDN的实现原理,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:

 

  由上图可见,用户访问未使用CDN缓存网站的过程为:

  1) 用户向浏览器提供要访问的域名;并把域名解析请求发往本地DNS服务器

  2) 本地DNS服务器将请求发往网站DNS服务器, 返回给本地DNS服务器源站点实际IP

  3) 本地DNS服务器将该IP地址返回给用户

  4) 用户直接访问源站点, 取回请求数据

  通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。

 

2.CDN访问方式

       CDN网络是在用户和服务器之间增加Cache层,如何将用户的请求引导到Cache上获得源服务器的数据,主要是通过接管DNS实现,下面让我们看看访问使用CDN缓存后的网站的过程:

 

  通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为:

  1) 用户向浏览器提供要访问的域名,域名解析请求被发往本地DNS服务器

  2) 本地DNS服务器将请求发往网站DNS服务器, 由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,请求被指向CDN网络中的全球负载均衡集群。

  3) 本地DNS服务器将请求发往全球负载均衡器, 该集群对域名进行智能解析, 将响应速度最快的CDN边缘集群IP返回给本地DNS服务器。(比如 根据地理位置信息解析对应的IP地址,使得用户能就近访问。)

  4) 本地DNS服务器将该IP地址进行本地缓存并返回给用户;

  5) 用户向该CDN边缘集群发出访问请求

  6) CDN边缘集群收到访问请求后, 如果是第一次访问, 那么CDN边缘集群会向源站点取得数据, 并返回给用户, 并缓存

       7) 如果CDN边缘集群有缓存, 且未过期, 则直接把数据返回给用户

 

传统和CDN访问方式对ICP和CDN运营商的影响分析

       通过以上的分析我们可以得到,为了实现既要对普通用户透明(即加入缓存以后用户客户端无需进行任何设置,直接使用被加速网站原有的域名即可访问),又要在为指定的网站提供加速服务的同时降低对ICP的影响,只要修改整个访问过程中的域名解析部分,以实现透明的加速服务,下面是CDN网络实现的具体操作过程。

  1) 作为ICP,只需要把域名解释权交给CDN运营商,其他方面不需要进行任何的修改;操作时,ICP修改自己域名的解析记录,一般用cname方式指向CDN网络Cache服务器的地址。

  2) 作为CDN运营商,首先需要为ICP的域名提供公开的解析,为了实现sortlist,一般是把ICP的域名解释结果指向一个CNAME记录;

  3) 当需要进行sortlist时,CDN运营商可以利用DNS对CNAME指向的域名解析过程进行特殊处理,使DNS服务器在接收到客户端请求时可以根据客户端的IP地址,返回相同域名的不同IP地址;

  4) 由于从cname获得的IP地址,并且带有hostname信息,请求到达Cache之后,Cache必须知道源服务器的IP地址,所以在CDN运营商内部维护一个内部DNS服务器,用于解释用户所访问的域名的真实IP地址;

  5) 在维护内部DNS服务器时,还需要维护一台授权服务器,控制哪些域名可以进行缓存,而哪些又不进行缓存,以免发生开放代理的情况。

 

CDN的网络系统架构

       CDN网络架构主要由两大部分,分为中心边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cache和负载均衡器等组成。

  当用户访问加入CDN服务的网站时,域名解析请求将最终交给全局负载均衡DNS进行处理。全局负载均衡DNS通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户能够得到快速的服务。同时,它还与分布在世界各地的所有CDNC节点保持通信,搜集各节点的通信状态,确保不将用户的请求分配到不可用的CDN节点上,实际上是通过DNS做全局负载均衡。

  对于普通的Internet用户来讲,每个CDN节点就相当于一个放置在它周围的WEB。通过全局负载均衡DNS的控制,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求。由于它离用户更近,因而响应时间必然更快。

  每个CDN节点由两部分组成:负载均衡设备高速缓存服务器

  负载均衡设备负责每个节点中各个Cache的负载均衡,保证节点的工作效率;同时,负载均衡设备还负责收集节点与周围环境的信息,保持与全局负载DNS的通信,实现整个系统的负载均衡。

  高速缓存服务器(Cache)负责存储客户网站的大量信息,就像一个靠近用户的网站服务器一样响应本地用户的访问请求。

  CDN的管理系统是整个系统能够正常运转的保证。它不仅能对系统中的各个子系统和设备进行实时监控,对各种故障产生相应的告警,还可以实时监测到系统中总的流量和各节点的流量,并保存在系统的数据库中,使网管人员能够方便地进行进一步分析。通过完善的网管系统,用户可以对系统配置进行修改。

  理论上,最简单的CDN网络有一个负责全局负载均衡的DNS和各节点一台Cache,即可运行。DNS支持根据用户源IP地址解析不同的IP,实现就近访问。为了保证高可用性等,需要监视各节点的流量、健康状况等。一个节点的单台Cache承载数量不够时,才需要多台Cache,多台Cache同时工作,才需要负载均衡器,使Cache群协同工作。

 

可用CDN商业服务

 

名称

链接

1

Amazon CloudFront

https://aws.amazon.com/tw/cloudfront/

2

Microsoft Ajax CDN

https://www.asp.net/ajax/cdn

3

Google Cloud CDN

https://cloud.google.com/cdn/

4

CloudFlare

https://www.cloudflare.com/cdn/

5

Akamai CDN

https://www.akamai.com/us/en/cdn/

6

Edgecast

https://www.verizondigitalmedia.com

7

fastly

https://www.fastly.com/

8

ChinaCache CDN

http://en.chinacache.com/products/mobile-cdn

9

maxcdn

https://www.maxcdn.com/open-source/

 

可用CDN开源软件

 

名称

链接

1

Nginx

https://www.nginx.com/

2

varnish

https://varnish-cache.org/

2

LuManager

http://www.zijidelu.org/

3

Fikker CDN

http://www.fikker.com/

 

对传统CDN在云环境下可作如下自动化和优化

1. CDN边缘节点在访问流量突然增加的情况下, 不易动态调节资源。可以和云计算的弹性伸缩相结合来解决, 做到动态调整资源配置, 扩大节点处理能力, 缓解系统压力。

2. 传统CDN使用的专用存储设备比较昂贵, 不易扩展, 兼容性较差。云存储系统的规模扩展非常便捷,在系统容量不能满足存储需求时,只需在新增加的服务节点上部署分布式存储中间件并进行必要的网络配置,即可快速地将该节点纳入原有存储集群管理体系中。云存储技术非常适合于大文件的读取密集型访问,这也正是CDN的主要应用场景。

3. 对CDN日志可以进行更加高效地统计分析, 数据挖掘, 捕捉用户行为特征和发现用户目标需求,从而进行有针对性的内容管理和资源调度。通过和云计算大数据集成, 能够基于计算集群的分布式计算模型能够针对海量大规模非结构化数据提供高性能的并行处理能力,从而更好地改善CDN的智能型。
4. 传统的CDN针对用户的不同终端和不同环境下地访问缺乏智能性。 结合云计算+SDN, 融合CDN可具有在任意时间、任意地点以及任意终端上看到任意内容的技术特点,以及统一性与智能性的特点,能实现业务内容在不同网络、按照不同既定策略向多种终端的快速分发,能够实现热门内容自动存储到融合CDN各云端的节点,而无需增加额外的承载网设备,大大降低了CDN服务商的建网成本,提高了投资收益率。例如高清视频业务向移动终端播放时,CDN网络需根据终端的类型、网络带宽等因素,自动调整视频类业务的分发策略,选择适合手机屏幕的编码格式,并采用预先设定好的手机视频Qos策略,使用户快速获得业务内容,降低承载网的流量压力,从而保证用户的业务体验。同时还能动态适配用户和网络情况,对视频内容进行识别,实现智能管控,从而适时添加针对性的增值业务和广告,保证用户的业务体验。 

5. CDN可通过和云计算的安全组件进行集成, 来做更好的CDN网络安全检查和防护

6. 集成多个CDN厂商的服务, 并动态调整使用哪个厂商的服务。由于各CDN厂商接口都不一样, 比较难统一接口。

7. 增加访问控制, 如什么地域的人, 什么网站可以访问该CDN资源。

  

下面介绍一下CDN服务如何和云计算环境OpenStack进行集成, 来解决上述问题。

 

二、poppy简介

Poppy(罂粟花, PoP代表Point ofPresence即CDN入网点/边缘节点, Py即Python)是openstack的一个组件, 用于提供CDN服务, 即CDN as a Service。

CDN厂商特有的API被抽象化, Poppy向上只提供统一CDN的RESTful API, 使用户环境能够使用多个CDN提供商的服务。

用户可配置多个CDN服务商, 并针对各服务商跑性能评估, 根据响应速度来动态切换CDN服务商, 从而减少CDN服务质量问题对用户造成的影响。

poppy这个项目目前只有master分支, 2014年有的代码, 目前网上相关文档和技术介绍较少, 只能自己看代码来理解。

 

poppy特性:

1. 可对接以下CDN提供商的API:

       *Akamai (Production Ready)

       *Fastly (In Development)

       *Amazon CloudFront (In Development)

       *MaxCDN (In Development)

       *Your CDN Here...

2. 发送配置给n个配置好的CDN提供商

3. 支持多个后端DB (建议CassandraDB)

       *支持CassandraDB

       *可扩展支持其他DB

4. 支持多个DNS提供商

       *Rackspace DNS

       *Openstack Designate (Coming soon)

5. 兼容Openstack

       *使用keystone做认证

       *使用swift做log存储

6. 可支持多个CDN源站点 (公网服务器, Amazon S3 bucket等等)

7. 支持多个domain

8. 定制化缓存和TTL规则

9. 配置缓存内容的访问策略

 

三、名词解释

Service

A service represents a customers’application that has its content cached to the edge nodes.

服务。即CDN服务实例, 用户的网站/域名需要的CDN服务具体配置和限制要求。

 

Status

The time it takes for a serviceconfiguration to be distributed amongst a CDN provider cache can vary. Thestatus indicates the current state of the service.

状态。当前服务的状态。

 

CachingRule

A caching rule provides the user withfine-grained control over the time-to-live (TTL) of an object. When the TTLexpires for an object, the edge node pulls the object from the origin again.

缓存规则, 当对象的TTL超时后, 边缘节点会再次从源重新下载对象

 

Domain

A domain represents the domain name throughwhich visitors retrieve content. The underlying site may be served through aCDN. A service can have multiple domains. A user typically uses CNAME for thisdomain to their CDN provider.

域, 域名。需要CDN支持的网站名。

 

Driver

Poppy has a modular API where manycomponents are interchangeable. These components are known as drivers (seeStevedore Framework). It is possible to use different transport drivers,manager drivers, storage drivers, and provider drivers.

驱动, 包括传输驱动, 管理驱动, 存储驱动, 提供商驱动

 

EdgeNode

CDN providers have many points-of-presence(POP) servers around the world. These servers are known as edge nodes. Theseedge nodes cache the content and serve it directly to customers, thus reducingtransit time to a customers' location.

边缘节点, CDN提供商在全世界有很多points-of-presence(POP)(入网点/访问点/提供点)服务器. 这些服务器叫做边缘节点, 用来缓存内容以及直接给用户提供服务, 由于其距离用户更近, 所以相应更快。

 

Flavor

A flavor allows the user to decide what CDNproviders they would like their service to use. Operators can define theflavors offered, and assign a CDN provider belonging to that flavor. Useflavors to abstract away the underlying provider used.

flavor上会配置使用哪些CDN提供商的服务, 使用时有些什么规格和限制。flavor最终被绑定到service中使用。

 

ManagerDriver

A manager driver contains the businesslogic within the application. This driver is responsible for delegating tasksto Storage and Provider Drivers.

管理驱动, 包含内在的业务逻辑, 并能调度存储和提供商驱动。

 

Origin

An origin is an address (ip or domain) fromwhich the CDN provider pulls content. A service can have multiple origins.

origin源站点, 是内容原始来源的站点。CDN提供商需要获取内容的来源,可以使IP地址或域名, 一个service可以由多个源站点。

 

Provider

There are many established CDN vendors inthe market. A provider is one of these vendors, who has decided to participatein the Poppy project. These participating providers will have a provider driverthat can communicate with their API.

提供商, 支持poppy驱动和API的CDN厂商

 

ProviderDriver

A provider driver is responsible forcommunicating with the third party providers who are participating in the Poppyproject.

提供商驱动, 支持poppy api的CDN提供商驱动

 

Purge

Purging removes content from the edgeservers, so it can be refreshed from your origin servers.

清除缓存。移除边缘节点的缓存内容, 然后需要从源站点重新拉取数据

 

Restriction

A restriction enables the user to definerules about who can or cannot access content from the cache. Examples of arestriction are allowing requests only from certain domains, geographies, or IPaddresses.

限制。用户自定义的一些访问规则, 用来定义从哪些ip、域名, 或地域的请求可以访问CDN资源。

 

StorageDriver

A storage driver is responsible forcommunicating with the chosen data store to store service configurations.

存储驱动。poppy支持以驱动方式支持多种后端存储设备, 并保存配置。目前只支持cassandra, 以后会支持SQL Alchemy。

一般openstack组件会把配置通过SQL Alchemy存储到MySQL数据库中, 但是poppy把相关数据存储到了cassandra中, 主要数据有: domain的证书, service服务, 和flavor信息。

 

TransportDriver

A transport driver handles the incomingrequests to the API. The recommended transport driver for Poppy is the PecanDriver based on WSGI.

传输驱动。处理API请求, 目前支持基于WSGI的Pecan驱动。

  

四、cassandra安装

Cassandra(社区内一般简称为C*)是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身。Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性和性能,被 Apple, Comcast, Instagram, Spotify, eBay, Rackspace, Netflix等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。

由于poppy依赖于cassandra, 需要在CentOS 7环境上安装cassandra2.0.17

1. 安装java (如已安装可以跳过)

# yum -y update

# yum -y install java

 

2. 添加DataStax的yum仓库

# vim /etc/yum.repos.d/datastax.repo

[datastax]

name = DataStax Repo for Apache Cassandra

baseurl = http://rpm.datastax.com/community

enabled = 1

gpgcheck = 0

 

3. 安装cassandra 2

# yum -u install dsc20

 

4. 启动cassandra

# systemctl start cassandra

# systemctl enable cassandra

 

5.通过命令行测试cassandra是否已启动

# cqlsh

能进入说明已正常启动


五、zookeeper安装

ZooKeeper曾是Hadoop的正式子项目,后发展成为Apache顶级项目,与Hadoop密切相关但却没有任何依赖。它是一个针对大型应用提供高可用的数据管理、应用程序协调服务的分布式服务框架,基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,提供的功能包括:配置维护、统一命名服务、状态同步服务、集群管理等。

在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。

由于poppy依赖于zookeeper, 进行进程间API调用/配置消息的发送和监听, 需要在CentOS 7环境上安装zookeeper 3.4.9

1. 安装java (如已安装可以跳过)

# yum -y update

# yum -y install java

 

2. 下载zookeeper

# wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.9.tar.gz

 

3. 解压zookeeper到zookeeper目录

# tar xzvf ./zookeeper-3.4.9.tar.gz

# mv -f zookeeper-3.4.9 zookeeper

 

4. 生成zookeeper配置文件

# cp ./zookeeper/conf/zoo_sample.cfg ./zookeeper/conf/zoo.cfg

 

5. 启动zookeeper

# ./zookeeper/bin/zkServer.sh start

  

六、poppy手动安装

假设当前目录为:/root/projects

1. 从github上clone poppy代码到本地

# git clone https://github.com/openstack/poppy.git

 

2. 复制poppy相关的配置文件到poppy_conf目录

# mkdir poppy_conf

# cp poppy/etc/poppy.conf poppy_conf/poppy.conf

# cp poppy/etc/logging.conf poppy_conf/logging.conf

 

3. 修改配置文件poppy_conf/poppy.conf中的cassandra服务IP地址。cluster的值改为实际的cassandra服务ip地址。另外, 把配置文件中的<>说明, 都改成实际值。

[drivers:storage:cassandra]

archive_on_delete = True

# Comma-separated list of hosts (Example: cass01,cass02,cass03)

cluster = localhost

;port = 9042

 

4. 安装poppy时, 为了依赖包不干扰现有环境的python库, 可以把poppy安装在virtualenv中

# pip install virtualenv

# cd poppy

# virtualenv .venv

# source .venv/bin/activate

(.venv) # pip install -r ./requirements.txt

(.venv) # python ./setup.py install

 

5. 运行poppy-worker

(.venv) # poppy-worker --config-file /root/projects/poppy_conf/poppy.conf --log-config-append /root/projects/poppy_conf/logging.conf

2016-11-18 16:32:58.424 3615 INFO kazoo.client [-] Connecting to localhost:2181

2016-11-18 16:32:58.566 3615 INFO kazoo.client [-] Zookeeper connection established, state: CONNECTED

 

6. 运行poppy-server

(.venv) # poppy-server --config-file /root/projects/poppy_conf/poppy.conf --log-config-append /root/projects/poppy_conf/logging.conf

2016-11-18 16:34:13.402 3752 WARNING stevedore.named [-] Could not load mail

2016-11-18 16:34:13.456 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: Heard and Mcdonald  Islands in GEO zone mapping

2016-11-18 16:34:13.457 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: Senegal  Seychelles in GEO zone mapping

2016-11-18 16:34:13.457 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: South Georgia and South Sandwich in GEO zone mapping

2016-11-18 16:34:13.458 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: Jordan in GEO zone mapping

2016-11-18 16:34:13.458 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: France (European Territory) in GEO zone mapping

2016-11-18 16:34:13.459 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: St Vincent and the  Grenadines in GEO zone mapping

2016-11-18 16:34:13.459 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: Kenya in GEO zone mapping

2016-11-18 16:34:13.459 3752 WARNING poppy.provider.akamai.geo_zone_code_mapping [-] Unsupported country: Cote d'Ivoire in GEO zone mapping

2016-11-18 16:34:14.310 3752 INFO poppy.transport.pecan.driver [-] Serving on host 127.0.0.1:8888

 

七、poppy架构和工作原理

poppy软件运行时, 主要有3个进程:  1. poppy-server进程      2.taskflow(基于zookeeper)        3. poppy-worker进程

poppy-server进程:

1. poppy通过API Transport Driver(WSGI-Pecan)来接收REST API请求

2. REST API请求由manager进行业务处理, 部分数据会被保存在存储中, 部分业务需要通过taskflow调用poppy-worker进程中的CDN提供商的API等, 主要业务模块有:

2.1 管理驱动 (ManagerDriver):

初始化并实例化各控制器, 实例化后的各控制器, 将会保存在下面的管理控制器这个基类中。

 

2.2管理控制器 (ManagerController):

各驱动的基类, 用来保存各个驱动实例

 

2.3分析控制器(AnalyticController):

输入: 域名以及provider支持的参数

GET/v1.0/services/{service_id}/analytics?domain={domain}&metricType=requestCount&startTime=2016-01-22T17:42:08&endTime=2016-01-24T17:42:08

处理: 调用provider驱动接口

输出: provider返回的度量数据

 

2.4 后台任务控制器 (BackgroundJobController):

支持在后台跑一些自定义的任务。比如: 需要对特殊的CDN提供商定时做一些特殊配置, 信息抓取, 监控等。并可自己触发告警和邮件通知等。

 

2.5 Flavor控制器 (FlavorController):

增、删、查flavor。flavor主要用来规定CDN服务的一些规格属性。如希望使用到的provider提供商名称, 服务商网站链接, API访问url, 以及一些规格限制, 如: 最多支持的源站点数量, 域数量, 缓存时间等等。

 

2.6 健康控制器 (HealthController):

对poppy的几个模块返回健康状况, 是否存活。主要有: CDN provider是否alive, DNS是否alive, 各分布式任务是否alive, 存储服务是否alive。

 

2.7 Home控制器 (HomeController):

用户访问RestAPI根目录时, 返回当前poppy的RestAPI支持一些什么属性和返回格式等等。即返回API EntryPoint

 

2.8 通告包装类 (NotificationWrapper):

简单包装了一下send发送消息方法, 用于发送邮件通知。

 

2.9 提供商包装类 (ProviderWrapper):

包装了一下面向CDN提供商的通用API接口, 主要提供如下接口: 创建/更新/删除服务, 清除缓存、创建/删除证书(create, update, delete, purge,create_certificate, delete_certificate)。

 

2.10业务控制器 (ServiceController):

CDN业务的抽象类和接口: 主要是增、删、改、查CDNservice以及清除缓存。

 

2.11SSL证书控制器 (SSLCertificcateController):

创建、删除、获取域名SSL证书。会通过storage驱动保存。

 

3. 存储驱动:

相关数据会通过存储驱动被保存在cassandra中。

 

taskflow(zookeeper)进程:

Taskflow是OpenStack中的一个Python库, 它主要是可以使task的执行变得更加容易、一致和可靠,这对于openstack中各种长流程任务来说应该十分有好处。

OpenStack 的代码正在有组织的增长,但是如果进程被意外中断,却没有一个可以安全恢复或回滚代码的标准;大多数项目并没有使task可以重启或恢复。

通过Taskflow的推广,使OpenStack变的可信和可靠,甚至在没有HA的情况下。

这里taskflow底层是通过保存任务状态, 并监听任务节点来实现。(通过zookeeper保存, 也可使用redis数据库实现)

 

poppy使用taskflow主要用来保存poppy-server创建的各异步任务流配置, 和任务返回结果。poppy-worker中的相关模块会去读取异步任务配置并执行任务。

任务流包括: 创建、更新、删除服务, 创建ssl证书, 删除ssl证书等任务。各任务流(taskflow)还包括了一连串的任务(task)。

比如: 创建服务这个任务流, 包含了一连串的任务:对DNS提供商API的操作任务, 对DNS服务的操作任务, 保存log到数据库的操作任务, 获取各操作状态的任务

任务流主要是把一连串的任务按照顺序串联起来, 每个任务流操作可以认为为一个原子操作。如果其中一个流操作失败时, 可以按照反向操作进行回滚。

 

总结: 这里的taskflow主要用于进程间(poppy-server和poppy-worker间)传递异步任务消息或配置, 类似rabbitmq, 同时更加方便的进行任务执行失败的回滚操作。

 

poppy-worker进程:

poppy-worker会监听taskflow, 并执行收到的各任务流, 各任务会调用如下驱动:


DNS驱动:

驱动目前实现了对openstack的designate以及rackspace DNS服务的支持。

主要的DNS接口有: 创建服务的CNAME记录(create), 删除服务的CNAME记录(delete), 更新服务的CNAME记录(update), 生成共享的ssl域前缀(generate_shared_ssl_domain_suffix),域名分散是否已满(is_shard_full)。

有关域名分散(domainshard)看这个文档: https://segmentfault.com/a/1190000004647665

 

Provider驱动:

实现抽象API对接各CDN提供商的私有API。

从代码上看, 目前支持的provider有: 实现较全: akamai, 部分实现:cloudfront, fastly, maxcdn。

主要实现的接口有: 创建/更新/删除服务, 清除缓存、创建/删除证书, CDN provider是否alive, 得到某域的分析度量值, 等等。

 

存储驱动:

相关数据会通过存储驱动被保存在数据库中。目前只支持cassandra。




  

八、poppy代码

 

├── doc                       相关文档源文件

├── docker                     提供部分docker compose和相关配置文件, 用来通过docker自动编排相关服务如zookeeper, cassandra, 做到快速部署、试用、测试

├── etc                        配置文件示例

├── hadoop                    提供hadoop pig脚本, 用于把log导入到hadoop, 可用于深层分析

├── poppy                     poppy核心代码以及驱动

│   ├── cmd

│   ├── common

│   ├── distributed_task         分布式任务驱动, 即taskflow的任务执行, 回滚, 监听等

│   │   ├── base

│   │   ├── taskflow

│   │   │   ├── flow

│   │   │   └── task

│   │   └── utils

│   ├── dns                   DNS驱动, 用来增、删、改CNAME记录

│   │   ├── base

│   │   ├── default

│   │   ├── designate

│   │   └── rackspace

│   ├── manager

│   │   ├── base

│   │   └── default

│   ├── metrics

│   │   ├── base

│   │   └── blueflood

│   │       └── utils

│   ├── model

│   │   └── helpers

│   ├── notification

│   │   ├── base

│   │   └── mailgun

│   ├── openstack

│   ├── provider                对接CDN服务商的驱动

│   │   ├── akamai

│   │   │   ├── background_jobs

│   │   │   │   ├── check_cert_status_and_update

│   │   │   │   ├── delete_policy

│   │   │   │   └── update_property

│   │   │   ├── cert_info_storage

│   │   │   ├── domain_san_mapping_queue

│   │   │   ├── http_policy_queue

│   │   │   └── mod_san_queue

│   │   ├── base

│   │   ├── cloudfront

│   │   ├── fastly

│   │   ├── maxcdn

│   │   └── mock

│   ├── storage                 存储驱动, 保存当前配置

│   │   ├── base

│   │   ├── cassandra

│   │   │   └── migrations

│   │   │       └── config

│   │   └── mockdb

│   └── transport                API驱动, 目前的pecan实现了REST API服务

│       ├── pecan

│       │   ├── controllers

│       │   │   └── v1

│       │   ├── hooks

│       │   └── models

│       │       ├── request

│       │       └── response

│       └── validators

│           ├── schemas

│           └── stoplight

└── ....

 

九、CLI命令行和API接口

目前poppy未提供CLI命令行, 该网站列了(http://docs.cloudcdn.apiary.io/#introduction/error-resources)一些API和配置参数, API包括如下类型:

BASE: 得到当前API服务支持的一些配置和选项参数, 健康检查等

Services: 增删改查Service, 清除assets, 得到分析数据

SSL证书: 创建、获取、删除SSL证书。

Flavors: CDN配置和CDN provider的映射

Admin: 一些只有管理员才能做的运维操作。如: 通过DNS服务状态来得到DNS服务名称和projectid, 通过证书状态得到域名, 手动配置任务状态, 禁用某DNS服务等等。

 

样例如下:

查询Services

METHOD: GET

RESOURCE: /services

BODY: 无

 

创建Services

METHOD: POST

RESOURCE: /services

BODY:

{

    "name": "mywebsite.com",                                    服务名称, 一般为需要CDN提供服务的网站名

    "domains": [                                                 网站的域名和访问协议, 可以支持多个域名

        {"domain": "www.mywebsite.com"},

        {"domain": "blog.mywebsite.com",

         "protocol": "https"}

    ],

    "origins": [                                                   源站点名称和访问协议

        {

            "origin": "mywebsite.com",

            "port": 443,

            "ssl": false,

            "hostheadertype": "origin"

        }

    ],

    "caching": [                                                  缓存配置。需要缓存的网站文件名称, 类型, 缓存时间等规则。

        { "name" : "default", "ttl" : 3600 },

        { "name" : "home",

          "ttl" : 17200,

          "rules" : [

                { "name" : "index", "request_url" : "/index.htm" }

            ]

        },

        { "name" : "images",

          "ttl" : 12800,

          "rules" : [

                { "name" : "images", "request_url" : "*.png" }

            ]

        }

    ],

    "restrictions": [                                               访问控制。规则可以是: 从哪个网站可以访问该资源(防盗链), 地域访问控制

        {

            "name": "website only",

            "type": "whitelist",

            "rules": [

                {

                    "referrer": "www.mywebsite.com"

                }

            ]

        },

        {

            "name": "americas only",

            "type": "whitelist",

            "rules": [

                {

                    "geography": "US MX CA"

                }

            ]

        }

    ],

    "log_delivery": {                                             是否开启log存储

        "enabled:": true

    },

    "flavor_id": "asia"                                            标明flavor_id。flavor可以用来指定使用哪几个CDN提供商。

}

 

其他API略

0 0
原创粉丝点击