summaryrefslogtreecommitdiff
path: root/README.euc_jp
blob: 3e8c8d952992a3051d239e2efb75633168c9af68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
$Header$

pgpool version 3.4.1(lainihi) README

1. pgpoolとは

   pgpoolは,PostgreSQL専用のいわゆる「コネクションプール」サーバで, 
   PostgreSQLクライアントとPostgreSQLサーバの間で両者の仲立ちをします.
   pgpoolを利用することによって,PostgreSQLサーバへの接続オーバヘッド
   を低減でき,システム全体のスループットを向上させることができます.

   PostgreSQLのクライアントがpgpoolに接続すると,初回はPostgreSQLへの
   接続がpgpoolから確立されます.クライアントが終了してもPostreSQLへの
   接続は切断されることなく残り,次回の同じユーザ,データベースで
   pgpoolへの接続があったときにはこのPostgreSQLへの接続が再利用されま
   す.

   pgpoolには障害時に「フェイルオーバ」(コネクションプールモード時)あ
   るいは「縮退運転」(レプリケーションモード時)の機能があるので,シ
   ステムのダウンタイムを最小限に押さえることができます.

   なお,フェイルオーバや縮退運転は何か障害が起きたことをトリガにして
   起動されますが,メインテナンスなどのために意図的にフェイルオーバや
   縮退運転モードに移行することもできます.詳細は「10. スイッチオーバ」
   をご覧下さい.

1.1 レプリケーションについて

   更にpgpoolは「レプリケーション」も可能です.レプリケーションを使用
   することにより,物理的に2台のディスクにリアルタイムでハードディスク
   のバックアップを取ることができ,片方にディスク障害が発生しても運用
   を継続することができます.pgpoolのレプリケーションは同じ更新系の問
   い合わせを2台のサーバに送信することによって行いますので,いわゆる同
   期レプリケーションの一種ということになります.なお,今のところ,レ
   プリケーションは2台のみで,3台以上のレプリケーションはできません.

   このような実装ですので,pgpoolでは同じ問い合わせを送っても異なる結
   果を返すようなデータ,たとえば乱数やトランザクションID,OID,SERIAL,
   シーケンス,CURRENT_TIMETSTAMPのようなものに関してはレプリケーショ
   ンはしますが,2台のホストでまったく同じ値がコピーされる保証はありま
   せん.

   ただし,SERIAL型については,後述の"insert_lock"を使うことによって対
   応可能です.詳細は「6. pgpoolの設定方法」のinsert_lockの項を参照し
   てください.

   レプリケーション中に障害が発生すると,自動的に縮退運転を行います.
   例を示します.今,

   masterサーバ(backend_host_name, backend_portで指定)
   secondaryサーバ(secondary_backend_host_name, secondary_backend_portで指定)

   の2台でレプリケーションを行っていたとします.

   1) 正常時

      master, secondaryに同一のデータがレプリケーションされる.

   2) masterに障害が発生

      masterを切り離してsecondaryのみで運用を継続

   3) secondaryに障害が発生

      secondaryを切り離してmasterのみで運用を継続

   4) masterとsecondaryのデータ不一致を検出

      pgpoolは全部ではありませんが,要所要所でmasterのsecondaryのデー
      タが一致しているかどうかをチェックしています.たとえば,同じテー
      ブルなのに列数が異なるようなケースは,異常と見なされます.このよ
      うな異常が検出されると,secondaryのみで運用を継続します.

   縮退運転に入ると以後masterとsecondaryのデータは一致しない状態になる
   可能性があります.再度レプリケーション運転に入る前に,一旦両系を停
   止し,rsyncなどを使って手動でデータベースクラスタの状態を一致させて
   ください.この際,障害の状況によっては必ずしもmaster側が最新とは限
   らないので注意してください.master,secondaryのどちらで縮退運転をし
   ているかは,pgpoolにpsqlなどから"show pool_status"コマンドを投げる
   ことで確認できます(詳細後述).


   レプリケーション時の SELECT については、replicate_select の値によっ
   て挙動が異なります。false の場合はマスタにのみ送信します。ただし、
   負荷分散を設定している場合はどちらかにランダムで送信します。詳細は
   「1.4 負荷分散(load balance)について」をご覧ください。副作用を伴な
   う関数呼び出しがある場合は、

      /*REPLICATION*/ SELECT ...

   と、SELECT の前にコメントを付けてください。なお、SELECT nextval も
   しくは SELECT setval で始まるクエリは自動的にレプリケーションさせま
   す。true の場合はすべての SELECT をレプリケーションさせます。

