5.12. インメモリキャッシュ

Pgpool-IIの全てのモードでインメモリクエリキャッシュを利用することができます。 クエリキャッシュはSELECTの結果を保管しておいて再利用するものです。 テーブルの更新によりキャッシュが古くなると、自動的にそのテーブルに関連したキャッシュが削除される(memqcache_auto_cache_invalidationがonの場合。デフォルトでこの項目はonになっています)のでPgpool-IIの再起動の必要はありません。

注意: 基本的に以下のSELECTはキャッシュされません。

    immutableでない関数を含むSELECT
    一時テーブル、unloggedテーブルを使ったSELECT
    検索結果が memqcache_maxcache を越えるようなSELECT
    SELECT FOR SHARE/UPDATE
    /*NO QUERY CACHE*/コメントで始まるSELECT
    システムカタログを使用しているSELECT
    TABLESAMPLEを使っているSELECT
   

ただし、VIEWと unloggedテーブルは、cache_safe_memqcache_table_list に記載することでキャッシュされます。

インメモリクエリキャッシュは、SELECT文(拡張問い合わせの場合は更にバインドパラメータ)と 検索結果をペアで記録します。 同じSELECT文が発行された場合に、Pgpool-IIはキャッシュから結果を返します。 SQLの解析もPostgreSQLへのアクセスも行われないため、インメモリキャッシュからの結果の提供は非常に高速です。

反面、キャッシュをストアするオーバヘッドが生じるので、通常の方法より遅くなる場合も有ります。 また、あるテーブルが更新された場合、Pgpool-IIは自動的にそのテーブルに関係する全てのキャッシュを削除します。 そのため、更新が多いシステムではパフォーマンスが悪くなります。 キャッシュのヒット率(SHOW POOL_CACHEを使って確認できます)が70%以下の場合は、インメモリクエリキャッシュを無効にしたほうが良いかもしれません。

クエリキャッシュにSELECT結果が登録されるのは、基本的にSELECTが正常終了したときです。 明示的なトランザクションを実行中なら、そのトランザクションがコミットされるまではクエリキャッシュにはSELECT結果は登録されません。 また、拡張問い合わせでは、クラスタリングモードにより、キャッシュの登録されるタイミングが異なることに注意してください。 ストリーミングレプリケーションモードロジカルレプリケーションモードでは、Syncメッセージがフロントエンドから送られ、その応答(Ready for queryメッセージ)がバックエンドから返ってきたタイミングになります。 ですから、

   Parse (SELECT 1)
   Bind (SELECT 1)
   Execute (SELECT 1)
   Parse (SELECT 1)
   Bind (SELECT 1)
   Execute (SELECT 1)
   Sync
  

という順でコマンドがフロントエンドから送信されても、2回目のExecute (SELECT 1)ではクエリキャッシュは利用されません。 一方それ以外のクラスタリングモードでは、1回目のExecute (SELECT 1)の結果がクエリキャッシュに登録されるので、2回目のExecute (SELECT 1)ではクエリキャッシュが利用されます。

5.12.1. インメモリクエリキャッシュを有効にする

memory_cache_enabled (boolean)

onにするとメモリキャッシュが有効になります。 デフォルトはoffです。

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

注意: enable_shared_relcacheが有効の場合、クエリキャッシュはリレーションキャッシュでも使用されます。 その上、たとえmemory_cache_enabledパラメータがオフに設定されていたとしても、クエリキャッシュは使用されます。 リレーションキャッシュの詳細は項5.15を参照してください。

5.12.2. キャッシュストレージの選択

memqcache_method (string)

キャッシュに用いるストレージのタイプを指定します。 このパラメータで有効な全ての値のリストを以下の表に示します。

表 5-10. Memcache method options

説明
'shmem'共有メモリを使用
'memcached'memcachedを使用

デフォルトは'shmem'です。

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

5.12.3. 共通設定

以下はshmemmemcachedの両タイプのクエリキャッシュで有効なパラメータです。

memqcache_expire (integer)

クエリキャッシュの寿命を秒単位で設定します。 デフォルト0で、キャッシュの期限はなくなり、関連テーブルが更新されるまではキャッシュが有効になります。

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

注意: memqcache_expirememqcache_auto_cache_invalidationは互いに独立です。

memqcache_auto_cache_invalidation (boolean)

onに設定した場合、更新されたテーブルに関連するキャッシュを自動で削除します。 offならばキャッシュは削除されません。

デフォルト値はonです。

注意: memqcache_auto_cache_invalidationmemqcache_expireは互いに独立です。

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

