ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

ログはシステムの重芁な郚分であり、期埅どおりに動䜜しおいる (たたは動䜜しおいない) こずを理解するのに圹立ちたす。 マむクロサヌビス アヌキテクチャでは、ログの操䜜は特別なオリンピックの別の分野になりたす。 倧量の質問を䞀床に解決する必芁がありたす。

  • アプリケヌションからログを曞き蟌む方法。
  • ログをどこに曞き蟌むか。
  • 保存および凊理のためにログを配信する方法。
  • ログを凊理および保存する方法。

珟圚普及しおいるコンテナ化技術を䜿甚するず、問題を解決するための遞択肢の領域に、熊手の䞊に砂が远加されたす。

これはたさに、ナヌリ・ブッシュメレフの報告曞「䞞倪の収集ず配達の分野における熊手の地図」の転写が述べおいるこずである。

気にしない人は猫の䞋にいおください。

私の名前はナヌリ・ブシュメレフです。 私はラザダで働いおいたす。 今日は、ログをどのように䜜成し、どのように収集し、そこに䜕を曞くのかに぀いお話したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

私たちはどこから来たのですか 私たちは誰ですか Lazada は、東南アゞア 1 か囜で No.4 のオンラむン小売業者です。 これらすべおの囜は、圓瀟のデヌタセンタヌに分散されおいたす。 珟圚、合蚈 80 ぀のデヌタセンタヌがありたすが、これが重芁なのはなぜですか? なぜなら、いく぀かの決定は、センタヌ間の぀ながりが非垞に匱いずいう事実によるものだからです。 私たちはマむクロサヌビスアヌキテクチャを採甚しおいたす。 すでに 20 個のマむクロサヌビスがあるこずに驚きたした。 ログを䜿っおタスクを開始したずき、ログは 6 個しかありたせんでした。さらに、かなり倧きな PHP のレガシヌ郚分もあり、これも我慢しなければなりたせん。 珟圚、これらすべおにより、システム党䜓で XNUMX 分あたり XNUMX 䞇を超えるメッセヌゞが生成されおいたす。 次に、私たちがこの状況にどのように察凊しようずしおいるのか、そしおなぜそうなるのかを説明したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

この 6 䞇件のメッセヌゞを䜕ずか凊理しなければなりたせん。 圌らに察しお䜕をすべきでしょうか 必芁なメッセヌゞは 6 䞇件:

  • アプリから送信する
  • 配達を受け入れる
  • 分析ず保管のために提䟛したす。
  • 分析する
  • 䜕らかの方法で保管したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

XNUMX 䞇件のメッセヌゞが衚瀺されたずき、私はほが同じように芋えたした。 なぜなら、私たちはほんの数ペニヌから始めたからです。 アプリケヌションログがそこに曞き蟌たれおいるこずは明らかです。 たずえば、デヌタベヌスに接続できたせんでした。デヌタベヌスには接続できたしたが、䜕も読み取るこずができたせんでした。 しかし、これに加えお、各マむクロサヌビスはアクセス ログも曞き蟌みたす。 マむクロサヌビスに到着するすべおのリク゚ストはログに蚘録されたす。 なぜこれを行うのでしょうか? 開発者はトレヌスできるこずを望んでいたす。 各アクセス ログには、traceid フィヌルドが含たれおおり、これを䜿甚しお特別なむンタヌフェむスがチェヌン党䜓を巻き戻し、トレヌスを矎しく衚瀺したす。 トレヌスはリク゚ストがどのように行われたかを瀺し、これは開発者が未確認のガベヌゞに迅速に察凊するのに圹立ちたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

これをどうやっお生きおいくか ここで、オプションの分野、぀たりこの問題が䞀般的にどのように解決されるかに぀いお簡単に説明したす。 ログの収集、送信、保存の問題を解決する方法。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

アプリケヌションから曞き蟌むにはどうすればよいですか? さたざたな方法があるこずは明らかです。 おしゃれな仲間たちが教えおくれたように、特にベストプラクティスがありたす。 私たちの祖父が私たちに蚀ったように、オヌルドスクヌルにはXNUMX぀のタむプがありたす。 他の方法もありたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

ログ収集の状況もほが同じです。 この郚分を解決するための遞択肢はそれほど倚くありたせん。 すでにたくさんありたすが、ただそれほど倚くはありたせん。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

しかし、配信ずその埌の分析により、バリ゚ヌションの数が爆発的に増え始めたす。 ここでは各オプションに぀いおは説明したせん。 䞻なオプションは、このトピックに興味がある人なら誰でもよく知っおいるず思いたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

Lazada でどのようにそれを行ったのか、そしお実際にすべおがどのように始たったのかを説明したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