1.2 レプリケーションにおける制限事項

   まったく同じ問い合わせを2つのサーバに発行することによってレプリケー
   ションを行うpgpoolでは,単体のPostgreSQLでは発生しないデッドロック
   状態が起こり得ます.その理由は,pgpoolでは,問い合わせを

   1) 問い合わせのリクエストを master, secondary の順に投げる

   2) 結果の待ち合わせを master, secondary の順に行う

   というように処理するからです.デッドロックの例を示します.ここでは,

   BEGIN;
   LOCK TABLE t1;
   END;

   という単純なトランザクションを考えます.以下の図では,begin, endは
   省略しています.また,2つのセッションsession 0とsession 1が進行して
   いるものとします.

	    master		       secondary
   session 0	session 1	session 0   session 1
   ------------------------------------------------------
   lock	
		lock
					     lock
				lock
   ------------------------------------------------------

   session1のmasterはsession0のmasterを待ち続けますが,一方secondaryに
   おいては,session1が先にロックを獲得したため,session0がsession1を
   待ち続けています.このようにしてお互いにお互いを待ち続けるデッドロッ
   ク状態が発生します.

   pgpoolでは,この問題に対処するため,以下の2つの方法を用意しています.

   1) pgpool.confのreplication_strictをtrueにする

      こうすると,常にsecondaryはmasterの問い合わせ処理が終わってから
      問い合わせを処理するようになります.デッドロックが発生する恐れは
      なくなりますが,masterとsecondaryの並列処理ができなくなるため,
      パフォーマンスが落ちる可能性がありますが,もっとも安全な方法です.
      pgpoolはデフォルトでこのモードで動作します.

      なお,ある問合わせのみstrictモードにしたくない場合は,
      /*NO STRICT*/コメントを問合わせの先頭にいれてください.

   2) デッドロックが発生する可能性のある問い合わせの先頭に特別なキーワー
      ド「/*STRICT*/」を入れる

      たとえば上の例で言うと

      /*STRICT*/ LOCK TABLE t1;

      とします.こうすると,この問い合わせだけはmasterとsecondaryが並
      列処理しなくなるので,デッドロックが発生しません./*STRICT*/が記
      入されていない他の問い合わせは並列処理されるので,効率が良くなり
      ます.

      なお,PostgreSQLでは,/*から*/まではコメントとして扱われるので,
      DB処理に影響はありません.

1.3 replication_timeoutについて

   万が一デッドロックが発生したときに備え,replication_timeoutを設定す
   ることができます.単位はミリ秒(1/1000秒)です.もしmasterの処理が終
   わってからsecondaryがreplication_timeout以内に応答を返さない場合は,
   該当セッションを強制終了することによってデッドロック状態を解消しま
   す.

   なお,masterに比べ,secondaryの性能が著しく劣る場合にはsecondaryの
   応答が遅れ,デッドロックではないのにタイムアウトになることがありま
   す.この場合は適当にreplication_timeoutを大きくするか,
   replication_strictをtrue にします.

   注意: replication_strictがtrueの場合にはこのパラメータは無視されま
   す.

1.4 負荷分散(load balance)について

   レプリケーションが有効な場合,pgpool.confの"load_balance_mode"を
   trueに設定することによりSELECT文の負荷分散が可能です.以下の条件の
   もとでランダムにマスタとセカンダリにSELECT文が発行され,検索性能の
   向上が期待できます.

   1) プロトコルバージョンがV3であること.すなわちバックエンドが
      PostgreSQL 7.4以後であること

   2) SQL文が正確に行頭からSELECT(あるいはselect)で始まっていること(た
      だし、SELECT nextval と SELECT setval の場合は除く)

   3) SELECT文が明示的なトランザクションブロック内で実行されていないこ
      と

   なお,当然のことながらSELECT FOR UPDATEや,更新を伴う関数を呼び出す
   ような副作用のあるSELECT文を使用している場合は問題が起きます.この
   ような場合はload_balance_mode"をfalseにするか,SELECT文の行頭にスペー
   スや/*NO LOAD BALANCE*/のようなコメントを挿入して負荷分散されないよ
   うにしてください.

   ちなみに,regression testにはそのようなSELECT文が含まれているため
   (たとえばconstraintsテストの「SELECT 'one' AS one,
   nextval('insert_seq');」)ロードバランスモードが有効になっていると
   regression testが通りません.

2. pgpoolのメリット

   世の中にはpgpool以外にもデータベース用のコネクションプールサーバが
   存在しますが,それらと比較した場合のpgpoolのメリットを説明します.

   (1) アプリケーションの変更の必要がありません

       コネクションプール用のソフトには専用の特別なAPI(アプリケーショ
       ンプログラムインターフェイス)を経由しないと利用できないものもあ
       りますが,pgpoolはクライアントから見ると普通のPostgreSQLサーバ
       に見えるため,そのようなAPIを使用する必要がありません.今まで
       PostgreSQLを使っていたアプリケーションは,接続先のポート番号や
       ホストを変更するだけですぐにpgpoolが利用できるようになります.
       (ただし,いくつか制限事項があります)

   (2) どの言語でも使えます

        pgpoolはPostgreSQLのクライアントやアプリケーションから見ると普
	通のPostgreSQLサーバに見えます.したがってPHP, Perl, Javaなど
	各言語用のPostgreSQL用APIがそのまま使えます.

   (3) prefork型アーキテクチャ

       Apacheなどと同様,あらかじめサーバプロセスをforkしておくアーキ
       テクチャを採用.コネクション要求の度にサーバプロセスをforkする
       方式に比べ,オーバヘッドが少なく,応答性が優れています.

   (4) PostgreSQLへの接続数の制限が可能

       PHPからPostgreSQLにアクセスする場合,同時接続数がApacheサーバの
       プロセス数と等しくなるため,PostgreSQLが過負荷になりがちです.
       pgpoolではPostgreSQLへの接続数はpreforkしたpgpoolのサーバ数に
       よって制限されるため,PostgreSQLがもっとも効率良く動作する同時
       接続数を維持することができます.

   (5) フェイルオーバー機能を装備

       pgpoolには「フェイルオーバー」の機能があります.すなわち,
       PostgreSQLサーバを2台指定しておき,1台がダウンした際に自動的に2
       台目のサーバに切り替えることができます.フェイルオーバー機能に
       より,システムのダウンタイムを最小限に押さえることができます.
       ただし,2台のPostgreSQLサーバのデータを同期させる機能はありませ
       んので,必要ならばdbmirrorなどのレプリケーションパッケージを併
       用してください.

       また,フェイルオーバーの際にはクライアントとのコネクションが切
       断されます.したがって,フェイルオーバー後はクライアントは再度
       pgpoolに接続する必要があります.

   (6) レプリケーション機能を装備.ラージオブジェクトのレプリケーショ
       ンも可能です.

   (7) 負荷分散機能を装備.SELECT文の負荷分散ができます.

