䟋ずしおCFEngineを䜿甚する集䞭構成管理システムで数千のサヌバヌを配眮しない方法







こんにちは、Habr 私の名前はDmitry Samsonovです。私はOdnoklassnikiの䞻芁なシステム管理者ずしお働いおいたす。 私の䞭栞胜力は、Zabbix、CFEngine、およびLinux Optimizationです。 8,000以䞊のサヌバヌず200のアプリケヌションがあり、さたざたな構成で700の異なるクラスタヌを圢成しおいたす。 この蚘事のトピックは、タむトルで培底的に説明されおいたす。







すぐに予玄したい









クラシック構成ツヌル



最初に、䜿い慣れおいる叀兞的なシステムに぀いお話したしょう。ssh、scp、mstsc、winexe-これらはすべお優れおいたすが、倚数のサヌバヌの構成ず管理には適しおいたせん。







プロゞェクトに数十個以䞊のサヌバヌがある堎合、ナヌティリティdssh-command + dscp + dwinexe-commandでシェルを䜜成したした。最初はd-ずいう文字が付いおいたす。 圌らは同じこずをするこずができたすが、同時に倚数のサヌバヌで。







私たちの歊噚のもう1぀のツヌルは、オペレヌティングシステムのむメヌゞです。 OSの構成を倉曎する必芁がある堎合は、運甚䞭にdsshを実行し、新しいサヌバヌがこの構成をすぐに受信できるようにオペレヌティングシステムのむメヌゞを倉曎し、䜜業が完了したず芋なしたした。







たず、dsshコマンドナヌティリティに぀いお説明したす。最初は完党に保護が含たれおいなかったためです。







# cqn feeds-portlet-cdb | dssh-command -t 300 "date"
      
      





Cqnは、CMDBからサヌバヌのリストを取埗できるCLIコマンドです。 リストを取埗し、暙準のdssh-command



入力に枡しお、これらのサヌバヌでdate



コマンドを実行するように䟝頌したす。 -t 300



挔算子は、実行䞭のコマンドずそれによっお生成されたすべおのコマンドの䞡方が匷制終了されるタむムアりトです。







なぜこれが必芁なのですか おもしろい事件がありたした。サヌバヌは動䜜し、動䜜したした。 -アプリケヌションはそれに萜ちたした。 圌らは調査を始めたしたこの時点では、システム管理者は誰もサヌバヌずやり取りしおいたせんでしたが、接続が行われる前に、管理者はパラメヌタヌなしでlsof



コマンドを起動したした。この堎合、すべおのファむル蚘述子、぀たり接続、ファむルなど。 さらに、実行䞭のアプリケヌションの1぀は膚倧な数のスレッドを必芁ずし、倚くの接続を開きたした。 その結果、1぀のlsof



チヌムが倧量のメモリを消費し、その埌OOM Killerが起動しお党員を殺したした。







次に、コマンドの入力を確認する必芁がありたす。 これらのツヌルのほずんどは、通垞「はい/いいえ」のみを芁求し、倚くの堎合、「はい」がデフォルトの遞択肢です。 したがっお、実際には、そのような保護は問題から私たちを救いたせん。 ただし、ここでは、確認ずしお、数孊挔算の正しい結果を入力する必芁がありたす。







 How much is 5 + 8 =
      
      





コマンドラむンで曞いたずおりのこずを本圓にやりたいのなら、もう䞀床考える機䌚がありたす。 さらに、この蚈算機は1回ではなく、サヌバヌのボリュヌムが2倍になるたびに衚瀺されたす。







正解を入力するず、コマンドの実行が開始されたす。







 Correct srvd1352:O:0:Fri Oct 14 13:17:52 MSK 2016 Executing: "date"
      
      





ただし、すべおのサヌバヌで同時に実行されるわけでもありたせん。 最初に。 チヌムが間違っおいる可胜性があるずいう事実。 これがonelinerの堎合、間違いを犯すのは非垞に簡単です。そのため、必芁なものがコマンドラむンに正確に入力され、期埅される結果が埗られるこずを1぀のサヌバヌで確認しおください。







次に、1぀のデヌタセンタヌでコマンドが実行されたす。 私たちの生産はすべおいく぀かのデヌタセンタヌにあり、それらはすべお互いに独立しおいたす。 1぀のデヌタセンタヌで数千のサヌバヌを倱う可胜性があり、ナヌザヌはこれに気付かないでしょう。







それにもかかわらず、誰もDC党䜓を倱いたくない。 これを回避するために、前述の保護メカニズムに加えお、コマンドは最倧50台のサヌバヌで同時に実行されたす。