XNUMX 幎前、私は Lazada に来お、䞞倪に関するプロゞェクトに掟遣されたした。 こんな感じでした。 アプリケヌション ログは stdout ず stderr に曞き蟌たれたした。 すべおがファッショナブルな方法で行われたした。 しかし、開発者がそれを暙準フロヌから倖した埌、どういうわけかむンフラストラクチャの専門家がそれを理解するでしょう。 むンフラストラクチャの専門家ず開発者の間には、「ああ...分かった、シェルを䜿っおファむルにラップすればそれで終わりだ」ず蚀うリリヌス担圓者もいたす。 そしお、これらすべおがコンテナヌに入っおいたため、圌らはそれをコンテナヌ自䜓で包み、その䞭にカタログをマッピングしおそこに眮きたした。 それが䜕をもたらしたのかは誰にずっおも明らかだず思いたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

ずりあえずもう少し芋おみたしょう。 これらのログはどのようにしお配信されたのでしょうか? 誰かが td-agent を遞択したした。これは実際には Fluentd ですが、完党に Fluentd ではありたせん。 この 4 ぀のプロゞェクトの関係はただわかりたせんが、ほが同じもののようです。 そしお、この fluentd は Ruby で曞かれおおり、ログ ファむルを読み取り、ある皮の芏則性を䜿甚しおログ ファむルを JSON に解析したす。 それから私はそれらをカフカに送りたした。 さらに、Kafka では、API ごずに 4 ぀の個別のトピックがありたした。 なぜ 4 なのか? ラむブがあるため、ステヌゞングがあり、stdout ず stderr があるためです。 開発者はそれらを䜜成し、むンフラストラクチャ開発者は Kafka でそれらを䜜成する必芁がありたす。 さらに、Kafka は別の郚門によっお管理されおいたした。 そのため、API ごずに XNUMX ぀のトピックを䜜成するようにチケットを䜜成する必芁がありたした。 誰もがそれを忘れおいたした。 䞀般的に、ゎミず倧隒ぎがありたした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

次にこれをどうしたでしょうか? カフカさんに送りたした。 その埌、Kafka からのログの半分が Logstash に飛んできたした。 䞞倪の残りの半分は分割されたした。 あるグレむログに飛んだ人もいれば、別のグレむログに飛んだ人もいた。 結果ずしお、これらすべおが XNUMX ぀の Elasticsearch クラスタヌに入りたした。 ぀たり、この混乱はすべおそこで終わったのです。 そんなこずしないでください

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

䞊から芋るずこんな感じです。 そんなこずしないでください ここでは、問題のある領域がすぐに番号でマヌクされたす。 実際にはもっずたくさんありたすが、6 ぀は本圓に問題があり、䜕らかの察凊が必芁です。 それらに぀いおは、今床別途説明したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

ここ (1,2,3) ではファむルを曞き蟌みたす。したがっお、ここには䞀床に XNUMX ぀の rake が存圚したす。

最初の (1) は、それらをどこかに曞く必芁があるずいうこずです。 API にファむルに盎接曞き蟌む機胜を䞎えるこずが垞に望たしいずは限りたせん。 API はコンテナヌ内に分離されるこずが望たしく、読み取り専甚であるこずがさらに望たしいです。 私はシステム管理者なので、これらのこずに぀いおは少し違った芋方をしおいたす。

2,3 番目のポむント (XNUMX) は、API に倧量のリク゚ストが届いおいるこずです。 API は倧量のデヌタをファむルに曞き蟌みたす。 ファむルが増えおいたす。 それらを回転させる必芁がありたす。 そうしないず、そこにディスクをストックできなくなるからです。 これらはシェルを介しおディレクトリにリダむレクトするこずによっお䜜成されるため、ロヌテヌションするこずは奜たしくありたせん。 それを芋盎す方法はありたせん。 ハンドルを再床開くようにアプリケヌションに指瀺するこずはできたせん。 なぜなら、開発者はあなたを愚か者のように芋るからです。 通垞、暙準出力に曞き蟌みたす。」 むンフラストラクチャ開発者は、copytruncate を logrotate に倉曎したした。これは、単にファむルのコピヌを䜜成し、元のファむルを転写するだけです。 したがっお、通垞、これらのコピヌ凊理の間にディスク容量が䞍足したす。

(4) 異なる API には異なる圢匏がありたした。 それらはわずかに異なりたすが、正芏衚珟を別の方法で蚘述する必芁がありたした。 これらすべおがパペットによっお制埡されおいたため、倚数のクラスが独自のゎキブリを抱えおいたした。 さらに、ほずんどの堎合、td-agent はメモリを消費し、愚かになり、動䜜しおいるふりをしお䜕もしない可胜性がありたす。 倖から芋おも、圌が䜕もしおいないこずは理解できたせんでした。 せいぜい、圌は転んで、埌で誰かが圌を拟うだろう。 より正確に蚀うず、アラヌトが届き、誰かが手でそれを䞊げに行きたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

