资讯专栏INFORMATION COLUMN

基于repmgr的PostgreSQL的高可用搭建

IT那活儿 / 2921人阅读
基于repmgr的PostgreSQL的高可用搭建

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


主机信息

IP1:192.168.28.151 Primary PG-1
IP2:192.168.28.150 Standby PG-2

IP3:192.168.21.152 witness PG-3


安装PostgreSQL

其中SLAVE只安装软件不进行初始化,Primary 进行初始化。

参数调整:

  • wal_level 至少replica
  • archive_mode=on
  • archive_command=cp %p /data/archive/%f
  • wal_log_hit=on或者在初始化的开启数据校验和
  • max_wal_senders=10
  • max_keep_size=48GB
  • hot_standby=on


SSH免密 两台主机均做

PG-1:

vim /etc/hosts
  192.168.21.151 PG-1
  192.168.21.150 PG-2
  192.168.21.152 PG-3
  ssh-keygen
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-2
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-3

PG-2:

vim /etc/hosts
  192.168.21.151 PG-1
  192.168.21.150 PG-2
  192.168.21.152 PG-3
  ssh-keygen
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-1
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-3

PG-3:

vim /etc/hosts
  192.168.21.151 PG-1
  192.168.21.150 PG-2
  192.168.21.152 PG-3
  ssh-keygen
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-1
  ssh-copy-id -i .ssh/idrsa.pub postgres@PG-2


安装repmgr ,三台主机都安装

tar -xzvf repmgr.4.2.tar.gz
  cd repmgr.4.2
  ./configure
  make
  make install


配置pg_hba.conf和创建repmgr用户和库

初始化Primary节点,配置pg_hba.conf和创建repmgr用户和库。
initdb -A scram-sha-256 -D /data/pg133 -E utf8 --wal-segsize=1024 -U postgres -W -k
create database repmgr;
  create user repmgr replication login superuser password 4Replic%;
  alter user repmgr set search_path to repmgr,"$user",public;
配置参数:
shared_preload_libraries=repmgr;
重启数据库。
配置用户登录数据库免密:
vi /home/postgres/.pgpass
  ip:port:repmgr:repmgr:repmgr

ip:port:replication:repmgr:repmgr #注意该行必须有,否则在执行switchover的时候,standby可以正常提升为primary,但旧primary 无法自动跟随新主,每台主机上都要进行配置。


repmgr集群搭建

6.1 Primary上编辑repmgr.conf
vim /etc/remgr/repmgr.conf 
node_id=1
node_name=PG-1.PG
conninfo=host=PG-1.PG port=5432 user=repmgr dbname=repmgr
data_directory=/data/pg134
replication_user=repmgr
replication_type=physical
use_replication_slots=true
location=my-repmgr
#witness settings
witness_sync_interval=10
#logging settings
log_level=INFO
log_facility=STDERR
log_file=/opt/repmgr/repmgr.log
log_status_interval=2
#Environment/Command Settings
pg_bindir=/opt/pg134/bin
repmgr_bindir=/opt/pg134/bin
passfile=/home/postgres/.pgpass
use_primary_conninfo_password=false
#Standby promote_Settings
promote_check_timeout=60
promote_check_interval=1
#Standby Follow Settings
primary_follow_timeout=60
standby_follow_timeout=15
#Standby Switchover Settings
shutdown_check_timeout=60
standby_reconnect_timeout=60
wal_receive_check_timeout=30
#Node Rejoin Settings
node_rejoin_timeout=60
#Failover And Monitoring Settings
failover=automatic
priority=100
connection_check_type=ping
reconnect_attempts=5
reconnect_interval=2
promote_command=/opt/pg134/bin/repmgr standby promote -f /opt/repmgr/repmgr.conf --log-to-file
follow_command=/opt/pg134/bin/repmgr standby follow -f /opt/repmgr/repmgr.conf --upstream-node-id=%n --log-to-file
primary_notification_timeout=60
repmgrd_standby_startup_timeout=30
monitoring_history=yes
monitor_interval_secs=2
degraded_monitoring_timeout=-1
async_query_timeout=60
repmgrd_pid_file=/opt/repmgr/repmgrd.pid
standby_disconnect_on_failover=true
sibling_nodes_disconnect_timeout=30
child_node_connected_min_count=1
child_nodes_check_interval=2
child_nodes_disconnect_timeout=10
child_nodes_connected_include_wintess=true
#child_nodes_disconnect_command = /opt/pg134/bin/pg_ctl stop -D /data/pg134
primary_visibility_consensus=true
#Service Control Commands
service_start_command=/opt/pg134/bin/pg_ctl start -w -D /data/pg134
service_stop_command=/opt/pg134/bin/pg_ctl stop -w -D /data/pg134
service_restart_command=/opt/pg134/bin/pg_ctl restart -w -D /data/pg134
service_reload_command=/opt/pg134/bin/pg_ctl reload -w -D /data/pg134
repmgrd_service_start_command=> /opt/repmgr/repmgrd.pid && /opt/pg134/bin/repmgrd -f /opt/repmgr/repmgr.conf -d -p /opt/repmgr/repmgrd.pid
repmgrd_service_stop_command=kill -9 `cat /opt/repmgr/repmgrd.pid`
6.2 在Primary上进行注册
repmgr -f /etc/repmgr/repmgr.conf primary register  将在主节点安装repmgr扩展和元数据对象,并为主服务器添加元数据记录。对象的模式的repmgr。
6.3  验证集群状态
repmgr -f /etc/repmgr/repmgr.conf cluster show
6.4 启动监控
复制群集中的每个服务器都有自己的记录。如果repmgrd 正在使用,则节点的状态或角色更改时会更新字段upstream_node_id,active和 type。
启动监控:
repmgrd -f /etc/repmgr/repmgr.conf --verbose --monitoring-history > /var/log/repmgr/repmgr.log 2>&1 &
  或者
  repmgr -f /etc/repmgr/repmgr.conf daemon start
