PostgreSQL ず接続固有の曞き蟌み䞀貫性蚭定

蚘事の翻蚳はコヌスの孊生向けに特別に甚意されたした 「デヌタベヌス」。 この方向の開発に興味がありたすか? ご招埅したす オヌプンデヌでは、プログラム、オンラむン圢匏の特城、蚓緎埌に卒業生を埅぀胜力ずキャリアの芋通しに぀いお詳しく話したす。

PostgreSQL ず接続固有の曞き蟌み䞀貫性蚭定

PostgreSQL ず接続固有の曞き蟌み䞀貫性蚭定
Compose では倚くのデヌタベヌスを扱っおいるため、その機胜ず欠点に぀いおさらに詳しく知る機䌚が埗られたす。 新しいデヌタベヌスの機胜を愛するようになるず、私たちが長幎䜿っおきたより成熟したツヌルに同様の機胜があればどんなに玠晎らしいだろうず考えるこずがありたす。 私が PostgreSQL に期埅しおいた新機胜の XNUMX ぀は、クラスタヌ党䜓にわたる接続ごずの構成可胜な曞き蟌み䞀貫性でした。 そしお、結局のずころ、私たちはすでにそれを持っおいるので、今日はそれをどのように䜿甚できるかに぀いおの情報を共有したいず思いたす。

なぜ必芁なのですか

クラスタヌがどのように動䜜するかは、アプリケヌションによっお異なりたす。 たずえば、請求曞支払いアプリを考えおみたしょう。 クラスタヌ党䜓で XNUMX% の䞀貫性が必芁ずなるため、デヌタベヌスがすべおの倉曎が行われるのを埅機するように同期コミットを有効にする必芁がありたす。 ただし、アプリケヌションが急速に成長しおいる゜ヌシャル ネットワヌクの堎合は、XNUMX% の䞀貫性よりも高速な応答を奜むでしょう。 これを実珟するには、クラスタヌで非同期コミットを䜿甚したす。

劥協点を満たす

デヌタの䞀貫性ずパフォヌマンスの間でトレヌドオフを行う必芁がありたす。 PostgreSQL は、デフォルト構成が予枬可胜であり、予期せぬ事態が発生しないため、䞀貫性から遠ざかりたす。 次に、劥協点を芋おみたしょう。

トレヌドオフ 1: パフォヌマンス

PostgreSQL クラスタヌに䞀貫性が必芁ない堎合は、非同期で実行できたす。 曞き蟌みはクラスタヌ リヌダヌに察しお行われ、曎新は数ミリ秒埌にそのレプリカに送信されたす。 PostgreSQL クラスタヌに䞀貫性が必芁な堎合は、同期しお実行する必芁がありたす。 曞き蟌みはクラスタヌ リヌダヌに察しお行われ、クラスタヌ リヌダヌは曎新をレプリカに送信し、各レプリカが曞き蟌んだこずの確認を埅っおから、曞き蟌みを開始したクラむアントに成功した旚の確認を送信したす。 これらのアプロヌチの実質的な違いは、非同期方匏では XNUMX ぀のネットワヌク ホップが必芁であるのに察し、同期方匏では XNUMX ぀のネットワヌク ホップが必芁であるこずです。

トレヌドオフ 2: 䞀貫性

これら 1 ぀のアプロヌチでリヌダヌが倱敗した堎合の結果も異なりたす。 䜜業が非同期で実行される堎合、そのような゚ラヌが発生した堎合、すべおのレコヌドがレプリカによっおコミットされるわけではありたせん。 どれくらい倱われたすか アプリケヌション自䜓ずレプリケヌションの効率によっお異なりたす。 Compose レプリケヌションでは、レプリカ内の情報量がリヌダヌよりも 1 MB 少ない堎合、レプリカがリヌダヌになるこずができなくなりたす。぀たり、非同期操䜜䞭に最倧 XNUMX MB のレコヌドが倱われる可胜性がありたす。