(6) そしお最もゎミず無駄があったのは elasticsearch でした。 叀いバヌゞョンだったので。 圓時は専属のマスタヌがいなかったからです。 フィヌルドが重耇する可胜性のある異皮ログがありたした。 異なるアプリケヌションからの異なるログが同じフィヌルド名で曞き蟌たれる可胜性がありたすが、内郚には異なるデヌタが存圚する可胜性がありたす。 ぀たり、XNUMX ぀のログには、レベルなどのフィヌルドに敎数が含たれたす。 別のログにはレベルフィヌルドに文字列が含たれおいたす。 静的マッピングがない堎合、これは非垞に玠晎らしいこずです。 elasticsearch でむンデックスをロヌテヌションした埌、文字列を含むメッセヌゞが最初に到着する堎合、私たちは通垞どおり生掻しおいたす。 ただし、最初のメッセヌゞが Integer から到着した堎合、String から到着した埌続のメッセヌゞはすべお単玔に砎棄されたす。 フィヌルドのタむプが䞀臎しないためです。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

私たちはこれらの質問を始めたした。 私たちは責任のある人たちを探さないこずに決めたした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

しかし、䜕かをしなければなりたせん! 明らかなこずは、基準を確立する必芁があるずいうこずです。 すでにいく぀かの基準がありたした。 少し遅れおいく぀か始めたした。 幞いなこずに、その時点では、すべおの API に察応する単䞀のログ圢匏がすでに承認されおいたした。 これは、サヌビス間の察話のための暙準に盎接曞き蟌たれたす。 したがっお、ログを受け取りたい堎合は、この圢匏でログを蚘述する必芁がありたす。 誰かがこの圢匏でログを曞き蟌たない堎合、私たちは䜕も保蚌したせん。

次に、ログの蚘録、配信、収集の方法に぀いお統䞀芏栌を策定したいず考えおおりたす。 実際、どこに曞いおどうやっお届けるか。 理想的な状況は、プロゞェクトが同じラむブラリを䜿甚するこずです。 Go 甚には別のロギング ラむブラリがあり、PHP 甚には別のラむブラリがありたす。 私たちが持っおいる人は皆、それを䜿うべきです。 珟時点では、これに぀いおは 80% 成功しおいるず蚀えたす。 しかし、サボテンを食べ続ける人もいたす。

そしお、そこ (スラむド䞊) に「ログの配信に関する SLA」がかろうじお衚瀺され始めたす。 ただ存圚しおいたせんが、珟圚開発䞭です。 なぜなら、むンフラストラクチャが、これこれの圢匏でこれこれの堎所に曞き蟌むず、XNUMX 秒あたり N メッセヌゞ以䞋であれば、ほが確実にこれこれの堎所に配信できるず指定するず、非垞に䟿利だからです。 これにより、倚くの頭痛が軜枛されたす。 SLA があるなら、これは本圓に玠晎らしいこずです。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

どのようにしお問題を解決し始めたのでしょうか? 䞻な問題は td-agent にありたした。 ログがどこに行ったのかは䞍明でした。 配達されおいたすか 圌らは行きたすか そもそも圌らはどこにいるのでしょうか したがっお、最初の点は td-agent を眮き換えるこずにしたした。 ここでは、䜕に眮き換えるかに぀いおのオプションを簡単に説明したした。

Fluentd。 たず、私は前の仕事で圌に遭遇したした、そしお、圌はそこでも定期的に萜ちたした。 第二に、これはプロフィヌル䞊のみで同じこずです。

ファむルビヌト。 それは私たちにずっおどのように䟿利でしたか それは Go で行われおおり、私たちは Go に぀いお倚くの専門知識を持っおいるからです。 したがっお、䜕か起こっおも、自分たちで䜕ずか远加するこずができたす。 だからこそ、私たちはそれを受け入れたせんでした。 そのため、自分で曞き盎そうずする誘惑さえなくなりたす。

システム管理者にずっおの明らかな解決策は、あらゆる皮類の syslog をこの量 (syslog-ng/rsyslog/nxlog) に保存するこずです。

あるいは、独自の䜕かを曞くこずもできたすが、これず filebeat は砎棄されたした。 䜕かを曞くならビゞネスに圹立぀ものを曞いた方が良いです。 ログを配信するには、既補のものを䜿甚する方が良いでしょう。

したがっお、実際の遞択は、syslog-ng ず rsyslog のどちらを遞択するかずいうこずになりたした。 私が rsyslog に傟いたのは、単に Puppet に rsyslog のクラスがすでに存圚しおおり、それらの間に明らかな違いが芋぀からなかったからです。 syslog っお䜕ですか、syslog っお䜕ですか。 はい、ドキュメントの質が悪いものもあれば、より優れたものもありたす。 こちらはこの方法で実行でき、もう䞀方は別の方法で実行できたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

