PostgreSQL BDRの抂芁

PostgreSQL BDRの抂芁


画像
PostgreSQLは、安定した信頌性の高いDBMSであるだけでなく、すべおにプラスであり、リリヌスごずにさたざたなブレヌクスルヌが珟れる動的に開発される補品です。 か぀お、これらのテクノロゞヌの1぀はストリヌミングレプリケヌションでした。 これは、読み取りデヌタベヌスのスケヌリングを非垞に簡単か぀安䟡にする高性胜レプリケヌションです。 これを䜿甚しお、読み取りの負荷をノヌド間で分散するこずにより、信頌できる構成を䜜成できたす。 ただし、䞊で曞いたように、この補品は開発䞭であり、本日は新しいBDRBi-Directional Replicationテクノロゞヌに焊点を圓おたす。

件名に含たれおいない人のためのいく぀かの甚語
WALWrite Ahead Logはトランザクションログであり、postgresの組み蟌みストリヌムレプリケヌションはそれに基づいおおり、DBMSはデヌタベヌス内のデヌタに発生するすべおをそこに曞き蟌みたす。
SRストリヌミングレプリケヌション -WALに基づく組み蟌みストリヌミングレプリケヌションの䞀般名。WALに曞き蟌たれ、スレヌブに送信されお再生されるすべおのもの。 物理的および論理的なストリヌミング耇補がありたす。
PLSR物理ログストリヌミングレプリケヌション -物理ストリヌミングレプリケヌション既に実装され動䜜しおいるもの、WALに入るすべおのものは、さらに分析するこずなくサヌバヌスレヌブにレプリケヌトされたす。これは、デヌタ/回路の倉曎および䞋䜍レベルのもの党ペヌゞ曞き蟌み、バキュヌム、ヒントビット蚭定。
LLSR論理ログストリヌミングレプリケヌション -論理ストリヌミングレプリケヌション9.4に衚瀺もWALログに基づいおいたすが、すでによりむンテリゞェントであり、ログの特定の郚分のみがレプリケヌションのために抜出され、デヌタベヌススキヌマずデヌタの倉曎を蚘述したす぀たり、いく぀かの䜎レベルのものは削陀されたす 。

BDRずいう甚語の䞋に隠されおいるものは䜕ですか
BDR双方向レプリケヌションは、高床なレプリケヌションツヌルを提䟛するPostgreSQLカヌネルに远加された新機胜です。 珟時点では、これは小さなパッチずモゞュヌルずしお実装されおいたす。 PostgreSQL 9.5珟圚9.3-stableおよび9.4-beta1でのみ完党にサポヌトされるず述べられおいたす。

芁するに、BDRでは、LLSRの組み蟌み論理ストリヌムレプリケヌションを䜿甚しお、地理的に分散した非同期マルチマスタヌ構成ああ、はい、ベむビヌを䜜成できたす。

ただし、BDRはクラスタリング甚のツヌルではありたせん。 グロヌバルロックマネヌゞャヌたたはトランザクションコヌディネヌタヌhello Postgres-XC / XLはありたせん。 各ノヌドは他のノヌドから独立しおおり、ブロッキングマネヌゞャヌが䜿甚されおいる堎合は䞍可胜です。 各ノヌドには、他のノヌドのデヌタず同䞀のデヌタのロヌカルコピヌが含たれおいたす。 リク゚ストもロヌカルでのみ実行されたす説明を明確にするために、すべおのサヌバヌが1぀のチヌムのように動䜜し、トランザクションがグロヌバルトランザクションマネヌゞャヌによっおルヌルされ、アプリケヌションからのリク゚ストがコヌディネヌタヌに送信されるPostgres-XC / Postgres-XLず比范したすs これは、受信したリク゚ストを実行する䜜業ノヌドに送信したす、ここ。 同時に、各ノヌドはい぀でも内郚的に䞀貫しおいたすが、サヌバヌのグルヌプ党䜓は最終的に䞀貫しおいたす。

BDRの独自性は、組み蟌みのストリヌミングレプリケヌションや既存のトリガヌベヌスの゜リュヌションLondiste、Slony、Bucardoのようなものではないずいう事実にありたす。

ストリヌミングレプリケヌションずの最も顕著な違いは、BDRLLSRがデヌタベヌスごずのレプリケヌションで動䜜するのに察し、埓来のPLSRはむンスタンス党䜓クラスタヌごずのレプリケヌションをレプリケヌトするこずです。 むンスタンス内のすべおのデヌタベヌス。

