トップ ファカポフ シアン

トップ ファカポフ シアン

すべおの人に良い 

私の名前はニキヌタです。Cian ゚ンゞニアリング チヌムのチヌム リヌダヌです。 䌚瀟での私の責任の XNUMX ぀は、本番環境のむンフラストラクチャに関連するむンシデントの数をれロに枛らすこずです。
以䞋で説明する内容は私たちに倚倧な苊痛をもたらしたした。この蚘事の目的は、他の人が私たちの間違いを繰り返さないようにするか、少なくずもその圱響を最小限に抑えるこずです。 

プリアンブル

昔、Cian がモノリスで構成されおおり、ただマむクロサヌビスの気配がなかった頃、私たちは 3  5 ペヌゞをチェックするこずでリ゜ヌスの可甚性を枬定しおいたした。 

圌らは答えたす - すべお問題ありたせんが、長時間答えない堎合は - 譊告したす。 事件ずみなされるためにどれくらいの期間仕事を䌑たなければならないかは、䌚議で人々が決定した。 ゚ンゞニアのチヌムが垞に事件の調査に関䞎しおいたした。 調査が完了するず、圌らは事埌分析、぀たり䜕が起こったか、調査がどれくらい続いたか、珟時点で䜕をしたか、将来䜕をするかずいう圢匏のレポヌトを電子メヌルで曞きたした。 

サむトのメむンペヌゞ、たたはサむトが最䞋䜍に達したこずをどのように理解しおいるか

 
゚ラヌの優先床を䜕らかの方法で理解するために、ビゞネス機胜にずっお最も重芁なサむト ペヌゞを特定したした。 これらを䜿甚しお、成功/倱敗したリク゚ストずタむムアりトの数をカりントしたす。 これが皌働時間を枬定する方法です。 

サむトには、怜玢ず広告の送信ずいう䞻芁なサヌビスを担圓する非垞に重芁なセクションが倚数あるこずがわかったずしたす。 倱敗したリク゚ストの数が 1% を超える堎合、これは重倧なむンシデントです。 ゎヌルデンタむムの 15 分以内に゚ラヌ率が 0,1% を超えた堎合も、これは重倧むンシデントずみなされたす。 これらの基準はほずんどのむンシデントをカバヌしたすが、残りはこの蚘事の範囲倖です。

トップ ファカポフ シアン

トップベストむンシデント Cian

したがっお、私たちは事件が起こったずいう事実を刀断するこずを間違いなく孊びたした。 

珟圚、あらゆる出来事が詳现に説明され、Jira ゚ピックに反映されおいたす。 ちなみに、このために私たちは FAIL ずいう別のプロゞェクトを開始したした。そのプロゞェクトでぱピックのみを䜜成できたす。 

過去数幎間のすべおの倱敗を収集するず、リヌダヌは次のずおりです。 

  • mssql 関連のむンシデント。
  • 倖郚芁因によっお匕き起こされるむンシデント。
  • 管理者の゚ラヌ。

管理者の間違いやその他の興味深い倱敗をさらに詳しく芋おみたしょう。

XNUMX 䜍 – 「DNS 内を敎理する」

嵐の火曜日でした。 DNS クラスタヌ内の順序を埩元するこずにしたした。 

内郚DNSサヌバヌをバむンドからpowerdnsに転送し、DNS以倖に䜕もない完党に別のサヌバヌを割り圓おたいず考えおいたした。 

DC の各堎所に XNUMX 台の DNS サヌバヌを配眮し、ゟヌンをバむンドから powerdns に移動し、むンフラストラクチャを新しいサヌバヌに切り替える時期が来たした。 

移動の最䞭、すべおのサヌバヌ䞊のロヌカル キャッシュ バむンドで指定されたすべおのサヌバヌのうち、サンクトペテルブルクのデヌタ センタヌにある XNUMX 台だけが残りたした。 この DC は圓初、私たちにずっお重芁ではないず宣蚀されおいたしたが、突然単䞀障害点になっおしたいたした。
モスクワずサンクトペテルブルクの間の運河が厩萜したのはこの移転期間䞭にあった。 実際、DNS が䜿甚できない状態で XNUMX 分間攟眮されたしたが、ホスティング業者が問題を解決したずきに埩旧したした。 

結論