3. pgpoolのデメリット

   (1) オーバヘッドがあります

       PostgreSQLに対するアクセスはすべていったんpgpoolを経由するため,
       その分のオーバヘッドがあります.オーバヘッドの量は条件によって
       異なるので一概には言えませんが,私がpgbenchで試した限りでは7-
       15%程度の性能劣化が認められました.

   (2) すべてのlibpqプロトコルがサポートされていません

       現時点では,以下の機能がサポートされていません.

       o trust, clear text password, pam以外の認証方式(レプリケーショ
        ンモードまたはマスタ/スレーブモード時)

       o trust, clear text password, crypt, md5, pam以外の認証方式(非
        レプリケーションモード時)

       o pgpoolに対して,pg_hba.confによるアクセス制御はサポートされて
         いません(pgpoolが接続するPostgreSQLではもちろんpg_hba.confに
         よるアクセス制御が有効になります)

   (3) pgpool自体にpg_hba.confによるアクセス制限はかかりません

       TCP/IPコネクションを許可している場合(後述の
       allow_inet_domain_socketが1の場合),pgpool自体にはどのホストか
       らでも接続できてしまいます.必要ならばiptablesなどを使ってアク
       セス制限をかけて下さい(もちろん,pgpoolが接続するPostgreSQLサー
       バではpg_hba.confによるアクセス制限が有効です).

   (5) 制限事項

       o レプリケーションにおける制限事項については1.2をご覧下さい.

       o template1, regressionという名前のデータベースはコネクションプー
         ルの対象になりません.

       o CREATE TEMP TABLEで作成されたテーブルはフロントエンドがセッショ
         ンを終了しても削除されません.これは,コネクションプールの効
         果でバックエンドから見るとセッションが継続しているように見え
         るからです.セッションの終了時に明示的にDROP TABLEするか,ト
         ランザクションブロックの中でCREATE TEMP TABLE ... ON COMMIT
         DROPをお使い下さい.

4. pgpoolの稼働環境

   pgpoolは,libpqプロトコルのversion 2(PostgreSQL 6.4-7.3.xで採用)お
   よびversion 3(PostgreSQL 7.4以降)に対応していますが,セッションの終
   了時に送出できる問い合わせに違いがあります.PostgreSQLのバージョン
   に応じて以下のようにpgpool.confを設定してください.

   7.1あるいはそれ以前のバージョン:
   reset_query_list = 'ABORT'

   7.2.x:
   reset_query_list = 'ABORT; RESET ALL'

   7.3以降:
   reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'

   に変えてください(最後はpgpool.confのデフォルト値なので,実際には変
   更の必要はありません).

   version 2プロトコルとversion 3のフロントエンドとバックエンドが混在
   していても問題ありません.pgpoolはプロトコルバージョンを自動判別し,
   適切に処理します(ただし,マスタとセカンダリのPostgreSQLのプロトコ
   ルバージョンは合わせる必要があります).

   対応するOSは特に制限がありません.以下,動作が確認された環境です.

   Vine Linux 4.0 (kernel 2.6.16-0vl166)/PostgreSQL 8.2.1
   Vine Linux 3.2 (kernel 2.4.31-0vl1.10)/PostgreSQL 8.1.1
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 8.1.0
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 8.0.3
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 8.0
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 7.4.5
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 7.4.3
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 7.4.2
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 7.3.7
   Vine Linux 2.6r4 (kernel 2.4.22-0vl2.12)/PostgreSQL 7.3.6
   Vine Linux 2.6r3 (kernel 2.4.22-0vl2.8)/PostgreSQL 7.4.2
   Vine Linux 2.6r3 (kernel 2.4.22-0vl2.8)/PostgreSQL 7.3.6
   Vine Linux 2.6CR (kernel 2.4.20-0vl29.1)/PostgreSQL 7.3.4
   RedHat Linux 9.0 (kernel 2.4.20)/PostgreSQL 7.3.6
   RedHat Linux 8.0 (kernel 2.4.18-14)/PostgreSQL 7.3.2
   RedHat Linux 6.2 (kernel 2.2.24)/PostgreSQL 7.2.1
   FreeBSD 5.2.1-RELEASE(AMD64)/PostgreSQL 7.4.3
   FreeBSD 5.2.1-RELEASE/PostgreSQL 7.3?
   FreeBSD 4.7-RELEASE/PostgreSQL 7.2.4 
   FreeBSD 4.2-RELEASE/PostgreSQL 7.3.2
   Sparc/Solaris8/PostgreSQL 7.3
   Sparc/Solaris8/PostgreSQL 7.4.3