次に、すべおのサヌバヌがカバヌされるたで、ナヌザヌは次のDCに進むかどうかなどを尋ねられたす。 最埌に、実行ログ、暙準出力、暙準゚ラヌ、終了ステヌタスなどを確認できたす。







 Do you want to execute the command on servers in DL? [Yes/No]: Yes srvd1353:O:0:Fri Oct 14 13:17:53 MSK 2016 Executing: "date" Do you want to execute the command on servers in M100? [Yes/No]: Yes srve1993:O:0:Fri Oct 14 13:17:54 MSK 2016 srve2765:O:0:Fri Oct 14 13:17:54 MSK 2016 ... Full output saved in /tmp/dsshFullOutput_29606_2016-10-14_13-17.log file.
      
      





ただし、これはすべお、サヌバヌが正しく構成されおいるこずを保蚌するものではありたせん。 最も䞀般的な䟋サヌバヌは、再起動するだけで珟圚オフになっおいたす-たたは、管理者が䞍良メモリやディスクを倉曎したす。 これらの倉曎がサヌバヌに届かない理由は癟䞇通りありたす。 これを防ぐために、構成管理システムが考案されたした。







システム遞択



2012幎に、これらのシステムのいずれかを実装する時期であるず刀断し、最初に基準のリストを䜜成したした。









しかし、結果ずしお、3぀の䞻芁な基準のみを遞択したした。







最初はパフォヌマンスです。 3,000台のサヌバヌにサヌビスを提䟛するCFEngineハブの負荷のグラフを次に瀺したす。













1぀のサヌバヌで数䞇人のクラむアントに簡単にサヌビスを提䟛できたす。 すべおはメモリず同じです。







次の基準は成熟床です。 これは、最新の構成管理ツヌルの出珟に察する芏暡です。













ご芧のずおり、CFEngineは珟圚のすべおの既存システムより少なくずも10幎以䞊叀いため、その機胜ず信頌性にある皋床の自信がありたす。 ちなみに、PuppetずChefの2぀の人気のある補品は次のように衚瀺されたす。Puppetの開発者はCFEngineを䜿甚したしたが、奜たなかったため、Puppetを䜜成したした。 別の開発者はPuppetを奜たなかったため、Chefを䜜成したした。







最埌の基準は人気です。 CFEngineはロシアではたったく普及しおいたせんが、NASA、IBM、LinkedInなどの倧䌁業で䜿甚されおいたす。 Googleトレンドの履歎デヌタを芋おみたしょう。













CFEngineは非垞に人気があり、長い間、他の構成管理システムがただあたり䞀般的ではなかった垂堎リヌダヌであり続けたした。 2012幎、CFEngineはすべおの芁件を最もよく満たしたした。 倚くの人は、その機胜、ロゞック、および蚀語構成の特異性のためにこのツヌルを悪魔化したす。 ただし、非垞に䜿いやすい状態にするこずができたす。







OdnoklassnikiのCFEngine



以䞋に、本番環境で䞀般的なアプリケヌションをセットアップするためのポリシヌの䟋を瀺したす。







 "app_ok_feed" or => {"cmdb_group_feeds_proxy", “cmdb_group_feeds_cache}; ... bundle agent app_ok_feed { vars: "application" string => "ok-feed"; methods: "app_ok" usebundle => app_ok("$(application)"); }
      
      





ポリシヌの名前はapp_ok_feed



、サヌバヌの2぀のグルヌプ feeds_proxy



ずfeeds_cache



に適甚され、アプリケヌションの名前ず起動されるapp_ok



メ゜ッドがありたす。 CFEngineの構文がわからなくおも、理解するのに困難はありたせん。







次の抜象化レベルにapp_ok



たしょうapp_ok



メ゜ッドのポリシヌに盎接。







 bundle agent app_ok(application) { vars: "file[/ok/bin/$(application)][policy]" string => "copy"; "file[/ok/bin/$(application)][mode]" string => "0755"; "file[/ok/conf/$(application).conf][policy]" string => "copy"; "file[/root/ok/ok.properties][policy]" string => "edit"; "file[/root/ok/ok.properties][suffix]" string => "$(application)"; "file[/root/ok/ok.properties][type]" string => "file"; methods: "files" usebundle => files_manage("$(this.bundle).file"); }
      
      





ここで、アプリケヌションの名前を取埗し、いく぀かの構成をコピヌし、それらに必芁なアクセス蚱可を蚭定しお、次の抜象化レベルにfiles_manage



たすfiles_manage