memqcache_maxcache (integer)

キャッシュされるSELECTクエリ結果の最大サイズをバイト数で指定します。 この値より大きいサイズのデータの結果はPgpool-IIにキャッシュされません。 サイズの制約によりデータのキャッシュができなかった場合、以下のメッセージが表示されます。

       LOG:   pid 13756: pool_add_temp_query_cache: data size exceeds memqcache_maxcache. current:4095 requested:111 memq_maxcache:4096
      

注意: 共有メモリによるクエリキャッシュ('shmem')の場合は、memqcache_maxcachememqcache_cache_block_sizeを超えないように、'memcached'を使用する場合は、slabのサイズ(デフォルトで1MB)を超えないようにしてください。

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

cache_safe_memqcache_table_list (string)

SELECT結果がPgpool-IIにキャッシュされるべきテーブル名のリストをカンマ区切りで指定します。 このパラメータは、VIEWとunloggedテーブルにのみ適用されます。 通常のテーブルは、cache_unsafe_memqcache_table_listに記載されていない限りキャッシュされます。

テーブル名のマッチングには正規表現も利用できます (指定した各表現に ^ と $ をつけた形で使われます)。

注意: スキーマ名を付けないテーブル名とスキーマ名を付けた形の両方をクエリの中で使う場合は、両方共リストに登録してください。

	#For example:
	#If the queries sometime use "table1" and other times "public.table1"
	#to refer the table1 then the cache_safe_memqcache_table_list
	#would be configured as follows.

	cache_safe_memqcache_table_list = "table1,public.table1"

       

注意: cache_unsafe_memqcache_table_listcache_safe_memqcache_table_listより優先されます。

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

cache_unsafe_memqcache_table_list (string)

SELECT結果がPgpool-IIにキャッシュされるべきでないテーブル名のリストをカンマ区切りで指定します。

テーブル名のマッチングには正規表現も利用できます (指定した各表現に ^ と $ をつけた形で使われます)。

注意: スキーマ名を付けないテーブル名とスキーマ名を付けた形の両方をクエリの中で使う場合は、両方共リストに登録してください。

	#For example:
	#If the queries sometime use "table1" and other times "public.table1"
	#to refer the table1 then the cache_unsafe_memqcache_table_list
	#would be configured as follows.

	cache_unsafe_memqcache_table_list = "table1,public.table1"

       

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

memqcache_oiddir (string)

SELECTクエリが使用するテーブルにOIDを格納するディレクトリへのフルパスで指定します。

memqcache_oiddirには、各データベースのためのディレクトリが格納されます。 そのディレクトリ名はデータベースのOIDです。 更に、各データベースディレクトリの下には各テーブルのためのファイルが格納されます。 そのファイル名は同じくテーブルのOIDです。 これらのファイルの中にはクエリキャッシュへのポインタが格納されており、 キャッシュを削除する際のキーとして使われます。

注意: Pgpool-IIの通常の再起動ではmemqcache_oiddirの中身はクリアされません。

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

5.12.4. 共有メモリ使用時の設定

これらはキャッシュストレージとして共有メモリを使用した場合に使われるパラメーターです。

memqcache_total_size (integer)

共有メモリのキャッシュサイズをバイト単位で指定します。

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

memqcache_max_num_cache (integer)

キャッシュエントリの数を指定します。 この設定項目は、キャッシュの管理領域の大きさを決めるために使用します。

注意: 管理領域の大きさは、memqcache_max_num_cache * 48バイトで計算できます。 少なすぎるとキャッシュを登録することができずにエラーになります。 逆に多すぎると単に空間の無駄になります。

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

memqcache_cache_block_size (integer)

キャッシュのブロックサイズを指定します。 Pgpool-IImemqcache_cache_block_sizeのブロックで管理されたキャッシュメモリを利用します。 SELECT結果はこのブロックに詰め込まれ、1つのブロックに収まらなければなりません。 従って、memqcache_cache_block_sizeを検索結果が超えると、キャッシュされません。

memqcache_cache_block_sizeは、512以上の値でなければなりません。

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

5.12.5. memcached使用時の設定

これらはキャッシュストレージとしてmemcachedを使用した場合に使われるパラメーターです。

memqcache_memcached_host (string)

memcachedが動いているホスト名またはIPアドレスを指定します。 Pgpool-IIと同じマシンでmemcachedを動かす場合は、'localhost'が使えます。

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

memqcache_memcached_port (integer)

memcachedのポート番号を指定します。 デフォルトは 11211 です。

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