专栏首页数据库架构之美基于repmgr的postgresql主备高可用方案

基于repmgr的postgresql主备高可用方案

本文比较基础,主要介绍postgresql开源高可用工具repmgr的部署和使用,初学者可以根据本文步骤一步一步做下去,废话不多说,直接进入主题,本文以两台机器为例。

1.两台机器分别编译安装postgresql,步骤略。

2.主库配置

vi postgresql.conf
wal_log_hints=on
archive_mode=on
archive_command=’test ! -f /pgarch/%f && cp %p /pgarch/%f’

创建管理用户和库

createuser -s repmgr
createdb repmgr -O repmgr
 
vi pg_hba.conf
local   replication   repmgr                              trust
host    replication   repmgr      127.0.0.1/32            trust
host    replication   repmgr      192.168.1.1/32          trust
host    replication   repmgr      192.168.1.2/32          trust
local   repmgr        repmgr                              trust
host    repmgr        repmgr      127.0.0.1/32            trust
host    repmgr        repmgr      192.168.1.1/32          trust
host    repmgr        repmgr      192.168.1.2/32          trust

备库连接测试

psql 'host=192.168.1.1 user=repmgr dbname=repmgr connect_timeout=2'

主库创建/etc/repmgr.conf

node_id=1
node_name=node1
conninfo='host=192.168.1.1 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/pgdata'

注册主库

repmgr -f /etc/repmgr.conf primary register

查看:

repmgr -f /etc/repmgr.conf cluster show
SELECT * FROM repmgr.nodes;

3.备库配置

创建/etc/repmgr.conf

node_id=2
node_name=node2
conninfo='host=192.168.1.2 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/pgdata'

克隆备库,内部使用的是pg_basebackup来进行克隆,并且会自动创建recovery.conf文件

repmgr -h 192.168.1.1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --dry-run
repmgr -h 192.168.1.1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone

启动并注册备库

repmgr -f /etc/repmgr.conf standby register

查看集群状态

repmgr -f /etc/repmgr.conf cluster show
[postgres@node2 pgdata]$ repmgr cluster show
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                            
----+-------+---------+-----------+----------+----------+----------+----------+---------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 3        | host=192.168.1.1 user=repmgr dbname=repmgr connect_timeout=2
 2  | node2 | standby |   running | node1    | default  | 100      | 3        | host=192.168.1.2 user=repmgr dbname=repmgr connect_timeout=2

查看复制状态

select * from pg_stat_replication;
select * from pg_stat_wal_receiver;

切换测试,在备库操作,注意,切换操作需要配置主机间互信。

[postgres@DB2 .ssh]$ repmgr standby switchover
NOTICE: executing switchover on node "node2" (ID: 2)
NOTICE: local node "node2" (ID: 2) will be promoted to primary; current primary "node1" (ID: 1) will be demoted to standby
NOTICE: stopping current primary node "node1" (ID: 1)
NOTICE: issuing CHECKPOINT
DETAIL: executing server command "pg_ctl  -D '/pgdata' -W -m fast stop"
INFO: checking for primary shutdown; 1 of 60 attempts ("shutdown_check_timeout")
INFO: checking for primary shutdown; 2 of 60 attempts ("shutdown_check_timeout")
INFO: checking for primary shutdown; 3 of 60 attempts ("shutdown_check_timeout")
NOTICE: current primary has been cleanly shut down at location 0/14000028
NOTICE: promoting standby to primary
DETAIL: promoting server "node2" (ID: 2) using "pg_ctl  -w -D '/pgdata' promote"
waiting for server to promote.... done
server promoted
NOTICE: waiting up to 60 seconds (parameter "promote_check_timeout") for promotion to complete
NOTICE: STANDBY PROMOTE successful
DETAIL: server "node2" (ID: 2) was successfully promoted to primary
INFO: local node 1 can attach to rejoin target node 2
DETAIL: local node's recovery point: 0/14000028; rejoin target node's fork point: 0/14000098
NOTICE: setting node 1's upstream to node 2
WARNING: unable to ping "host=192.168.1.1 user=repmgr dbname=repmgr connect_timeout=2"
DETAIL: PQping() returned "PQPING_NO_RESPONSE"
NOTICE: starting server using "pg_ctl  -w -D '/pgdata' start"
NOTICE: NODE REJOIN successful
DETAIL: node 1 is now attached to node 2
NOTICE: switchover was successful
DETAIL: node "node2" is now primary and node "node1" is attached as standby
NOTICE: STANDBY SWITCHOVER has completed successfully