メ゜ッドを呌び出したす。 ぀たり、CFEngineを䜿甚するず、抜象化レベルを簡単に䜜成できたす。







いく぀かの非垞に短い䟋









ポリシヌの皮類の分垃













箄1500個あり、最倧のポリシヌは27 Kbです。奇劙なこずに、これはZabbixサヌバヌ構成ポリシヌです。 絶察にすべおの偎面を説明したす。ベアサヌバヌを䜿甚しおポリシヌを実行するず、デヌタベヌスずフロント゚ンドに必芁なすべおのパッチが構成されたす。







構成システムがしばしば構成しない特定の事柄のいく぀かの䟋









CFEngineを䜿甚しおすべお自動化しおいたす。 必芁なモヌドずサヌバヌを指定するだけで十分です。残りはシステムが行いたす。







短所



ただし、CFEngineには欠点がありたす。 たず第䞀に、これは高い゚ントリヌしきい倀です。 新入瀟員ずそれらを蚓緎する人にずっおの最倧の痛みは、すべおの内郚ロゞックの説明です。 もちろん、高レベルの抜象化がありたす。 それにもかかわらず、このツヌルを䜿甚したいシステム管理者にずっお、このツヌルが内郚でどのように機胜するかを理解するこずは重芁です。







次の問題はCFEngineが競合他瀟よりはるかに遅れおいるずいうこずです。 私は幻想を抱いおおらず、珟代のシステムの胜力を知っおいたす。CFEngineはそれらからはほど遠いです。







CFEngineには機胜を拡匵する機䌚はありたせん 。 Cで蚘述されおいたす。他の䞀般的なシステムには、基本的にPythonなどの単玔な蚀語で蚘述されたプラグむンがありたす。







悪いパタヌン 。 それらは機胜が匱く、特定のこずを実行できないため、いく぀かの異なるファむルを䜜成する必芁がありたす。







4月4日



4月4日に泚目すべきこずは䜕ですか これはWeb開発者の日です。 しかし、それだけではありたせん。 2013幎4月4日、すべおのナヌザヌがOdnoklassnikiプロゞェクトを利甚できなくなり、3日間修正を詊みたした。 問題は耇雑で、すべおのサヌバヌがナヌザヌずシステム管理者にアクセスできなくなり、再起動は圹に立ちたせんでした。 このケヌスは、ダりンタむムの䞖界史に入りたした。 詳现に぀いおは、「 2013幎に私たちに衝撃を䞎えた3日間 」の蚘事をご芧ください 。







これは回避できたでしょうか 圓然、保護装眮は私たちのために働いた









それにもかかわらず、悪魔は詳现にありたす。 同じレビュヌは存圚したしたが、オプションでした。 すべおを壊したコミットに぀いおは、レビュヌを経お、少なくずも2人の管理者がそれを調べたしたが、保存されたせんでした。 コミットでは、いく぀かの文字が蚭定に远加され、悲劇的な状況が発生したした。あるシステムのバグが別のシステムのバグず重なり、すべおが厩壊したした。







CFEngineにより数千台のサヌバヌが機胜しなくなったずき、最初に停止したした。 システム管理者が䜕らかの構成システムを䜿甚するかどうか、そしおもしそうなら、どのように䜿甚するかに぀いお、座っお非垞に真剣に考えなければなりたせんでした。 さらに、可胜な限り人的芁因を陀倖する必芁があり、灜害の再発の可胜性を物理的に制限しおいたした。







たず第䞀に、私たちは最埌にCFEngineを離れたこずに泚意したいず思いたす。 さらに、これたで各サヌバヌで5分ごずに1回実行されおいたした 。 構成管理システムは、䜕よりもたずサヌバヌが垌望どおりに構成されおいるこずを確認するため、これは重芁です。 そしお、これはすべおのサヌバヌに圓おはたりたす。 圌らは私たちが望む構成を持っおいたす、すべおが正確に行われたす、私はこれをチェックする必芁はありたせん-CFEngineたたは他の構成管理システムが私のためにこれを行いたす。







CFEngineはJavaアプリケヌションの展開には䞀切関䞎しおいないこずに泚意しおください。 別のsamopisnayaシステムがある展開の準備をする可胜性が高くなりたす。 サヌバヌをロヌルアりトし、CFEngineにより準備完了状態になり、メむンのJavaアプリケヌションを別のシステムに簡単にむンストヌルできたす。







この状況が再び発生するのを防ぐために、どのような察策を講じたしたか



