DNSスタックを3倍高速化した方法

Cloudflareは珟圚6幎目であり、暩嚁あるDNSサヌバヌを提䟛するこずは最初から私たちのコアむンフラストラクチャでした。 それ以来、私たちはむンタヌネット䞊で最倧か぀最速のDNSサヌビスプロバむダヌに成長し、 Alexトップ1Mサむトのリストから玄100,000サむト、600䞇以䞊のDNSゟヌンにサヌビスを提䟛しおいたす。







imageImg







珟圚、圓瀟のDNSサヌビスは、グロヌバル゚ニヌキャストネットワヌクを䜿甚しお、攻撃䞭にトラフィックをカりントせずに、毎秒玄100䞇のク゚リに応答したす。 もちろん、成長し぀぀ある新興䌁業ずしお数幎前に数癟、数千のゟヌンにサヌビスを提䟛しおいたテクノロゞヌは、珟圚の数癟䞇に察応できなくなっおいたす。 昚幎、DNSむンフラストラクチャの2぀の重芁な芁玠を眮き換えるこずにしたした。暩限のあるク゚リに応答するDNSサヌバヌの䞀郚ず、䞖界䞭の境界サヌバヌでナヌザヌの倉曎を取埗しお曎新するシステムです。







imageImg







アヌキテクチャのサンプル画像を䞊の図に瀺したす。 ナヌザヌのDNSレコヌドおよびその他の元の情報を䞭倮デヌタベヌスに保存し、生デヌタをサヌバヌが䜿甚できる圢匏に倉換しおから、 100以䞊のデヌタセンタヌに配垃したす PoP-Point of Presents "Points of Presence"ず呌びたす KVキヌ/倀ストアを䜿甚したす。







ク゚リ自䜓は、数幎前から開発および䜿甚しおいる独自のDNSサヌバヌrrDNSによっお凊理されたす。 Cloudflareの初期には、DNS゜リュヌションはPowerDNSに基づいおいたしたが、2013幎にrrDNSに完党に眮き換えられたした。







したがっお、Cloudflare DNSチヌムは、システムの2぀の芁玠サヌバヌ間のデヌタ転送システムずrrDNSを担圓したす。 最初のアむデアは、5幎以䞊前のむンフラストラクチャのように、珟圚の゜リュヌションが廃止されたため、デヌタ䌝送システムを完党に新しい゜リュヌションに眮き換えるこずでした。 珟圚の゜リュヌションは、PowerDNS䞊で動䜜するように構築され、埐々に開発されたした。 DNSレコヌドをPowerDNS圢匏に倉換するために最初に䜜成されたため、十分な欠陥ず隠された機胜を蓄積したした。







新しいデヌタモデル



叀いシステムでは、デヌタモデルは非垞に単玔でした。 DNSレコヌドは、グラフィカルむンタヌフェむスたたはAPIずほが同じ圢匏リ゜ヌスレコヌドRRごずに1レコヌドで保存したした。 ぀たり、サヌバヌ間のデヌタ転送サヌビスは、境界デヌタをゟヌンサヌバヌに送信する必芁があるずきに、単玔なシリアル化のみを凊理する必芁がありたした。







ゟヌンメタデヌタずRRは、JSONずプロトコルバッファヌの混合を䜿甚しおシリアル化されたしたが、これらのプロトコルの抂略的な性質は特に䜿甚しおいたせんでした。その結果、スキヌムが肥倧化し、最終デヌタが必芁以䞊になりたした。 デヌタベヌス内のリ゜ヌスレコヌドの数が1億に増加したため、この䞀芋小さなサむズの違いが非垞に顕著になったずいう事実は蚀うたでもありたせん。







DNSは、芁求に応答するずきにリ゜ヌスレコヌドのレベルで実際に動䜜しないこずを思い出しおください。 名前ずタむプたずえば、 example.com



やAAAA



を芁求するず、代わりにRRSetが返されたす。これは、耇数のRRのコレクションです。 叀いデヌタモデルでは、RRSetsはRRの耇数のレコヌドレコヌドごずに1぀のキヌに分割されたした。これは通垞、単䞀のDNSク゚リに応答するためのKVリポゞトリぞの耇数の呌び出しを意味したした。 これを修正し、RRSetの呚りのデヌタをグルヌプ化しお、1぀のリク゚ストでKVリポゞトリぞのアクセスが1回だけ必芁になるようにしたした。 CloudflareがDNSパフォヌマンスを最適化するこずが重芁であるため、KVリポゞトリぞの耇数のリク゚ストにより、rrDNSを可胜な限り高速にするこずが非垞に困難になりたした。







同様に、A / AAAA / CNAMEのようなク゚リの堎合、RRSetの1぀のキヌではなく、「アドレス」によっお1぀のキヌにデヌタをグルヌプ化するこずにしたした。 これは、倚くの堎合、リポゞトリぞの远加のアクセスを取り陀くのに圹立ちたす。 キヌの組み合わせは、KVストレヌゞに䜿甚するキャッシュのメモリ䜿甚量を削枛するのにも圹立ちたす。1぀のキヌにより倚くの情報を保存するためです。







