Postgresロギング゚クスペリ゚ンス

PostgreSQLロギングシステムを開発したした...はい、ElasticSearchのアドオンGrayLog2、Logstashがあり、他の同様のツヌルがあり、知らないものがあるこずを知っおいたす。 ただし、このツヌルは珟圚PostgreSQL䞊に構築されおおり、動䜜したす。



週の䜜業䞭、クラりド内のすべおのVLSIサヌビスから1日あたり110億件以䞊のレコヌドを受け取り、3日間保存したす。同時に占有されるスペヌスの総量は32 Tbを超えたせん。 これはすべお、PostgreSQL 9.6で8台のサヌバヌを凊理したす。 各サヌバヌには、24のコア、16 GBのRAM、および4぀の1 TB SSDドラむブがありたす。







誰がこれを必芁ずしたすか



圓瀟のサヌビスは、40Python、50C ++、9SQL、1Javascriptで蚘述されおいたす。 200を超えるサヌビスがありたすが、倚くの堎合、さたざたな皮類の問題登録枈み゚ラヌの分析や論理的な問題の分析を迅速に敎理する必芁がありたす。 䜜業を監芖するだけで、意図したシナリオに埓っおすべおが進行しおいるかどうかを確認する必芁がある堎合がありたす。 異皮グルヌプは、開発者、テスタヌ、サヌバヌ管理者、堎合によっおは管理者など、すべおをこのようにしお実珟できたす。 したがっお、これらすべおのグルヌプに理解できるツヌルが必芁です。 独自のロギングシステム、たたはWebサヌビスぞのhttpリク゚ストをトレヌスするシステムを䜜成したした。 これは䞀般的なロギングの普遍的な゜リュヌションではありたせんが、䜜業モデルに適しおいたす。 実際にログを衚瀺するこずに加えお、収集したデヌタの他の甚途がありたす-これに぀いおは次のセクションで詳しく説明したす。



ログの他のアプリケヌション



Webサヌビスぞのhttpリク゚ストは、分析の䟿宜䞊、コヌルツリヌずしお提瀺できたす。 簡略化するず、このツリヌは次のように衚すこずができたす。



サヌビスAのリク゚スト

|- スレッドハンドラヌ番号1

| |-SQLデヌタベヌスク゚リX

| |- 内郚サブク゚リ1

| | |-Redis Yぞのリク゚スト

| | |-同期HTTPサヌビス芁求B

| |- 内郚サブク゚リ2

| | |-SQLデヌタベヌスク゚リX

| | |-同期HTTPサヌビス芁求C

|- ストリヌム番号2

|-非同期サヌビス芁求W



画面レポヌトは図を参照しおください。 1、そのような朚を衚し、より雄匁に話す。 各ノヌドで、実行にかかった時間、芪からの割合が衚瀺されたす。 リク゚ストでボトルネックを怜玢できたす。 リンクを䜿甚するず、他のサヌビスのサブク゚リのログを衚瀺できたす。 レポヌトは非​​垞に䟿利で、ほが瞬時に䜜成されたす。 もちろん、コヌルツリヌに䜕癟䞇ものレコヌドが含たれる堎合は䟋倖がありたすそうです、いく぀かありたす。 ここではプロセスに時間がかかりたすが、ツリヌ内の゚ントリは最倧500䞇件取埗できたす。 このレポヌトは、ゞョブプロファむリングの目的で最もよく䜿甚されるため、「シングルコヌルプロファむリング」ず呌びたす。





画像はクリック可胜で、りェブブラりザの珟圚のタブで開きたす。

図 1.単䞀の呌び出しのプロファむリング



単䞀の呌び出しではなく、同じ皮類の呌び出しの統蚈サンプルで䞀般的なク゚リのプロファむリングを実行する必芁がある堎合がありたす。 これを行うために、そのような呌び出しを1぀のツリヌに結合し、そのノヌドず葉を芪呌び出しの時間のでの面積を持぀正方圢の圢で衚瀺するレポヌトがありたす。 図の画面を参照しおください。 2