6.5 在STANDBY上编辑repmgr.conf
vim /etc/repmgr/repmgr.conf
 node_id=2
node_name=PG-2.PG
conninfo=host=PG-2.PG port=5432 user=repmgr dbname=repmgr
data_directory=/data/pg134
replication_user=repmgr
replication_type=physical
use_replication_slots=true
location=my-repmgr
#witness settings
witness_sync_interval=10
#logging settings
log_level=INFO
log_facility=STDERR
log_file=/opt/repmgr/repmgr.log
log_status_interval=2
#Environment/Command Settings
pg_bindir=/opt/pg134/bin
repmgr_bindir=/opt/pg134/bin
passfile=/home/postgres/.pgpass
use_primary_conninfo_password=false
#Standby promote_Settings
promote_check_timeout=60
promote_check_interval=1
#Standby Follow Settings
primary_follow_timeout=60
standby_follow_timeout=15
#Standby Switchover Settings
shutdown_check_timeout=60
standby_reconnect_timeout=60
wal_receive_check_timeout=30
#Node Rejoin Settings
node_rejoin_timeout=60
#Failover And Monitoring Settings
failover=automatic
priority=100
connection_check_type=ping
reconnect_attempts=5
reconnect_interval=2
promote_command=/opt/pg134/bin/repmgr standby promote -f /opt/repmgr/repmgr.conf --log-to-file
follow_command=/opt/pg134/bin/repmgr standby follow -f /opt/repmgr/repmgr.conf --upstream-node-id=%n --log-to-file
primary_notification_timeout=60
repmgrd_standby_startup_timeout=30
monitoring_history=yes
monitor_interval_secs=2
degraded_monitoring_timeout=-1
async_query_timeout=60
repmgrd_pid_file=/opt/repmgr/repmgrd.pid
standby_disconnect_on_failover=true
sibling_nodes_disconnect_timeout=30
child_node_connected_min_count=1
child_nodes_check_interval=2
child_nodes_disconnect_timeout=10
child_nodes_connected_include_wintess=true
child_nodes_disconnect_command = /opt/pg134/bin/pg_ctl stop -D /data/pg134
primary_visibility_consensus=true
#Service Control Commands
service_start_command=/opt/pg134/bin/pg_ctl start -w -D /data/pg134
service_stop_command=/opt/pg134/bin/pg_ctl stop -w -D /data/pg134
service_restart_command=/opt/pg134/bin/pg_ctl restart -w -D /data/pg134
service_reload_command=/opt/pg134/bin/pg_ctl reload -w -D /data/pg134
repmgrd_service_start_command=> /opt/repmgr/repmgrd.pid && /opt/pg134/bin/repmgrd -f /opt/repmgr/repmgr.conf -d -p /opt/repmgr/repmgrd.pid
repmgrd_service_stop_command=kill -9 `cat /opt/repmgr/repmgrd.pid`
6.6 standby克隆
repmgr -f /etc/repmgr/repmgr.conf -U repmgr -d repmgr -h 192.168.28.166 standby clone --dry-run -c