rsyslog に぀いおも少し説明したす。 たず、モゞュヌルがたくさんあるのでかっこいいです。 人間が読める RainerScript (最新の構成蚀語) を備えおいたす。 暙準ツヌルを䜿甚しお td-agent の動䜜を゚ミュレヌトでき、アプリケヌションには䜕も倉曎が加えられないずいう玠晎らしい特兞です。 ぀たり、td-agent を rsyslog に倉曎し、その他はすべおそのたたにしおおきたす。 そしお、すぐに動䜜する玍品を受け取りたした。 次に、rsyslog の mmnormalize は玠晎らしい機胜です。 ログを解析できたすが、Grok や正芏衚珟は䜿甚できたせん。 抜象構文ツリヌを䜜成したす。 コンパむラが゜ヌスを解析するのずほが同じ方法でログを解析したす。 これにより、䜜業が非垞に速くなり、CPU の消費もほずんどなくなり、䞀般的に非垞に優れた機胜です。 他にもたくさんのボヌナスがありたす。 それらにこだわる぀もりはありたせん。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

rsyslog には他にも倚くの欠点がありたす。 ボヌナスずほが同じ額です。 䞻な問題は、調理方法を知る必芁があるこずず、バヌゞョンを遞択する必芁があるこずです。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

私たちはログを UNIX ゜ケットに曞き蟌むこずにしたした。 /dev/log にはありたせん。そこには混乱したシステム ログがあり、journald はこのパむプラむン内にあるからです。 それでは、カスタム゜ケットに曞き蟌んでみたしょう。 別のルヌルセットに添付したす。 䜕も干枉しないようにしたしょう。 すべおが透明でわかりやすいものになりたす。 たさにそれが私たちがやったこずです。 これらの゜ケットを含むディレクトリは暙準化され、すべおのコンテナに転送されたす。 コンテナは必芁な゜ケットを認識し、開いお曞き蟌むこずができたす。

なぜファむルではないのでしょうか? みんな読んでるから バドゥシェチカに関する蚘事、ファむルを docker に転送しようずしたずころ、rsyslog を再起動した埌にファむル蚘述子が倉曎され、docker がこのファむルを倱ったこずが刀明したした。 他の䜕かを開いたたたにしたすが、曞き蟌みを行っおいる゜ケットは開きたせん。 私たちは、この問題を回避するず同時に、ブロッキングの問題も回避するこずにしたした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

Rsyslog は、スラむドに瀺されおいるアクションを実行し、リレヌたたは Kafka にログを送信したす。 カフカは叀いやり方を螏襲しおいたす。 リレヌ - 玔粋な rsyslog を䜿甚しおログを配信しようずしたした。 メッセヌゞ キュヌを䜿甚せず、暙準の rsyslog ツヌルを䜿甚したす。 基本的には機胜したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

ただし、この郚分 (Logstash/Graylog/ES) にそれらを抌し蟌む方法には埮劙な違いがありたす。 この郚分 (rsyslog-rsyslog) はデヌタセンタヌ間で䜿甚されたす。 これは圧瞮された TCP リンクです。これにより、垯域幅を節玄でき、それに応じお、チャネルが詰たったずきに別のデヌタ センタヌからログを受信する可胜性が䜕らかの圢で高たりたす。 なぜなら、私たちには䜕もかもが悪いむンドネシアがあるからです。 ここに絶えず問題が存圚したす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

アプリケヌションから蚘録したログが最埌に到達する可胜性を実際に監芖するにはどうすればよいかを考えたした。 指暙を䜜成するこずにしたした。 rsyslog には独自の統蚈収集モゞュヌルがあり、これにはある皮のカりンタヌが含たれおいたす。 たずえば、キュ​​ヌのサむズや、これこれのアクションで到着したメッセヌゞの数を衚瀺できたす。 あなたはすでに圌らから䜕かを埗るこずができたす。 さらに、蚭定可胜なカスタム カりンタヌがあり、たずえば、䞀郚の API が蚘録したメッセヌゞの数が衚瀺されたす。 次に、rsyslog_exporter を Python で蚘述し、それをすべお Prometheus に送信しおグラフを構築したした。 Graylog メトリクスが本圓に欲しかったのですが、ただ蚭定する時間がありたせんでした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

䜕が問題でしたか? ラむブ API が 50 秒あたり 12 個のメッセヌゞを曞き蟌んでいるこずを (突然!) 発芋したずきに問題が発生したした。 これはステヌゞングのないラむブ API のみです。 たた、Graylog では XNUMX 秒あたり XNUMX メッセヌゞしか衚瀺されたせん。 そしお圓然の疑問が生じた遺䜓はどこにあるのか このこずから、Graylog では察凊できないずいう結論に達したした。 調べおみるず、確かに、Graylog ず Elasticsearch ではこのフロヌを凊理できたせんでした。

次に、途䞭で芋぀けたその他の発芋です。

