5.2. 接続と認証

5.2.1. 接続設定

listen_addresses (string)

クライアントアプリケーションからの接続をサーバが監視する TCP/IP アドレスを指定します。 この値は、ホスト名をコンマで区切ったリスト、そして/もしくは、数値によるIPアドレスです。 *という特別なエントリは利用可能な全てのIPインタフェースに対応します。 エントリ0.0.0.0は全てのIPv4アドレスの監視を、そしてエントリ::は全てのIPv6アドレスの監視を許容します。 リストが空の場合、サーバはいかなるIPインタフェースも全く監視しないで、Unixドメインソケットのみを使用して接続が行われます。 デフォルトの値はlocalhostで、ローカルなTCP/IP "loopback"接続のみ許可します。 クライアント認証(項6.1)は誰がサーバにアクセス可能かをきめ細かく制御するのに対し、listen_addressesはどのインタフェースが接続を試みるかを制御します。 これにより、安全でないネットワークインタフェース上において繰り返して行われる悪意のある接続要求の防止に役立ちます。

このパラメータはサーバ起動時にのみ設定可能です。

port (integer)

Pgpool-IIが接続を受け付けるために監視するポート番号です。 デフォルト値は9999です。

このパラメータはサーバ起動時にのみ設定可能です。

unix_socket_directories (string)

Pgpool-IIが接続を受け付けるUNIXドメインソケットを置くディレクトリです。 コンマで区切った複数のディレクトリのリストを設定すると複数のUNIXドメインソケットファイルを作成します。 デフォルト値は/tmpです。 このソケットは、cron によって削除されることがあるので注意してください。 /var/runなどのディレクトリに変更することをお勧めします。

このパラメータはサーバ起動時にのみ設定可能です。

unix_socket_group (string)

UNIXドメインソケット(複数も)を所有するグループを設定します(ソケットを所有するユーザは常にサーバを起動するユーザです)。 unix_socket_permissionsパラメータとの組合せで、UNIXドメインソケット接続の追加的アクセス管理機構として使うことができます。 デフォルトでは空文字列で、サーバユーザのデフォルトグループを使用します。

このパラメータはサーバ起動時にのみ設定可能です。

unix_socket_permissions (integer)

UNIXドメインソケット(複数も)のアクセスパーミッションを設定します。 UNIXドメインソケットは通常のUNIXファイルシステムパーミッション設定の一式を使用します。 パラメータ値は、chmodおよびumaskシステムコールが受け付ける数値形式での指定を想定しています。 (通常使われる8進数形式を使用するのであれば、0(ゼロ)で始まらなければなりません。)

デフォルトのパーミッションは、誰でも接続できる0777になっています。 変更するならば0770(ユーザとグループのみです。unix_socket_groupも参照してください)や0700(ユーザのみ)が適切です。 (UNIXドメインソケットでは書き込み権限だけが問題になるため、読み込みや実行のパーミッションを設定または解除する意味はありません。)

このパラメータはサーバ起動時にのみ設定可能です。

pcp_listen_addresses (string)

クライアントアプリケーションからの接続をPCPサーバが監視する TCP/IP アドレスを指定します。 この値は、ホスト名をコンマで区切ったリスト、そして/もしくは、数値によるIPアドレスです。 *という特別なエントリは利用可能な全てのIPインタフェースに対応します。 エントリ0.0.0.0は全てのIPv4アドレスの監視を、そしてエントリ::は全てのIPv6アドレスの監視を許容します。 リストが空の場合、サーバはいかなるIPインタフェースも全く監視しないで、Unixドメインソケットのみを使用して接続が行われます。 デフォルトの値はlocalhostで、ローカルなTCP/IP "loopback"接続のみ許可します。 クライアント認証(項6.1)は誰がサーバにアクセス可能かをきめ細かく制御するのに対し、pcp_listen_addressesはどのインタフェースが接続を試みるかを制御します。 これにより、安全でないネットワークインタフェース上において繰り返して行われる悪意のある接続要求の防止に役立ちます。

このパラメータはサーバ起動時にのみ設定可能です。

pcp_port (integer)

PCPプロセスが接続を受け付けるために監視するポート番号です。 デフォルト値は9898です。

このパラメータはサーバ起動時にのみ設定可能です。

pcp_socket_dir (string)

PCPプロセスが接続を受け付けるUNIXドメインソケットを置くディレクトリです。 デフォルト値は/tmpです。 このソケットは、cron によって削除されることがあるので注意してください。 /var/runなどのディレクトリに変更することをお勧めします。

このパラメータはサーバ起動時にのみ設定可能です。

num_init_children (integer)

preforkするPgpool-IIのサーバプロセスの数です。 デフォルト値は32です。 num_init_childrenはPgpool-IIに対してクライアントが同時に接続できる上限の数でもあります。 num_init_childrenより多いクライアントがPgpool-IIに接続しようとした場合、reserved_connectionsが1以上に設定されている場合を除き、それらのクライアントは、Pgpool-IIのどれかのプロセスへの接続が閉じられるまで待たされます(PostgreSQLのように接続拒否エラーにはなりません。)。 待たされる数の上限は、listen_backlog_multiplier * num_init_children です。