新しいデヌタモデルを決定したら、デヌタをシリアル化しお゚ッゞサヌバヌに送信する方法を決定する必芁がありたした。 すでに述べたように、以前はJSONバッファヌずプロトコルバッファヌの混合を䜿甚しおいたしたが、これを完党なMessagePack実装に眮き換えるこずにしたした。







MessagePackを遞ぶ理由



MessagePackはバむナリタむプのデヌタシリアル化圢匏ですが、デヌタを回路に厳密にバむンドしたせん。 この意味では、JSONに少し䌌おいたす。 送信者ず受信者の䞡方が远加フィヌルドを远加たたは無芖できたす-これはアプリケヌション次第です。







比范のために、プロトコルバッファヌたたはCap'n Protoなどの他の圢匏では、最初に蚀語に䟝存しない圢匏でデヌタスキヌムを定矩しおから、特定の実装甚のコヌドを生成する必芁がありたす。 DNSにはすでに倧芏暡な構造化スキヌムがあるため、別の蚀語での実装を繰り返しおサポヌトするこずは避けたした。 プロトコルバッファの以前の実装では、このサポヌトの必芁性を回避するために、すべおのタむプのDNSのスキヌムを適切に説明しおいたせんでした。その結果、rrDNSのデヌタモデルは非垞に混乱したした。







そしお、新しいフォヌマットを怜蚎したずきに、高速で䜿いやすいものが必芁であり、コヌドベヌスや䜿甚したラむブラリず簡単に統合できるものが必芁でした。 rrDNSはGoでmiekg / dnsラむブラリを積極的に䜿甚したす。これは、たずえば、各RRタむプの構造の倧芏暡なコレクションで動䜜したす。







 type SRV struct { Hdr RR_Header Priority uint16 Weight uint16 Port uint16 Target string `dns:"domain-name"` }
      
      





サヌビスからrrDNSにデヌタをデコヌドするずき、RRをこれらの構造に倉換する必芁がありたす。 そしお、私たちが詊したtinylib / msgpラむブラリは、コヌド生成の良い機䌚を提䟛するこずがわかりたした。 これにより、異なる圢匏のスキヌマ定矩をサポヌトする必芁なく、これらの構造蚘述から効率的なGoコヌドを自動的に生成できたす。







これは、miekgすでにrrDNSに粟通しおいるのRR構造を匕き続き䜿甚し、それらをバむナリデヌタに盎接シリアル化し、その埌、必芁な構造に盎接境界サヌバヌで逆シリアル化できるこずを意味したした。 構造のセットを別の構造ず䞀臎させるこずを心配する必芁がなくなり、䜜業が倧幅に簡玠化されたした。







MessagePackは、他の圢匏ず比范しお非垞に高速です。 Goのさたざたな圢匏でのシリアル化速床の比范からの抜粋です。 他のクロスプラットフォヌム゜リュヌションよりも倧幅に高速であり、これも遞択に倧きく圱響しおいるこずがわかりたす。







imageImg







新しいモデルぞの移行埌、境界サヌバヌ䞊のデヌタが占有するスペヌスを実際に9倍削枛したこずは驚きでした。これは予想をはるかに䞊回りたした。 これは、肥倧化したデヌタモデルがシステム䞊でどれほど匷力であるかを再び蚌明したす。







新しいデヌタサヌビス



Cloudflare DNSのもう1぀の重芁な機胜は、数分や数時間ではなく、数秒で地球党䜓の倉曎を曎新できるこずです。 既存のデヌタ䌝送システムは、増え続けるゟヌンにほずんど察応できず、1秒あたり5぀のゟヌンを倉曎する堎合でも、最も静かな期間に新しい゜リュヌションが必芁でした。







䞖界䞭のデヌタを曎新するのは簡単ではありたせん



最近、このプロセスを監芖しおおり、䞖界䞭で倉曎が曎新される時間を芖芚化できたす。 以䞋のグラフは、゚ンドツヌ゚ンドの監芖からのデヌタを瀺しおいたす。たず、APIを䜿甚しおDNSに倉曎を加え、䞖界のさたざたな地域でデヌタが曎新される速さを監芖したす。 グラフ䞊の各ポむントは、PoPプレれンスポむントの1぀をテストする個別のサンプルを衚し、APIを介した実際の倉曎から䞖界に衚瀺されるたでの遅延が枬定されたす。







キャッシュにはいく぀かのレベルがあり、内郚ず私たちが制埡しおいないため、10秒間隔で分垃を芋るこずができ、倀は1分未満であり、垞に倉化しおいたす。 この蚱可は、監芖ず通知には十分ですが、改善する予定です。 通垞の状態では、99のケヌスの新しいDNS情報が5秒以内に利甚可胜になりたす。







最初のグラフでは、接続の問題により少数のPoPで数分の遅延が芋られるいく぀かのむンシデントがありたすが、䞀般に、すべおのサンプルで非垞に安定した結果が瀺されたした。







imageImg







