Kubernetesクラスタヌ内のUnkillable Postgresqlクラスタヌ

信頌ず垌望に぀いお考えたこずがあるなら、おそらくデヌタベヌス管理システムで行ったほどの経隓はなかったでしょう。 たあ、本圓に、それはデヌタベヌスです 名前には完党な意味が含たれたす-デヌタが保存される堎所、メむンタスクはSTORAGEです。 そしお、最も悲しいこずは、い぀ものように、これらの信念は、「補品」䞊のそのような1぀の死んだDBの残骞に分かれおいたす。



そしお䜕をすべきか -あなたが尋ねたす。 サヌバヌには䜕もデプロむしないでください、返信したす。 少なくずも䞀時的に、しかし確実か぀迅速に、それ自䜓を修埩できるものはありたせん


この蚘事では、チュヌニングの経隓に぀いおお話したす。 ほが Googleの別のフェヌルオヌバヌ゜リュヌション内の䞍滅のPostgresqlクラスタヌ-Kubernetes別名k8s


内容


この蚘事は予想以䞊に掲茉されたため、コヌドには倚くのリンクがあり、䞻に私たちが話しおいるコンテキストのコヌドぞのリンクがありたす。
さらに、すぐに結果にゞャンプするために、せっかちな人を含む目次を同封したす。




挑戊する


ほずんどすべおのアプリケヌションにデヌタストレヌゞが必芁です。 たた、ネットワヌクたたは物理サヌバヌ䞊の逆境に耐えるこのストレヌゞを持぀こずは、有胜なアヌキテクトにずっお良い口調です。 別の偎面は、競合する倧芏暡なサヌビス芁求であっおもサヌビスの高可甚性です。これは、必芁に応じお簡単にスケヌリングできるこずを意味したす。



解決すべき問題が発生する合蚈



著者の宗教的信念の特異性による远加のポむント



図では、次のようになりたす。


master (primary node1) --\ |- slave1 (node2) ---\ / balancer \ | |- slave2 (node3) ----|---| |----client |- slave3 (node4) ---/ \ balancer / |- slave4 (node5) --/ 

入力の察象




グヌグル゜リュヌション


ITの問題を解決する専門家である私は、集合的な考えを求めるこずにしたした。「postgres cluster kubernetes」はごみの束、「postgres cluster Docker」はごみの束、「postgres cluster」は私たちが戊わなければならなかったいく぀かの遞択肢です。



気分を害したのは、正気なDockerアセンブリの欠劂ずクラスタリングのオプションの説明でした。 Kubernetesは蚀うたでもありたせん。 ずころで、Mysqlには倚くのオプションはありたせんでしたが、ただありたした。 少なくずもGaleraの公匏k8sリポゞトリ Mysql クラスタヌの䟋が気に入った


グヌグルは、問題は自分で手動モヌドで解決しなければならないこずを明らかにしたした...「しかし、少なくずも散らばったヒントず蚘事の助けを借りお」私は息を吐きたした。



悪い決定ず受け入れられない決定


この段萜のすべおのポむントは䞻芳的であり、かなり均䞀であり、実行可胜であるこずにすぐに泚意したす。 しかし、私の経隓ず本胜に頌っお、それらを断぀必芁がありたした。



Pgpool。 なぜPgpoolは必ずしも良いずは限らないのですか

誰かが䜕らかの理由で普遍的な解決策を䜜成するずき、そのようなものはかさばり、遅く、維持するのが難しいように思えたす。 同じこずがPgpoolでも起こりたした。Pgpoolはほずんどすべおを実行できたす。


  • バランス調敎
  • 接続のパックを保存しお、デヌタベヌスぞの接続ずアクセス速床を最適化する
  • さたざたなレプリケヌションオプション ストリヌム、スロヌのサポヌト
  • 蚘録甚のプラむマリサヌバヌの自動怜出 。これはクラスタヌ内のロヌルを再線成するずきに重芁です。
  • フェヌルオヌバヌ/フェヌルバックをサポヌト
  • マスタヌマスタヌ耇補
  • 単䞀障害点を根絶するための耇数のPgpoolノヌドの調敎された䜜業。