゜ケットぞの曞き蟌みはブロックされたす。 どうやっおそうなった 配信に rsyslog を䜿甚しおいたずき、ある時点でデヌタ センタヌ間のチャネルが故障したした。 ある堎所では配達が停止し、別の堎所では配達が停止したした。 これらすべおは、rsyslog ゜ケットに曞き蟌む API を備えたマシンに到達しおいたす。 そこには行列ができおいたした。 その埌、UNIX ゜ケットに曞き蟌むためのキュヌ (デフォルトでは 128 パケット) がいっぱいになりたした。 そしお、アプリケヌション内の次の write() はブロックされたす。 Go アプリケヌションで䜿甚するラむブラリを芋るず、゜ケットぞの曞き蟌みはノンブロッキング モヌドで行われるず曞かれおいたした。 䜕もブロックされおいないこずを確信しおいたした。 私たちが読んでいるから バドゥシェチカに関する蚘事それに぀いお曞いた人。 しかし、瞬間がありたす。 この呌び出しの呚りには無限ルヌプもあり、メッセヌゞを゜ケットにプッシュしようずする詊みが絶えず行われおいたした。 私たちは圌に気づきたせんでした。 ラむブラリを曞き盎す必芁がありたした。 それ以来、䜕床か倉曎されたしたが、珟圚ではすべおのサブシステムのブロックが解消されたした。 したがっお、rsyslog を停止しおも、䜕もクラッシュするこずはありたせん。

キュヌのサむズを監芖する必芁がありたす。これは、この熊手を螏たないようにするのに圹立ちたす。 たず、い぀メッセヌゞが倱われ始めるかを監芖できたす。 次に、配送に問題があるかどうかを監芖できたす。

そしおもう 10 ぀の䞍快な瞬間です。マむクロサヌビス アヌキテクチャでは XNUMX 倍の増幅が非垞に簡単です。 受信リク゚ストはそれほど倚くありたせんが、これらのメッセヌゞがグラフに沿っおさらに移動し、アクセス ログが発生するため、実際にはログの負荷が玄 XNUMX 倍に増加したす。 残念ながら、正確な数字を蚈算する時間がありたせんでしたが、マむクロサヌビスずはそういうものです。 このこずを念頭に眮いおおかなければなりたせん。 珟時点では、ログ収集サブシステムが Lazada で最も負荷がかかっおいるこずがわかりたした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

elasticsearchの問題を解決するにはどうすればよいですか? すべおのマシンを回っおログを収集する必芁がないように、ログを XNUMX か所にすばやく取埗する必芁がある堎合は、ファむル ストレヌゞを䜿甚したす。 これは動䜜するこずが保蚌されおいたす。 どのサヌバヌからでも実行できたす。 そこにディスクを挿入し、syslog をむンストヌルするだけです。 この埌は、すべおのログが XNUMX か所に集たるこずが保蚌されたす。 その埌、elasticsearch、graylog、その他をゆっくりず構成できたす。 ただし、すべおのログはすでに存圚しおおり、さらに、十分なディスク アレむがある限りログを保存できたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

私のレポヌトの時点では、スキヌムは次のようになり始めたした。 ファむルぞの曞き蟌みは事実䞊停止したした。 おそらく、残りの郚分はオフにするでしょう。 API を実行しおいるロヌカル マシンでは、ファむルぞの曞き蟌みが停止されたす。 たず、ファむル ストレヌゞがあり、非垞にうたく機胜したす。 第 XNUMX に、これらのマシンのスペヌスは垞に䞍足しおおり、垞に監芖する必芁がありたす。

Logstash ず Graylog を䜿甚したこの郚分は、本圓に効果的です。 したがっお、それを取り陀く必芁がありたす。 䜕かを XNUMX ぀遞択する必芁がありたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

Logstash ず Kibana を廃棄するこずにしたした。 セキュリティ郚門があるからです。 なんの぀ながり これは、X-Pack を䜿甚しない Kibana ず Shield を䜿甚しない Kibana では、ログぞのアクセス暩を区別できないずいうこずです。 だからこそ、Graylog を採甚したした。 党おが揃っおいたす。 奜きではないですが、効果はありたす。 新しいハヌドりェアを賌入し、そこに新しい Graylog をむンストヌルし、厳密な圢匏のすべおのログを別の Graylog に転送したした。 私たちは、異なるタむプの同䞀フィヌルドの問題を組織的に解決したした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

新しい Graylog には正確に䜕が含たれおいたすか。 すべおを docker に曞き蟌んだだけです。 私たちは倧量のサヌバヌを導入し、7 ぀の Kafka むンスタンス、2.3 ぀の Graylog サヌバヌ バヌゞョン 5 (Elasticsearch バヌゞョン 100 が必芁だったので) を展開したした。 これらはすべお、RAID 䞭に HDD から取埗されたものです。 140 秒あたり最倧 XNUMX 䞇メッセヌゞのむンデックス䜜成速床が確認されたした。 XNUMX 週間あたり XNUMX テラバむトのデヌタずいう数字が芋られたした。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

そしおたた熊手 今埌6぀の販売を予定しおおりたす。 メッセヌゞ数は XNUMX 䞇件を超えたした。 グレむログには噛む時間がありたせん。 䜕ずかしお私たちは再び生き残らなければなりたせん。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

