How we made our DNS stack 3x fasterについてので古橋さんのつぶやきまとめ

1
リンク Cloudflare Blog How we made our DNS stack 3x faster Cloudflare is now well into its 6th year and providing authoritative DNS has been a core part of infrastructure from the start. We’ve since grown to be the largest and one of the fastest managed DNS services on the Internet, hosting DNS for nearly 100,000 6 users 276
Sadayuki Furuhashi @frsyuki

Great article. Cloudflare engineers made their DNS stack 3x faster using MessagePack. blog.cloudflare.com/how-we-made-ou… #msgpack

2017-04-12 05:24:00
Sadayuki Furuhashi @frsyuki

読んだ。すばらしい。CDNプロバイダのCloudflareが、MessagePack と Go を使ってDNSの実装を3倍速くしたという話。"How we made our DNS stack 3x faster" blog.cloudflare.com/how-we-made-ou… #msgpack

2017-04-12 14:53:07
Sadayuki Furuhashi @frsyuki

背景、データモデル、実装、ベンチマークが順に語られていて、少なくとも "Why MessagePack?" の部分は確実に読んだ方がいいのだけども! 要約するならば、世界100箇所以上のデータセンタで数百万のDNSゾーンを運用しているAnycastサーバを刷新した話。

2017-04-12 14:54:39
Sadayuki Furuhashi @frsyuki

Cloudflareでは、少なくとも5つのDNSゾーンが毎秒更新されていて、それらをエッジサーバ群に配信しているのだが(想像だけど、DNSの配信遅延がCDNのキャッシュヒット率に影響するのでは)、前世代では、時折30分以上、まれに1時間を超える配信遅延が発生していた。

2017-04-12 14:58:39
Sadayuki Furuhashi @frsyuki

新システムではほぼ常に1分以下で安定した。エッジサーバ上に保存するDNSレコードのテーブルも小さくなっている。JSON+Protocol Buffersを使っていた前世代と比べ、MessagePackによる新システムは「9分の1」のサイズで済み、当初の予想以上の成果が得られている

2017-04-12 14:59:37
Sadayuki Furuhashi @frsyuki

MessagePackを選択した理由は、Go実装が速いこともあるが、スキーマ定義言語を使う必要がなく、メンテナンスが簡単であることが第一に挙げられている。特にDNSはシンプルでデータ構造は既に標準化されているため、protobufスキーマをメンテせずに済む手法を探していたようだ。

2017-04-12 15:02:20
Sadayuki Furuhashi @frsyuki

実装としては、 github.com/tinylib/msgp を使っていて、Goのstruct定義をそのまま使ってシリアライザ/デシリアライザを生成してくれる点が便利であるらしい。ベンチマーク結果も非常に良好。 github.com/alecthomas/go_…

2017-04-12 15:03:08
Sadayuki Furuhashi @frsyuki

Goのstruct定義をそのまま使えると言うことは、既存のインスタンスをそのままバイナリに変換でき、逆にバイナリからそのままstructを取り出すこともでき、その間で型のマッピングなどの問題をまったく意識せずに済むため、大幅にシンプルになったという。

2017-04-12 15:05:16
Sadayuki Furuhashi @frsyuki

プログラミング言語内の型定義をそのまま使って、透過的にシリアライズ・デシリアライズする最適なコードを生成するこの手法は、MessagePackの各言語実装によく見られる手法で、C++実装やC#実装、Java実装などでも同じように可能。これは一応論文にも書いてある。

2017-04-12 15:07:27
Sadayuki Furuhashi @frsyuki

msgpack.org のウェブサイト自体も、CloudflareをCDNとして使っているわけだけども、DNSをCNAMEでCloudflareへ向けるとキャッシュを配ってくれて、ヒットしなかった場合のみ設定しておいたサーバにリクエストが飛ぶ。で、

2017-04-12 15:13:47
Sadayuki Furuhashi @frsyuki

クライアントからのDNSリクエストは UDP Anycast で処理されていて、地理的に近いDNSサーバが応答することになる。このDNSサーバが、地理的に位置にあるキャッシュサーバのうち、当該サイトのキャッシュを持つサーバのIPを応答すれば、

2017-04-12 15:17:00
Sadayuki Furuhashi @frsyuki

クライアントは地理的に近いキャッシュサーバへとアクセすることになる。つまり、できるだけ多くのAnycast DNSサーバに対して、各キャッシュサーバのキャッシュの状態が配られているほど、キャッシュを持つ近いサーバのIPを返せるから、キャッシュヒット率が向上するハズ…

2017-04-12 15:19:56
Sadayuki Furuhashi @frsyuki

…だと思われるのだけど、実際のところはどうなんだろうか。毎秒5ゾーン以上更新されるというのは、ユーザーからの設定の更新がそれくらいの頻度で発生しているのか、それともキャッシュサーバの増減や状態の変化に伴ってゾーン情報が変更されるため高頻度になるのか。

2017-04-12 15:21:19
Sadayuki Furuhashi @frsyuki

このあたりはもう少しCDNの詳細を知らないと分からないなぁ。Cloudflareのブログにも、そこまでは書かれていない。 blog.cloudflare.com/how-we-made-ou…

2017-04-12 15:23:47
Sadayuki Furuhashi @frsyuki

datanyze.com/market-share/d… によれば、Alexa top 1Mドメインのうち、98,726ドメインはCloudflareで配信されていて、これは48.28%のシェアに相当し、世界トップ。それらがMessagePackでシリアライズされて配信されている様は胸熱。

2017-04-12 15:28:27
Sadayuki Furuhashi @frsyuki

全世界のドメインで見ても、31.03% の 811,725ドメインはCloudflareで、これも世界首位。 datanyze.com/market-share/d…

2017-04-12 15:30:36
Sadayuki Furuhashi @frsyuki

理解が正しければ、同じCDNでも Fastly はDNSサーバは持っていなくて、少なくともCloudflareとは設定方法が違うのだけども、地理的に近いキャッシュを持つサーバにどうやってアクセスを飛ばしているんだろうな…Cloudflareも予想でしかないけども。

2017-04-12 15:37:38
Tatsuhiko Miyagawa @miyagawa

@frsyuki we run our own DNS server and you can CNAME to it.

2017-04-12 15:40:35
Sadayuki Furuhashi @frsyuki

@miyagawa I see, right. Fastly hosts Fastly's DNS name and can anycast it. Cloudflare hosts users' DNS zones as well, on the other hand.

2017-04-12 15:44:25
Tatsuhiko Miyagawa @miyagawa

@frsyuki we use anycast for Apex domains but non-apex names can be just CNAME and our DNS servers at the edge returns the IP near you

2017-04-12 15:47:04