[pgpool-general-jp: 238] 縮退運転が有効にならない??

Nobuaki Inamura inamuran36 @ mahikari.or.jp
2007年 8月 19日 (日) 17:21:48 JST


稲村と申します。お世話になっております。

以下の環境でPgpool_3.1.1を使ってデータベースシステムを試験中です。
Host
 DELL SC440 (2台使用:pool1とpool2という名前)
 MEM  1G
 HDD 80G

Debian (etch)
PostgreSQL8.1
Pgpool_3.1.1
HeartBeat2

2台のデータベースサーバを1つの仮想IPで使用し負荷分散と高可用性のシステムを試験していたのですが、
おかしな現象に遭遇しました。
それが縮退運転が有効になっていないという現象でした。

(下手な絵ではないので申し訳ありません・・図に関しては
http://pgpool.projects.postgresql.org/pgpool-HA/ja/
を参考にしていただければわかりやすいかと。)


                             ホストpool1
             ------------pgpool------PostgreSQL
       |       |_________|___  
仮想IP-------|                    | |
             |               |~~~~~~~~~    |
             ------------pgpool------PostgreSQL
                             ホストpool2



試験はホストpool1が仮想IPを持っている状態で行いました。ですので、現状で仮想IPへアクセスすると、
pool1のサーバのpgpoolを使ってpool1とpool2のPostgreSQLへデータが書き込まれるようになっています。
この状態で以下の手順で試験をすると、問題の動作が表れました。

1.2つのHostのうち、pool2がダウンし、縮退運転に入る。
2.仮想IP上からテーブルに1行追加する。=pool1では追加されるが、pool2はダウンしているため追加はされない:不一致が起きる
3.pgpool2を復旧させ、pgpool1のpgpoolを再起動させる。
4.再び仮想IP経由で、追加したテーブルを見る(select)と、実行するたびにpool1とpool2のデータが交互に出てくる
  →実行結果がいつも違う。2つのデータベースが違っているのに縮退運転になっていない
という現象が現れました。ちなみにpool1の実IPから実行しても同じ結果でした。(当たり前ですが、一応。)

これは仕様なのでしょうか?それとも縮退運転の条件を満たしていないor設定ミスなのでしょうか?


以下にpgpool.confの設定を添付します。(pool1のもの)
---------------------
#
# pgpool configuration file
#

# Host name or IP address to listen on: '*' for all, '' for no TCP/IP
# connections
listen_addresses = '*'

# Port number for pgpool
port = 5433

# Unix domain socket path.  (The Debian package defaults to
# /var/run/postgresql.)
socket_dir = '/var/run/postgresql'

# Host name where PostgreSQL server is running on.  '' means localhost
# using Unix domain socket.
backend_host_name = '192.168.2.**'

# port number PostgreSQL server is running on
backend_port = 5432

# Unix domain socket path for the backend.  (The Debian package defaults
# to /var/run/postgresql.)
backend_socket_dir = '/var/run/postgresql'

# Host name where secondary PostgreSQL server is running on.  '' means
# localhost using Unix domain socket.
secondary_backend_host_name = '192.168.2.**'

# Port number secondary PostgreSQL server is running on.  0 means no
# secondary PostgreSQL.
secondary_backend_port = 5432

# Number of pre-forked child processes
num_init_children = 32

# Number of connection pools allowed for a child process
max_pool = 4

# If idle for this many seconds, child exits.  0 means no timeout.
child_life_time = 300

# If idle for this many seconds, connection to PostgreSQL closes.
# 0 means no timeout.
connection_life_time = 0

# If child_max_connections connections were received, child exits.
# 0 means no exit.
child_max_connections = 0

# Logging directory (more accurately, the directory for the PID file)
logdir = '/var/run/postgresql'

# Replication mode
replication_mode = true

# Set this to true if you want to avoid deadlock situations when
# replication is enabled.  There will, however, be a noticable performance
# degration.  A workaround is to set this to false and insert a /*STRICT*/
# comment at the beginning of the SQL command.
replication_strict = true

# When replication_strict is set to false, there will be a chance for
# deadlocks.  Set this to nonzero (in milliseconds) to detect this
# situation and resolve the deadlock by aborting current session.
replication_timeout = 5000

# Load balancing mode, i.e., all SELECTs except in a transaction block
# are load balanced.  This is ignored if replication_mode is false.
load_balance_mode = true

# Load balance weight for master and secondary.  The actual weight is
# calculated by weight_master divided by weight_secondary.  For
# example both
#
# weight_master = 10 and weight_secondary = 5
# weight_master = 4 and weight_secondary = 2
#
# are regarded as the master having double the weight compared to the
# secondary.  Master and secondary have the same weight in the default.
weight_master = 0.5
weight_secondary = 0.5

# If there is a data mismatch between master and secondary, start
# degeneration to stop replication mode.
replication_stop_on_mismatch = true

# Semicolon separated list of queries to be issued at the end of a session
reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'

# If true print time stamp on each log line.
print_timestamp = true

# If true, operate in master/slave mode.
master_slave_mode = false

# If true, cache connection pool.
connection_cache = true

# Health check timeout.  0 means no timeout.
health_check_timeout = 20

# Health check period.  0 means no health check.
health_check_period = 0

# Health check user
health_check_user = 'nobody'

# If true, automatically lock table with INSERT statements to keep SERIAL
# data consistency.  An /*INSERT LOCK*/ comment has the same effect.  A
# /NO INSERT LOCK*/ comment disables the effect.
insert_lock = false

# If true, ignore leading white spaces of each query while pgpool judges
# whether the query is a SELECT so that it can be load balanced.  This
# is useful for certain APIs such as DBI/DBD which is known to adding an
# extra leading white space.
ignore_leading_white_space = false

# If true, print all statements to the log.  Like the log_statement option
# to PostgreSQL, this allows for observing queries without engaging in full
# debugging.
log_statement = false

---------------------




-- 
Nobuaki Inamura : inamuran36 @ mahikari.or.jp



pgpool-general-jp メーリングリストの案内