PostgreSQL流复制配置
主库配置
编辑$PGDATA/postgresql.conf文件
log_timezone = 'PRC'datestyle = 'iso, mdy'timezone = 'PRC'default_text_search_config = 'pg_catalog.english'listen_addresses = '*'port = 5432wal_level = hot_standbyhot_standby = onarchive_mode = onarchive_command = 'cp "%p" "/data/pgsql/archivedir/%f"'max_wal_senders = 5wal_keep_segments = 1280wal_sender_timeout = 60smax_connections = 2500max_prepared_transactions = 2500wal_log_hints = onmax_parallel_maintenance_workers = 16maintenance_work_mem = 3GBmax_worker_processes = 64max_parallel_workers_per_gather = 24max_parallel_workers = 36effective_cache_size = 64GBhuge_pages = tryshared_buffers = 64GB#idle_in_transaction_session_timeout = 180000wal_buffers = 16MBshared_preload_libraries = 'pg_stat_statements'pg_stat_statements.max = 10000pg_stat_statements.track = allcheckpoint_timeout = 30minmax_sync_workers_per_subscription = 32max_wal_size = 64GBmin_wal_size = 4GBwal_compression = ontcp_keepalives_idle = 600tcp_keepalives_interval = 10tcp_keepalives_count = 6autovacuum = onautovacuum_max_workers = 8autovacuum_work_mem = 4GBlog_autovacuum_min_duration = 0autovacuum_vacuum_scale_factor = 0.02autovacuum_analyze_scale_factor = 0.01autovacuum_freeze_max_age = 1200000000autovacuum_multixact_freeze_max_age = 1250000000autovacuum_vacuum_cost_delay = 0msvacuum_freeze_table_age = 200000000vacuum_multixact_freeze_table_age = 200000000min_parallel_table_scan_size =0min_parallel_index_scan_size =0parallel_tuple_cost =0parallel_setup_cost =0
配置pg_hba.conf文件
因为安全原因,使用replica用户用作复制
假设所有的pgpool2服务器和PostgreSql服务器都在200.100.128.0/23子网,编辑pg_hba.conf文件支持此用户的md5验证。
PostgreSql数据库中创建用户
# 创建流复制用户create role replica login replication encrypted password '<replicaPass>';
修改pg_hba.conf文件
#TYPE DATABASE USER ADDRESS METHODlocal all postgres peerlocal all all peerhost all all 127.0.0.1/32 md5host all all 15.16.0.0/24 md5host replication all 127.0.0.1/32 md5host replication replica 15.16.22.14/24 md5host replication replica 15.16.22.15/24 md5
使用pgpool2的故障转移和在线恢复功能,需要所有pgpool2和PostgreSql服务器的postgres系统用户允许ssh免密登录。
# 生成postgres用户的ssh免密互登录su postgresssh-keygen配置免密略# 流复制用户replica免密su - postgrescat > .pgpass <<EOFhhhtlt-pg1:5432:replication:replica:APzqI4B6d5h2khhhtlt-pg2:5432:replication:replica:APzqI4B6d5h2kEOF
配置 recovery.done文件
standby_mode = 'on'primary_conninfo = 'host=hhhtlt-pg2 port=5432 user=replica'restore_command = 'scp -P 22 hhhtlt-pg2:/data/pgsql/archivedir/%f %p'
重启
su - postgres/usr/local/postgresql/11/bin/pg_ctl -D /data/pgsql/11/data -l /var/log/postgres/postgresql-11-main.log stop/usr/local/postgresql/11/bin/pg_ctl -D /data/pgsql/11/data -l /var/log/postgres/postgresql-11-main.log start
从库配置
配置完主节点后使用pg_basebackup将主库的配置同步到从库
注: 执行前要先把data目录清空pg_basebackup -X stream -c fast -P -D /data/pgsql/11/data -h hhhtlt-pg1 -p 5432 -U replica
修改recovery.done文件
# mv recovery.done recovery.confstandby_mode = 'on'primary_conninfo = 'host=sxsz-spzw-pg1 port=5432 user=replica'restore_command = 'scp -P 22 sxsz-spzw-pg1:/data/pgsql/archivedir/%f %p'
启动
su - postgres/usr/local/postgresql/11/bin/pg_ctl -D /data/pgsql/11/data -l /var/log/postgres/postgresql-11-main.log start
验证
主库执行postgres=# select * from pg_stat_replication;-[ RECORD 1 ]----+------------------------------pid | 3174usesysid | 16384usename | replicaapplication_name | walreceiverclient_addr | 15.16.22.15client_hostname |client_port | 34444backend_start | 2021-09-09 21:59:17.238057+08backend_xmin |state | streamingsent_lsn | 0/40000D0write_lsn | 0/40000D0flush_lsn | 0/40000D0replay_lsn | 0/40000D0write_lag |flush_lag |replay_lag |sync_priority | 0sync_state | async