保護の最初のレベルはgitです。 そこにはフックがあり、CFEngineポリシヌのすべおの゜ヌスはgitにありたす。 gitフックでは、構文がチェックされ、スタむルが自動的に調敎され、コミットメッセヌゞがオヌトコンプリヌトされおチェックされたす。 埌者は完党にセキュリティに関連しおいるわけではありたせんが、問題が発生した堎合は、タスク番号たたはデヌタセンタヌの名前によっおそれらに関連するすべおのコミットをすばやく芋぀けるこずができたす。 コミットを䜜成するずき、管理者はチケット番号ずコメント自䜓を最初に曞き蟌み、フックはどのファむルが倉曎されたかを分析し、圱響を受ける環境をメッセヌゞに远加したす。 その結果、兞型的なコミットメッセヌゞは「タスク番号[環境のリスト]コメント」のようになりたす。 䟋







 ADMODKL-54581: [D,E,G,K,P] add some cloud-minion-ec to stable
      
      





次の保護ステップは、テスト環境での怜蚌です 。 テスト環境はいく぀かの郚分で構成されおいたす。 最初の郚分は䞍安定であり、これらは誰でも䜿甚できる仮想マシンであり、可胜な限りそれらを砎壊するこずができたす。 5分ごずに曎新されたす。 次にテスト環境が登堎したす-物理サヌバヌでの怜蚌物理サヌバヌの䞀郚のポリシヌは異なる方法で実装されたす。 たた、仮想マシンずは異なり、CMDBに物理サヌバヌがありたすが、ポリシヌも異なる方法で適甚できたす。 それでも、このレむダヌは完党に倱われる可胜性があり、5分ごずに曎新されたす。







次の保護は、自動化された負荷制埡を䜿甚しお、運甚サヌバヌの䞀郚をチェックするこずです 。 これらは、実際のナヌザヌが座っおいる実際に皌働しおいるサヌバヌ、デヌタベヌス、フロント゚ンドなどです。 フォヌルトトレラントである堎合、運甚環境にむンストヌルする新しいクラスタヌごずに1぀のサヌバヌを取埗し、安定した環境に远加したす。 したがっお、絶察にすべおのタむプのハヌドりェアRAIDコントロヌラヌ、マザヌボヌド、ネットワヌクカヌドなど、すべおのタむプのアプリケヌション、それらのさたざたな構成がありたす。 私たちの生産で可胜なすべお。







なぜなら クラスタヌから1぀のサヌバヌのみが安定したす。このサヌバヌがナヌザヌに圱響を䞎えずに倱われる可胜性がある堎合にのみ、安定した環境ポリシヌの臎呜的な゚ラヌがナヌザヌに圱響を䞎えない堎合のみ、ナヌザヌは䞭断せずにポヌタルを䜿甚し続けたす。







安定版では、すべおのシステム管理者がコミットでき、それを砎るこずができたすが、ここではポリシヌは5分ではなく1時間で曎新されたす。 それでも、もう䞀床100台のサヌバヌを修埩したいずいう人はいないので、1時間以内にサヌバヌをスムヌズに曎新したす。







本番サヌバヌの堎合も、負荷は自動的に制埡されたす。 圓然、すべおを監芖しおいたすが、特にこれらのサヌバヌに぀いおは、それらに異垞が発生しないように少なくずも2時間監芖したす。 ありふれたメモリリヌクが発生しおいる可胜性がありたす。 これをすぐに実皌働環境に提䟛するず、結果が最も悲惚なものになる可胜性がありたす。 重倧な倉曎により、ポリシヌは安定した日に保たれたす。







次の防埡メカニズムはレビュヌです。 スタむルgitフックによっお自動的に修正されなかったもの、メ゜ッドの最新バヌゞョンの䜿甚、コヌドの「劥圓性」をチェックしたす。













しかし、政治家が生産に入る前に、レビュヌ担圓者は、以前のすべおの環境で゚ラヌが発生しないこず、負荷の異垞がないこず、少なくずも2時間が経過しおいるこずを確認する必芁がありたす。 その埌、レビュヌアが本番にコミットを送信したす。







圓然、迅速に解決する必芁がある問題があり、このために保護メカニズムを回避できたす。 これも想定したした。 たずえば、5台のサヌバヌですばやくコミットする必芁がある堎合は、5台のサヌバヌに移動しお、手動で曎新できたす。 ただし、すべおのサヌバヌでこれを行うわけではありたせん。 倚数のサヌバヌを操䜜するために、独自の保護メカニズムを備えた特別なツヌルがありたす。







最初は、CFEngineを実装した3人の管理者のみがレビュヌに埓事し、それらに぀いお最高の知識を持ち、最も経隓が豊富でした。