待ち行列は、OS内部に作られ、「listenキュー」と呼ばれます。 listenキューの長さは「バックログ」と呼ばれます。 システムによってはバックログの上限が設定されており、listen_backlog_multiplier*num_init_childrenがこれを越える場合はバックログを大きく設定する必要があります。 さもないと高負荷時に以下のような問題が発生する可能性があります:

  • Pgpool-IIへの接続が失敗する。

  • カーネル内で行われるリトライによりPgpool-IIへの接続が遅くなる。

実際にlistenキューが溢れているかどうかは、"netstat -s"コマンドを使って確認できます。 もし、以下のような出力があった場合、

	535 times the listen queue of a socket overflowed
       

listenキューが溢れています。 この場合にはバックログを増やす必要があります(スーパユーザ権限が必要になります)。

	# sysctl net.core.somaxconn
	net.core.somaxconn = 128
	# sysctl -w net.core.somaxconn = 256
       

/etc/sysctl.confに以下のように書いても構いません。

	net.core.somaxconn = 256
       

PostgreSQLへ張られる接続数は大まかにはmax_pool*num_init_childrenとなります。

ただし、問い合わせのキャンセルを行うとバックエンドに対して別の接続が張られます。 したがって、すべての接続が使用中の場合には問い合わせのキャンセルができなくなります。 問い合わせのキャンセルを必ず保証したい場合は、想定されるコネクション数の倍の値を設定してください。

また、PostgreSQLは一般ユーザによる同時接続をmax_connections - superuser_reserved_connections個まで許しています。

まとめると、max_pool、num_init_children、max_connections、superuser_reserved_connectionsは、以下の式を満たしていなければなりません。

       
       max_pool*num_init_children <= (max_connections - superuser_reserved_connections) (クエリのキャンセルを考慮しない場合)
       max_pool*num_init_children*2 <= (max_connections - superuser_reserved_connections) (クエリのキャンセルを考慮する場合)
      

このパラメータはサーバ起動時にのみ設定可能です。

reserved_connections (integer)

このパラメータが1以上に設定されていると、(num_init_children - reserved_connections)以上のクライアントからの接続はブロックされるのではなく受け付けられず、"Sorry, too many clients already"というエラーになります。 たとえば、reserved_connections = 1で、num_init_children = 32なら、32番目のクライアントからの接続は拒否されます。 これは、PostgreSQLと似た挙動で、クライアントからの接続数が多く、各セッションが長時間に渡るようなシステムで有効です。 この場合、listenキューが非常に長くなる可能性があり、システムを不安定にさせます。 こうした状況では、このパラメータを0以外にして、listenキューが長くなるのを防ぐのは良い考えです。

このパラメータを0にすると、クライアントからの接続要求は拒否されなくなります。 デフォルト値は0です。 このパラメータはサーバ起動時にのみ設定可能です。

5.2.2. 認証設定

enable_pool_hba (boolean)

trueの場合、Pgpool-IIはクライアント認証にpool_hba.confを使用します。 クライアント認証のためpool_hba.confを設定する方法について、詳細は項6.1を参照してください。 デフォルトはfalseです。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

pool_passwd (string)

認証用のパスワードファイルへのパス(絶対パスまたは相対パス)を指定します。 デフォルト値は"pool_passwd"です。 相対パスは、設定ファイルが置かれているディレクトリを基準としています。 ''(空文字列)を指定すると パスワードファイルの使用は無効になります。

パスワードは、3つの形式でpool_passwdファイルに保存できます。 AES256暗号化形式、平文形式、md5形式です。 Pgpool-IIは接頭辞によってパスワードの形式を確認するため、pool_passwd内の各パスワードのエントリはパスワードの形式を接頭辞として付ける必要があります。

平文形式のパスワードを保存するためには、TEXT接頭辞を使用します。 例として、pool_passwd内にクリアテキストパスワード文字列"mypassword"を保存する場合、パスワード文字列の先頭にTEXT接頭辞を追加します。 例えば、TEXTmypasswordとなります。

同様に、md5ハッシュパスワードはmd5接頭辞、AES256暗号化パスワード形式はAES接頭辞を使って保存することができます。 AES256暗号化パスワードの詳細は、項6.4を参照してください。

有効な接頭辞がない場合、Pgpool-IIは平文のパスワードとして文字列を見なします。

このパラメータはサーバ起動時にのみ設定可能です。

allow_clear_text_frontend_auth (boolean)

PostgreSQLバックエンドサーバはあるユーザの認証に対してmd5またはSCRAM認証を必要としており、そのユーザのパスワードが"pool_passwd"ファイルに存在しない場合、allow_clear_text_frontend_authPgpool-IIがフロントエンドクライアントとクリアテキストパスワード認証を行い、クライアントから平文形式のパスワードを取得しバックエンド認証のために使用することを許可します。

デフォルトはfalseです。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

注意: allow_clear_text_frontend_authenable_pool_hbaが有効でない場合のみ機能します。

authentication_timeout (integer)

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

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。