以前は仕事の準備䞭に倖郚芁因を無芖しおいたしたが、今ではそれらも準備䞭のリストに含たれおいたす。 そしお珟圚、すべおのコンポヌネントが n-2 で予玄されおいるこずを確認するよう努めおおり、䜜業䞭にこのレベルを n-1 に䞋げるこずができたす。

  • アクションプランを䜜成するずきは、サヌビスが倱敗する可胜性があるポむントをマヌクし、すべおが「悪化から悪化」するシナリオを事前に怜蚎しおください。
  • 内郚 DNS サヌバヌをさたざたな地理的䜍眮/デヌタセンタヌ/ラック/スむッチ/入力に分散したす。
  • 各サヌバヌにロヌカル キャッシュ DNS サヌバヌをむンストヌルしたす。このサヌバヌは芁求をメむン DNS サヌバヌにリダむレクトしたす。サヌバヌが䜿甚できない堎合は、キャッシュから応答したす。 

XNUMX䜍 – 「Nginxで物事を敎理する」

ある晎れた日、私たちのチヌムは「これにはもう飜きた」ず刀断し、nginx 構成をリファクタリングするプロセスが始たりたした。 䞻な目暙は、構成を盎感的な構造にするこずです。 以前は、すべおが「歎史的に確立」されおおり、䜕の論理もありたせんでした。 これで、各server_nameが同じ名前のファむルに移動され、すべおの構成がフォルダヌに分散されたした。 ちなみに、この蚭定には 253949 行たたは 7836520 文字が含たれおおり、玄 7 MB を占めたす。 最䞊䜍の構造: 

Nginxの構造

├── access
│   ├── allow.list
...
│   └── whitelist.conf
├── geobase
│   ├── exclude.conf
...
│   └── geo_ip_to_region_id.conf
├── geodb
│   ├── GeoIP.dat
│   ├── GeoIP2-Country.mmdb
│   └── GeoLiteCity.dat
├── inc
│   ├── error.inc
...
│   └── proxy.inc
├── lists.d
│   ├── bot.conf
...
│   ├── dynamic
│   └── geo.conf
├── lua
│   ├── cookie.lua
│   ├── log
│   │   └── log.lua
│   ├── logics
│   │   ├── include.lua
│   │   ├── ...
│   │   └── utils.lua
│   └── prom
│       ├── stats.lua
│       └── stats_prometheus.lua
├── map.d
│   ├── access.conf
│   ├── .. 
│   └── zones.conf
├── nginx.conf
├── robots.txt
├── server.d
│   ├── cian.ru
│   │   ├── cian.ru.conf
│   │   ├── ...
│   │   └── my.cian.ru.conf
├── service.d
│   ├── ...
│   └── status.conf
└── upstream.d
    â”œâ”€â”€ cian-mcs.conf
    â”œâ”€â”€ ...
    â””── wafserver.conf

かなり改善されたしたが、構成の名前を倉曎しお配垃する過皋で、䞀郚の構成の拡匵子が間違っおおり、 include *.conf ディレクティブに含たれおいたせんでした。 その結果、䞀郚のホストが利甚できなくなり、メむン ペヌゞに 301 が返されたした。 応答コヌドが 5xx/4xx ではなかったため、これはすぐには気づかれず、朝になっお初めお気づきたした。 その埌、むンフラストラクチャ コンポヌネントをチェックするテストの䜜成を開始したした。

結論 

  • (nginx に限らず) 構成を正しく構造化し、プロゞェクトの初期段階でその構造に぀いおよく考えおください。 こうするこずでチヌムにずっお理解しやすくなり、結果的に TTM が削枛されたす。
  • 䞀郚のむンフラストラクチャ コンポヌネントのテストを䜜成したす。 たずえば、すべおのキヌのserver_nameが正しいステヌタスず応答本文を提䟛しおいるこずを確認したす。 コンポヌネントの基本機胜をチェックするスクリプトをいく぀か手元に甚意しおおけば、午前 3 時に他に䜕をチェックする必芁があるかを必死になっお思い出す必芁がなくなりたす。 

XNUMX䜍 - 「カサンドラのスペヌスが突然なくなった」

デヌタは着実に増加し、圧瞮が機胜しなかったため、Cassandra クラスタヌで倧芏暡なケヌススペヌスの修埩が倱敗し始める瞬間たではすべおが順調でした。 

ある嵐の日、塊はほずんどカボチャに倉わりたした。

  • クラスタヌには合蚈スペヌスの玄 20% が残っおいたした。
  • パヌティション䞊のスペヌス䞍足によりノヌドの远加埌にクリヌンアップが実行されないため、ノヌドを完党に远加するこずはできたせん。
  • 圧瞮が機胜しないため、生産性は埐々に䜎䞋したす。 
  • クラスタヌは緊急モヌドになっおいたす。

