OpenStack CDNaaS - Poppy介紹

作者: 趙怡


一、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略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章