これは同期モヌドでは発生したせん。 リヌダヌで障害が発生するず、リヌダヌで確認された曞き蟌みはレプリカでも確認される必芁があるため、すべおのレプリカが曎新されたす。 これが䞀貫性です。

同期動䜜は、䞀貫性ずパフォヌマンスのトレヌドオフにおいお䞀貫性が明らかに有利な課金アプリケヌションでは理にかなっおいたす。 このようなアプリケヌションにずっお最も重芁なのは、有効なデヌタです。 次に、リク゚ストにできるだけ早く応答しおナヌザヌの泚意を匕き続けるこずが䞻なタスクである゜ヌシャル ネットワヌクに぀いお考えおみたしょう。 この堎合、ネットワヌク ホップが少なく、コミットの埅ち時間が少ないパフォヌマンスが優先されたす。 ただし、考慮する必芁があるのはパフォヌマンスず䞀貫性の間のトレヌドオフだけではありたせん。

トレヌドオフ 3: クラッシュ

障害時にクラスタヌがどのように動䜜するかを理解するこずは非垞に重芁です。 XNUMX ぀以䞊のレプリカに障害が発生した状況を考えおみたしょう。 コミットが非同期で凊理される堎合、リヌダヌはレプリカが倱われるのを埅たずに機胜し続けたす。぀たり、曞き蟌みを受け入れお凊理したす。 レプリカがクラスタヌに戻るず、リヌダヌに远い぀きたす。 同期レプリケヌションでは、レプリカが応答しない堎合、リヌダヌには遞択の䜙地がなく、レプリカがクラスタヌに戻り、曞き蟌みを受け入れおコミットできるようになるたでコミット確認を埅ち続けたす。

トランザクションごずに XNUMX ぀の接続ですか?

すべおのアプリケヌションには、䞀貫性ずパフォヌマンスの異なるタむプの組み合わせが必芁です。 もちろん、それが完党に䞀貫性があるず私たちが想像しおいる料金支払いアプリや、ほずんど䞀時的な゜ヌシャル ネットワヌキング アプリの堎合は別です。 他のすべおの堎合では、䞀郚の操䜜は同期的でなければならず、䞀郚の操䜜は非同期的でなければならない堎合がありたす。 チャットに送信されたメッセヌゞがコミットされるたでシステムを埅機させたくない堎合もありたすが、同じアプリケヌションで支払いが凊理される堎合は埅機する必芁がありたす。

もちろん、これらすべおの決定はアプリケヌション開発者によっお行われたす。 各アプロヌチをい぀䜿甚するかに぀いお適切な決定を䞋すこずは、クラスタヌを最倧限に掻甚するのに圹立ちたす。 開発者が接続ずトランザクションの SQL レベルでそれらを切り替えるこずができるこずが重芁です。

実際にコントロヌルを確保する

デフォルトでは、PostgreSQL は䞀貫性を提䟛したす。 これはサヌバヌパラメヌタによっお制埡されたす synchronous_commit。 デフォルトではこの䜍眮にありたす onですが、他にも XNUMX ぀のオプションがありたす。 local, remote_write たたは off.

パラメヌタを蚭定する堎合 off ロヌカル システム䞊であっおも、すべおの同期コミットが停止されたす。 local パラメヌタヌはロヌカル システムの同期モヌドを指定したすが、レプリカぞの曞き蟌みは非同期で実行されたす。 Remote_write さらに詳しく蚀えば、レプリカぞの曞き蟌みは非同期で行われたすが、レプリカが曞き蟌みを受け入れおもディスクに曞き蟌んでいない堎合には、曞き蟌みが返されたす。

利甚可胜な遞択肢の範囲を考慮しお行動を遞択したす。 on – これらは同期録音です。遞択したす。 local ロヌカルのコミットは同期したたたにしお、ネットワヌク経由で非同期コミットを実行したす。

さお、これを蚭定する方法をすぐに説明したすが、次のように蚭定したず想像しおください。 synchronous_commit в local サヌバヌ甚。 パラメヌタを倉曎できないか考えたした synchronous_commit そしお、それが可胜であるだけでなく、これを行う方法が XNUMX ぀あるこずが刀明したした。 XNUMX ぀目は、接続のセッションを次のように蚭定するこずです。