此时查看状态,已经切换完成:

[postgres@GCCX4TMP .ssh]$ repmgr cluster show
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                            
----+-------+---------+-----------+----------+----------+----------+----------+---------------------------------------------------------------
 1  | node1 | standby |   running | node2    | default  | 100      | 3        | host=192.168.1.1 user=repmgr dbname=repmgr connect_timeout=2
 2  | node2 | primary | * running |          | default  | 100      | 4        | host=192.168.1.2 user=repmgr dbname=repmgr connect_timeout=2

看上面的切换日志其实可以看到切换的一个流程:

①停止主库

②备库promte为主库

③原主库执行rejoin操作:repmgr node rejoin -d 'host=192.168.1.1 dbname=repmgr user=repmgr' --force-rewind --config-files=postgresql.conf,postgresql.auto.conf --verbose

这里说下repmgr node rejoin操作,执行该命令之前先删除recovery.conf文件,并且要求数据库之前是干净的关闭,达到一个一致性状态。然后repmgr会检查数据库能否加入,如果不能的话就会使用pg_rewind进行恢复操作,至于pg_rewind的原理和用法见我上一篇文章。

后面的文章我们再介绍一下如何通过repmgrd实现auto failover。

本文分享自微信公众号 - 数据库架构之美(databasekernel),作者:数据库架构之美

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用repmgrd实现postgresql failover和auto failover

    前面的文章介绍了postgresql基于repmgr的高可用及切换方案,这篇文章主要聊聊通过repmgrd实现failover及auto failover。

    数据库架构之美
  • 如何杀掉pg数据库正在运行的sql

    我们在生产环境可能经常遇到长sql,长sql对数据库的影响还是挺大的,不仅可能对主机资源消耗较大,还可能会阻塞其他sql的正常执行,所以对于长sql我们要尤其注...

    数据库架构之美
  • PostgreSQL的几种分布式架构对比

    Citus以插件的方式扩展到postgresql中,独立于postgresql内核,所以能很快的跟上pg主版本的更新,部署也比较简单,是现在非常流行的分布式方案...

    数据库架构之美
  • 谁说 PostgreSQL 没有靠谱的高可用(1)

    最近问postgresql 那个高可用靠谱的人越来越多,其实我也试过几种postgresql 的高可用方案,而最近听到的声音是 PostgreSQL 没有靠谱的...

    AustinDatabases
  • 谁说postgresql 没有靠谱的高可用(6)

    接上期,(如果看不懂的,请从第一期看,否则可能和看天书没两样),最近在梳理一些问题的时候,发现一个现象,大部分出现问题后,解决就完了,网上很多文字,大多都是这样...

    AustinDatabases
  • PostgreSQL 高可用集群 repmgr 与 头疼的问题

    PostgreSQL 的高可用的方案,基本上不是原生的,大多是依靠第三方的公司来进行开发的,挂名的有那么几种 Patroni, PGPOOL-II, Repmg...

    AustinDatabases
  • 29.C++- 异常处理

    C++内置了异常处理的语法元素 try catch try语句处理正常代码逻辑 当try语句发现异常时,则通过throw语句抛出异常,并退出try语句 catc...

    张诺谦
  • 干货,不小心执行了rm -f,除了跑路,如何恢复?

    每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵。

    芋道源码
  • 只需4招,教你轻松打造更高效的开放数据项目

    美国很多地方政府都制定了开放式数据战略帮助他们增强政府公信力、提高政务透明度,同时也提高了民众的参与度,扩大了民众获取信息的渠道。这种“开放式数据战略”在美国经...

    灯塔大数据
  • C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)

    提交网址: https://leetcode.com/problems/binary-tree-preorder-traversal/

    Enjoy233

扫码关注云+社区

领取腾讯云代金券