Welcome to pgpool -II page |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(last update: 2007/02/12) [English page] |
pgpool-IIとはpgpool-IIはPostgreSQL専用のミドルウェアで,PostgreSQLのデータベースクラ イアントとPostgreSQLサーバの間に割り込む形で動作し,PostgrSQLに以下のよ うな機能を追加します.
pgpool-IIはPostgreSQLバックエンドとフロントエンドの通信プロトコルを理解して その間を中継します.すなわち,PostgreSQLのデータベースアプリケーションか らはPostgreSQLサーバに,PostgreSQLからはデータベースアプリケーションに見 えるように設計されています.そのため,PostgreSQLそのものはもちろん,アプ リケーションの開発言語によらず,PostgreSQLのデータベースアプリケーション にほとんど手を加えることなく,pgpool-IIの機能が利用できます. pgpool-IIの稼働環境pgpool-IIは,Linuxをはじめ,SolarisやFreeBSDなどのほとんどのUNIX環境で動作 します.Windowsでは動きません.対応するPostgreSQLのバージョンは, PostgreSQLの6.4以降です.ただしパラレルクエリモードを使用するときは PostgreSQL 7.4以降をお使いください. pgpool-IIのインストールpgpool-IIのインストールには,gcc 2.9以上,およびGNU makeが必要です. また,pgpool-IIはlibpqを使用するので,ビルドを行うマシン上にlibpqがインストー ルされていることが必要です.
pgpool-IIの設定pgpool-IIの設定ファイルはデフォルトでは/usr/local/etc/pgpool.confおよび /usr/local/etc/pcp.confです.pgpool-IIは動作モードによって使用できる機能と, 必要な設定項目が異なります.
pcp.confの設定どの動作モードでも,pcp.confの設定は必要です.pgpool-IIには管理者がpgpool-IIの 停止や情報取得などの管理操作を行うためのインターフェイスが用意されていま す.そのインターフェイスを利用するためにはユーザ認証が必要になるので,そ のユーザ名とパスワードをpcp.confに登録します. pgpool-IIをインストールすると,$prefix/etc/pcp.conf.sampleができるので,それを $prefix/etc/pcp.confという名前でコピーします. cp $prefix/etc/pcp.conf.sample $prefix/etc/pcp.confpcp.confでは空白行や#で始まる行はコメントと見なされます. ユーザとパスワードは, ユーザ名:[md5暗号化したパスワード]のように指定します. [md5暗号化したパスワード]は,$prefix/bin/pg_md5コマンドで作成できます. ./pg_md5 foo acbd18db4cc2f85cedef654fccc4a4d8pcp.confは,pgpool-IIを動作させるユーザIDで読み取り可能になっていなければ なりません. pgpool.confの設定前述のように,動作モードによって,pgpool.confの設定項目が異なります. pgpool-IIをインストールすると,$prefix/etc/pgpool.conf.sampleができるので,それを $prefix/etc/pgpool.confという名前でコピーします. cp $prefix/etc/pgpool.conf.sample $prefix/etc/pgpool.confpgpool.confでは空白行や#で始まる行はコメントと見なされます. rawモード単にpgpool-IIを経由して接続するだけのモードです.単にPostgreSQLサーバへの接 続セッション数を制限したり,2台以上のPostgreSQLサーバを用意してフェイル オーバ動作をさせたいときに利用します.
rawモードにおけるフェイルオーバ動作についてrawモードにおいて,2台以上のPostgreSQLサーバを指定すると,フェイルオーバ が可能です.フェイルオーバでは,正常時にはbackend_hostname0で指定した PostgreSQLのみを使用し,ほかのサーバにはアクセスしません. backend_hostname0のサーバがダウンすると,次にbackend_hostname1で指定した サーバにアクセスをこころみ,成功すればそれを使用します.以下, backend_hostname2...でも同様になります. コネクションプールモードrawモードに加え,コネクションプーリングが利用できるようになります. 設定項目は,rawモードでの設定項目の他に以下を設定します.
コネクションプールモードにおけるフェイルオーバ動作についてrawモードと同様の動作をします. レプリケーションモードレプリケーションを有効にするモードです. rawモード,コネクションプールモードに加え,以下を設定します.
ロードバランスの条件についてload_balance_mode = true を設定した場合,以下の条件を満たした時に問い 合わせはロードバランスされます.
/*REPLICATION*/ SELECT ...と、SELECT の前にコメントを付けてください。 レプリケーションモードにおける縮退運転についてPostgreSQLサーバのうち,1台がダウンすると,そのサーバを切り離して縮退運 転に入ります.1台でもサーバが生き残っていれば,システムとしての運用を継 続できます. マスタースレーブモードmaster/slaveモードは,Slony-Iのような,master/slave式のレプリケーショ ンソフトにレプリケーションをまかせるモードです.このモードで使うために は,レプリケーションモードと同じように,DBノードのホスト情報 をセットし,master_slave_modeとload_balance_modeをtrueにします.このと き,問い合わせによってマスターDBだけに問い合わせが送られる場合と,DB ノードの間でロードバランスされて問い合わせが送られる場合があります. ロードバランスの条件はレプリケーションモードと同じです。 マスタースレーブモードでは,pgpool.confのreplication_modeをfalseに,master_slave_mode をtrueにします. パラレルモードパラレルクエリ機能が利用できるモードです.レプリケーションや負荷分散機能 は利用できません. システムDBの設定パラレルモードを利用するためには,システムDBを設定する必要があります. システムDBはデータを各PostgreSQLサーバで分割するためのルールを PostgreSQLのテーブルの形で保持します.システムDBはpgpoolが動作するホスト と同じホストに置く必要はありません.システムDBの設定はpgpool.confで行い ます.
システムDBの初期設定システムDBにスキーマとテーブルを作成します.初期設定用のスクリプトが $prefix/share/system_db.sqlにあるのでそれを利用します.ただし,このスク リプトではスキーマ名が"pgpool_catalog"となっているので,違うスキーマを使 う場合は適当に書き換えてください.また,データベース名として"pgpool"以外 を使う場合は以下を適当に読み替えてください. psql -f $prefix/share/system_db.sql pgpool dblinkのインストールパラレルモードではdblinkを使います。dblinkはPostgreSQLソースファイル ($POSTGRES_SRC)$(POSTGRES_SRC)/contrib/dblink にあります。$POSTGRES_SRC/contrib/dblink/README.dblinkを参考にシステム DBにdblinkをインストールしてください。 また、pgpoolデータベースに関数の登録が必要です。psql pgpool < $POSTGRES_SRC/contrib/dblink/dblink.sql コネクション数の設定パラレルモードでは、クエリによりシステムDBからdblink経由でpgpoolに接続 するので、想定される同時接続数以上のコネクションが必要になる場合があり ます。そのため、pgpool.confのnum_init_childrenには同時接続数より十分大 きい値を設定して下さい。 目安として以下の式でnum_init_childrenを設定してください。 num_init_children = 想定される同時接続数 * ( 1 + クエリの中で使われているテーブルの最大数) データ分割ルールの登録パラレルクエリの対象となるテーブルのデータ分割ルールはあらかじめ pgpool_catalog.dist_def というテーブルに登録しておきます. CREATE TABLE pgpool_catalog.dist_def( dbname TEXT, -- DB名 schema_name TEXT, --schema名 table_name TEXT, -- テーブル名 col_name TEXT NOT NULL CHECK (col_name = ANY (col_list)), -- 分散キー列名 col_list TEXT[] NOT NULL, -- tableの属性名 type_list TEXT[] NOT NULL, -- 属性のタイプ名 dist_def_func TEXT NOT NULL, -- 分散先のDBノードを決定する関数名 PRIMARY KEY (dbname,schema_name,table_name) );pgbenchのテーブルを分割するルールの例を示します. INSERT INTO pgpool_catalog.dist_def VALUES ( 'pgpool', 'public', 'accounts', 'aid', ARRAY['aid','bid','abalance','filler'], ARRAY['integer','integer','integer','character(84)'], 'pgpool_catalog.dist_def_accounts' ); INSERT INTO pgpool_catalog.dist_def VALUES ( 'pgpool', 'public', 'branches', 'bid', ARRAY['bid','bbalance','filler'], ARRAY['integer','integer','character(84)'], 'pgpool_catalog.dist_def_branches' ); INSERT INTO pgpool_catalog.dist_def VALUES ( 'pgpool', 'public', 'tellers', 'tid', ARRAY['tid','bid','tbalance','filler'], ARRAY['integer','integer','integer','character(84)'], 'pgpool_catalog.dist_def_tellers' ); ここで,pgpool_catalog.dist_def_accounts, pgpool_catalog.dist_def_branches,pgpool_catalog.dist_def_tellersは,引 数として分割キーの値を受け取り,どのPostgreSQLサーバ(「DBノード」と呼び ます)を0からの番号で返す関数です.ここでは,3台のDBノードにデータを分割 する関数の例を示します.
CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_accounts (val ANYELEMENT) RETURNS INTEGER AS '
SELECT CASE WHEN $1 >= 1 and $1 <= 30000 THEN 0
WHEN $1 > 30000 and $1 <= 60000 THEN 1
ELSE 2
END' LANGUAGE SQL;
CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_branches (val ANYELEMENT) RETURNS INTEGER AS '
SELECT 0
' LANGUAGE SQL;
CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_tellers (val ANYELEMENT) RETURNS INTEGER AS '
SELECT CASE WHEN $1 >= 1 and $1 <= 3 THEN 0
WHEN $1 > 3 and $1 <= 6 THEN 1
ELSE 2
END' LANGUAGE SQL;
クライアント認証(HBA)のための pool_hba.conf 設定方法PostgreSQLのpg_hba.confと同じようにpgpoolでもpool_config.confファイ ルを使ったクライアント認証がサポートされています。 pgpoolをインストールするとデフォルトインストール先の設定ファイルディ レクトリ"/usr/local/etc"にpool_hba.conf.sampleが一緒にインストール されます。このpool_hba.conf.sampleファイルをpool_hba.confとしてコピー し、必要であれば編集してください。デフォルトではpool_hbaによる認証は有 効になっています。 pool_hba.confのフォーマットはpg_hba.confのものとほとんど同じです。
local DATABASE USER METHOD [OPTION]
host DATABASE USER CIDR-ADDRESS METHOD [OPTION]
各フィールドで設定できる値の詳細は"pool_hba.conf.sample"を参照して ください。 以下はpool_hbaの制限事項です。
現在pgpoolはSSL接続をサポートしていないので"hostssl"は指定するこ とができません。 pgpoolはバックエンドサーバにあるユーザ情報を事前に知る事ができな いため、データベース名はpool_hba.confにある値のみと比較されます。 なのでグループに関する認証はpool_hbaで行うことができません。 上記の"samegroup"と同じ理由で、ユーザ名はpool_hba.confにある値の みと比較されます。グループに関する認証はpool_hbaで行うことはでき ません。 現在pgpoolはIPv6をサポートしていません。 これも上記の"samegroup"と同じ理由によるものです。pgpoolはバックエ ンドのユーザ/パスワード情報を持っていないので、バックエンドに保存 されているパスワードを使った認証を行うことができません。 ここで説明された機能、制限はクライアントとpgpool間で行われるクライ アント認証についてだということに注意してください。クラインアントは pgpoolのクライアント認証に成功したとしても、PostgreSQLによるクライ アント認証に成功しないと接続状態となりません。pool_hbaにとってはク ライアントに指定されたユーザ名やデータベース名 (例. psql -U testuser testdb)が実際にバックエンド上に存在するかどう かは問題ではありません。それがpool_hba.confの値とマッチするかどうか でチェックが行われます。 pgpoolが稼働するホスト上のユーザ情報を使ったPAM認証を利用することが できます。pgpoolをPAMサポート付きでビルドするにはconfigureオプショ ンに"--with-pam"を指定してください。
./configure --with-pam
実際にPAM認証を有効にするには、pool_hba.confで"pam"メソッドを設定す るのに加え、pgpoolのサービス設定ファイルをシステムのPAM設定ディレクト リ(通常は /etc/pam.d に作成する必要があります。サービス設定ファイ ルの例はインストールディレクトリの"share/pgpool.pam"を参考にしてく ださい。 pgpool-IIの起動と停止以上で設定が終わったので,各DBノードを起動し,必要ならばシステムDBも起動 してからpgpool-IIを起動します. pgpool [-c][-f config_file][-a hba_file][-F pcp_config_file][-n][-d]
pgpool [-f config_file][-F pcp_config_file] [-m {s[mart]|f[ast]|i[mmediate]}] stop
制限事項
認証・アクセス制御方式
レプリケーションモードで注意が必要な関数などpgpool-IIでは同じ問い合わせを送っても異なる結 果を返すようなデータ,たとえば乱数やトランザクションID,OID,SERIAL, シーケンス,CURRENT_TIMETSTAMPのようなものに関してはレプリケーショ ンはしますが,2台のホストでまったく同じ値がコピーされる保証はありま せん. CREATE TEMP TABLEで作成されたテーブルはフロントエンドがセッショ ンを終了しても削除されません.これは,コネクションプールの効 果でバックエンドから見るとセッションが継続しているように見え るからです.セッションの終了時に明示的にDROP TABLEするか,ト ランザクションブロックの中でCREATE TEMP TABLE ... ON COMMIT DROPをお使い下さい. クエリについてpgpool-II では扱うことができないクエリについて説明します。 マルチバイト文字について制限対象:全モード 現在の実装では、マルチバイト文字の変換処理を行いません。クライアントエ ンコーディング、バックエンドノードのサーバエンコーディング、システム DB のサーバエンコーディングを一致させるようにしてください。 拡張問い合わせプロトコル制限対象:パラレルモード JDBC ドライバなどのような拡張問い合わせプロトコルには対応していません。 必ず簡易問い合わせプロトコルを使用してください。 INSERT制限対象:パラレルモード INSERT を行う際には、分割ルールとなる値を DEFAULT にはできません。例え ばテーブル t に x というカラムがあり、x が分割ルールの対象カラムだった 場合には、 INSERT INTO t(x) VALUES (DEFAULT);はできません。また、分割ルールとなる値が関数呼び出しの場合も 対応していません。 INSERT INTO t(x) VALUES (func());必ず明示的に値を与える必要があります。 また、SELECT INTO や INSERT INTO ... SELECT という形式もサポートしてい ません。 UPDATE制限対象:パラレルモード 分割ルールとなるカラムを更新すると分割ルールに従ったデータの整合性が崩 れる可能性があります。pgpool-II では特にデータの再配置ということは行い ません。 もし制約違反などにより一部のノードでエラーになった場合にロールバックす ることはできません。 WHERE 句にサブクエリや関数呼び出しがある場合には正しく動かない可能性が あります。 例:UPDATE branches set bid = 100 where bid = (select max(bid) from beances); SELECT ... FOR UPDATE制限対象:パラレルモード WHERE 句にサブクエリや関数呼び出しがある場合には正しく動かない可能性が あります。 例:SELECT * FROM branches where bid = (select max(bid) from beances) FOR UPDATE; COPY制限対象:パラレルモード COPY BINARY には対応していません。また、ファイルからのコピーにも対応し ていません。COPY FROM STDIN と COPY TO STDOUT のみ対応しています。 ALTER/CREATE TABLE について制限対象:パラレルモード pgpool に情報を更新させるためには、pgpool を再起動する必要があります。 トランザクション制限対象:パラレルモード トランザクション中に発行される SELECT は dblink を経由する場合には別ト ランザクションになります。以下に例を示します。 BEGIN; INSERT INTO t(a) VALUES (1); SELECT * FROM t ORDER BY a; <-- 上の INSERT した値は見えない END; また制約違反などにより一部のノードでエラーになった場合にロールバックすることはできません。 View/Rule制限対象:パラレルモード View や Rule は各ノードに同じ内容が定義されます。 SELECT * FROM a, b where a.i = b.iのような JOIN の場合に、a と b はノード内でのみ処理を行い、その結果を 統合します。ノードをまたがった JOIN を行う View を作成することはできま せん。Rule についても同様になります。 関数/トリガについて制限対象:パラレルモード 関数は各ノードに同じ内容が定義されます。関数内で JOIN や他のノードのデー タ操作を行うことはできません。 デッドロックについて制限対象:パラレルモード ノード間をまたがるデッドロックを検出することができません。
例:tellersテーブルは以下のルールで分割されている。
tid <= 10 ノード 0
tid >= 10 ノード 1
A) BEGIN;
B) BEGIN;
A) SELECT * FROM tellers WHERE tid = 11 FOR UPDATE;
B) SELECT * FROM tellers WHERE tid = 1 FOR UPDATE;
A) SELECT * FROM tellers WHERE tid = 1 FOR UPDATE;
B) SELECT * FROM tellers WHERE tid = 11 FOR UPDATE;
この場合、単一のノードではデッドロックを検知できないため、pgpool は待
たされた状態になります。この現象は SELECT FOR UPDATE 以外にも行ロック
を獲得するクエリで発生する可能性があります。回避策としましては、
replication_timeout を設定するようにしてください。
また、あるノードでデッドロックが発生した場合は、各ノードのトランザクショ ンの状態が異なる状況になります。そのため、デッドロックを検知した時点で 以下のログを出力して pgpool は該当のプロセスを終了させます。 pool_read_kind: kind does not match between master(84) slot[1] (69) スキーマについて制限対象:パラレルモード public 以外のスキーマに属すようなオブジェクトの参照は必ず スキーマ.オブジェクトと指定するようにしてください。 set search_path = xxxを指定し、スキーマ名を省略すると、pgpool がどの分散ルールを適用するか 判断できません。 システム DB分割ルールpgpool-II では分割ルールの対象のカラムは 1 つのみとします。x と y の OR 条件などといったものには対応していません。 ビルドに必要な環境libpqpgpool-II では libpq をリンクします。libpq のバージョンは 2.0 の場合、 configure に失敗します。必ず libpq 3.0 (PostgreSQL 7.4) をリンクするよ うにしてください。また、SystemDB のバージョンも PostgreSQL 7.4 以降が 必須になります。 クエリキャッシュ現在のクエリキャッシュの実装では、キャッシュの無効化を手動で行う必要が あります。 pgpool との互換性pgpool の場合 /*STRICT*/ など、pgpool を制御する特殊なコメントを書ける ようになっていました。pgpool-II の現在の実装では特殊コメントを無視しま す。 リファレンスPCPコマンドリファレンスPCPコマンド一覧pgpool-IIを操作するUNIXコマンドとして、以下のものがあります。 * pcp_node_count - ノード数を取得する * pcp_node_info - ノード情報を取得する * pcp_proc_count - プロセス一覧を取得する * pcp_proc_info - プロセス情報を取得する * pcp_systemdb_info - システムDB情報を取得する * pcp_detach_node - ノードを切り離す * pcp_attach_node - ノードを復帰させる * pcp_stop_pgpool - pgpool-IIを停止させる 共通引数全てのコマンドには共通する引数があります。これは接続するpgpool-IIの情報や認証 情報などです。
ex)
$ pcp_node_count 10 localhost 9898 postgres hogehoge
第一引数 - タイムアウト値
秒数でタイムアウト値を指定します。この時間内にpgpool-IIから応
答がない場合はコネクションを切断して終了します。
第二引数 - pgpool-IIが稼動しているホスト名
第三引数 - pgpool-IIが受け付けているポート番号
第四引数 - PCPユーザ名
第五引数 - PCPパスワード
PCPユーザ名とパスワードは ./configure 時に --prefix で指定した 'インストールディレクトリ/etc' にある pcp.conf 内に記述されているものを指定 します。pcp.conf ファイルの場所がデフォルト以外の場所にある場合、pgpool の -F オプションでその位置を指定することができます。 パスワードはコマンドに渡す時点でmd5化されている必要はありません。 コマンド | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||