ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pgpool-II session failover
    PostgreSQL 2019. 10. 11. 14:08

    pgpool-II는 자동 session failover가 된다.

    테스트 시나리오

    1. agensgraph의 initdb 명령어로 data1을 생성한다.
    2. data1/postgresql.conf 파일을 수정하고, ag_ctl 명령어로 data1를 시작한다.
    3. pg_basebackup 명령어로 data2를 생성하고, ag_ctl 명령어로 data2를 시작한다. 백업대상은 data1이다.
    4. pgpool-II를 시작한다. 
    5. agens 명령어에 pgpool-II port를 사용하여 질의한다. 
    6. ag_ctl stop명령어로 master인 data1를 죽인다.
    7. agens 명령어에 pgpool-II port를 사용하여 질의한다. 

    다음은 위의 테스트 시나리오를 실행한 결과이다.

    data1/postgresql.conf 내용

    # -----------------------------
    # PostgreSQL configuration file
    # -----------------------------
    #
    # This file consists of lines of the form:
    #
    #   name = value
    #
    # (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
    # "#" anywhere on a line.  The complete list of parameter names and allowed
    # values can be found in the PostgreSQL documentation.
    #
    # The commented-out settings shown in this file represent the default values.
    # Re-commenting a setting is NOT sufficient to revert it to the default value;
    # you need to reload the server.
    #
    # This file is read on server startup and when the server receives a SIGHUP
    # signal.  If you edit the file on a running system, you have to SIGHUP the
    # server for the changes to take effect, run "pg_ctl reload", or execute
    # "SELECT pg_reload_conf()".  Some parameters, which are marked below,
    # require a server shutdown and restart to take effect.
    #
    # Any parameter can also be given as a command-line option to the server, e.g.,
    # "postgres -c log_connections=on".  Some parameters can be changed at run time
    # with the "SET" SQL command.
    #
    # Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
    #                MB = megabytes                     s   = seconds
    #                GB = gigabytes                     min = minutes
    #                TB = terabytes                     h   = hours
    #                                                   d   = days
     
     
    #------------------------------------------------------------------------------
    # FILE LOCATIONS
    #------------------------------------------------------------------------------
     
    # The default values of these variables are driven from the -D command-line
    # option or PGDATA environment variable, represented here as ConfigDir.
     
    #data_directory = 'ConfigDir'       # use data in another directory
                        # (change requires restart)
    #hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
                        # (change requires restart)
    #ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
                        # (change requires restart)
     
    # If external_pid_file is not explicitly set, no extra PID file is written.
    #external_pid_file = ''         # write an extra PID file
                        # (change requires restart)
     
     
    #------------------------------------------------------------------------------
    # CONNECTIONS AND AUTHENTICATION
    #------------------------------------------------------------------------------
     
    # - Connection Settings -
     
    #listen_addresses = 'localhost'     # what IP address(es) to listen on;
                        # comma-separated list of addresses;
                        # defaults to 'localhost'; use '*' for all
                        # (change requires restart)
    port = 7432             # (change requires restart)
    max_connections = 100           # (change requires restart)
    #superuser_reserved_connections = 3 # (change requires restart)
    #unix_socket_directories = '/tmp'   # comma-separated list of directories
                        # (change requires restart)
    #unix_socket_group = ''         # (change requires restart)
    #unix_socket_permissions = 0777     # begin with 0 to use octal notation
                        # (change requires restart)
    #bonjour = off              # advertise server via Bonjour
                        # (change requires restart)
    #bonjour_name = ''          # defaults to the computer name
                        # (change requires restart)
     
    # - Security and Authentication -
     
    #authentication_timeout = 1min      # 1s-600s
    #ssl = off
    #ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
    #ssl_prefer_server_ciphers = on
    #ssl_ecdh_curve = 'prime256v1'
    #ssl_dh_params_file = ''
    #ssl_cert_file = 'server.crt'
    #ssl_key_file = 'server.key'
    #ssl_ca_file = ''
    #ssl_crl_file = ''
    #password_encryption = md5      # md5 or scram-sha-256
    #db_user_namespace = off
    #row_security = on
     
    # GSSAPI using Kerberos
    #krb_server_keyfile = ''
    #krb_caseins_users = off
     
    # - TCP Keepalives -
    # see "man 7 tcp" for details
     
    #tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
                        # 0 selects the system default
    #tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
                        # 0 selects the system default
    #tcp_keepalives_count = 0       # TCP_KEEPCNT;
                        # 0 selects the system default
     
     
    #------------------------------------------------------------------------------
    # RESOURCE USAGE (except WAL)
    #------------------------------------------------------------------------------
     
    # - Memory -
     
    shared_buffers = 128MB          # min 128kB
                        # (change requires restart)
    #huge_pages = try           # on, off, or try
                        # (change requires restart)
    #temp_buffers = 8MB         # min 800kB
    #max_prepared_transactions = 0      # zero disables the feature
                        # (change requires restart)
    # Caution: it is not advisable to set max_prepared_transactions nonzero unless
    # you actively intend to use prepared transactions.
    #work_mem = 4MB             # min 64kB
    #maintenance_work_mem = 64MB        # min 1MB
    #replacement_sort_tuples = 150000   # limits use of replacement selection sort
    #autovacuum_work_mem = -1       # min 1MB, or -1 to use maintenance_work_mem
    #max_stack_depth = 2MB          # min 100kB
    #eager_mem = 4MB            # min 1MB
    dynamic_shared_memory_type = posix  # the default is the first option
                        # supported by the operating system:
                        #   posix
                        #   sysv
                        #   windows
                        #   mmap
                        # use none to disable dynamic shared memory
                        # (change requires restart)
     
    # - Disk -
     
    #temp_file_limit = -1           # limits per-process temp file space
                        # in kB, or -1 for no limit
     
    # - Kernel Resource Usage -
     
    #max_files_per_process = 1000       # min 25
                        # (change requires restart)
    #shared_preload_libraries = 'pg_stat_statements,pg_statsinfo,pg_hint_plan,hll'      # (change requires restart)
     
    # - Cost-Based Vacuum Delay -
     
    #vacuum_cost_delay = 0          # 0-100 milliseconds
    #vacuum_cost_page_hit = 1       # 0-10000 credits
    #vacuum_cost_page_miss = 10     # 0-10000 credits
    #vacuum_cost_page_dirty = 20        # 0-10000 credits
    #vacuum_cost_limit = 200        # 1-10000 credits
     
    # - Background Writer -
     
    #bgwriter_delay = 200ms         # 10-10000ms between rounds
    #bgwriter_lru_maxpages = 100        # 0-1000 max buffers written/round
    #bgwriter_lru_multiplier = 2.0      # 0-10.0 multiplier on buffers scanned/round
    #bgwriter_flush_after = 512kB       # measured in pages, 0 disables
     
    # - Asynchronous Behavior -
     
    #effective_io_concurrency = 1       # 1-1000; 0 disables prefetching
    #max_worker_processes = 8       # (change requires restart)
    #max_parallel_workers_per_gather = 2    # taken from max_parallel_workers
    #max_parallel_workers = 8       # maximum number of max_worker_processes that
                        # can be used in parallel queries
    #old_snapshot_threshold = -1        # 1min-60d; -1 disables; 0 is immediate
                        # (change requires restart)
    #backend_flush_after = 0        # measured in pages, 0 disables
     
     
    #------------------------------------------------------------------------------
    # WRITE AHEAD LOG
    #------------------------------------------------------------------------------
     
    # - Settings -
     
    #wal_level = replica            # minimal, replica, or logical
                        # (change requires restart)
    #fsync = on             # flush data to disk for crash safety
                        # (turning this off can cause
                        # unrecoverable data corruption)
    #synchronous_commit = on        # synchronization level;
                        # off, local, remote_write, remote_apply, or on
    #wal_sync_method = fsync        # the default is the first option
                        # supported by the operating system:
                        #   open_datasync
                        #   fdatasync (default on Linux)
                        #   fsync
                        #   fsync_writethrough
                        #   open_sync
    #full_page_writes = on          # recover from partial page writes
    #wal_compression = off          # enable compression of full-page writes
    #wal_log_hints = off            # also do full page writes of non-critical updates
                        # (change requires restart)
    #wal_buffers = -1           # min 32kB, -1 sets based on shared_buffers
                        # (change requires restart)
    #wal_writer_delay = 200ms       # 1-10000 milliseconds
    #wal_writer_flush_after = 1MB       # measured in pages, 0 disables
     
    #commit_delay = 0           # range 0-100000, in microseconds
    #commit_siblings = 5            # range 1-1000
     
    # - Checkpoints -
     
    #checkpoint_timeout = 5min      # range 30s-1d
    #max_wal_size = 1GB
    #min_wal_size = 80MB
    #checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
    #checkpoint_flush_after = 256kB     # measured in pages, 0 disables
    #checkpoint_warning = 30s       # 0 disables
     
    # - Archiving -
     
    #archive_mode = off     # enables archiving; off, on, or always
                    # (change requires restart)
    #archive_command = ''       # command to use to archive a logfile segment
                    # placeholders: %p = path of file to archive
                    #               %f = file name only
                    # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
    #archive_timeout = 0        # force a logfile segment switch after this
                    # number of seconds; 0 disables
     
     
    #------------------------------------------------------------------------------
    # REPLICATION
    #------------------------------------------------------------------------------
     
    # - Sending Server(s) -
     
    # Set these on the master and on any standby that will send replication data.
     
    max_wal_senders = 2     # max number of walsender processes
                    # (change requires restart)
    wal_keep_segments = 32      # in logfile segments, 16MB each; 0 disables
    #wal_sender_timeout = 60s   # in milliseconds; 0 disables
     
    #max_replication_slots = 10 # max number of replication slots
                    # (change requires restart)
    #track_commit_timestamp = off   # collect timestamp of transaction commit
                    # (change requires restart)
     
    # - Master Server -
     
    # These settings are ignored on a standby server.
     
    #synchronous_standby_names = '' # standby servers that provide sync rep
                    # method to choose sync standbys, number of sync standbys,
                    # and comma-separated list of application_name
                    # from standby(s); '*' = all
    #vacuum_defer_cleanup_age = 0   # number of xacts by which cleanup is delayed
     
    # - Standby Servers -
     
    # These settings are ignored on a master server.
     
    hot_standby = on            # "off" disallows queries during recovery
                        # (change requires restart)
    #max_standby_archive_delay = 30s    # max delay before canceling queries
                        # when reading WAL from archive;
                        # -1 allows indefinite delay
    #max_standby_streaming_delay = 30s  # max delay before canceling queries
                        # when reading streaming WAL;
                        # -1 allows indefinite delay
    #wal_receiver_status_interval = 10s # send replies at least this often
                        # 0 disables
    #hot_standby_feedback = off     # send info from standby to prevent
                        # query conflicts
    #wal_receiver_timeout = 60s     # time that receiver waits for
                        # communication from master
                        # in milliseconds; 0 disables
    #wal_retrieve_retry_interval = 5s   # time to wait before retrying to
                        # retrieve WAL after a failed attempt
     
    # - Subscribers -
     
    # These settings are ignored on a publisher.
     
    #max_logical_replication_workers = 4    # taken from max_worker_processes
                        # (change requires restart)
    #max_sync_workers_per_subscription = 2  # taken from max_logical_replication_workers
     
     
    #------------------------------------------------------------------------------
    # QUERY TUNING
    #------------------------------------------------------------------------------
     
    # - Planner Method Configuration -
     
    #enable_bitmapscan = on
    #enable_hashagg = on
    #enable_hashjoin = on
    #enable_indexscan = on
    #enable_indexonlyscan = on
    #enable_material = on
    #enable_mergejoin = on
    #enable_nestloop = on
    #enable_seqscan = on
    #enable_sort = on
    #enable_tidscan = on
    #enable_eager = off
     
    # - Planner Cost Constants -
     
    #seq_page_cost = 1.0            # measured on an arbitrary scale
    #random_page_cost = 4.0         # same scale as above
    #cpu_tuple_cost = 0.01          # same scale as above
    #cpu_index_tuple_cost = 0.005       # same scale as above
    #cpu_operator_cost = 0.0025     # same scale as above
    #parallel_tuple_cost = 0.1      # same scale as above
    #parallel_setup_cost = 1000.0   # same scale as above
    #min_parallel_table_scan_size = 8MB
    #min_parallel_index_scan_size = 512kB
    #effective_cache_size = 4GB
     
    # - Genetic Query Optimizer -
     
    #geqo = on
    #geqo_threshold = 12
    #geqo_effort = 5            # range 1-10
    #geqo_pool_size = 0         # selects default based on effort
    #geqo_generations = 0           # selects default based on effort
    #geqo_selection_bias = 2.0      # range 1.5-2.0
    #geqo_seed = 0.0            # range 0.0-1.0
     
    # - Other Planner Options -
     
    #default_statistics_target = 100    # range 1-10000
    #constraint_exclusion = partition   # on, off, or partition
    #cursor_tuple_fraction = 0.1        # range 0.0-1.0
    #from_collapse_limit = 8
    #join_collapse_limit = 8        # 1 disables collapsing of explicit
                        # JOIN clauses
    #force_parallel_mode = off
     
     
    #------------------------------------------------------------------------------
    # ERROR REPORTING AND LOGGING
    #------------------------------------------------------------------------------
     
    # - Where to Log -
     
    #log_destination = 'stderr'     # Valid values are combinations of
                        # stderr, csvlog, syslog, and eventlog,
                        # depending on platform.  csvlog
                        # requires logging_collector to be on.
     
    # This is used when logging to stderr:
    #logging_collector = off        # Enable capturing of stderr and csvlog
                        # into log files. Required to be on for
                        # csvlogs.
                        # (change requires restart)
     
    # These are only used if logging_collector is on:
    #log_directory = 'log'          # directory where log files are written,
                        # can be absolute or relative to PGDATA
    log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
                        # can include strftime() escapes
    #log_file_mode = 0600           # creation mode for log files,
                        # begin with 0 to use octal notation
    #log_truncate_on_rotation = off     # If on, an existing log file with the
                        # same name as the new log file will be
                        # truncated rather than appended to.
                        # But such truncation only occurs on
                        # time-driven rotation, not on restarts
                        # or size-driven rotation.  Default is
                        # off, meaning append to existing files
                        # in all cases.
    #log_rotation_age = 1d          # Automatic rotation of logfiles will
                        # happen after that time.  0 disables.
    #log_rotation_size = 10MB       # Automatic rotation of logfiles will
                        # happen after that much log output.
                        # 0 disables.
     
    # These are relevant when logging to syslog:
    #syslog_facility = 'LOCAL0'
    #syslog_ident = 'postgres'
    #syslog_sequence_numbers = on
    #syslog_split_messages = on
     
    # This is only relevant when logging to eventlog (win32):
    # (change requires restart)
    #event_source = 'PostgreSQL'
     
    # - When to Log -
     
    #client_min_messages = notice       # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   log
                        #   notice
                        #   warning
                        #   error
     
    log_min_messages = log      # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   info
                        #   notice
                        #   warning
                        #   error
                        #   log
                        #   fatal
                        #   panic
     
    #log_min_error_statement = error    # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   info
                        #   notice
                        #   warning
                        #   error
                        #   log
                        #   fatal
                        #   panic (effectively off)
     
    #log_min_duration_statement = -1    # -1 is disabled, 0 logs all statements
                        # and their durations, > 0 logs only
                        # statements running at least this number
                        # of milliseconds
     
     
    # - What to Log -
     
    #debug_print_parse = off
    #debug_print_rewritten = off
    #debug_print_plan = off
    #debug_pretty_print = on
    #log_checkpoints = off
    #log_connections = off
    #log_disconnections = off
    #log_duration = off
    #log_error_verbosity = default      # terse, default, or verbose messages
    #log_hostname = off
    #log_line_prefix = '%m [%p] '       # special values:
                        #   %a = application name
                        #   %u = user name
                        #   %d = database name
                        #   %r = remote host and port
                        #   %h = remote host
                        #   %p = process ID
                        #   %t = timestamp without milliseconds
                        #   %m = timestamp with milliseconds
                        #   %n = timestamp with milliseconds (as a Unix epoch)
                        #   %i = command tag
                        #   %e = SQL state
                        #   %c = session ID
                        #   %l = session line number
                        #   %s = session start timestamp
                        #   %v = virtual transaction ID
                        #   %x = transaction ID (0 if none)
                        #   %q = stop here in non-session
                        #        processes
                        #   %% = '%'
                        # e.g. '<%u%%%d> '
    #log_lock_waits = off           # log lock waits >= deadlock_timeout
    #log_statement = 'none'         # none, ddl, mod, all
    #log_replication_commands = off
    #log_temp_files = -1            # log temporary files equal or larger
                        # than the specified size in kilobytes;
                        # -1 disables, 0 logs all temp files
    log_timezone = 'ROK'
     
     
    # - Process Title -
     
    #cluster_name = ''          # added to process titles if nonempty
                        # (change requires restart)
    #update_process_title = on
     
     
    #------------------------------------------------------------------------------
    # RUNTIME STATISTICS
    #------------------------------------------------------------------------------
     
    # - Query/Index Statistics Collector -
     
    #track_activities = on
    #track_counts = on
    #track_io_timing = off
    #track_functions = none         # none, pl, all
    #track_activity_query_size = 1024   # (change requires restart)
    #stats_temp_directory = 'pg_stat_tmp'
     
     
    # - Statistics Monitoring -
     
    #log_parser_stats = off
    #log_planner_stats = off
    #log_executor_stats = off
    #log_statement_stats = off
     
     
    #------------------------------------------------------------------------------
    # AUTOVACUUM PARAMETERS
    #------------------------------------------------------------------------------
     
    #autovacuum = on            # Enable autovacuum subprocess?  'on'
                        # requires track_counts to also be on.
    log_autovacuum_min_duration = 0 # -1 disables, 0 logs all actions and
                        # their durations, > 0 logs only
                        # actions running at least this number
                        # of milliseconds.
    #autovacuum_max_workers = 3     # max number of autovacuum subprocesses
                        # (change requires restart)
    #autovacuum_naptime = 1min      # time between autovacuum runs
    #autovacuum_vacuum_threshold = 50   # min number of row updates before
                        # vacuum
    #autovacuum_analyze_threshold = 50  # min number of row updates before
                        # analyze
    #autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
    #autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
    #autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
                        # (change requires restart)
    #autovacuum_multixact_freeze_max_age = 400000000    # maximum multixact age
                        # before forced vacuum
                        # (change requires restart)
    #autovacuum_vacuum_cost_delay = 20ms    # default vacuum cost delay for
                        # autovacuum, in milliseconds;
                        # -1 means use vacuum_cost_delay
    #autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
                        # autovacuum, -1 means use
                        # vacuum_cost_limit
     
     
    #------------------------------------------------------------------------------
    # CLIENT CONNECTION DEFAULTS
    #------------------------------------------------------------------------------
     
    # - Statement Behavior -
     
    #search_path = '"$user", public'    # schema names
    #default_tablespace = ''        # a tablespace name, '' uses the default
    #temp_tablespaces = ''          # a list of tablespace names, '' uses
                        # only default tablespace
    #check_function_bodies = on
    #default_transaction_isolation = 'read committed'
    #default_transaction_read_only = off
    #default_transaction_deferrable = off
    #session_replication_role = 'origin'
    #statement_timeout = 0          # in milliseconds, 0 is disabled
    #lock_timeout = 0           # in milliseconds, 0 is disabled
    #idle_in_transaction_session_timeout = 0    # in milliseconds, 0 is disabled
    #vacuum_freeze_min_age = 50000000
    #vacuum_freeze_table_age = 150000000
    #vacuum_multixact_freeze_min_age = 5000000
    #vacuum_multixact_freeze_table_age = 150000000
    #bytea_output = 'hex'           # hex, escape
    #xmlbinary = 'base64'
    #xmloption = 'content'
    #gin_fuzzy_search_limit = 0
    #gin_pending_list_limit = 4MB
     
    # - Locale and Formatting -
     
    datestyle = 'iso, ymd'
    #intervalstyle = 'postgres'
    timezone = 'ROK'
    #timezone_abbreviations = 'Default'     # Select the set of available time zone
                        # abbreviations.  Currently, there are
                        #   Default
                        #   Australia (historical usage)
                        #   India
                        # You can create your own file in
                        # share/timezonesets/.
    #extra_float_digits = 0         # min -15, max 3
    #client_encoding = sql_ascii        # actually, defaults to database
                        # encoding
     
    # These settings are initialized by initdb, but they can be changed.
    lc_messages = 'ko_KR.UTF-8'         # locale for system error message
                        # strings
    lc_monetary = 'ko_KR.UTF-8'         # locale for monetary formatting
    lc_numeric = 'ko_KR.UTF-8'          # locale for number formatting
    lc_time = 'ko_KR.UTF-8'             # locale for time formatting
     
    # default configuration for text search
    default_text_search_config = 'pg_catalog.simple'
     
    # - Other Defaults -
     
    #dynamic_library_path = '$libdir'
    #local_preload_libraries = ''
    #session_preload_libraries = ''
     
     
    #------------------------------------------------------------------------------
    # LOCK MANAGEMENT
    #------------------------------------------------------------------------------
     
    #deadlock_timeout = 1s
    #max_locks_per_transaction = 64     # min 10
                        # (change requires restart)
    #max_pred_locks_per_transaction = 64    # min 10
                        # (change requires restart)
    #max_pred_locks_per_relation = -2   # negative values mean
                        # (max_pred_locks_per_transaction
                        #  / -max_pred_locks_per_relation) - 1
    #max_pred_locks_per_page = 2            # min 0
     
     
    #------------------------------------------------------------------------------
    # VERSION/PLATFORM COMPATIBILITY
    #------------------------------------------------------------------------------
     
    # - Previous PostgreSQL Versions -
     
    #array_nulls = on
    #backslash_quote = safe_encoding    # on, off, or safe_encoding
    #default_with_oids = off
    #escape_string_warning = on
    #lo_compat_privileges = off
    #operator_precedence_warning = off
    #quote_all_identifiers = off
    #standard_conforming_strings = on
    #synchronize_seqscans = on
     
    # - Other Platforms and Clients -
     
    #transform_null_equals = off
     
     
    #------------------------------------------------------------------------------
    # ERROR HANDLING
    #------------------------------------------------------------------------------
     
    #exit_on_error = off            # terminate session on any error?
    #restart_after_crash = on       # reinitialize after backend crash?
     
     
    #------------------------------------------------------------------------------
    # CONFIG FILE INCLUDES
    #------------------------------------------------------------------------------
     
    # These options allow settings to be loaded from files other than the
    # default postgresql.conf.
     
    #include_dir = 'conf.d'         # include files ending in '.conf' from
                        # directory 'conf.d'
    #include_if_exists = 'exists.conf'  # include file only if it exists
    #include = 'special.conf'       # include file
     
     
    #------------------------------------------------------------------------------
    # CUSTOMIZED OPTIONS
    #------------------------------------------------------------------------------
     
    # Add settings for extensions here
     
    pg_stat_statements.max = 10000
                        # Sets the maximum number of statements tracked by
                        # pg_stat_statements.
    pg_stat_statements.track = all
                        # Selects which statements are tracked by
                        # pg_stat_statements. (none, top, all)
    #pg_stat_statements.track_utility = on
                        # Selects whether utility commands are tracked by
                        # pg_stat_statements.
    #pg_stat_statements.save = on
                        # Save pg_stat_statements statistics across server
                        # shutdowns.
     
    # - pg_statsinfo settings -
    #
    # See http://pgstatsinfo.sourceforge.net/pg_statsinfo.html#configuration
    # for more detailed information.
     
    #pg_statsinfo.adjust_log_level = off
                        # Enables or disables log level altering feature.
    #pg_statsinfo.adjust_log_log = ''
    #pg_statsinfo.adjust_log_info = ''
    #pg_statsinfo.adjust_log_notice = ''
    #pg_statsinfo.adjust_log_warning = ''
    #pg_statsinfo.adjust_log_error = ''
    #pg_statsinfo.adjust_log_fatal = ''
                        # Change loglevel into LOG/INFO/NOTICE/WARNING/ERROR/FATAL
                        # for logged entries with SQLSTATEs listed here. (*5)
    #pg_statsinfo.controlfile_fsync_interval = 1min
                        # Interval to sync pg_statsinfo's control file.
    pg_statsinfo.enable_maintenance = 'on'
                        # Enable or disable auto maintenance features. Multiple
                        # items should be comma separated.
                        #   'snapshot': Enables only snapshot maintenance.
                        #   'repolog': Enables only repository log maintenance.
                        #   'log': Enables only log file maintenance.
                        #   'snapshot, log': Enables both snapshot and log file
                        #                    maintenance.
                        #   'on': Enables all maintenance features.
                        #   'off': Disables everything.
    #pg_statsinfo.excluded_dbnames = 'template0,template1'
                        # Exclude databases listed here from monitoring.
    #pg_statsinfo.excluded_schemas = 'pg_catalog,pg_toast,information_schema'
                        # Exclude schemas listed here from monitoring.
    #pg_statsinfo.log_maintenance_command = 'archive_pglog.sh %l'
                        # Command path to be executed to do log file maintenance.
                        # Default value is a ready-made shell script which archives
                        # old log files into compressed files then removes them.
    #pg_statsinfo.long_lock_threshold = 30s
                        # Time to wait before record prolonged locks.
    #pg_statsinfo.long_transaction_max = 10s
                        # Sets the max collection size of long transaction.
    pg_statsinfo.maintenance_time = '00:02:00'
                        # Time to do automatic maintenance.
    #pg_statsinfo.repolog_buffer = 10000
                        # Since repository logs are sent to repository every 10
                        # seconds by default, pg_statsinfo needs to buffer logs for
                        # the intervals. Additionaly, this buffer is expected to
                        # absorb a transient burst of log entries which might
                        # retard storing them. Log entries which are run over this
                        # buffer are simply dropped off.
    #pg_statsinfo.repolog_interval = 10s
                        # Repository logs are written at intervals of this value.
    pg_statsinfo.repolog_keepday = 7
                        # Repository logs are preserved for this period.
    #pg_statsinfo.repolog_min_messages = warning
                        # Minimum message levels for repository log. (*1)
    #pg_statsinfo.repolog_nologging_users = ''
                        # Exclude log lines of these users separated by commas from
                        # repository log.
    pg_statsinfo.repository_keepday = 7
                        # Snapshots are preserved for this period.
    #pg_statsinfo.repository_server = 'dbname=postgres port=5432'
                        # Connection string to connect the repository. (*4)
                        # Password prompt must be avoided.
    #pg_statsinfo.sampling_interval = 5s
                        # Sampling is a process collecting some additional
                        # informations such like session states several times for
                        # a snapshot interval. This value should be a fraction of
                        # snapshot interval. (*3)
    pg_statsinfo.snapshot_interval = 30min          # snapshot interval (*3)
    #pg_statsinfo.stat_statements_max = 30
                        # Maximum number of entries of pg_stat_statements to be
                        # recorded for every snapshot.
    #pg_statsinfo.stat_statements_exclude_users = ''
                        # Exclude queries of these users separated by commas from
                        # snapshots.
    pg_statsinfo.syslog_line_prefix = '%t %p %c-%l %x %q(%u, %d, %r, %a) '
                        # A printf-style string that is output at the beginning of
                        # each syslog line. (*2) Note that timestamp and process ID
                        # in syslog are them of pg_statsinfo daemon, not of
                        # original ones. You need to add %t and %p to preserve the
                        # original values.
    pg_statsinfo.syslog_min_messages = error
                        # Minimum message level for syslog. (*1)
    #pg_statsinfo.textlog_filename = 'pg_statsinfo.log'
                        # Textlog filename. Should not be empty.
    pg_statsinfo.textlog_line_prefix = '%t %p %c-%l %x %q(%u, %d, %r, %a) '
                        # A printf-style string that is output at the beginning of
                        # each textlog line. (*2)
    #pg_statsinfo.textlog_min_messages = warning
                        # Minimum message level for textlog. (*1)
    #pg_statsinfo.textlog_nologging_users = ''
                        # Exclude log lines of these users separated by commas from
                        # text log.
    #pg_statsinfo.textlog_permission = 0600
                        # Permission mode for textlog file.
    #pg_statsinfo.enable_alert = on
                        # Off disables all alerts for this instance.
    #pg_statsinfo.target_server = ''
                        # Connection string for the observed instance. (*4)
     
    #pg_hint_plan.enable_hint = on
                        # Force planner to use plans specified in the hint comment
                        # preceding to the query.
    #pg_hint_plan.debug_print = off
                        # Logs results of hint parsing.
    #pg_hint_plan.parse_messages = info
                        # Message level of parse errors.
    #pg_hint_plan.message_level = info
                        # Message level of debug messages.
    #pg_hint_plan.enable_hint_table = false
                        # Force planner to not get hint by using table lookups.
    pgpool.pg_ctl = '/home/bylee/install/agensgraph/bin/agens'

    data2/recovery.conf 내용

    standby_mode = on
    primary_conninfo = 'host=127.0.0.1 port=7432 user=bylee password=bylee'
    trigger_file = '/home/bylee/install/pgpool2-4_0_1/data2/trigger'

    위 내용에서 user=bylee, password=bylee는 replicator에 대한 내용이다. 여기서는 간단히 테스트하기 위해 db root 계정을 사용한다.

    pgpool-II의 pgpool.conf 내용

    # ----------------------------
    # pgPool-II configuration file
    # ----------------------------
    #
    # This file consists of lines of the form:
    #
    #   name = value
    #
    # Whitespace may be used.  Comments are introduced with "#" anywhere on a line.
    # The complete list of parameter names and allowed values can be found in the
    # pgPool-II documentation.
    #
    # This file is read on server startup and when the server receives a SIGHUP
    # signal.  If you edit the file on a running system, you have to SIGHUP the
    # server for the changes to take effect, or use "pgpool reload".  Some
    # parameters, which are marked below, require a server shutdown and restart to
    # take effect.
    #
     
     
    #------------------------------------------------------------------------------
    # CONNECTIONS
    #------------------------------------------------------------------------------
     
    # - pgpool Connection Settings -
     
    listen_addresses = 'localhost'
                                       # Host name or IP address to listen on:
                                       # '*' for all, '' for no TCP/IP connections
                                       # (change requires restart)
    port = 9999
                                       # Port number
                                       # (change requires restart)
    socket_dir = '/tmp'
                                       # Unix domain socket path
                                       # The Debian package defaults to
                                       # /var/run/postgresql
                                       # (change requires restart)
     
     
    # - pgpool Communication Manager Connection Settings -
     
    pcp_listen_addresses = '*'
                                       # Host name or IP address for pcp process to listen on:
                                       # '*' for all, '' for no TCP/IP connections
                                       # (change requires restart)
    pcp_port = 9898
                                       # Port number for pcp
                                       # (change requires restart)
    pcp_socket_dir = '/tmp'
                                       # Unix domain socket path for pcp
                                       # The Debian package defaults to
                                       # /var/run/postgresql
                                       # (change requires restart)
    listen_backlog_multiplier = 2
                                       # Set the backlog parameter of listen(2) to
                                       # num_init_children * listen_backlog_multiplier.
                                       # (change requires restart)
    serialize_accept = off
                                       # whether to serialize accept() call to avoid thundering herd problem
                                       # (change requires restart)
     
    # - Backend Connection Settings -
     
    backend_hostname0 = 'localhost'
                                       # Host name or IP address to connect to for backend 0
    backend_port0 = 7432
                                       # Port number for backend 0
    backend_weight0 = 1
                                       # Weight for backend 0 (only in load balancing mode)
    backend_data_directory0 = '/home/bylee/install/pgpool2-4_0_1/data1'
                                       # Data directory for backend 0
    backend_flag0 = 'ALLOW_TO_FAILOVER'
                                       # Controls various backend behavior
                                       # ALLOW_TO_FAILOVER, DISALLOW_TO_FAILOVER
                       # or ALWAYS_MASTER
    backend_hostname1 = 'localhost'
    backend_port1 = 7433
    backend_weight1 = 1
    backend_data_directory1 = '/home/bylee/install/pgpool2-4_0_1/data2'
    backend_flag1 = 'ALLOW_TO_FAILOVER'
     
    # - Authentication -
     
    enable_pool_hba = off
                                       # Use pool_hba.conf for client authentication
    pool_passwd = 'pool_passwd'
                                       # File name of pool_passwd for md5 authentication.
                                       # "" disables pool_passwd.
                                       # (change requires restart)
    authentication_timeout = 60
                                       # Delay in seconds to complete client authentication
                                       # 0 means no timeout.
     
    allow_clear_text_frontend_auth = off
                                       # Allow Pgpool-II to use clear text password authentication
                                       # with clients, when pool_passwd does not
                                       # contain the user password
     
    # - SSL Connections -
     
    ssl = off
                                       # Enable SSL support
                                       # (change requires restart)
    #ssl_key = './server.key'
                                       # Path to the SSL private key file
                                       # (change requires restart)
    #ssl_cert = './server.cert'
                                       # Path to the SSL public certificate file
                                       # (change requires restart)
    #ssl_ca_cert = ''
                                       # Path to a single PEM format file
                                       # containing CA root certificate(s)
                                       # (change requires restart)
    #ssl_ca_cert_dir = ''
                                       # Directory containing CA root certificate(s)
                                       # (change requires restart)
     
     
    #------------------------------------------------------------------------------
    # POOLS
    #------------------------------------------------------------------------------
     
    # - Concurrent session and pool size -
     
    num_init_children = 32
                                       # Number of concurrent sessions allowed
                                       # (change requires restart)
    max_pool = 4
                                       # Number of connection pool caches per connection
                                       # (change requires restart)
     
    # - Life time -
     
    child_life_time = 300
                                       # Pool exits after being idle for this many seconds
    child_max_connections = 0
                                       # Pool exits after receiving that many connections
                                       # 0 means no exit
    connection_life_time = 0
                                       # Connection to backend closes after being idle for this many seconds
                                       # 0 means no close
    client_idle_limit = 0
                                       # Client is disconnected after being idle for that many seconds
                                       # (even inside an explicit transactions!)
                                       # 0 means no disconnection
     
     
    #------------------------------------------------------------------------------
    # LOGS
    #------------------------------------------------------------------------------
     
    # - Where to log -
     
    log_destination = 'stderr'
                                       # Where to log
                                       # Valid values are combinations of stderr,
                                       # and syslog. Default to stderr.
     
    # - What to log -
     
    log_line_prefix = '%t: pid %p: '   # printf-style string to output at beginning of each log line.
     
    log_connections = off
                                       # Log connections
    log_hostname = off
                                       # Hostname will be shown in ps status
                                       # and in logs if connections are logged
    log_statement = off
                                       # Log all statements
    log_per_node_statement = off
                                       # Log all statements
                                       # with node and backend informations
    log_client_messages = off
                                       # Log any client messages
    log_standby_delay = 'if_over_threshold'
                                       # Log standby delay
                                       # Valid values are combinations of always,
                                       # if_over_threshold, none
     
    # - Syslog specific -
     
    syslog_facility = 'LOCAL0'
                                       # Syslog local facility. Default to LOCAL0
    syslog_ident = 'pgpool'
                                       # Syslog program identification string
                                       # Default to 'pgpool'
     
    # - Debug -
     
    #log_error_verbosity = default          # terse, default, or verbose messages
     
    #client_min_messages = notice           # values in order of decreasing detail:
                                            #   debug5
                                            #   debug4
                                            #   debug3
                                            #   debug2
                                            #   debug1
                                            #   log
                                            #   notice
                                            #   warning
                                            #   error
     
    #log_min_messages = warning             # values in order of decreasing detail:
                                            #   debug5
                                            #   debug4
                                            #   debug3
                                            #   debug2
                                            #   debug1
                                            #   info
                                            #   notice
                                            #   warning
                                            #   error
                                            #   log
                                            #   fatal
                                            #   panic
     
    #------------------------------------------------------------------------------
    # FILE LOCATIONS
    #------------------------------------------------------------------------------
     
    pid_file_name = '/home/bylee/install/pgpool2-4_0_1/pgpool.pid'
                                       # PID file name
                                       # Can be specified as relative to the"
                                       # location of pgpool.conf file or
                                       # as an absolute path
                                       # (change requires restart)
    logdir = '/home/bylee/install/pgpool2-4_0_1/tmp'
                                       # Directory of pgPool status file
                                       # (change requires restart)
     
     
    #------------------------------------------------------------------------------
    # CONNECTION POOLING
    #------------------------------------------------------------------------------
     
    connection_cache = on
                                       # Activate connection pools
                                       # (change requires restart)
     
                                       # Semicolon separated list of queries
                                       # to be issued at the end of a session
                                       # The default is for 8.3 and later
    reset_query_list = 'ABORT; DISCARD ALL'
                                       # The following one is for 8.2 and before
    #reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'
     
     
    #------------------------------------------------------------------------------
    # REPLICATION MODE
    #------------------------------------------------------------------------------
     
    replication_mode = off
                                       # Activate replication mode
                                       # (change requires restart)
    replicate_select = on
                                       # Replicate SELECT statements
                                       # when in replication mode
                                       # replicate_select is higher priority than
                                       # load_balance_mode.
     
    insert_lock = off
                                       # Automatically locks a dummy row or a table
                                       # with INSERT statements to keep SERIAL data
                                       # consistency
                                       # Without SERIAL, no lock will be issued
    lobj_lock_table = ''
                                       # When rewriting lo_creat command in
                                       # replication mode, specify table name to
                                       # lock
     
    # - Degenerate handling -
     
    replication_stop_on_mismatch = off
                                       # On disagreement with the packet kind
                                       # sent from backend, degenerate the node
                                       # which is most likely "minority"
                                       # If off, just force to exit this session
     
    failover_if_affected_tuples_mismatch = off
                                       # On disagreement with the number of affected
                                       # tuples in UPDATE/DELETE queries, then
                                       # degenerate the node which is most likely
                                       # "minority".
                                       # If off, just abort the transaction to
                                       # keep the consistency
     
     
    #------------------------------------------------------------------------------
    # LOAD BALANCING MODE
    #------------------------------------------------------------------------------
     
    load_balance_mode = on
                                       # Activate load balancing mode
                                       # (change requires restart)
    ignore_leading_white_space = on
                                       # Ignore leading white spaces of each query
    white_function_list = ''
                                       # Comma separated list of function names
                                       # that don't write to database
                                       # Regexp are accepted
    black_function_list = 'currval,lastval,nextval,setval'
                                       # Comma separated list of function names
                                       # that write to database
                                       # Regexp are accepted
     
    black_query_pattern_list = ''
                                       # Semicolon separated list of query patterns
                                       # that should be sent to primary node
                                       # Regexp are accepted
                                       # valid for streaming replicaton mode only.
     
    database_redirect_preference_list = ''
                                       # comma separated list of pairs of database and node id.
                                       # example: postgres:primary,mydb[0-4]:1,mydb[5-9]:2'
                                       # valid for streaming replicaton mode only.
     
    app_name_redirect_preference_list = ''
                                       # comma separated list of pairs of app name and node id.
                                       # example: 'psql:primary,myapp[0-4]:1,myapp[5-9]:standby'
                                       # valid for streaming replicaton mode only.
    allow_sql_comments = off
                                       # if on, ignore SQL comments when judging if load balance or
                                       # query cache is possible.
                                       # If off, SQL comments effectively prevent the judgment
                                       # (pre 3.4 behavior).
     
    disable_load_balance_on_write = 'transaction'   # Load balance behavior when write query is issued
                            # in an explicit transaction.
                            # Note that any query not in an explicit transaction
                            # is not affected by the parameter.
                            # 'transaction' (the default): if a write query is issued,
                            # subsequent read queries will not be load balanced
                            # until the transaction ends.
                            # 'trans_transaction': if a write query is issued,
                            # subsequent read queries in an explicit transaction
                            # will not be load balanced until the session ends.
                            # 'always': if a write query is issued, read queries will
                            # not be load balanced until the session ends.
     
    #------------------------------------------------------------------------------
    # MASTER/SLAVE MODE
    #------------------------------------------------------------------------------
     
    master_slave_mode = on
                                       # Activate master/slave mode
                                       # (change requires restart)
    master_slave_sub_mode = 'stream'
                                       # Master/slave sub mode
                                       # Valid values are combinations stream, slony
                                       # or logical. Default is stream.
                                       # (change requires restart)
     
    # - Streaming -
     
    sr_check_period = 0
                                       # Streaming replication check period
                                       # Disabled (0) by default
    sr_check_user = 'bylee'
                                       # Streaming replication check user
                                       # This is neccessary even if you disable streaming
                                       # replication delay check by sr_check_period = 0
    sr_check_password = 'bylee'
                                       # Password for streaming replication check user
                                       # Leaving it empty will make Pgpool-II to first look for the
                                       # Password in pool_passwd file before using the empty password
     
    sr_check_database = 'postgres'
                                       # Database name for streaming replication check
    delay_threshold = 0
                                       # Threshold before not dispatching query to standby node
                                       # Unit is in bytes
                                       # Disabled (0) by default
     
    # - Special commands -
     
    follow_master_command = ''
                                       # Executes this command after master failover
                                       # Special values:
                                       #   %d = node id
                                       #   %h = host name
                                       #   %p = port number
                                       #   %D = database cluster path
                                       #   %m = new master node id
                                       #   %H = hostname of the new master node
                                       #   %M = old master node id
                                       #   %P = old primary node id
                                       #   %r = new master port number
                                       #   %R = new master database cluster path
                                       #   %% = '%' character
     
    #------------------------------------------------------------------------------
    # HEALTH CHECK GLOBAL PARAMETERS
    #------------------------------------------------------------------------------
     
    health_check_period = 5
                                       # Health check period
                                       # Disabled (0) by default
    health_check_timeout = 20
                                       # Health check timeout
                                       # 0 means no timeout
    health_check_user = 'bylee'
                                       # Health check user
    health_check_password = 'bylee'
                                       # Password for health check user
                                       # Leaving it empty will make Pgpool-II to first look for the
                                       # Password in pool_passwd file before using the empty password
     
    health_check_database = 'postgres'
                                       # Database name for health check. If '', tries 'postgres' frist,
    health_check_max_retries = 0
                                       # Maximum number of times to retry a failed health check before giving up.
    health_check_retry_delay = 1
                                       # Amount of time to wait (in seconds) between retries.
    connect_timeout = 10000
                                       # Timeout value in milliseconds before giving up to connect to backend.
                                       # Default is 10000 ms (10 second). Flaky network user may want to increase
                                       # the value. 0 means no timeout.
                                       # Note that this value is not only used for health check,
                                       # but also for ordinary conection to backend.
     
    #------------------------------------------------------------------------------
    # HEALTH CHECK PER NODE PARAMETERS (OPTIONAL)
    #------------------------------------------------------------------------------
    #health_check_period0 = 0
    #health_check_timeout0 = 20
    #health_check_user0 = 'nobody'
    #health_check_password0 = ''
    #health_check_database0 = ''
    #health_check_max_retries0 = 0
    #health_check_retry_delay0 = 1
    #connect_timeout0 = 10000
     
    #------------------------------------------------------------------------------
    # FAILOVER AND FAILBACK
    #------------------------------------------------------------------------------
    failover_command = '/home/bylee/install/pgpool2-4_0_1/failover.sh %d %P %H %R'
    #failover_command = ''
                                       # Executes this command at failover
                                       # Special values:
                                       #   %d = node id
                                       #   %h = host name
                                       #   %p = port number
                                       #   %D = database cluster path
                                       #   %m = new master node id
                                       #   %H = hostname of the new master node
                                       #   %M = old master node id
                                       #   %P = old primary node id
                                       #   %r = new master port number
                                       #   %R = new master database cluster path
                                       #   %% = '%' character
    failback_command = ''
                                       # Executes this command at failback.
                                       # Special values:
                                       #   %d = node id
                                       #   %h = host name
                                       #   %p = port number
                                       #   %D = database cluster path
                                       #   %m = new master node id
                                       #   %H = hostname of the new master node
                                       #   %M = old master node id
                                       #   %P = old primary node id
                                       #   %r = new master port number
                                       #   %R = new master database cluster path
                                       #   %% = '%' character
     
    failover_on_backend_error = on
                                       # Initiates failover when reading/writing to the
                                       # backend communication socket fails
                                       # If set to off, pgpool will report an
                                       # error and disconnect the session.
     
    detach_false_primary = off
                                       # Detach false primary if on. Only
                                       # valid in streaming replicaton
                                       # mode and with PostgreSQL 9.6 or
                                       # after.
     
    search_primary_node_timeout = 300
                                       # Timeout in seconds to search for the
                                       # primary node when a failover occurs.
                                       # 0 means no timeout, keep searching
                                       # for a primary node forever.
     
    #------------------------------------------------------------------------------
    # ONLINE RECOVERY
    #------------------------------------------------------------------------------
     
    recovery_user = 'nobody'
                                       # Online recovery user
    recovery_password = ''
                                       # Online recovery password
                                       # Leaving it empty will make Pgpool-II to first look for the
                                       # Password in pool_passwd file before using the empty password
     
    recovery_1st_stage_command = ''
                                       # Executes a command in first stage
    recovery_2nd_stage_command = ''
                                       # Executes a command in second stage
    recovery_timeout = 90
                                       # Timeout in seconds to wait for the
                                       # recovering node's postmaster to start up
                                       # 0 means no wait
    client_idle_limit_in_recovery = 0
                                       # Client is disconnected after being idle
                                       # for that many seconds in the second stage
                                       # of online recovery
                                       # 0 means no disconnection
                                       # -1 means immediate disconnection
     
     
    #------------------------------------------------------------------------------
    # WATCHDOG
    #------------------------------------------------------------------------------
     
    # - Enabling -
     
    use_watchdog = off
                                        # Activates watchdog
                                        # (change requires restart)
     
    # -Connection to up stream servers -
     
    trusted_servers = ''
                                        # trusted server list which are used
                                        # to confirm network connection
                                        # (hostA,hostB,hostC,...)
                                        # (change requires restart)
    ping_path = '/bin'
                                        # ping command path
                                        # (change requires restart)
     
    # - Watchdog communication Settings -
     
    wd_hostname = ''
                                        # Host name or IP address of this watchdog
                                        # (change requires restart)
    wd_port = 9000
                                        # port number for watchdog service
                                        # (change requires restart)
    wd_priority = 1
                                        # priority of this watchdog in leader election
                                        # (change requires restart)
     
    wd_authkey = ''
                                        # Authentication key for watchdog communication
                                        # (change requires restart)
     
    wd_ipc_socket_dir = '/tmp'
                                        # Unix domain socket path for watchdog IPC socket
                                        # The Debian package defaults to
                                        # /var/run/postgresql
                                        # (change requires restart)
     
     
    # - Virtual IP control Setting -
     
    delegate_IP = ''
                                        # delegate IP address
                                        # If this is empty, virtual IP never bring up.
                                        # (change requires restart)
    if_cmd_path = '/sbin'
                                        # path to the directory where if_up/down_cmd exists
                                        # (change requires restart)
    if_up_cmd = 'ip addr add $_IP_$/24 dev eth0 label eth0:0'
                                        # startup delegate IP command
                                        # (change requires restart)
    if_down_cmd = 'ip addr del $_IP_$/24 dev eth0'
                                        # shutdown delegate IP command
                                        # (change requires restart)
    arping_path = '/usr/sbin'
                                        # arping command path
                                        # (change requires restart)
    arping_cmd = 'arping -U $_IP_$ -w 1'
                                        # arping command
                                        # (change requires restart)
     
    # - Behaivor on escalation Setting -
     
    clear_memqcache_on_escalation = on
                                        # Clear all the query cache on shared memory
                                        # when standby pgpool escalate to active pgpool
                                        # (= virtual IP holder).
                                        # This should be off if client connects to pgpool
                                        # not using virtual IP.
                                        # (change requires restart)
    wd_escalation_command = ''
                                        # Executes this command at escalation on new active pgpool.
                                        # (change requires restart)
    wd_de_escalation_command = ''
                                        # Executes this command when master pgpool resigns from being master.
                                        # (change requires restart)
     
    # - Watchdog consensus settings for failover -
     
    failover_when_quorum_exists = on
                                        # Only perform backend node failover
                                        # when the watchdog cluster holds the quorum
                                        # (change requires restart)
     
    failover_require_consensus = on
                                        # Perform failover when majority of Pgpool-II nodes
                                        # aggrees on the backend node status change
                                        # (change requires restart)
     
    allow_multiple_failover_requests_from_node = off
                                        # A Pgpool-II node can cast multiple votes
                                        # for building the consensus on failover
                                        # (change requires restart)
     
     
    # - Lifecheck Setting -
     
    # -- common --
     
    wd_monitoring_interfaces_list = ''  # Comma separated list of interfaces names to monitor.
                                        # if any interface from the list is active the watchdog will
                                        # consider the network is fine
                                        # 'any' to enable monitoring on all interfaces except loopback
                                        # '' to disable monitoring
                                        # (change requires restart)
     
    wd_lifecheck_method = 'heartbeat'
                                        # Method of watchdog lifecheck ('heartbeat' or 'query' or 'external')
                                        # (change requires restart)
    wd_interval = 10
                                        # lifecheck interval (sec) > 0
                                        # (change requires restart)
     
    # -- heartbeat mode --
     
    wd_heartbeat_port = 9694
                                        # Port number for receiving heartbeat signal
                                        # (change requires restart)
    wd_heartbeat_keepalive = 2
                                        # Interval time of sending heartbeat signal (sec)
                                        # (change requires restart)
    wd_heartbeat_deadtime = 30
                                        # Deadtime interval for heartbeat signal (sec)
                                        # (change requires restart)
    heartbeat_destination0 = 'localhost'
                                        # Host name or IP address of destination 0
                                        # for sending heartbeat signal.
                                        # (change requires restart)
    heartbeat_destination_port0 = 9694
                                        # Port number of destination 0 for sending
                                        # heartbeat signal. Usually this is the
                                        # same as wd_heartbeat_port.
                                        # (change requires restart)
    heartbeat_device0 = ''
                                        # Name of NIC device (such like 'eth0')
                                        # used for sending/receiving heartbeat
                                        # signal to/from destination 0.
                                        # This works only when this is not empty
                                        # and pgpool has root privilege.
                                        # (change requires restart)
     
    #heartbeat_destination1 = 'host0_ip2'
    #heartbeat_destination_port1 = 9694
    #heartbeat_device1 = ''
     
    # -- query mode --
     
    wd_life_point = 3
                                        # lifecheck retry times
                                        # (change requires restart)
    wd_lifecheck_query = 'SELECT 1'
                                        # lifecheck query to pgpool from watchdog
                                        # (change requires restart)
    wd_lifecheck_dbname = 'template1'
                                        # Database name connected for lifecheck
                                        # (change requires restart)
    wd_lifecheck_user = 'nobody'
                                        # watchdog user monitoring pgpools in lifecheck
                                        # (change requires restart)
    wd_lifecheck_password = ''
                                        # Password for watchdog user in lifecheck
                                        # Leaving it empty will make Pgpool-II to first look for the
                                        # Password in pool_passwd file before using the empty password
                                        # (change requires restart)
     
    # - Other pgpool Connection Settings -
     
    other_pgpool_hostname0 = 'localhost'
                                        # Host name or IP address to connect to for other pgpool 0
                                        # (change requires restart)
    other_pgpool_port0 = 9999
                                        # Port number for other pgpool 0
                                        # (change requires restart)
    other_wd_port0 = 9000
                                        # Port number for other watchdog 0
                                        # (change requires restart)
    #other_pgpool_hostname1 = 'host1'
    #other_pgpool_port1 = 5432
    #other_wd_port1 = 9000
     
     
    #------------------------------------------------------------------------------
    # OTHERS
    #------------------------------------------------------------------------------
    relcache_expire = 0
                                       # Life time of relation cache in seconds.
                                       # 0 means no cache expiration(the default).
                                       # The relation cache is used for cache the
                                       # query result against PostgreSQL system
                                       # catalog to obtain various information
                                       # including table structures or if it's a
                                       # temporary table or not. The cache is
                                       # maintained in a pgpool child local memory
                                       # and being kept as long as it survives.
                                       # If someone modify the table by using
                                       # ALTER TABLE or some such, the relcache is
                                       # not consistent anymore.
                                       # For this purpose, cache_expiration
                                       # controls the life time of the cache.
    relcache_size = 256
                                       # Number of relation cache
                                       # entry. If you see frequently:
                                       # "pool_search_relcache: cache replacement happend"
                                       # in the pgpool log, you might want to increate this number.
     
    check_temp_table = on
                                       # If on, enable temporary table check in SELECT statements.
                                       # This initiates queries against system catalog of primary/master
                                       # thus increases load of master.
                                       # If you are absolutely sure that your system never uses temporary tables
                                       # and you want to save access to primary/master, you could turn this off.
                                       # Default is on.
     
    check_unlogged_table = on
                                       # If on, enable unlogged table check in SELECT statements.
                                       # This initiates queries against system catalog of primary/master
                                       # thus increases load of master.
                                       # If you are absolutely sure that your system never uses unlogged tables
                                       # and you want to save access to primary/master, you could turn this off.
                                       # Default is on.
     
    #------------------------------------------------------------------------------
    # IN MEMORY QUERY MEMORY CACHE
    #------------------------------------------------------------------------------
    memory_cache_enabled = off
                                       # If on, use the memory cache functionality, off by default
    memqcache_method = 'shmem'
                                       # Cache storage method. either 'shmem'(shared memory) or
                                       # 'memcached'. 'shmem' by default
                                       # (change requires restart)
    memqcache_memcached_host = 'localhost'
                                       # Memcached host name or IP address. Mandatory if
                                       # memqcache_method = 'memcached'.
                                       # Defaults to localhost.
                                       # (change requires restart)
    memqcache_memcached_port = 11211
                                       # Memcached port number. Mondatory if memqcache_method = 'memcached'.
                                       # Defaults to 11211.
                                       # (change requires restart)
    memqcache_total_size = 67108864
                                       # Total memory size in bytes for storing memory cache.
                                       # Mandatory if memqcache_method = 'shmem'.
                                       # Defaults to 64MB.
                                       # (change requires restart)
    memqcache_max_num_cache = 1000000
                                       # Total number of cache entries. Mandatory
                                       # if memqcache_method = 'shmem'.
                                       # Each cache entry consumes 48 bytes on shared memory.
                                       # Defaults to 1,000,000(45.8MB).
                                       # (change requires restart)
    memqcache_expire = 0
                                       # Memory cache entry life time specified in seconds.
                                       # 0 means infinite life time. 0 by default.
                                       # (change requires restart)
    memqcache_auto_cache_invalidation = on
                                       # If on, invalidation of query cache is triggered by corresponding
                                       # DDL/DML/DCL(and memqcache_expire).  If off, it is only triggered
                                       # by memqcache_expire.  on by default.
                                       # (change requires restart)
    memqcache_maxcache = 409600
                                       # Maximum SELECT result size in bytes.
                                       # Must be smaller than memqcache_cache_block_size. Defaults to 400KB.
                                       # (change requires restart)
    memqcache_cache_block_size = 1048576
                                       # Cache block size in bytes. Mandatory if memqcache_method = 'shmem'.
                                       # Defaults to 1MB.
                                       # (change requires restart)
    memqcache_oiddir = '/var/log/pgpool/oiddir'
                                       # Temporary work directory to record table oids
                                       # (change requires restart)
    white_memqcache_table_list = ''
                                       # Comma separated list of table names to memcache
                                       # that don't write to database
                                       # Regexp are accepted
    black_memqcache_table_list = ''
                                       # Comma separated list of table names not to memcache
                                       # that don't write to database
                                       # Regexp are accepted

    위 내용에서 failover_command에는 failover.sh 파일의 경로를 지정한다.

    failover.sh 파일 내용

    #! /bin/sh -x
    # Execute command by failover.
    # special values:  %d = node id
    #                  %h = host name
    #                  %p = port number
    #                  %D = database cluster path
    #                  %m = new master node id
    #                  %M = old master node id
    #                  %H = new master node host name
    #                  %P = old primary node id
    #                  %R = new master database cluster path
    #                  %r = new master port number
    #                  %% = '%' character
     
    falling_node=$1          # %d
    old_primary=$2           # %P
    new_primary=$3           # %H
    pgdata=$4                # %R
     
    pghome=/home/bylee/install/agensgraph
    log=failover.log
     
    date >> $log
    echo "failed_node_id=$falling_node new_primary=$new_primary" >> $log
     
    if [ $falling_node = $old_primary ]; then
        $pghome/bin/ag_ctl promote -D $pgdata
        exit 0;
    fi;
    exit 0;

    pgpool-II 구성 확인

    [bylee@bylee5 pgpool2-4_0_1]$ agens -p 9999 -d postgres
    agens (AgensGraph 1.4devel, based on PostgreSQL 10.3)
    Type "help" for help.
     
    postgres=# show pool_nodes;
     node_id | hostname  | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change 
    ---------+-----------+------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
     0       | localhost | 7432 | up     | 0.500000  | primary | 0          | true              | 0                 | 2018-11-21 13:48:28
     1       | localhost | 7433 | up     | 0.500000  | standby | 0          | false             | 0                 | 2018-11-21 13:48:28
    (2 rows)

    data1 stop

    [bylee@bylee5 pgpool2-4_0_1]$ ag_ctl -D data1 stop
    waiting for server to shut down.... done
    server stopped

    failover 확인

    [bylee@bylee5 pgpool2-4_0_1]$ agens -p 9999 -d postgres
    agens (AgensGraph 1.4devel, based on PostgreSQL 10.3)
    Type "help" for help.
     
    postgres=# show pool_nodes;
     node_id | hostname  | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change 
    ---------+-----------+------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
     0       | localhost | 7432 | down   | 0.500000  | standby | 0          | false             | 0                 | 2018-11-22 09:36:11
     1       | localhost | 7433 | up     | 0.500000  | primary | 0          | true              | 0                 | 2018-11-22 09:36:11
    (2 rows)

    위에서 보는 바와 같이 failover가 발생해도 -p 9999 옵션으로 전과 동일하게 접속이 가능하다.

    'PostgreSQL' 카테고리의 다른 글

    repmgr 설치  (0) 2019.10.14
    pgbouncer와 pgpool-II 비교  (0) 2019.10.11
    pgbouncer session failover  (0) 2019.10.11
    pgBouncer와 pgPool-II 성능 측정  (0) 2019.10.11
    pgBouncer 소스 수정량 확인  (0) 2019.10.11
Designed by Tistory.