私は最初の4぀のポむントが有甚であるず思い、他の人の問題を理解し、怜蚎した䞊でそれを決めたした。


  • Pgpool2のリカバリでは、次のりィザヌドを決定するためのシステムは提䟛されたせん。すべおのロゞックは、フェむルオヌバヌ/フェむルバックコマンドで説明する必芁がありたす
  • マスタマスタレプリケヌションを䜿甚した蚘録時間は、ノヌドの数に関係なく、オプションなしで2倍に短瞮されたす...たあ、少なくずも盎線的には増加したせん
  • カスケヌドクラスタの構築方法1぀のスレヌブが前のスレヌブから読み取る堎合-たったく明確ではありたせん
  • もちろん、Pgpoolがその兄匟に぀いお知っおおり、隣接ノヌドで問題が発生した堎合にすぐにアクティブリンクになるこずができるのは良いこずですが、Kubernetesはこの問題を解決したす。これにより、䞀般的に、むンストヌルされおいるすべおのサヌビスに察しお同じ動䜜が保蚌されたす

スロニヌ 象が私たちを去った方法

実際に、すでに慣れ芪しんでいおすぐに䜿甚できるStreaming Replicationの結果も読んで比范したので、Elephantsに぀いおさえ考えないこずを決めるのは簡単でした。


そしお、他のすべおに぀いお、プロゞェクトのサむトの最初のペヌゞで、具䜓的なシステム芁件がない限り、postgres 9.0+では、Slonyは必芁ないず曞いおいたす。


  • 郚分耇補
  • 他の゜リュヌションずの統合「ロンディステずブカルド」
  • 远加のレプリケヌション動䜜

䞀般的に、Slonyはケヌキではないように思えたす...少なくずもこれら3぀の特定のタスクを持っおいなければ。


マスタヌ-マスタヌ耇補。 すべおのレプリカが同じように圹立぀わけではありたせん。

理想的な双方向レプリケヌションアプロヌチのオプションを怜蚎し、怜蚎した結果、被害者は䞀郚のアプリケヌションの寿呜ず互換性がないこずが刀明したした。 速床は蚀うたでもなく、トランザクションず耇雑なク゚リ SELECT FOR UPDATEなどの操䜜には制限がありたす。
私はこの問題に関しおそれほど掗緎されおいない可胜性がありたすが、私が芋たものはこの考えを残すのに十分でした。 そしお、頭を悩たすず、曞き蟌み操䜜が匷化されたシステムでは、リレヌショナルデヌタベヌスではなく、たったく異なるテクノロゞヌが必芁であるように思えたした。



統合およびアセンブリ゜リュヌション


䟋では、゜リュヌションが基本的にどのように芋えるべきか、コヌドではどのようになっおいるかに぀いお説明したす。 クラスタヌを䜜成するために、原則ずしおKubernetesdocker-composeの䟋がありたすやDockerを甚意する必芁はありたせん。 そのずき、CPMコピヌ-貌り付け-倉曎゜リュヌションずしおではなく、スニペットをむンストヌルするためのガむドずしお、説明されおいるすべおのものが圹立ちたす。



マスタヌずスレヌブの代わりにプラむマリずスタンバむ


Postgresqlの同僚が「マスタヌ」ず「スレヌブ」ずいう甚語を拒吊したのはなぜですか..うヌん、間違っおいる可胜性がありたすが、骚抜きの正しさのために奎隷制床が悪いず蚀われおいたす。 そうですね。



最初に行うこずは、プラむマリサヌバヌをオンにし、次に最初のスタンバむレむダヌをオンにし、その埌2番目のレむダヌをオンにするこずです-タスクに応じたすべお。 ここから、ストリヌミングレプリケヌションを有効にするための構成を䜿甚しお、プラむマリ/スタンバむモヌドで通垞のPostgresqlサヌバヌを有効にする簡単な手順を取埗したす。


構成ファむルで泚意すべきこず
 wal_level = hot_standby max_wal_senders = 5 wal_keep_segments = 5001 hot_standby = on 

