マルチ CDN を検討するにあたって考慮する点


# はじめに
Web を通じてコンテンツの配信を安定して行いたい場合に CDN(Content Delivery Network) を利用するのはもはや一般的ですが、サイトやイベントの配信に複数の CDN を利用するケース、いわゆる「マルチ CDN 」の事例が増えています。

この記事ではマルチ CDN にはどのようなメリットがあるのか、またマルチ CDN を導入する際に考慮すべき点をご紹介したいと思います。

# マルチCDNとは
特に明確な定義があるわけではないのですが、マルチ CDN とは２つ以上の CDN を配信に利用、もしくは利用できる状態にしておくことを言います。

一般的にはひとつのサービスや動画の配信などに複数の CDN を利用することをさしますが、複数の CDN ベンダーと契約して状況やサービスによって CDN を使い分けているケースもマルチ CDN （戦略）と呼ぶこともあるようです。


# マルチ CDN 利用のメリット
マルチ CDN を利用する一般的なメリットとしては以下のようなものがあげられます。

### スケーラビリティの向上
複数の CDN ベンダーにトラフィックを分散することで、ひとつの CDN だけでは処理しきれないような大規模なトラフィックを配信することが出来ます。
スポーツイベントやドラマや映画の配信、ゲームのリリースが代表的な利用例としてあげられます。
マルチ CDN を導入するきっかけとして一番多いのがこのケースではないでしょうか。


### 可用性の向上
特定の CDN のサービスがなんらかの理由でダウンしてしまった場合でも、別の CDN を利用することでサイトやサービスの配信を継続することが出来ます。また、特定の ISP やネットワークの障害時にも別の CDN を利用することでエンドユーザーへの影響を最小限に抑えることができる可能性があります。


### パフォーマンスの最適化
特定の国や地域などの条件に応じて利用する CDN サービスをコントロールすることで、全体としてのパフォーマンスを向上できる可能性があります。

### コストの最適化
複数の CDN と契約することで、コスト的に最適な CDN を選択することが可能となります。
ただし、後述のデメリットで説明する配信単価については注意する必要があります。


# マルチ CDN 利用のデメリット
一方デメリットとしては以下のような点があげられます。ただし利用形態によってはデメリット部分を軽減することが出来ます。

### 運用負荷の増加
配信設定の作成、設定変更、キャッシュの削除などの作業を複数の CDN に対して行う必要があります。
また、CDN から配信されたトラフィックの情報を確認する際にも複数の CDN からデータを取得して合算する必要があるなど、単一の CDN でサービスを運用する場合と比較して運用の工数が増加します。

### オリジン負荷の増加
複数の CDN からキャッシュにヒットしなかったリクエストがオリジン環境に到達します。仮に各 CDN のキャッシュヒット率が同じだったとすると CDN を2つ利用する場合は単独の CDN で運用する場合と比較してオリジンに到達するリクエストの数は2倍になります。

### 機能利用の制限
マルチ CDN の利用方法にもよりますが、CDN の切り替えを前提とするためには基本的にはすべての CDN で同一の挙動をするように設定する必要があります。
特定の CDN に優れた機能があったとしても、すべての CDN で実装が出来ない機能は利用することが出来ません。

### 配信単価
メリットとしてあげた「コストの最適化」に反するのですが、一般的に CDN ベンダーはより多くので配信容量を多くコミットすることでより単価が安くなります。複数 CDN を利用する場合は各 CDN にコミットできる配信容量は分散され少なくなるため、配信単価自体は高くなる傾向にあります。

# マルチ CDN の利用形態

マルチ CDN の利用形態としては以下のようなものが挙げられます。

#### バックアップ - 障害時に切り替え
通常はプライマリの CDN のみを利用し、プライマリ CDN に問題が発生した場合にセカンダリの CDN に切り替えます。

**メリット**
プライマリ CDN に問題が発生しない限りひとつの CDN だけを意識してサービスを運用できます。

**デメリット**
障害が発生してセカンダリ CDN に切り替えた場合、何も対策をしていないとセカンダリ CDN にはキャッシュがない状態なので一時的にオリジンの負荷が増加します。
また、障害発生時に CDN を切り替える仕組みや運用手順を作成しておく必要があります。自動的な仕組みが実装出来ないと障害発生時に切り替えまでに時間を要してしまう可能性もあります。


#### 常時マルチ CDN 利用
常に複数の CDN に分散してトラフィックを流します。パターンとしては以下のようなケースが考えられます。

* 割合で制御
50:50 や 20:80 などの割合で利用する CDN をコントロールする

* 地域制御
特定の地域ごとに利用する CDN をコントロール

* 最適な CDN を優先利用
常時ヘルスチェックやパフォーマンスチェックを行い、最適なパフォーマンスを提供する CDN を優先的に利用。

**メリット**
各 CDN に常にキャッシュが溜まっているので、万が一の障害時に片方の CDN にトラフィックを全振りしてもオリジンの負荷はそれほど増加しないことが期待できます。