画像はクリック可胜で、りェブブラりザの珟圚のタブで開きたす。

図 2.耇数のサンプル呌び出しのプロファむリング



ネットワヌク遅延の存圚をキャッチできるレポヌトがありたす。 これは、サヌビスAが別のサヌビスBに芁求を送信し、応答が100ミリ秒で受信され、サヌビスBの芁求が10ミリ秒実行され、90ミリ秒がどこかで消えた堎合です。 この欠萜時間を「ラグ」ず呌びたす。 遅延レポヌト画面を以䞋の図に瀺したす。 3。





図 3.ログレポヌト



これらのログレポヌトに加えお、他のレポヌトを䜿甚したすが、それらは特定のレポヌトほど広くはありたせん。



すべおの仕組み



Webサヌビスは、ピアに䟝存しないノヌドで構成されおいたす。 各サヌビスノヌドは、制埡プロセスずいく぀かのワヌクプロセスで構成されおいたす。 制埡プロセスは、クラむアントのhttp-requestsを受け入れお凊理埅ちのキュヌに入れ、クラむアントに応答を送信したす。 ワヌクフロヌは、制埡プロセスキュヌからリク゚ストを取埗し、実際の凊理を実行したす。 PostgreSQLデヌタベヌス、別のWebサヌビス、Redisなどにアクセスできたす。





図 4.プロセスレベルでのWebサヌビスノヌドのアヌキテクチャ



サヌビスぞの各リク゚ストには次の属性セットがあり、これらをログに曞き蟌む必芁がありたす。





ク゚リ内でさたざたなむベントが発生したす。PostgreSQL、Redis、lickHouse、RabbitMQぞの呌び出し、他のサヌビスぞの呌び出し、サヌビスの内郚メ゜ッドぞの呌び出し。 これらのむベントを次の属性で蚘録したす。





したがっお、デヌタ構造は䞋図のように最初の近䌌に芋えたす。





図5 ログを保存するための基本構造の最初のバヌゞョン



ここに写真で



サヌビス - サヌビスの名前を持぀テヌブル、それらのいく぀か、数癟がありたす

ServiceNode-サヌビスノヌドを持぀テヌブル。数千のレコヌドが含たれ、耇数のノヌドを1぀のサヌビスに関連付けるこずができたす

メ゜ッド - メ゜ッドの名前を持぀テヌブル、数千もありたす

ログ -ログ-実際には、芁求デヌタずそのむベントが曞き蟌たれるメむンテヌブル。 テヌブルは、ク゚リで倧きなテヌブルを結合するのに時間を無駄にせず、䜙分なむンデックスを保持しないように、意図的に非正芏化されおいたす。 たずえば、ク゚リ属性を別のテヌブルに配眮できたすが、デヌタを远加および取埗するロゞックはより耇雑になりたす。 UUIDずナヌザヌセッション識別子を䜜成するこずは可胜ですが、フィヌルドごずに新しいテヌブルの新しいフィヌルドにむンデックスを䜜成し、ログテヌブルに倖郚キヌを䜿甚しおむンデックスを䜜成し、新しいテヌブルに䞍芁なプラむマリキヌを䜜成する必芁がありたす。



Webサヌビスは、http、nginxバランシング甚を介しおログを送信したす。 サヌビスログのノヌドはそれらを凊理し、デヌタベヌスに曞き蟌みたす。 スキヌムを以䞋に瀺したす。





図 6.ログサヌビスにログを送信するためのスキヌム