--dry-run选项用于检查。

开始克隆:
repmgr -f /etc/repmgr/repmgr.conf -U repmgr -d repmgr -h 192.168.28.166  standby clone -c

克隆从主PostgreSQL的数据目录中的文件节点,使用postgresql的pg_basebackup,会自动创建一个recovery.conf文件。

6.7 启动STANDBY
pg_ctl -D /data/pgdata start
6.8 在STANDBY上注册
repmgr -f /etc/repmgr/repmgr.conf  standby register  
 启动repmgrd:
repmgr -f /etc/repmgr/repmgr.conf daemon start
  或
  repmgrd -f /etc/repmge/repmgr.conf -d -p /data/repmgr/repmgrd.pid
6.9 witness见证服务器搭建
数据库初始化:
initdb -A scram-sha-256 -D /data/pg133 -E utf8 --wal-segsize=1024 -U postgres -W -k
创建数据库和用户:  
create database repmgr;
  create user repmgr with login superuser replication password 4Replic%;
  alter user repmgr set search_path to repmgr,"$user",public;

数据库配置参数:

shared_preload_libraries=repmgr;

数据库重启。

编辑repmgr配置文件: 
vi /etc/repmgr/repmgr.conf
node_id=3
node_name=PG-3.PG
conninfo=host=PG-3.PG port=5432 user=repmgr dbname=repmgr
data_directory=/data/pg134
replication_user=repmgr
replication_type=physical
use_replication_slots=true
location=my-repmgr
#witness settings
witness_sync_interval=10
#logging settings
log_level=INFO
log_facility=STDERR
log_file=/opt/repmgr/repmgr.log
log_status_interval=2
#Environment/Command Settings
pg_bindir=/opt/pg134/bin
repmgr_bindir=/opt/pg134/bin
passfile=/home/postgres/.pgpass
use_primary_conninfo_password=false
#Standby promote_Settings
promote_check_timeout=60
promote_check_interval=1
#Standby Follow Settings
primary_follow_timeout=60
standby_follow_timeout=15
#Standby Switchover Settings
shutdown_check_timeout=60
standby_reconnect_timeout=60
wal_receive_check_timeout=30
#Node Rejoin Settings
node_rejoin_timeout=60
#Failover And Monitoring Settings
failover=automatic
priority=100
connection_check_type=ping
reconnect_attempts=5
reconnect_interval=2
promote_command=/opt/pg134/bin/repmgr standby promote -f /opt/repmgr/repmgr.conf --log-to-file
follow_command=/opt/pg134/bin/repmgr standby follow -f /opt/repmgr/repmgr.conf --upstream-node-id=%n --log-to-file
primary_notification_timeout=60
repmgrd_standby_startup_timeout=30
monitoring_history=yes
monitor_interval_secs=2
degraded_monitoring_timeout=-1
async_query_timeout=60
repmgrd_pid_file=/opt/repmgr/repmgrd.pid
standby_disconnect_on_failover=true
sibling_nodes_disconnect_timeout=30
child_nodes_check_interval=2
child_node_connected_min_count=1
child_nodes_disconnect_timeout=10
child_nodes_connected_include_wintess=true
child_nodes_disconnect_command = /opt/pg134/bin/pg_ctl stop -D /data/pg134
primary_visibility_consensus=true
#Service Control Commands
service_start_command=/opt/pg134/bin/pg_ctl start -w -D /data/pg134
service_stop_command=/opt/pg134/bin/pg_ctl stop -w -D /data/pg134
service_restart_command=/opt/pg134/bin/pg_ctl restart -w -D /data/pg134
service_reload_command=/opt/pg134/bin/pg_ctl reload -w -D /data/pg134
repmgrd_service_start_command=> /opt/repmgr/repmgrd.pid && /opt/pg134/bin/repmgrd -f /opt/repmgr/repmgr.conf -d -p /opt/repmgr/repmgrd.pid
repmgrd_service_stop_command=kill -9 `cat /opt/repmgr/repmgrd.pid`
注册为见证服务器:
repmgr -f /etc/repmgr/repmgr.conf witness register -h PG-1 -U repmgr -d repmgr