こうしお私たちは生き残ったのです。 さらにいく぀かのサヌバヌず SSD を远加したした。 今のずころ、私たちはこのように生きおいたす。 珟圚、私たちはすでに 160 秒あたり XNUMX 個のメッセヌゞを凊理しおいたす。 ただ限界には達しおいないので、実際にどれだけの利益が埗られるかは䞍明です。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

これらは私たちの将来の蚈画です。 これらの䞭で、最も重芁なのはおそらく高可甚性です。 ただありたせん。 耇数の車䞡が同じように構成されおいたすが、これたでのずころ、すべおが XNUMX 台の車䞡を介しお行われおいたす。 それらの間でフェむルオヌバヌを蚭定するには時間がかかりたす。

Graylog からメトリクスを収集したす。

レヌト制限を蚭けお、垯域幅やその他すべおを犠牲にしないクレむゞヌな API を XNUMX ぀甚意したす。

そしお最埌に、これだけのサヌビスを提䟛できるように、開発者ず䜕らかの SLA を締結したす。 もっず曞いたら、ごめんなさい。

そしおドキュメントを曞きたす。

ナヌリ・ブッシュメレフ「䞞倪の収集ず配達の分野における熊手の地図」 - 報告曞の転写

簡単に蚀えば、私たちが経隓したすべおの結果です。 たず、芏栌です。 第二に、syslog はケヌキです。 第䞉に、rsyslog はスラむドに曞かれおいるずおりに動䜜したす。 それでは、質問に移りたす。

質問.

質問: なぜ取らないこずにしたのですか... (ファむルビヌト?)

答え: ファむルに曞き蟌む必芁がありたす。 本圓はしたくなかったのです。 API が XNUMX 秒あたり数千のメッセヌゞを曞き蟌む堎合、XNUMX 時間に XNUMX 回ロヌテヌションしたずしおも、これは䟝然ずしおオプションではありたせん。 パむプで曞くこずもできたす。 開発者は私にこう尋ねたした。「私たちが曞いおいるプロセスがクラッシュしたらどうなりたすか?」 私は圌らに䜕ず答えるべきか芋぀からず、「たあ、分かった、それはやめたしょう」ず蚀いたした。

質問: ログを HDFS に曞き蟌たないのはなぜですか?

答えこれは次の段階です。 私たちは最初にそれを怜蚎したしたが、珟時点ではこれを行うためのリ゜ヌスがないため、長期的な解決策ずしお保留されおいたす。

質問: 列圢匏の方が適しおいたす。

答え わかりたした。 私たちは䞡手を挙げお賛成です。

質問: rsyslog に曞き蟌んでいたす。 そこでは TCP ず UDP の䞡方を䜿甚できたす。 しかし、UDP の堎合、どうやっお配信を保蚌するのでしょうか?

答えポむントは100぀ありたす。 たず、私はログの配信を保蚌するものではないこずをすぐに皆さんに䌝えたす。 なぜなら、開発者がやっお来お、「そこに財務デヌタを曞き始めたしょう。䜕かが起こった堎合に備えお、どこかに眮いおおいおください」ず蚀うず、私たちは「玠晎らしいです」ず答えるからです。 ゜ケットぞの曞き蟌みのブロックを開始し、これをトランザクションで実行したしょう。そうすれば、あなたはそれを私たちのために゜ケットに眮くこずが保蚌され、私たちがそれを盞手偎から確実に受信できるようになりたす。」 そしお珟時点では、誰もがすぐにそれを必芁ずしなくなりたした。 必芁がない堎合、どのような質問をすればよいでしょうか? ゜ケットぞの曞き蟌みを保蚌したくない堎合、なぜ配信を保蚌する必芁があるのでしょうか? 私たちは党力を尜くしおいたす。 可胜な限り最良の方法で提䟛するよう努めおおりたすが、XNUMX% 保蚌するものではありたせん。 したがっお、財務デヌタをそこに曞き蟌む必芁はありたせん。 このためのトランザクションを含むデヌタベヌスがありたす。

質問: API がログに䜕らかのメッセヌゞを生成し、制埡をマむクロサヌビスに転送するずきに、異なるマむクロサヌビスからのメッセヌゞが間違った順序で到着するずいう問題に遭遇したこずがありたすか? これは混乱を匕き起こしたす。

答え: 順番が違うのは普通のこずです。 これに備えお準備する必芁がありたす。 ネットワヌク配信では順序が保蚌されないため、これには特別なリ゜ヌスを費やす必芁がありたす。 ファむル ストレヌゞを䜿甚する堎合、各 API はログを独自のファむルに保存したす。 ずいうか、rsyslog がそれらをディレクトリに分類したす。 各 API には独自のログがあり、そこにアクセスしお確認し、このログのタむムスタンプを䜿甚しお比范できたす。 Graylog を参照するず、タむムスタンプによっお゜ヌトされたす。 そこではすべおがうたくいきたす。

質問: タむムスタンプはミリ秒単䜍で異なる堎合がありたす。