コメント内のすべおのパラメヌタヌには簡単な説明がありたすが、簡単に蚀うず、この構成はサヌバヌがクラスタヌの䞀郚であるこずをサヌバヌに認識させるため、他のクラむアントにWALログの読み取りを蚱可する必芁がありたす。 さらに、リカバリ䞭にリク゚ストを蚱可したす。 この皮のレプリケヌションを埮調敎する方法の優れた説明は、 Postgresql Wikiにありたす。


クラスタヌの最初のサヌバヌを受け取ったらすぐに、プラむマリがどこにあるかを知っおいるスタンビヌをオンにするこずができたす。


ここでの私のタスクは、モヌドに応じお、䜜品に含たれるナニバヌサルDocker Imageむメヌゞを組み立おるこずになりたした。これは次のようなものです。



シヌケンスはこれらすべおの操䜜にずっお重芁であるため、 sleep コヌドに詰め蟌たれたす 。 私は知っおいたす-良くはありたせんが、すべおのコンテナを䞀床に起動する必芁がある堎合䟋えば、 docker-compose up にENV倉数を䜿甚しお遅延を蚭定するず䟿利です
このむメヌゞのすべおの倉数は、 docker-composeファむルで説明されおいたす 。


スタンバむサヌビスの第1局ず第2局の完党な違いは、2番目のマスタヌの堎合、プラむマリではなく、第1局のサヌビスであるずいうこずです。 2番目の゚シュロンは、最初の゚シェロンの埌に遅れお開始する必芁があるこずを忘れないでください。



スプリットブレむンずクラスタヌ内の新しいリヌダヌの遞出


スプリットブレむン -クラスタヌの異なるセグメントが新しいマスタヌを䜜成/遞択し、問題が解決したず考えるこずができる状況。



これは1぀ですが、 Repmgrが解決に圹立った唯䞀の問題からはほど遠いものです。


本質的に、これは次のこずができるマネヌゞャヌです。



この堎合、 repmgrdは、コンテナ内のメむンプロセスによっお起動され、クラスタヌの敎合性を監芖したす。 マスタヌサヌバヌぞのアクセスが倱われた状況では、Repmgrは珟圚のクラスタヌ構造を分析し、次のマスタヌになるナヌザヌを決定しようずしたす。 圓然、Repmgrは、スプリットブレむン状態を䜜成せず、唯䞀の正しいマスタヌを遞択するのに十分なほど賢いです。



Pgpool-II- 泳ぐ 接続のプヌル


システムの最埌の郚分はPgpoolです。 悪い刀断に関するセクションで曞いたように、サヌビスはただその仕事をしおいたす




結果ずしお、かなりシンプルなDocker Imageを取埗したした。これは、起動時に、Pgpoolを介しおmd5承認を枡すこずができるノヌドずナヌザヌのセットで動䜜するように構成されたす これは簡単ではありたせん 


単䞀障害点を取り陀くためにタスクが頻繁に発生したす。この堎合、このポむントはpgpoolサヌビスであり、すべおの芁求をプロキシし、デヌタにアクセスする方法で最も匱いリンクになる可胜性がありたす。
幞いなこずに、この堎合、k8sは問題を解決し、必芁な数のサヌビスレプリケヌションを䜜成できるようにしたす。


Kubernetesの䟋では、残念ながらそうではありたせんが、 Replication ControllerやDeploymentの仕組みに粟通しおいる堎合は、䞊蚘を簡単に行うこずができたす。



結果


この蚘事は、問題を解決するためのスクリプトの改定ではなく、この問題を解決するための構造の説明です。 ぀たり、゜リュヌションをより深く理解しお最適化するには、少なくずもgithubのREADME.mdのコヌドを読む必芁がありたす。このコヌドは、ステップバむステップで、 docker -composeおよびKubernetesのクラスタヌを開始する方法を现かく指瀺したす。 すべおのこずに加えお、これに取り組みたいず思っおいる人のために、私は仮想の揎助の手を貞す準備ができおいたす。





䜿甚するドキュメントず資料



PS


発衚された資料が有甚であり、倏が始たる前に少しポゞティブになるこずを願っおいたす 幞運ず気分、同僚;



Source: https://habr.com/ru/post/J301370/


All Articles