5. pgpoolのインストール方法

   (1) pgpoolのインストール

      ./configure
      make
      make install

      でインストールが完了します(GNU makeが必要なので,FreeBSDなどでは
      makeをgmakeに読み替えてください).デフォルトのインストール先は,
      /usr/local以下で以下のようなファイルがインストールされます.

      /usr/local/bin/pgpool			プログラム本体
      /usr/local/etc/pgpool.conf.sample		設定ファイルサンプル
      /usr/local/etc/pool_hba.conf.sample	HBA設定ファイルサンプル

      インストール先を変更する場合は,configure --prefix=path... とし
      てください.

6. pgpoolの設定方法

   pgpoolの設定パラメータはpgpool.confで設定します.pgpool.conf.sample
   をpgpool.confにコピーし,設定を行ってください.

   pgpool.confの書式は以下です.

   (1) 設定項目 = 値 のペアで設定を行います.

   (2) 値が数値の場合はそのまま数字を書きますが,文字列の場合は原則と
       して'(単一引用符)で括ります.例:'foo' 空白が含まれない場合は単
       一引用符を省略しても構いません.論理値の項目については,true(真),
       false(偽),1(真),0(偽)で記述します.

   (3) 空白行は無視されます.

   (4) 行の先頭に"#"(シャープ)がある行は無視されます.コメント行として
       お使い下さい.

   pgpool.confには以下のような設定項目があります.

   listen_address

   TCP/IPコネクションを受け付けるアドレスをホスト名またはIPアドレスで
   指定します.「*」を指定するとすべてのIPインタフェースからのコネクショ
   ンを受け付けます.「''」を指定するとTCP/IPコネクションを受け付けま
   せん.デフォルト値は「localhost」です.
   
   UNIXドメインソケット経由のコネクションは常に受け付けます.

   なお,以前のバージョンと互換性を保つため,allow_inet_domain_socket
   ディレクティブを使用することもできます.

   allow_inet_domain_socket = 1 は, listen_addresses = '*' と同じで,
   allow_inet_domain_socket = 0 は listen_addresses = '' と同じです.

   port

   pgpoolがコネクションを受け付けるポート番号です.デフォルト値は9999
   です.

   socket_dir

   pgpoolがコネクションを受け付けるUnix domain socketディレクトリです.
   デフォルト値は'/tmp'です.

   backend_host_name

   pgpoolが接続するPostgreSQLサーバ(postmaster)が動いているホストの名
   前(文字列)です.デフォルト値は''で,この場合UNIXドメインソケットを
   通じて接続を行います.''以外ならばホスト名と見なし,INETドメインソ
   ケット経由で接続します.この場合,PostgreSQL側ではTCP/IPコネクショ
   ンを受け付けるようになっていること,またpg_hba.confが適切に設定され
   ていてpgpoolからの接続を許可するようになっている必要があります
   (PostgreSQLから見ると,pgpoolはクライアントに見えることを思い出し
   てください.).

   backend_port

   PostgreSQLサーバのポート番号です.デフォルト値は5432です.

   backend_socket_dir

   PostgreSQLサーバのUnix domain socketのディレクトリです.デフォルト値は'/tmp'です.

   secondary_backend_host_name

   フェイルオーバー機能またはレプリケーション機能を利用する場合,2台目
   のPostgreSQLサーバのホスト名を指定します.デフォルト値は''です.

   secondary_backend_port

   フェイルオーバー機能またはレプリケーション機能を利用する場合,2台目
   のPostgreSQLサーバのポート番号を指定します.0を指定するとフェイルオー
   バしません.デフォルト値は0です.

   num_init_children

   preforkするpgpoolのサーバプロセスの数です.デフォルト値は32になって
   います.

   なお,問い合わせのキャンセルを行うと通常のコネクションとは別に新た
   なコネクションが張られます.したがって,すべてのコネクションが使用
   中の場合は問い合わせのキャンセルができなくってしまうので,ご注意下
   さい.問い合わせのキャンセルを必ず保証したい場合は,想定されるコネ
   クション数の倍の値を設定することをおすすめします.

   max_pool

   pgpoolの各サーバプロセスがキープするPostgreSQLへの最大コネクション
   数です.pgpoolは,ユーザ名,データベースが同じならばコネクションを
   再利用しますが,そうでなければ新たにPostgreSQLへのコネクションを確
   立しようとします.したがって,ここでは想定される[ユーザ名:データベー
   ス名]のペアの種類の数だけをmax_poolに指定しておく必要があります.も
   しmax_poolを使いきってしまった場合は一番古いコネクションを切断し,
   そのスロットが再利用されます.

   max_poolのデフォルト値は4です.

   なお,pgpool全体としては,num_init_children*max_pool 分だけ
   PostgreSQLへのコネクションが張られる点に注意してください.

   child_life_time

   pgpoolの子プロセスの寿命です.アイドル状態になってから
   child_life_time秒経過すると,一旦終了して新しいプロセスを起動します.
   メモリーリークその他の障害に備えた予防措置です.child_life_timeのデ
   フォルト値は300秒,すなわち5分です.0を指定するとこの機能は働きませ
   ん(すなわち起動しっ放し).なお,まだ一度もコネクションを
   受け付けていないプロセスにはchild_life_timeは適用されません.

   connection_life_time

   コネクションプール中のコネクションの有効期間を秒単位で指定します.0
   を指定すると有効期間は無限になります.connection_life_timeのデフォ
   ルト値は0です.

   authentication_timeout

   認証処理のタイムアウト時間を秒単位で指定します。0 を指定するとタイ
   ムアウトを無効にします。authentication_timeout のデフォルト値は 60
   です。

   child_max_connections

   各pgpool子プロセスへの接続回数がこの設定値を超えると、その子プロセ
   スを終了します。child_life_timeやconnection_life_timeが効かないくら
   い忙しいサーバで、PostgreSQLバックエンドが肥大化するのを防ぐのに有
   効です。

   logdir

   pgpoolの各種ログファイルを格納するディレクトリです.現在のところ,
   pgpool.pidというプロセスIDを格納するファイルだけが作られるようになっ
   ています.logdirのデフォルト値は'/tmp'です.

   replication_mode

   レプリケーションモードで動作させる場合はtrueを指定してください.デ
   フォルト値はfalseです.

   replication_strict

   このオプションをtrueにすると,masterの問い合わせ処理の完了を待って
   からsecondaryの処理に移ります.デッドロックの危険性はなくなりますが,
   masterとsecondaryの間で問い合わせの並列処理を行わなくなるので性能が
   低下する場合もあります.

   なお,すべての問い合わせではなくて,SQLのコメントを使って一部の問い
   合わせのみstrict動作させることもできます.詳細は1.2を参照してくださ
   い.

   このオプションのデフォルト値はtrueです.

   replication_timeout

   replication_strictがfalseのときにデッドロックを監視するためのタイム
   アウト時間をミリ秒単位で指定します.デフォルト値は5000,すなわち5秒
   です.0を指定するとタイムアウトしなくなります.

   load_balance_mode

   trueを指定するとレプリケーションモードの際に,SELECT文をマスタとセ
   カンダリの間でロードバランスします.デフォルト値はfalseです.

   weight_master
   weight_secondary

   ロードバランスモードの時に,マスタとセカンダリにSELECTを振り分ける
   「重み」を定義します.マスタとセカンダリのハードウェア性能に差があ
   るときに有用です.

   重みはweight_masterとweight_secondaryに設定された数値の比率で決定さ
   れます.たとえば,

   weight_master = 0.5
   weight_secondary = 0.5

   や

   weight_master = 1
   weight_secondary = 1

   はいずれもマスタとセカンダリの重みが等しくなります(デフォルトです).

   weight_master = 1
   weight_secondary = 0.5

   ならマスタの方にはセカンダリの2倍の確率でSELECTが割り振られます.

   weight_master = 1
   weight_secondary = 0
   
   という設定も可能で,この場合はマスタだけにSELECTが割り振られるよう
   になります.もちろん,INSERTなどの更新系の問い合わせはマスタとセカ
   ンダリの両方に常に投げられます.

   replication_stop_on_mismatch

   trueを指定するとマスタとセカンダリの間でデータの不一致があった場合
   に強制的に縮退運転に入ります.このオプションがfalseの場合は,該当の
   問い合わせを強制的に終了するだけに留めます.デフォルト値はfalseです.

   replicate_select

   true を設定するとロードバランスされない SELECT 文をレプリケーション
   させます。これは pgpool 3.2 までの挙動と同じになります。false を設
   定すると SELECT 文をマスタのみに送信します。デフォルト値は false で
   す。

   reset_query_list

   セッションが終了するときにコネクションを初期化するためのSQLコマンド
   を「;」で区切って列挙します.デフォルトは以下のようになっていますが,
   任意のSQL文を追加しても構いません.

   reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'

   PostgreSQLのバージョンによって使用できるSQLコマンドが違うので,
   PostgreSQL 7.3以前では注意してください(「4. pgpoolの稼働環境」参照).

   なお,「ABORT」は,PostgreSQL 7.4以上ではトランザクションブロックの
   中にいない場合には発行されません.

   print_timestamp

   trueならばpgpoolのログにタイムスタンプを追加します.デフォルトは
   trueです.

   master_slave_mode

   trueならばマスタ/スレーブモードでpgpoolを運転します.詳細は14を見て
   ください.デフォルトはfalseです.このモードはreplication_modeとは両
   立しません.

   connection_cache

   trueならコネクションをキャッシュします.デフォルトはtrueです.

   health_check_timeout

   pgpoolはサーバ障害やネットワーク障害を検知するために,定期的にバッ
   クエンドに接続を試みます.これを「ヘルスチェック」と言います.障害
   が検知されると,フェイルオーバや縮退運転を試みます.

   この パラメータは,ネットワークケーブルが抜けた際などにヘルスチェッ
   クが長時間待たされるのを防ぐためのタイムアウト値を秒単位で指定しま
   す.デフォルトは20秒です.0を指定するとタイムアウト処理をしません.

   なお,ヘルスチェックを有効にすると,ヘルスチェックのための余分の接
   続が1つ必要になりますので,PostgreSQLのpostgresql.confの設定項目の
   max_connectionsを少くとも1増やすようにしてください.

   health_check_period

   ヘルスチェックを行う間隔を秒単位で指定します.0を指定するとヘルス
   チェックを行いません.デフォルトは0です(つまりヘルスチェックを行い
   ません).

   health_check_user

   ヘルスチェックを行うためのPostgreSQLユーザ名です.

   insert_lock

   SERIAL型を使っているテーブルをレプリケーションすると,SERIAL型の列
   の値がマスタとセカンダリで一致しなくなることがあります.この問題は,
   該当テーブルを明示的にロックすることで回避できます(もちろんトランザ
   クションの並列実行性は犠牲になりますが).しかし,そのためには,

   INSERT INTO ...

   を

   BEGIN;
   LOCK TABLE ...
   INSERT INTO ...
   COMMIT;

   に書き換えなければなりません.insert_lockをtrueにすると自動的にトラ
   ンザクションの開始,テーブルロック,トランザクションの終了を行って
   くれるので,こうした手間を省くことができます(すでにトランザクショ
   ンが開始されている場合はLOCK TABLE...だけが実行されます).

   ただ,このテーブルで本当にSERIAL型が使われているかどうかが判定される
   わけではないので,SERIAL型を使っていないテーブルでもこうした処理が
   行われてしまいます(機能上支障があるわけではないのですが,処理速度
   が遅くなってしまいます).

   この問題を回避するには2つの方法があります.

   1) insert_lockをtrueにして,INSERT文の先頭に/*NO INSERT LOCK*/コメ
      ントを追加する.このコメントがあると,テーブルロックは行われませ
      ん.

   2) insert_lockをfalseにして,INSERT文の先頭に/*INSERT LOCK*/コメン
      トを追加する.このコメントがあると,このINSERT文に対してのみテー
      ブルロックが行われます.

   SERIAL型を使っているテーブルが多い場合は1)を,少ない場合は2)を採用
   すると良いでしょう.

   insert_lockのデフォルト値はfalseです.

   なお,insert_lockを有効にしてregression testを実行すると,少くとも
   PostgreSQL 8.0ではtransactions, privileges, rules, alter_tableが
   failします.ruleでは,viewに対してLOCKをしようとしてしまうこと,
   ほかのものは

   ! ERROR:  current transaction is aborted, commands ignored until end of transaction block

   というようなメッセージが出てしまうためです.たとえば,transactions 
   では,存在しないテーブルに対してINSERTを行うテストが含まれており,
   pgpoolが最初に存在しないテーブルに対してLOCKを行う結果,エラーになっ
   てトランザクションがアボート状態になり,続くINSERTで上記エラーが出
   てしまいます.

   ignore_leading_white_space

   trueならば、load balanceの際にSQL文行頭の空白を無視します(全角ス
   ペースは無視されません)。これは、DBI/DBD:Pgのように、勝手に行頭にホ
   ワイトスペースを追加するようなAPIを使い、ロードバランスしたいときに
   有効です。

   log_statement

   trueならばSQL文をログ出力します.この役目はPostgreSQLの
   log_statementオプションと似ていて,デバッグオプションがないときでも
   問い合わせをログ出力して調べることができるので便利です.

   log_connections

   trueならば、全てのクライアント接続をログへ出力します。

   log_hostname

   trueならば,psコマンドでの状態表示時にIPアドレスではなく,ホスト名
   を表示します.また,log_connectionsが有効な場合にはログにホスト名を
   出力します.

   enable_pool_hba

   trueならば、pool_hba.confに従ってクライアント認証を行います。
   詳細は「7. クライアント認証(HBA)のためのpool_hba.conf設定方法」を参
   照してください。