**デメリット**
複数 CDN にトラフィックを分散する仕組みを構築する必要がある。




# マルチ CDN の実現方法

いずれの利用形態でマルチ CDN を利用するにしろ、複数 CDN 間にトラフィックを分散する仕組みが必要となります。代表的な実現方法について説明します。

### DNS
CDN を導入する一般的な方法は対象のドメイン(FQDN) を CDN を示すドメインに CNAME 設定することです。そのためマルチ CDN を実現するためには DNS を利用するのが合理的です。ただし一般的な DNS サービスは特定のレコード(FQDN) に対して CNAME ドメインは一つしか設定出来ません、

そのため DNS レベルでマルチ CDN を実現するためには複数の CNAME を設定可能な DNS サービスを利用することが必要です。一部のサービスでは複数 CDN 間のパフォーマンスの計測やヘルスチェックなどを行い最適な CDN にトラフィックをルーティングするマルチ CDN の利用を想定したサービスもあります。

このような複数の CNAME を設定可能な DNS サービスを提供しているベンダーとしては以下のようなものがあります。ただし実際に契約して機能をテストしたわけではないので、ご利用になる際は最新の情報や機能をベンダーに確認して十分に検証を行ってからご利用下さい。


**Citrix Intelligent Traffic Management (旧 Cedxis)** - https://www.citrix.com/products/citrix-intelligent-traffic-management/

Cedexis は元 Akamai のエンジニアなどが立ち上げたマルチ CDN ソリューションの会社です。マルチ CDN をソリューションとして最初に提供し出したのはこの会社だったような気がします。現在は Citrix に買収され Citrix Intelligent Traffic Management (CITM)という名称でサービスを提供しているようです。

なお、マルチ CDN とは直接関係はないですが、以下のページで Citrix が計測した各 CDN のパフォーマンスを国やメトリックスを指定して確認することが出来ます。CITM サービスではこういったデータもパフォーマンス的に最適な CDN を選択する際のデータとして利用しているようです。
https://www.citrix.com/products/citrix-intelligent-traffic-management/country-reports.html

**NS1** - https://ns1.com/
独自の DNS ソフトウェアを用いて高性能な DNS ソリューションを提供する会社です。latency や feed したデータに応じて最適な CDN を選択するマルチ CDN にも対応しているようです。

**mlytics** - https://www.mlytics.com/
AI ベースのトラフィックマネージメント機能を提供する台湾の会社です。詳しくは調べきれていませんが DNS サービスだけではなく mlytics 社の契約する複数のCDNベンダーを利用してマルチ CDN を実現することも可能なようです。

**AWS Route53** - https://aws.amazon.com/jp/route53/
AWS の提供する DNS サービスです。一般的な DNS では設定が出来ない特定のレコードに対して複数の CNAME レコードの設定が可能です。分散は重みづけ(weighted)を利用しますが、重みづけの精度は（特にトラフィックが少ない場合）あまり高くはないようです。ただし、上述のような専用のベンダーと契約することなく、AWS サービスの一環として手軽にマルチ CDN を実現することが出来ます。


### マニフェスト
動画配信でマルチ CDN を実現する際に使われることがある手法です。HLS や Dash など近年一般的な動画の配信では、動画を (そのまま単一の大きなファイルとして扱うのではなく) チャンク化し、マニフェストファイルでビデオプレーヤーに個々のビデオチャンクをどこで取得するのかを指示します。つまり、マニフェスト はビデオプレーヤーがファイルの適切な部分を見つけてロードし、再生できるようにする目次のようなものになります。

マニフェストを使用してトラフィックをルーティングする場合、マニフェストファイルに記載されているチャクファイルの URL を変更するだけで、プレーヤーがビデオファイルを取得する場所を変更できます。マニフェストファイルに記載するチャンクファイルの取得先をコントロールすることで、複数の CDN を利用した動画の配信が可能となります。

### プレイヤー/アプリケーション
こちらも主に動画配信で使われることがある手法です。マニフェストではなくブラウザやスマートフォンのアプリケーション側に複数の CDN から最適な CDN からコンテンツを取得するロジックを実装します。マニフェストでは管理者が割合などを考慮してクライアントにコンテンツ取得先の CDN を指定しますが、プレイヤーやアプリケーション側に CDN の選択ロジックを実装することで、クライアントからみた最適な CDN からコンテンツを取得するといったよりパフォーマンスを考慮した CDN の選択が可能になります。



# まとめ

以上マルチ CDN を検討する際によく聞かれる内容などをまとめてみました。マルチ CDN を検討してみたものの複数 CDN との契約の手間や、複数 CDN へトラフィック分散する仕組みの実装がネックとなって実際の導入には至らないケースは割と多いように感じます。

ただ、AWS の Route53 などより手軽にマルチ CDN を実現することが出来るサービスも出て来ていることや、Fastly など従来の CDN よりも利用のハードルが低い CDN もあるので、大規模な配信や絶対に落とせないサービスを構築する際は一考の価値があるのではないかと思います。