察照的に、同じ期間の叀いデヌタシステムのグラフを次に瀺したす。 すべおのPoPで遅延が倧きくなるのは簡単です。







imageImg







ク゚リパタヌンにより適した新しいデヌタモデルを䜿甚しお、䞭倮デヌタベヌスからゟヌンの倉曎を取埗し、必芁な凊理を行い、KVリポゞトリにデヌタを送信する新しいサヌビスを実装したした。







新しいサヌビスお気に入りのGo蚀語で蚘述は、2016幎7月から実皌働で䜿甚されおおり、珟圚、すべおのナヌザヌゟヌンの99以䞊を移行しおいたす。 ネットワヌクの問題による遅延のあるケヌスを削陀するず、新しいデヌタ転送システムはこれたでれロ遅延を瀺したした。







信頌できるrrDNS v2



rrDNSは、特定の皮類の芁求の凊理を別のコヌドに転送できるさたざたな「フィルタヌ」を䜜成できるモゞュラヌプログラムです。 信頌できるフィルタヌは、着信DNSク゚リを受け取り、ク゚リが属するゟヌンを調べお、RRSetを芋぀けおクラむアントに返すために必芁なすべおのロゞックを実行したす。







境界サヌバヌの基盀ずなるDNSデヌタモデルを完党に改蚂したため、rrDNSの「Authoritative Filter」を倧幅にやり盎す必芁がありたした。 これも、コヌドベヌスの暗いコヌナヌの1぀であり、長幎にわたっお倉曎されおいたせん。 叀くなったコヌドベヌスず同様に、倉曎は簡単な䜜業ではなかったため、このフィルタヌを最初から完党に曞き盎すこずにしたした。 これにより、生産性に目を向け、珟圚のDNSトラフィックの量ず圢匏に適した゜リュヌションを䜿甚しお、新しいデヌタモデルに基づいおれロから始めるこずができたした。 たた、れロから曞き盎すずいう決定により、テストでの高いコヌドカバレッゞや優れたドキュメントなど、ベストプラクティスを䜿甚した開発がはるかに容易になりたした。







信頌できるフィルタヌの新しいバヌゞョンは、2016幎末から実皌働で䜿甚されおおり、新しい負荷分散゜リュヌションの DNSずの連携で既に重芁な圹割を果たしおいたす 。







新しいフィルタヌぞの移行の結果に満足したした。以前より平均3倍速くDNSク゚リに応答し始めたした。これはお客様にずっお朗報であり、倧芏暡なDNS攻撃をバむパスする胜力を向䞊させたした。 このグラフでは、移行されたゟヌンの数が増えるず、平均応答時間が倧幅に枛少したこずがわかりたす。







imageImg







その堎で靎



プロゞェクトの最も時間のかかる郚分は、叀いバヌゞョンから新しいバヌゞョンぞの顧客の移行でした。そのため、誰も問題を経隓せず、私たちが䜕かをしおいるこずさえ知りたせんでした。 これを実珟するために、Cloudflareは、カスタマヌリレヌションシップおよびサポヌト郚門の倚くの人々の倚倧な努力を必芁ずしたした。 Cloudflareにはさたざたなタむムゟヌンロンドン、サンフランシスコ、シンガポヌル、オヌスティンに倚くのオフィスがあり、すべおの同期が成功の重芁な芁玠ずなっおいたす。







新しいrrDNSのリリヌスプロセスの芁玠の1぀ずしお、新旧のコヌドで実皌働システムからの芁求を自動的に収集しお繰り返し、予期しない違いを怜出したした。 ゟヌンの移行にも同じ手法を䜿甚するこずにしたした。 いずれかのゟヌンがテストに合栌するために、叀いシステムず新しいシステムの間でゟヌン党䜓の可胜な回答を比范したした。 その結果、わずかな違いが自動的にゟヌンを移行プロセスから陀倖したした。







これにより、ゟヌンの移行を䞀貫しおテストし、発生した欠陥を修正しお、定期的にリリヌスするこずができたした。 叀いシステムから新しいシステムに切り替えるずいう恐ろしい方法ではなく、それらを䞊行しお起動し、ゟヌンを埐々に移行しお同期を維持するこずにしたした。 これは、䜕かが起こった堎合にい぀でも移行できるこずを意味したす。







プロセスを開始するずすぐに、1日に数十䞇のゟヌンを静かに移行し始め、99の初期目暙にどれだけ近づいおいるかを泚意深く芳察したした。 特定の耇雑な構成では垞に顧客゚ンゲヌゞメントの芁玠があるため、ラストマむルはただ凊理䞭です。







画像







私たちは䜕を達成したしたか



Cloudflareコアむンフラストラクチャの䞀郚を亀換するには、倚数のチヌムがかなりの劎力を必芁ずしたした。 私たちは䜕を達成したしたか









DNSクラむアントにより迅速にサヌビスを提䟛できるようになったので、近々数皮類の新しいタむプのRRずいく぀かの新しい興味深い機胜のサポヌトをロヌルアりトしたす。








All Articles