トップ ファカポフ シアン

終了 - クリヌンアップせずにさらに 5 ぀のノヌドを远加したした。その埌、スペヌスがなくなった空のノヌドのように、それらをクラスタヌから䜓系的に削陀しお再入力し始めたした。 私たちが望んでいたよりもはるかに倚くの時間が費やされたした。 クラスタヌが郚分的たたは完党に利甚できなくなるリスクがありたした。 

結論

  • すべおの cassandra サヌバヌで、各パヌティション䞊のスペヌスの 60% を超えお占有しおはなりたせん。 
  • CPU の 50% 以䞋でロヌドする必芁がありたす。
  • キャパシティプランニングを忘れずに、コンポヌネントごずに、その詳现に基づいお怜蚎する必芁がありたす。
  • クラスタヌ内のノヌドが倚いほど良いです。 少量のデヌタを含むサヌバヌはすぐに過負荷になり、そのようなクラスタヌは埩掻しやすくなりたす。 

XNUMX䜍 - 「領事のキヌ/倀ストレヌゞからデヌタが消えた」

サヌビスの発芋には、倚くの人ず同様に consul を䜿甚したす。 ただし、モノリスの青ず緑のレむアりトにもその Key-Value を䜿甚したす。 アクティブおよび非アクティブなアップストリヌムに関する情報が保存され、展開䞭に堎所が倉わりたす。 この目的のために、KV ず察話する展開サヌビスが䜜成されたした。 ある時点で、KV のデヌタが消えおしたいたした。 メモリから埩元されたしたが、倚数の゚ラヌがありたした。 その結果、アップロヌド䞭にアップストリヌムの負荷が䞍均䞀に分散され、バック゚ンドの CPU に過負荷がかかるために倚くの 502 ゚ラヌが発生したした。 その結果、私たちは consul KV から postgres に移行し、そこからそれらを削陀するのはそれほど簡単ではなくなりたした。  

結論

  • 蚱可のないサヌビスには、サむトの運営に重芁なデヌタが含たれおいおはなりたせん。 たずえば、ES で暩限がない堎合は、必芁のないずころからのアクセスをネットワヌク レベルで拒吊し、必芁なものだけを残し、さらに action.destructive_requires_name: true を蚭定するずよいでしょう。
  • バックアップずリカバリのメカニズムを事前に緎習しおください。 たずえば、バックアップず埩元ができるスクリプトを事前にたずえば Python で䜜成したす。

XNUMX䜍「キャプテン・アンオブビアス」 

ある時点で、バック゚ンドに 10 台以䞊のサヌバヌがある堎合、nginx アップストリヌムの負荷が䞍均䞀に分散しおいるこずに気づきたした。 ラりンドロビンではリク゚ストが最初から最埌のアップストリヌムに順番に送信され、nginx のリロヌドが行われるたびに最初からやり盎しになるため、最初のアップストリヌムは垞に残りのアップストリヌムよりも倚くのリク゚ストを受信し、その結果、動䜜が遅くなり、サむト党䜓に圱響が生じたした。 これは、トラフィック量が増加するに぀れおたすたす顕著になりたした。 単玔に nginx を曎新しおランダムを有効にするだけでは機胜したせんでした。バヌゞョン 1 (珟時点では) で成功しなかった倧量の lua コヌドをやり盎す必芁がありたす。 nginx 1.15 にパッチを適甚しお、ランダムなサポヌトを導入する必芁がありたした。 これで問題は解決したした。 このバグは「Captain Non-Ovviousness」カテゎリを獲埗したした。

結論

このバグを調査するのは非垞に興味深く、刺激的でした)。 

  • このような倉動をすぐに発芋できるようにモニタリングを敎理したす。 たずえば、ELK を䜿甚しお、各アップストリヌムの各バック゚ンドの RPS を監芖し、nginx の芳点から応答時間を監芖できたす。 この堎合、これは問題を特定するのに圹立ちたした。 

結果ずしお、やっおいるこずに察するより綿密なアプロヌチがあれば、ほずんどの倱敗は回避できたはずです。 私たちはマヌフィヌの法則を垞に芚えおおく必芁がありたす。 ã†ãŸãã„かない可胜性のあるものはすべおうたくいかないし、 そしおそれに基づいおコンポヌネントを構築したす。 

出所 habr.com

コメントを远加したす