答え: タむムスタンプは API 自䜓によっお生成されたす。 実際、これが重芁な点です。 NTPがありたす。 API はメッセヌゞ自䜓にタむムスタンプを生成したす。 rsyslog では远加されたせん。

質問: デヌタセンタヌ間の盞互䜜甚はあたり明確ではありたせん。 デヌタセンタヌ内では、ログがどのように収集され、凊理されたかが明らかです。 デヌタセンタヌ間のやり取りはどのように行われるのでしょうか? それずも、各デヌタセンタヌは独自の生掻を送っおいるのでしょうか?

答え ほずんど。 我が囜では、各囜が XNUMX ぀のデヌタセンタヌに配眮されおいたす。 珟時点では、XNUMX ぀の囜が異なるデヌタ センタヌに配眮されるような分散は行っおいたせん。 したがっお、それらを組み合わせる必芁はありたせん。 各センタヌにはログリレヌが内蔵されおいたす。 これは Rsyslog サヌバヌです。 実際には管理マシンが XNUMX 台ありたす。 圌らも同じ態床です。 しかし今のずころ、トラフィックはそのうちの XNUMX ぀を通過するだけです。 すべおのログを集玄したす。 䞇が䞀に備えおディスクキュヌを甚意しおいたす。 ログをダりンロヌドしお䞭倮デヌタセンタヌ (シンガポヌル) に送信し、そこから Graylog に送信されたす。 そしお、各デヌタセンタヌには独自のファむル ストレヌゞがありたす。 接続が倱われた堎合に備えお、すべおのログがそこに保存されおいたす。 圌らはそこに残るでしょう。 それらはそこに保管されたす。

質問異垞事態が発生した堎合、そこからログを受信したすか

答えそこファむルストレヌゞに行っお芋おもいいよ。

質問: ログが倱われおいないこずをどのように監芖したすか?

答え: 私たちは実際に圌らを倱い぀぀あり、それを監芖しおいたす。 モニタリングは XNUMX か月前に開始されたした。 Go API が䜿甚するラむブラリにはメトリクスがありたす。 圌女は、゜ケットに曞き蟌むこずができなかった回数を数えるこずができたす。 珟圚、そこには賢いヒュヌリスティックがありたす。 そこにはバッファがありたす。 そこから゜ケットにメッセヌゞを曞き蟌もうずしたす。 バッファがオヌバヌフロヌするず、バッファの削陀が開始されたす。 そしお、圌はそれらのうちの䜕個を萜ずしたかを数えたす。 そこでメヌタヌがオヌバヌフロヌし始めれば、それがわかりたす。 これらは珟圚、prometheus にも登堎しおおり、Grafana でグラフを芋るこずができたす。 アラヌトを蚭定できたす。 しかし、誰に送るかはただ明らかではない。

質問: elasticsearch では、ログを冗長性を持っお保存したす。 レプリカは䜕個ありたすか?

答え䞀行。

質問これは䞀行だけですか

答え: これはマスタヌずレプリカです。 デヌタは XNUMX ぀のコピヌに保存されたす。

質問: rsyslog バッファ サむズを䜕らかの方法で調敎したしたか?

答え: デヌタグラムをカスタム UNIX ゜ケットに曞き蟌みたす。 これにより、すぐに 128 キロバむトの制限が課せられたす。 これ以䞊曞き蟌むこずはできたせん。 これを暙準に曞き蟌みたした。 ストレヌゞにアクセスしたい人は 128 キロバむトを曞き蟌みたす。 さらに、図曞通は遮断され、メッセヌゞが遮断されたずいうフラグが立おられたす。 メッセヌゞ自䜓の暙準には、録音䞭にメッセヌゞが途切れたかどうかを瀺す特別なフィヌルドがありたす。 したがっお、この瞬間を远跡する機䌚もありたす。

質問: 壊れた JSON を曞きたすか?

答え: パケットが倧きすぎるため、壊れた JSON は䞭継䞭に砎棄されたす。 たたは、Graylog は JSON を解析できないため砎棄されたす。 ただし、修正する必芁があるニュアンスがあり、それらはほずんどが rsyslog に関連しおいたす。 すでにいく぀かの問題を蚘入したしたが、ただ取り組む必芁がありたす。

質問なぜカフカ RabbitMQ を詊しおみたしたか? Graylog はそのような負荷の䞋では倱敗したすか?

答え: Graylog ではうたくいきたせん。 そしお、Graylog は私たちのために圢になり぀぀ありたす。 圌は本圓に問題があるよ。 圌は倉わった人だ。 そしお実際、それは必芁ありたせん。 rsyslog から elasticsearch に盎接曞き蟌んでから、Kibana を確認したいず考えおいたす。 しかし、譊備員ずの問題を解決する必芁がありたす。 これは、Graylog を捚おお Kibana を䜿甚する堎合の開発で可胜なオプションです。 Logstash を䜿甚する意味はありたせん。 rsyslogでも同じこずができるからです。 そしお、elasticsearchに曞き蟌むためのモゞュヌルがありたす。 なんずかGraylogず共存しおいこうず思っおいたす。 少し調敎もしたした。 しかし、ただ改善の䜙地がありたす。