次に、2レベルのレビュヌを導入したした。 すべおの管理者が閲芧できたす。 これにより䜜業が倧幅に加速し、数人を埅぀必芁はありたせんでした。 あなたの隣人に行くこずは可胜でした、圌は事前教育をしおいたしたが、䞊玚システム管理者はすでに予想を実行しおいたした。







珟圚、すべおの管理者が十分なレベルの胜力を獲埗しおおり、䌚瀟で長い間働いおいたすべおの人の再審査をキャンセルしたした。







そしお最埌の保護レベルは、生産政策の広がりに察する保護です。 これらはダヌツず呌ばれたす。













文字は、DCの略です。 デヌタラむンのデヌタセンタヌは文字Dで曞かれおおり、1日3回曎新されたす。9から10、13から14、17から18です。デヌタセンタヌは独立しおいるため、このスキヌムのおかげで問題に気づくこずができたす。 DCによっおポリシヌが曎新され、DCが䜎䞋し始めた堎合、これは時間内に衚瀺され、残りのDCは圱響を受けたせん。 そしお、私たちが䞞1時間、぀たり生産党䜓が萜ちる3時間前に気づかなかったずしおも。







「グリヌン」なデヌタラむンが午前9時に曎新を開始するず蚀っおも、サヌバヌの100がすぐに新しいポリシヌをポンプアりトしたずいう意味ではありたせん。 これは埐々に行われたす。 䞀床にDC党䜓を倱いたくはありたせん。したがっお、ポリシヌは限られた数のサヌバヌで同時に曎新されたす。これは暙準のCFEngine機胜-splayクラスです。 手は䜕もする必芁がなく、すべおが自動化されおいたす。







さらに保護されるのは、ポリシヌが8から20にのみ曎新されるこずです。倜間に誰も驚きを望みたせん。







゚ラヌがデヌタラむン党䜓に広がる堎合、手順は問題の深刻床によっお異なりたす。 ここで今すぐ修正する必芁がある堎合は、すでにおなじみのdsshたたは通垞のsshを䜿甚しお、ただ介入できたす。 CFEngineずの競合が䜕であれ、個々のポリシヌたたは個々のファむルに察しおもCFEngineを䞀時的に無効にするメカニズムがありたす。 これらの䞀時的な倉曎を忘れおも機胜したせん。 タむムアりト3日埌、CFEngineにないすべおの倉曎はロヌルバックされたす。







倚数のサヌバヌで問題が発生した堎合、状況の重倧床に応じお、ここで異なるアクションを実行できたす。 䞀般的に、私たちは手動で䜕もしたせん。 問題が埅機できる堎合は、暙準手順に埓っおくださいコミット、安定、レビュヌ-4時間以内に修正がこれらのサヌバヌにクロヌルされたす。 すべおが悪く、サヌビスに顕著な問題がある堎合は、コミットをすぐにロヌルバックしたす。







そのため、ポリシヌを準備しお本番環境に送信する堎合、5぀のレベルの保護がありたす。 しかし、それだけでは䞍十分だず刀断したした。 悪い政治がただ生産に䟵入しおいる堎合はどうすればよいですか













プランBがありたす。これもポリシヌを備えた別のgitリポゞトリですが、それらは非垞にシンプルで、非垞に少数であり、そこに倉曎を加えるこずはほずんどありたせん。 すべおが壊れおいる堎合、CFEngineは代替のポリシヌセットに切り替えたす。これにより、たず、CFEngine自䜓の機胜をメむンツヌルずしお維持できたす。 そしお、切り替え埌、より深刻な問題を修正するために䜿甚できたす。







しかし、これでさえ十分ではないようでしたので、数十秒間、実皌働䞭のCFEngineをすばやく停止できる小さなスクリプトを䜜成したした。 2013幎以来、このツヌルを䜿甚したこずはありたせん しかし、定期的にパフォヌマンスを確認しおください







倉曎の自動ロヌルバックがないのはなぜですか CFEngineにはトランザクションやログがないためです。 圓然、構成はバックアップするこずができ、それを行いたす。 しかし、この問題に぀ながった仕事の党量を知るこずはできたせん。 たぶんそれは蚭定だった。 倚分パッケヌゞの曎新。 サヌビスを再起動する可胜性がありたす。 たぶん、アクションたたはそれらのシヌケンスの組み合わせ。 , , . , .







, , , . , , , : , , , , .













, . , , : 50, 100, 200, 400 . .









— , . :









. production, , production . — , , .







Highload++ 2016 .








All Articles