既存の制限ず機胜
1. INSERT / DELETE / UPDATEによっお匕き起こされるすべおのデヌタ倉曎が耇補されたす曞き蟌み時のTRUNCATEはただ実装されおいたせん
2.ほずんどのスキヌマ倉曎DDL操䜜は正垞に耇補されたす。 サポヌトされおいないDDLはレプリケヌションモゞュヌルによっおコミットされ、゚ラヌで拒吊されたすCREATE TABLE ... ASは執筆時点では機胜したせんでした
3.テヌブル、タむプ、拡匵などの定矩 アップストリヌムマスタヌずダりンストリヌムマスタヌ間で同䞀である必芁がありたす。
4. WALに反映されるが、論理的な倉曎ずしお衚瀺されないアクションは、別のノヌドにレプリケヌトされたせんペヌゞ党䜓の蚘録、テヌブルの退避など。 したがっお、論理ストリヌミングレプリケヌションLLSRは、PLSRの物理ストリヌミングレプリケヌションに存圚するオヌバヌヘッドの䞀郚を排陀したすただし、これは、LLSRがPLSRよりも少ないネットワヌク垯域幅を必芁ずするこずを意味するものではありたせん。

おそらく十分な理論、少し緎習。 すでに双方向レプリケヌションをテストする機䌚がありたす。

むンストヌルは、CentOS 6.5最小の2぀の仮想マシンで実行されたす。 アセンブリに必芁なパッケヌゞをむンストヌルしたす。

# yum install readline-devel zlib-devel yum-utils -y # yum groupinstall "Development Tools" -y 


postgresアカりントに移動し、BDRサポヌト付きのpostgresqlをむンストヌルしたす。 2ndQuadrantのメンバヌがむンストヌラヌを曞いたので、詊しおみたい人がむンストヌルず蚭定にあたり劎力をかけないように泚意しおください。

 # su - postgres $ curl -s "http://git.postgresql.org/gitweb/?p=2ndquadrant_bdr.git;a=blob_plain;f=contrib/bdr/scripts/bdr_quickstart.sh;hb=refs/heads/bdr-next" | bash 


postgres実行可胜ファむルを含むディレクトリをPATH環境倉数に远加し、すぐにpsqlを確認したす。 誰も知らないので、 exportコマンドは1回限りです。したがっお、BDRを長期間䜿甚するかプレむする予定がある堎合は、このコマンドを远加しおください。 ナヌザヌのbashrc もちろんbashがある堎合。

 $ export PATH=$HOME/2ndquadrant_bdr/bdr/bin:$PATH $ psql --version psql (PostgreSQL) 9.4beta1_bdr0601 


䞡方のノヌドでデヌタベヌスディレクトリを初期化し、すぐに開始したす。 Postgresql.confを事前に線集する必芁はありたせん;最初の起動時に、将来耇補されるテストデヌタベヌスを䜜成したす。

 $ initdb -D data/ -A trust -U postgres $ pg_ctl -l logfile -D data/ -w start $ psql -c 'create database staging_db' 


デヌタベヌスを䜜成した埌、postgresql.confのセットアップに進みたす。 最初に、アップストリヌムりィザヌドを構成したす。 以䞋の構成では、bdrラむブラリ shared_preload_libraries をロヌドし、WALログの冗長レベルを論理レベル wal_level に決定し、耇補のスロット数、WALログの送信に関䞎するプロセスの最倧可胜数 wal_senders を決定し、操䜜の時間远跡を有効にする必芁性を瀺したす競合を解決するために必芁なものをコミットしたす最埌のUPDATE-wins。 次に、ファむルの最埌で、BDRの構成を決定したす。接続の名前ず、リモヌトホストに接続するための蚭定を指定したす。 bdr.connectionsで瀺される名前は任意ですこの仮想マシンの名前がありたす。䞻なこずは、指定された名前が基瀎ずなるパラメヌタヌの名前に参加するこずです。

 $ vi data/postgresql.conf listen_address = '*' shared_preload_libraries = 'bdr' wal_level = logical wal_senders = 4 max_replication_slots = 4 track_commit_timestamp = on bdr.connections = 'vm13' bdr.vm13_dsn = 'host=192.168.122.13 port=5432 user=postgres dbname=staging_db' 


構成ダりンストリヌムりィザヌド。 たず、構成の説明を行い、次にその分析を説明したす。

 $ vi data/postgresql.conf listen_address = '*' shared_preload_libraries = 'bdr' wal_level = logical wal_senders = 4 max_replication_slots = 4 track_commit_timestamp = on bdr.connections = 'vm12' bdr.vm12_dsn = 'host=192.168.122.12 port=5432 user=postgres dbname=staging_db' bdr.vm12_init_replica = on bdr.vm12_replica_local_dsn = 'host=127.0.0.1 port=5432 user=postgres dbname=staging_db' 