7. クライアント認証(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の制限事項です。

   * "hostssl"接続タイプはサポートされません

     現在pgpoolはSSL接続をサポートしていないので"hostssl"は指定するこ
     とができません。

   * DATABASEフィールド値として"samegroup"はサポートされません

     pgpoolはバックエンドサーバにあるユーザ情報を事前に知る事ができな
     いため、データベース名はpool_hba.confにある値のみと比較されます。
     なのでグループに関する認証はpool_hbaで行うことができません。

   * USERフィールド値として"+"を使ったグループ指定はサポートされません

     上記の"samegroup"と同じ理由で、ユーザ名はpool_hba.confにある値の
     みと比較されます。グループに関する認証はpool_hbaで行うことはでき
     ません。

   * IPv6アドレス/マスク表記法はサポートされません

     現在pgpoolはIPv6をサポートしていません。

   * "trust", "reject", "pam"以外のメソッドはサポートされません

     これも上記の"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"を参考にしてく
   ださい。

8. pgpoolの起動

   pgpoolを起動するもっとも簡単な方法は,

   $ pgpool

   とするだけです.これで/usr/local/etc/pgpool.confを読み込み,その設
   定でサーバを起動します.

   指定可能なオプションは次の通りです.

   -f path

   デフォルト以外のコンフィギュレーションファイルのパス名を指定します.

   -a path

   デフォルト以外のHBAコンフィギュレーションファイルのパス名を指定します.

   -n

   デーモンモードで起動しません.このオプションはloggerやrotatelogsな
   どを使ってエラーメッセージをファイルに出力するときなどに便利です.

   -d

   デバッグメッセージを大量に出力します.

   -h

   ヘルプメッセージを出力して終了します.

9. pgpoolの終了

   「stop」オプションを使います.

   $ pgpool [-f path_to_configuration_file][-m {s[mart]|f[ast]|i[mmediate]}] stop

   で停止できます.起動時に-fオプションで設定ファイルをしているときは,
   stop時にも-fオプションで設定ファイルを指定してください.

   まだフロントエンドからの接続が終了していない子プロセスがあると,
   pgpoolは終了せずにその接続が終了するのを待ちます.stopリクエストが
   発行された以後は,新たにクライアントはpgpoolに接続することはできま
   せん.

   待たずに強制的に終了させるには,以下のようにします.

   $ pgpool -m fast stop

   または

   $ pgpool -m immediate stop

   fastは"f",immediateは"i"と省略することもできます.ちなみに,

   $ pgpool -m smart stop

   または

   $ pgpool -m s stop

   とすると,pgpool stopと同じ動作をします.

10. スイッチオーバ

   メインテナンスなどのために意図的にフェイルオーバや縮退運転モードに
   移行することができます.

   $ pgpool [-f config_file] [-s {m[aster]|s[econdary]] switch

   -sオプションを省略すると,マスタ側を落とし,セカンダリにフェイルオー
    バ(コネクションプールモードで動作時)または縮退(レプリケーションモー
    ドで動作時)します.セカンダリを落としたい場合は,

   $ pgpool [-f config_file] -s s[econdary] switch

   とします.

   なお,PostgreSQLサーバが1台の状態で動いている場合は,現在のクライア
   ントからpgpoolへのコネクションを強制的に一度切断し,pgpoolの子プロ
   セスが再起動されます.

11. ログの取り方

   pgpoolを-nオプション付で起動すると,stderr(標準エラー出力)にエラー
   や重大な情報(たとえばフェイルオーバしたような場合)に関するメッセー
   ジが出力されます.このままファイルにリダイレクトすることにより,
   pgpoolのログを取ることができます.

   [実行例]

   pgpool -n >& /tmp/pgpool.log &
   または
   pgpool -n > /tmp/pgpool.log 2>&1 &

   このとき,print_timestampをtrueにしておくと,タイムスタンプがログに
   付加されます(print_timestampはデフォルトでtrueです).

   また,loggerコマンドを使ってsyslogにメッセージを出力するのもよい方
   法です.

   [実行例]

   pgpool -n 2>&1 |logger -t pgpool -p local0.info&

   これにより,以下のようなメッセージがsyslogに出力されます.

   Apr 13 15:07:11 srapc1977  4月 13 15:07:11 pgpool: log: pid 2038: starting failover from (5432) to (5433)
   Apr 13 15:07:11 srapc1977  4月 13 15:07:11 pgpool: log: pid 2038: failover from (5432) to (5433) done.


12. pgpoolの内部情報の取得

    pgpoolが認識している設定ファイル(pgpool.conf)の内容や,現在のレプ
    リケーションの状態をSQLを発行することによって取得することができま
    す.たとえば,今pgpoolが同じホストのポート9999で動いているとすると,
    以下のようにして情報を取得できます.

    psql -p 9999 -c 'show pool_status' template1

    (データベース名は何でもかまいません).

             item             |                        value                         |                              description                                                   --------------------------------+------------------------------------------------------+------------------------------------------------------------------------
 listen_addresses             | *                                                    | host name(s) or IP address(es) to listen to
 port                         | 9998                                                 | pgpool accepting port number
 socket_dir                   | /tmp                                                 | pgpool socket directory
 backend_host_name            |                                                      | master backend host name
 backend_port                 | 5432                                                 | master backend port number
 secondary_backend_host_name  |                                                      | secondary backend host name
 secondary_backend_port       | 5433                                                 | secondary backend port number
 num_init_children            | 32                                                   | # of children initially pre-forked
 child_life_time              | 0                                                    | if idle for this seconds, child exits
 connection_life_time         | 0                                                    | if idle for this seconds, connection closes
 child_max_connections        | 0                                                    | if max_connections received, chile exits
 max_pool                     | 2                                                    | max # of connection pool per child
 logdir                       | /tmp                                                 | logging directory
 backend_socket_dir           | /tmp                                                 | Unix domain socket directory for the PostgreSQL server
 replication_mode             | 1                                                    | non 0 if operating in replication mode
 replication_strict           | 1                                                    | non 0 if operating in strict mode
 replication_timeout          | 5000                                                 | if secondary does not respond in this milli seconds, abort the session
 load_balance_mode            | 0                                                    | non 0 if operating in load balancing mode
 weight_master                | 1.000000                                             | weight of master
 weight_secondary             | 1.000000                                             | weight of secondary
 replication_stop_on_mismatch | 0                                                    | stop replication mode on fatal error
 reset_query_list             | ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT; | queries issued at the end of session
 print_timestamp              | 1                                                    | if true print time stamp to each log line
 master_slave_mode            | 0                                                    | if true, operate in master/slave mode
 connection_cache             | 1                                                    | if true, cache connection pool
 health_check_timeout         | 5                                                    | health check timeout
 health_check_period          | 0                                                    | health check period
 health_check_user            | t-ishii                                              | health check user
 insert_lock                  | 1                                                    | insert lock
 ignore_leading_white_space   | 0                                                    | ignore leading white spaces
 current_backend_host_name    |                                                      | current master host name
 current_backend_port         | 5432                                                 | current master port #
 replication_enabled          | 1                                                    | non 0 if actually operating in replication mode
 master_slave_enabled         | 0                                                    | non 0 if actually operating in master/slave
 num_reset_queries            | 3                                                    | number of queries in reset_query_list
 log_statement                | 0                                                    | if true, print all statements to the log
 log_connections              | 1                                                    | if true, print incoming connections to the log
 log_hostname                 | 0                                                    | if true, resolve hostname for ps and log print
 enable_pool_hba              | 1                                                    | if true, use pool_hba.conf for client authentication
 server_status                | master( on 5432) up secondary( on 5433) up           | server status
(39 rows)

contrib/dblinkを使えば,以下のようにして一部の結果だけを見ることができ
ます.

test=# SELECT * FROM dblink('port=9999 dbname=test', 'show pool_status')
	AS c1(pname text, val text) WHERE pname = 'port';
 pname | val  
-------+------
 port  | 9999
(1 row)

13. regression testの実施

   以下のようにしてpgpoolを併用してregression testを行うことができます.

   $ cd /usr/local/src/postgresql-7.4.5/src/test/regress
   $ make all
   $ ./pg_regress --schedule=parallel_schedule --port=9999

   注意: PostgreSQL 8.0では,src/test/regress以下にテスト用のテーブル
   スペースを作るため,同じホスト上に2つのデータベースクラスタを作り,
   レプリケーションモードでregression testをすると必ずtablespaceのテス
   トがfailしますが,これは異常ではありません.

14. ベンチマークの実施

   ベンチマークを実施するにはいろいろな方法がありますが,ここでは
   pgbenchとPHPそれにabを使った簡単な方法をご紹介します.

   まず,ベンチマークデータベースを初期化します.

   $ pgbench -i test
  
   abを起動します.ターゲットとなるPHPスクリプトはここでは以下のような
   簡単なものを使います.

   <?php
    ini_set("track_errors", "1");
    define_syslog_variables();

    $con = pg_connect("dbname=test user=postgres port=9999");
    if ($con == FALSE) {
      syslog(LOG_ERR, "could not connect $php_errormsg");
      trigger_error("Could not connect to DB", E_USER_ERROR);
      exit(1);
    }
    $aid = rand(1,10000);
    pg_query($con, "SELECT * FROM accounts WHERE aid = $aid");
    pg_close($con);
  ?>

  $ /usr/local/apache/bin/ab -c 100 -n 1000 "http://localhost/bench.php"

15. master/slaveモード

  master/slaveモードは,Slony-Iのような,master/slave式のレプリケーショ
  ンソフトにレプリケーションをまかせるモードです.このモードで使うために
  は,レプリケーションモードと同じように,マスタとセカンダリのホスト情報
  をセットし,master_slave_modeとload_balance_modeをtrueにします.このと
  き,問い合わせによってマスタだけに問い合わせが送られる場合と,マスタと
  セカンダリのどちらかにロードバランスされて問い合わせが送られる場合があ
  ります.

  1) 以下の条件がすべて満たされている場合,問い合わせはマスタとセカンダ
    リに負荷分散されます.

     - PostgreSQLのバージョンが7.4以降	
     - 問い合わせが正確に"SELECT"(大文字/小文字の別は無視されます)で始まっ
       ている
     - 問い合わせが明示的なトランクザションブロックの内側にない(つまり,
       BEGINを発行していない)

  2) 1)以外の場合は,マスタだけに問い合わせが送られます.

16. 複数のpgpoolを同じホストで立ち上げるには

  複数のpgpoolを同じホストで立ち上げるには(たとえば2つのDBクラスタを別々
  にpgpoolで扱うケース),2つの設定ファイルを作ります.

  それぞれのpgpoolを-fオプション付で起動し,それぞれの設定ファイルを認
  識させます.例:

  pgpool -f /usr/local/etc/pgpool.1.conf
  pgpool -f /usr/local/etc/pgpool.2.conf

  なお,2つの設定ファイルでは以下のパラメータを別々の値にする必要があ
  ります.

  port
  logdir (pgpoolのpidファイルの置き場所)

  なお,pgpoolを停止する際にも-fオプションを使います.例:

  pgpool -f /usr/local/etc/pgpool.1.conf -m smart stop

  このコマンドによって,上の例の最初のpgpoolが停止します.