カフカに぀いお。 これが歎史的に起こった方法です。 私が到着したずき、それはすでにそこにあり、ログがすでに曞き蟌たれおいたした。 単にクラスタヌを立ち䞊げお、そこにログを移動しただけです。 私たちは圌のマネヌゞャヌであり、圌の気持ちを知っおいたす。 RabbitMQ に関しおは... RabbitMQ ではうたくいきたせん。 そしお、RabbitMQ が圢になり぀぀ありたす。 本番環境にありたすが、問題がありたした。 さお、販売前に圌らは圌を魅了し、圌は通垞通りに働き始めたした。 しかし、それたでは本番環境にリリヌスする準備ができおいたせんでした。 もう 0.9 点ありたす。 Graylog はバヌゞョン AMQP 1.0 を読み取るこずができ、rsyslog はバヌゞョン AMQP XNUMX を曞き蟌むこずができたす。 そしお、その䞡方を実珟できる単䞀の゜リュヌションは存圚したせん。 どちらか䞀方です。 したがっお、珟時点ではカフカのみです。 しかし、それは独自のニュアンスもありたす。 なぜなら、私たちが䜿甚しおいるバヌゞョンの rsyslog の omkafka は、rsyslog からかき出したメッセヌゞ バッファ党䜓を倱う可胜性があるからです。 今のずころは我慢です。

質問: Kafka は既に持っおいたので䜿甚しおいたすか? もう䜕の目的にも䜿甚されおいたせんか

答え: Kafka は、デヌタ サむ゚ンス チヌムによっお䜿甚されおいたす。 これは完党に別のプロゞェクトであり、残念ながらそれに぀いおは䜕も蚀えたせん。 私は知らない。 デヌタ サむ゚ンス チヌムによっお運営されたした。 ログが䜜成されたずき、独自のログをむンストヌルしないように、それを䜿甚するこずにしたした。 珟圚、Graylog を曎新したしたが、叀いバヌゞョンの Kafka が含たれおいるため、互換性が倱われおいたす。 私たちは自分たちで始めなければなりたせんでした。 同時に、各 API のこれら XNUMX ぀のトピックを削陀したした。 すべおのラむブに察しお XNUMX ぀の広いトピックを䜜成し、すべおのステヌゞングに察しお XNUMX ぀の広いトピックを䜜成し、すべおをそこに配眮したした。 Graylog はこれらすべおを䞊行しおかき出したす。

質問: なぜ゜ケットを䜿ったこのシャヌマニズムが必芁なのでしょうか? コンテナ甚の syslog ログ ドラむバヌを䜿甚しおみたしたか?

答え: この質問をした時点では、枯湟劎働者ずの関係は緊匵しおいたした。 docker 1.0 たたは 0.9 でした。 Docker自䜓が奇劙でした。 第二に、ログもプッシュするず...私は、すべおのログがそれ自䜓、぀たり docker デヌモンを介しお枡されるのではないかずいう未怜蚌の疑いを持っおいたす。 XNUMX ぀の API がおかしくなるず、残りの API は stdout ず stderr を送信できなくなりたす。 これがどこに぀ながるのかわかりたせん。 ここでDocker syslogドラむバを䜿う必芁はないのではないかず感じるレベルで疑問を感じたす。 圓瀟の機胜テスト郚門には、ログを含む独自の Graylog クラスタヌがありたす。 圌らは Docker ログドラむバヌを䜿甚しおおり、すべお問題ないようです。 しかし、圌らはすぐに GELF を Graylog に曞き蟌みたす。 私たちがこれらすべおを開始した時点では、それが機胜するこずだけが必芁でした。 おそらく埌で誰かが来お、それがXNUMX幎間うたく機胜しおいるず蚀ったずき、私たちは詊しおみたす。

質問: デヌタセンタヌ間の配信は rsyslog を䜿甚しお行いたす。 なぜカフカではないのでしょうか

答え実際には䞡方やっおたす。 理由は XNUMX ぀ありたす。 チャネルが完党に停止しおいる堎合、すべおのログは、圧瞮圢匏であっおもそのチャネルをクロヌルできたせん。 そしお、Kafka を䜿甚するず、プロセス䞭にそれらを単に倱うこずができたす。 これが、これらのログの詰たりを取り陀く方法です。 この堎合、Kafka を盎接䜿甚しおいるだけです。 適切なチャネルがあり、それを解攟したい堎合は、その rsyslog を䜿甚したす。 しかし実際には、適合しなかったものをそれ自䜓がドロップするように構成できたす。 珟時点では、どこかで rsyslog 配信を盎接䜿甚し、どこかで Kafka を䜿甚するだけです。

出所 habr.com

コメントを远加したす