注意:-h连接的是primary节点,当发生故障切换时,见证节点会自动连接到最新的primary节点。

启动repmgrd:
repmgr -f /etc/repmgr/repmgr.conf daemon start
  或
  repmgrd -f /etc/repmge/repmgr.conf -d -p /data/repmgr/repmgrd.pid
查看集群状态:

基于同步的模式

7.1 在现有环境开启同步复制

  • 分别调整PostgreSQL的的配置文件synchronous_standby_name=any 1(*);
  • 分别执行pg_ctl reload。
7.2 在搭建环境中启动同步复制
primary节点synchronous_standby_name = any 1(*)
其他备库在克隆时,会自动设置同步模式,默认application_name为当前节点名:node_name。
7.3 在一主一备的环境中,当备库意外当即,会导致主库HANG
一直处于等待状态,直到备库恢复【建议生成环境部署,至少有两个备库,或者有额外的脚本,检测当前库的角色以及库的状态,当是备库且备库意外宕机时,将主库的synchronous_standby_names设置为空。】
一主一备环境中解决主库HANG,可以使用child_nodes_disconnect_command参数,配置脚本解决该问题,但需要等待备份节点恢复。

#!/bin/bash
DBPATH=/opt/pg134/bin
DBPORT=5432
DBHOST=127.0.0.1
/opt/pg134/bin/pg_ctl stop -D /data/pg134
$DBPATH/psql -U postgres -p $PGPORT -h $DBHOST <checkpoint;
alter system set synchronous_standby_names to ;
select pg_reload_conf();
q
EOF


使用复制槽

在现有环境中使用复制槽:

  • 分别调整repmgr的配置文件,添加use_replication_slots=true;
  • 分别重启repmgrd的守护进程;
  • 执行一次主备切换【如果不执行主备切换,复制槽不会自动创建。】

本文作者:魏 强(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129225.html

相关文章

  • PostgreSQL UDB,让31会议数据管理更高效可靠

    摘要:相比自建,其可靠性更高,方便运维维护。宋体经过审慎考虑,用户同时选用三种数据库,针对性的满足不同目标。宋体宋体其中,相比于在上的快速高效是其优势,也是用户选型的重要砝码。PostgreSQL UDB用在大数据分析上,查询效率更高。相比自建,其可靠性更高,方便运维维护。 — 31会议运维经理 汤雷 如何用好PostgreSQL? PostgreSQL是业内一款十分流行的开源数...

    vspiders 评论0 收藏0
  • 到底选择PostgreSOL还是MySQL?看这里

    摘要:经过对比选型,用户同时选用三种数据库来针对性的满足不同目标。基于能够带来的这些特性优势,用户选择了。相比自建,其可靠性更高,方便运维维护。整个过程中用户不需要任何人工干预和配置修改,真正做到自动容灾。 据DB-Engines 最新发布的2019年8月份数据库流行度排行榜(如下图)显示,名列前茅的MySQL和PostgreSQL数据库的流行趋势与去年同期相比依然稳增不减。 showImg...

    沈俭 评论0 收藏0
  • 数据仓库架构变迁

    摘要:前面我们简单阐述了分布式数据库的架构,并通过一条简单的查询语句解释了分布式的执行计划。 引言 第八届中国架构师大会(SACC2016)10月27号到29号在北京万达索菲特大饭店成功举办。大会以架构创新之路为主题,云集了国内外顶尖专家,共同探讨云计算和大数据等技术背景下,如何通过架构创新及各种IT新技术来带动企业转型增效。作为一家专注于云端数据仓库的初创公司,酷克数据受邀在SACC201...

    Raaabbit 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<