SET SESSION synchronous_commit TO ON;  
// Your writes go here

セッション内での埌続の曞き蟌みはすべお、接続されたクラむアントに肯定的な結果を返す前に、レプリカぞの曞き蟌みを確認したす。 もちろん蚭定を倉曎しない限り synchronous_commit たた。 䞀郚を省略するこずもできたす SESSION デフォルト倀になるため、コマンドに含めたす。

XNUMX 番目の方法は、単䞀トランザクションの同期レプリケヌションを確実に取埗したい堎合に適しおいたす。 倚くの NoSQL 䞖代のデヌタベヌスにはトランザクションの抂念が存圚したせんが、PostgreSQL にはトランザクションの抂念が存圚したす。 この堎合、トランザクションを開始しおから蚭定したす。 synchronous_commit в on トランザクションの゚ントリを実行する前。 COMMIT 任意のパラメヌタ倀を䜿甚しおトランザクションをコミットしたす synchronous_commitただし、他の開発者が曞き蟌みが非同期ではないこずを理解できるように、倉数を事前に蚭定するこずが最善です。

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

デヌタベヌスが接続されたクラむアントに肯定的な応答を返す前に、すべおのトランザクションのコミットがレプリカに曞き蟌たれたこずが確認されるようになりたす。

PostgreSQL の構成

これたでは、次のような PostgreSQL システムを想像しおいたした。 synchronous_commitにむンストヌルされおいたす local。 これをサヌバヌ偎で珟実的にするには、XNUMX ぀のサヌバヌ構成オプションを蚭定する必芁がありたす。 もう XNUMX ぀のパラメヌタ synchronous_standby_names い぀になったら本領を発揮するだろう synchronous_commit 入りたす on。 どのレプリカが同期コミットに適栌であるかを決定し、次のように蚭定したす。 *これは、すべおのレプリカが関係しおいるこずを意味したす。 これらの倀は通垞、次のように蚭定されたす。 蚭定ファむル 以䞋を远加するこずで:

synchronous_commit = local  
synchronous_standby_names='*'

パラメヌタを蚭定するこずで synchronous_commit 意味に localでは、ロヌカル ディスクが同期を維持するシステムを䜜成したすが、ネットワヌク レプリカのコミットはデフォルトで非同期になりたす。 もちろん、䞊に瀺したように、これらのコミットを同期するこずに決めた堎合は別です。

開発をフォロヌしおいる堎合 ガバナヌプロゞェクト、最近の倉曎点に気づいたかもしれたせん (1, 2)、これにより、ガバナヌ ナヌザヌはこれらのパラメヌタヌをテストし、その䞀貫性を監芖できるようになりたした。

もう少し蚀葉を...

ほんの XNUMX 週間前なら、PostgreSQL をこれほど现かく埮調敎するのは䞍可胜だず私は蚀っおいたでしょう。 そのずき、Compose プラットフォヌム チヌムのメンバヌである Kurt が、そのような機䌚が存圚するず䞻匵したした。 圌は私の反察意芋をなだめ、PostgreSQL のドキュメントで次のこずを芋぀けたした。 次の:

PostgreSQL ず接続固有の曞き蟌み䞀貫性蚭定

この蚭定はい぀でも倉曎できたす。 トランザクションの動䜜は、コミット時に有効な蚭定によっお決たりたす。 したがっお、䞀郚のトランザクションは同期的にコミットし、他のトランザクションは非同期的にコミットするこずが可胜であり、䟿利です。 たずえば、XNUMX ぀を匷制するには multistatement パラメヌタのデフォルト倀が逆の堎合に非同期でコミットするトランザクションを蚭定したす。 SET LOCAL synchronous_commit TO OFF トランザクション䞭。

構成ファむルに察するこの小さな倉曎により、ナヌザヌが䞀貫性ずパフォヌマンスを制埡できるようになりたした。

出所 habr.com

コメントを远加したす