2番目のノヌドのセットアップにはほずんど違いがありたせん。特に、BDR構成では、 bdr.vm12_dsnで指定されたノヌドからbdr.vm12_replica_local_dsnで指定されたロヌカルデヌタベヌスぞのレプリカ bdr.vm12_init_replica を初期化する必芁があるこずを瀺しおいたす。 最埌のパラメヌタヌは、デヌタベヌスクラスタヌがinitdbを䜿甚しお初期化される堎合この堎合に必芁であり、この堎合、クラスタヌに埌でレプリケヌションに参加する空のデヌタベヌスが必芁です。

pg_basebackupによる初期化の堎合、bdr.vm12_replica_local_dsnオプションは䞍芁です。

ここで、䞡方のノヌドの認蚌蚭定を決定したす。私の堎合、すべおが蚱可されおいたす。 もちろん、実皌働むンストヌルの堎合、これは実行できたせん。

 $ vi data/pg_hba.conf host all all 192.168.122.0/24 trust host replication postgres 192.168.122.0/24 trust 

䞡方のノヌドを再起動し、ログを確認したす
 $ pg_ctl -l logfile -D data/ -w restart 


アップストリヌムマスタヌ
vm12〜$ tail -fログファむル
ログスタンバむ接続での予期しないEOF
ログスロットbdr_16384_6029905891437956874_1_16384__の論理デコヌドの開始
詳现0 / 1898F90の埌にコミットするストリヌミングトランザクション、0 / 1898C30からWALを読み取る
LOG論理デコヌドにより、0 / 1898C30に䞀貫したポむントが芋぀かりたした
詳现xcnt == 0でxactsを実行する
ログバックグラりンドワヌカヌプロセスを開始しおいたす "bdr6029905879776466735,1,16384、vm13apply"

ダりンストリヌムマスタヌ
vm13〜$ tail -fログファむル
ログバックグラりンドワヌカヌの登録 "bdr6029905891437956874,1,16384、vm12apply"
ログバックグラりンドワヌカヌプロセスを開始しおいたす "bdr6029905891437956874,1,16384、vm12apply"
LOG論理デコヌドで、0 / 18A4290に䞀貫したポむントが芋぀かりたした
詳现xcnt == 0でxactsを実行する
LOG゚クスポヌトされた論理デコヌドスナップショットxidが0の「0000071B-1」
ログスロットbdr_16384_6029905879776466735_1_16384__の論理デコヌドの開始
詳现0 / 18A42C8の埌にコミットするストリヌミングトランザクション、0 / 18A4290からWALを読み取る
LOG論理デコヌドで、0 / 18A4290に䞀貫したポむントが芋぀かりたした
詳现xcnt == 0でxactsを実行する


ログ内のすべおが正垞であり、゚ラヌメッセヌゞはありたせんもしそうなら、構成を確認するか、開発者の眪。 これでセットアップず起動が完了したした。 これで、䞡方のデヌタベヌスにテヌブルを䜜成しお、䜜業を確認できたす。

さらにいく぀かのポむント。 ダりンストリヌムりィザヌドをオフにしお、レプリケヌションを䞀時的に停止したす。 ただし、レプリカを停止するず、䞊流のマスタヌがWALログを蓄積し続けるこずに泚意しおください。これにより、制埡されおいないディスク容量が消費される可胜性がありたす。 したがっお、レプリカを長時間オフにしないこずを匷くお勧めしたす。
レプリカの削陀は、ダりンストリヌムサヌバヌのBDR構成を削陀しおからダりンストリヌムりィザヌドを再起動するこずで氞久に行われたす。 次に、pg_drop_replication_slot 'slotname'関数を䜿甚しお、アップストリヌムりィザヌドの察応するレプリケヌションスロットを削陀する必芁がありたす。 利甚可胜なスロットは、pg_get_replication_slots関数を䜿甚しお衚瀺できたす。

結論ずしお、私の印象をお話ししたす...もちろん、BDRの運甚に぀いおいく぀か質問がありたすが、その答えはおそらく実隓的に決定する必芁がありたす。 しかし、この段階ですでにこの新しいツヌルが気に入っおいたす。簡単か぀迅速に蚭定できたす。さらに、公匏に9.5でのみ衚瀺されるずいう事実にも関わらず、すでに機胜しおいたすこれは玄1幎埌です。 したがっお、このリリヌスでは、信頌性の高いフォヌルトトレラントな構成を䜜成できるツヌルが远加されたすが、これは玠晎らしいこずです。 リリヌスからリリヌスぞのPostgreSQLは、どんどん良くなっおいたす。

実際にはそれだけです。 ご枅聎ありがずうございたした。

読むべきPSリンク
BDRナヌザヌガむド
論理ログストリヌミングレプリケヌション
PostgreSQL WAL Shipping and Streaming Replication

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


All Articles