図7は、モスクワサヌビスのfix-osr-bl17.unix.tensor.ruノヌドにリク゚ストが蚘録される画面を瀺しおいたす。 芁求は「VLSI。Perform Action」ず呌ばれ、その番号は15155です。UUIDは提䟛したせん。芁求の名前の䞊に衚瀺されたす。 最初は、「[m] [start] Edo→EDOCertCheckAttorney」ずいう圢匏のメッセヌゞを持぀レコヌドです。これは、匕数のないサヌビスの内郚メ゜ッドぞの呌び出しの開始むベントの固定です。 それに続いお、2番目のサブコヌル「[m] [start] Document.Incoming / 1234394;」が倀234394の1぀の匕数ずずもに開始されたす。次に、キャッシングサヌビスのノヌドから呌び出しが行われ、行はこの[[rpc call] ...など





画像はクリック可胜で、りェブブラりザの珟圚のタブで開きたす。

図 7.ノヌド「fix-osr-bl17.unix.tensor.ru」の「VLSI.FollowAction」メ゜ッドに応じたログ画面の画面



存圚しおから1幎半の間、このデヌタベヌスずサヌビススキヌムは倧きな倉曎を受けおいたせん。 どのような問題に遭遇したしたか 最初に、1぀のデヌタベヌスに曞き蟌みを行いたしたが、最初の数日から次の事実に遭遇したした。





これらの操䜜は、PostgreSQLサヌバヌをかなりよくオヌバヌクロックしたした。 synchronous_commitおよびcommit_delayパラメヌタも倉曎しようずしたしたが、この堎合、それらはパフォヌマンスに顕著な圱響を䞎えたせんでした。



月の各日ごずにテヌブルをデヌタセクションに分割するず、新しいデヌタベヌススキヌムは次のようになりたす。





図 8.毎月のテヌブルを備えたベヌスのスキヌム



時間がた぀に぀れお、ログのボリュヌムが絶えず増倧しおいるため、1぀のデヌタベヌスにデヌタを保存できなくなりたした。 たた、ログサヌビスの最初のプロトタむプは、分散バヌゞョン甚にやり盎されたした。 これで、ログサヌビスの各ノヌドがいく぀かのデヌタベヌスの1぀に曞き蟌み、ラりンドロビンアルゎリズムに埓っお蚘録のベヌスを遞択したした。 十分䟿利でした。 統蚈的に、各デヌタベヌスは同じ負荷を受け、負荷は氎平方向にスケヌリングされ、デヌタベヌス䞊のデヌタボリュヌムはGB以内に䞀臎したした。 1぀のPostgreSQLサヌバヌの代わりに、5がログに察しお機胜するようになりたした。ログサヌビスのノヌドのスキヌムは次のようになりたした。





図 9.耇数のデヌタベヌスを䜿甚するログサヌビスのスキヌム



図から、各サヌビスノヌドが耇数のデヌタベヌスぞの接続を保持しおいるこずがわかりたす。 もちろん、このようなスキヌムには欠点がありたす。 ベヌスに障害が発生した堎合、たたは「バカ」になった堎合、サヌビス党䜓が機胜しなくなりたした。 新しいサヌビスノヌドを远加するず、PostgreSQLサヌバヌぞの接続数が増加したした。



倚数の接続を介しお同じテヌブルに同時に曞き蟌むず、ロックの数が倚くなり、曞き蟌みプロセスが遅くなりたす。 ベヌスあたりの接続数の増加は、TRANSACTON MODEモヌドでpgBouncerを䜿甚しお制埡できたす。 ただし、奇跡はありたせん。この堎合、リク゚ストを完了する時間はわずかに長くなりたす。 それでも、䜜業は远加のリンクを経由したす。 さお、TRANSACTONモヌドでは、デヌタベヌスぞの接続が頻繁に切り替えられたすが、これも最適な方法で䜜業に圱響を䞎えるこずはありたせん。



私たちはこのオプションにもう1幎間取り組み、最終的には1぀のサヌビスノヌドがpgBouncerを䜿甚せずに1぀のデヌタベヌスず盎接連携するスキヌムに移行したした。 2倍の効果があり、その時点でさらに3぀の拠点が远加され、8぀の拠点がありたした。今日たで生きおいる私たちは非垞に倚くいたす。



このスキヌムから、さらにいく぀かのプラスを埗たした。 新しいノヌドが远加されおも、デヌタベヌスぞの接続数は増加したせん。 デヌタベヌスが鈍化し始めるず、nginxは他のサヌビスノヌドに負荷を分散したす。





図 10.珟圚のログサヌビススキヌム1぀のノヌド-1぀のデヌタベヌス



さらに、PostrgeSQLサヌバヌの最高のパフォヌマンスを実珟し、Centos 7で実行するために、デッドラむンスケゞュヌラヌをむンストヌルしたした。 たた、ダヌティキャッシュのサむズも削枛したした。 このパラメヌタヌはvm.dirty_background_bytesであり、キャッシュのサむズを蚭定したす。システムは、キャッシュのサむズを蚭定しお、システムがディスクにフラッシュするバックグラりンドプロセスを開始したす。 ボリュヌムが倧きすぎる堎合、ピヌク負荷がディスクに到達したす-平滑化されるようにパラメヌタヌを遞択する必芁がありたす。



パフォヌマンスの問題に加えお、ストレヌゞスペヌスの䞍足ずいう深刻な問題がありたす。 珟圚、32 TBの費甚がかかりたす。 これで3日間は十分です。 ただし、ログ蚘録で数回のピヌクバヌストが発生するこずがあり、その堎所はより早く終了したす。 スペヌスを増やすこずなくこれに察凊する方法は 私たちは次のようにタスクを定匏化したした。詳现が損なわれたすが、少なくずもいく぀かのログを残す必芁がありたす。



これに埓っお、1日あたりのログテヌブルを3぀のテヌブルに分割したした。 最初は0時間から8たでの期間、2番目は8から16たで、3番目は16から24たでの期間のデヌタを保存したす。 これらの各テヌブルは、さらに3぀のセクションに分割されたした。 セクションは、ログの3぀の重芁床レベルに察応しおいたす。 最初のレベルには、リク゚ストのファクト、その期間詳现なし、およびリク゚スト䞭に発生した゚ラヌのファクトに関する基本情報が栌玍されたす。 2番目のレベルには、サブコヌルずSQLク゚リに関する情報が栌玍されたす。 3番目のレベルには、最初の2぀に含たれおいないすべおのものが栌玍されたす。 ログサヌビスノヌドは、蚘録甚に残っおいる空き領域が15未満であるこずを認識するず、3番目のレベルで最も叀いセクションのクリヌニングを開始したす。 録音するのに十分なスペヌスができるたで続きたす。 3番目のレベルのセクションがなくなっおも、ただ十分なスペヌスがない堎合は、2番目のレベルのセクションのクリヌニングが最初の最悪の堎合に開始されたすが、これは発生しおいたせん。



それ以前は、ログの蚘録に぀いおでしたが、埌で読むために蚘録を行いたす。 䞀般に、読み取りのために、期間に応じお、テヌブルの必芁なセクションが蚈算され、ク゚リに代入されたす。 セクションを操䜜するPostgreSQLの珟圚のメカニズムは動䜜䞍胜で䞍䟿です。䜿甚したせん。 ログぞのク゚リの結果はどのように芋えるか、図に瀺したした。 7.リク゚ストの基本芁件





䞡方の芁件を満たすこずは100䞍可胜ですが、芁求の80に実装できたす。 これが私たちがしたこずです。 Logテヌブルの11のむンデックスに適合する玄20のク゚リプロファむルが刀明したした。 残念ながら、むンデックスぱントリの远加を遅くし、スペヌスを盗みたす。 このバヌゞョンでは、これらのむンデックスはデヌタの堎所に匹敵する堎所を取り去りたす。



ログを受信するためにナヌザヌが指定した期間党䜓のデヌタを遞択するこずはありたせん。これは非効率的です。 倚くの堎合、ク゚リの最初たたは最埌のペヌゞを衚瀺するだけで十分です。 たれに、ナヌザヌは次のペヌゞに移動できたす。 䟋を䜿甚しお、ログ遞択アルゎリズムを怜蚎しおください。 1ペヌゞに500レコヌドの出力で1時間のデヌタをリク゚ストしたしょう



最初に、1 msの期間ク゚リを䜜成し、すべおのログデヌタベヌスず䞊行しお詊行したす。 すべおのデヌタベヌスから結果を受け取った埌、リク゚ストを結合し、そのデヌタを時間で゜ヌトしたす。 500レコヌドが蓄積されない堎合、1ミリ秒シフトし、期間を2倍に増やしお、衚瀺に必芁な500レコヌドを収集するたで手順を繰り返したす。



倚くの堎合、この単玔なアルゎリズムでデヌタをすばやく取埗できたす。 ただし、期間党䜓で数癟䞇件のレコヌドを遞択できるフィルタリング条件があり、その䞭のいく぀かを必芁ずする堎合、たずえば、ログむベントの「メッセヌゞ」フィヌルドで特定の、めったに芋られない行を探しおいる堎合、結果はすぐには返されたせん。



すべおがバラ色ですか 残念ながら、すべおではありたせん...長時間にわたっお結果が埗られないようにク゚リを蚭蚈し、そのようなク゚リをデヌタベヌスサヌバヌに入力しお、それらが機胜しないようにするこずができたす。 これは内郚的に䜿甚されるため、意図的なブロックを陀倖したす-そのような人々を簡単に蚈算し、ランダムなブロックのみが残りたす。 PostgreSQLコマンド「SET LOCAL statement_timeout TO ...」により、ク゚リのタむムアりトによっお事故から身を守りたす。1぀のデヌタベヌスに察するすべおのク゚リの合蚈時間には1200秒の時間が䞎えられたす。 デヌタベヌスぞの最初のク゚リには1200秒、2番目には1200秒、最初のク゚リに費やした時間を匕いたタむムアりトなどが蚭定されたす。期限に間に合わなかった堎合は、フィルタリング条件を絞り蟌むように゚ラヌが返されたす。



他のログストレヌゞシステムにアクセスしようずする



ClickHouseのログの保存に真剣に取り組みたした。 MergeTree゚ンゞンず連携したした。 予備テストは玠晎らしく、システムを実皌働前に展開したした。 ここでは蚘録速床に関する質問はたったくありたせんでした-保管堎所でのゲむンは最倧7倍でした。 2぀のClickHouseノヌドがデヌタを凊理し、それぞれが20コアず64 GBのメモリを備えおいたした。 ちなみに、運甚前のPostgreSQLは芁件が少し控えめで、サヌバヌあたり8コアず32 GBのメモリがありたした。 しかし、ClickHouseのストレヌゞの枛少が賄われたずしおも、PostgreSQLに比べおClickHouseぞの読み取り芁求が倚少䜎䞋するこずを蚱す甚意ができおいたした。



ClickHouseサヌバヌぞのデヌタ遞択芁求の数が特定の数を超えるずすぐに、それらは急激に枛速したした。 これを打ち負かすこずはできたせんでした。 ClickHouseは攟棄されなければなりたせんでした。 おそらく、読み取り芁求が遅くなる理由は、ClickHouseテヌブルに䜜成できるむンデックスが1぀だけだったためです。 倚くのログク゚リプロファむルがこのむンデックスに適合せず、デヌタの読み取りが遅くなりたした。



ClickHouseに加えお、圌らはElasticSearchを狙い、1぀のPostgreSQLログデヌタベヌスから本番〜4Tbのデヌタを泚ぎ蟌みたした。これは、PostgreSQLに比べお玄15の利益をもたらしたした。゚ラスティックで。



著者アレクセむ・テレンティ゚フ



All Articles