首先我们已经有两台机器,在repmgr 的管理中,从图中可以看到 110 ,111 两台机器已经在 repmgr 的管理中 我们安装另外一台 postgresql 的机器 112 并且安装 repmgr repmgr -h 192.168.198.111 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --upstream-node-id=2 开始将机器的信息加入到集群中这里首先需要的就是编辑好 repmgr.conf 具体如何编译,请参见前几天的 repmgr 的安装的文字内容。 文件,并且对pg_hba.conf 文件进行修改,保证见证服务器上的repmgr 账号登录主机和从库都是OK 的 repmgr -f /etc/repmgr.conf witness register standby promote -f /etc/repmgr.conf follow_command=repmgr standby follow -f /etc/repmgr.conf -W --upstream-node-id
REPMGR 是一种方便简单的适合企业使用的高可用方式,为什么选择REPMGR作为单体PG的高可用方式 1 REPMGR 是这三种里面最简单的高可用的方式,这里的意思是结构节点,搭建简单,处理简单 数据库 启动主库 并且在主库中运行如下命令 create database repmgr; create user repmgr with password 'repmgr'; alter user 'repl'; \c repmgr create extension repmgr; 10 需要配置 .pgpass 免密功能 10.50.132.145:5432:repmgr:repmgr: repmgr 10.50.132.145:postgres:repl:repl 10.50.132.146:5432:repmgr:repmgr:repmgr 10.50.132.146:5432:postgres ='repmgr standby promote -f /etc/repmgr.conf' follow_command='repmgr standby follow -f /etc/repmgr.conf
本篇是POSTGRESQL 高可用的最后一篇文字,如果敢兴趣可以往前翻看之前的三篇文字,在安装完repmgr 后,创建对应repmgr的数据库后会有相关的表灌入到repmgr 数据库中。 ? 而经过测试,将其中一个节点进行关闭后,表中的数据并不会进行变化,到底我们在运行 repmgr -f /etc/repmgr.conf cluster show 我们看到的信息是怎么来的 ? OK 我们的跟踪一下这条命令到底做了什么,实际当中我们在执行repmgr 命令中,其实判断节点是否存在是需要连接到目前可以连接的节点中,并且其nodes表时包含完整的集群节点的信息的。 2 repmgr -f /etc/repmgr.conf standby switchover 在从节点进行主从切换的命令,中repmgr 做了什么 首先要判断切换中,你是否使用了复制槽,并且复制槽是否有效 3 Repmgr 中的一些系统表的如何利用,首当其冲的就是events 表 通过events 表可以知道所有系统中所经历的事情,并且可以分析一些问题保存历史记录。 ?
POSTGRESQL 的高可用,有以下几种 P+C , REPMGR, Patroni + ETCD 的方式, 那为什么我们最终选择了 REPMGR ,原因如下 1 REPMGR 是这三种里面最简单的高可用的方式 数据库 启动主库 并且在主库中运行如下命令 create database repmgr; create user repmgr with password 'repmgr'; alter user 'repl'; \c repmgr create extension repmgr; 10 需要配置 .pgpass 免密功能 10.50.132.145:5432:repmgr:repmgr:repmgr 10.50.132.145:postgres:repl:repl 10.50.132.146:5432:repmgr:repmgr:repmgr 10.50.132.146:5432:postgres ='repmgr standby promote -f /etc/repmgr.conf' follow_command='repmgr standby follow -f /etc/repmgr.conf
在众多postgresql 高可用模式中,主要的参与者有两位, Patroni VS repmgr 基于这二者的功能优点以及缺点相信大部分人都不是太明确,下面将根据两篇翻译的文字合并,来对两个高可用的程序来做一个比较 通过repmgr 程序来对服务在数据库内进行注册,并且通过repmgrd来进行多点的failover监控,可以在切换的过程中完成选主,与损坏节点再次加入到集群中,作为从库的一体化方案。 在集群中的节点数为偶数的情况下repmgr 本身通过witness见证服务器来解决脑裂的问题,见证服务器是一个节点,只考虑多数投票计数。 2 需要安装分布式存储,Patrnoi 本身是需要安装 etcd 或其他的分布式存储软件的,repmgr本身的一些日志信息以及节点信息是安装在本地节点PG中的repmgr 数据库里面的,所以不需要其他软件的安装 3 手动切换中,由于repmgr是通过repmgrd 来进行监控并自动进行切换的,所以停止repmgrd 程序本身,通过 repmgr命令直接启动切换步骤即可,patrnoi 在此方面可以通过命令来进行切换
-f /pgarch/%f && cp %p /pgarch/%f’ 创建管理用户和库 createuser -s repmgr createdb repmgr -O repmgr vi pg_hba.conf trust host repmgr repmgr 127.0.0.1/32 trust host repmgr repmgr ' 注册主库 repmgr -f /etc/repmgr.conf primary register 查看: repmgr -f /etc/repmgr.conf cluster show SELECT 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
后面需要设置的就是 repmgr 的操作数据库的用户和相关repmgr 存储元数据的数据库。 创建repmgr用户 ,以及创建repmgr 数据库 create user repmgr superuser login; alter user repmgr with password 'repmgr '; create database repmgr; alter database repmgr owner to repmgr; ALTER USER repmgr SET search_path TO trust host repmgr repmgr 127.0.0.1/32 trust host repmgr repmgr repmgr -f /etc/repmgr.conf primary register repmgr.conf中必须包含的内容 node_id=1 node_name
我们先从配置文件来入手,如果你的配置文件不知道怎么写,或者根本不知道配置文件中有哪些内容,请从 https://repmgr.org/docs/4.4/repmgr-administration-manual.html ' 配置PG中复制的账户,这里使用了repmgr作为复制的账户,当然你可以使用别的账户进行复制的配置,而不必须非要使用repmgr 来作为复制的账户。 /etc/repmgr.conf standby promote 3 查看当前节点的状态 repmgr -f /etc/repmgr.conf node status ? 在错误连接主节点的 repmgr -f /etc/repmgr.conf standby follow 5 查看当前的节点与其他节点的连接情况 repmgr -f /etc/repmgr.conf cluster 总结:其实在repmgr 的使用中,可以感觉到,即使不需要自动failover ,repmgr 在快速建立流复制从库和检查节点之间的状态也是很好的工具。
PG 的高可用的方法比较多,REPMGR 算是一个靠谱的方案,之前写过6期的REPMGR. 在现在看来浅薄了点, 目前需要对这个高可用的方式进行更深入的理解,从概念到细节. REPMGR 到底提供了几种工具 2.1 repmgr repmgr 程序提供的功能主要有 设置standby 服务器 手动将一个standby服务器promoting 为一个primary repmgr的数据库,并且修改search_path 针对repmgr的数据库 ALTER USER repmgr SET search_path TO repmgr, "$user", public; 对于repmgr的用户名密码方面 通过设置.pgpass文件 或者 可以通过pg_hba.conf 文件来控制 .pgpass 主要设置 repmgr 账号,并且replication也是通过repmgr replication:repmgr:foo node2:5432:repmgr:repmgr:foo node2:5432:replication:repmgr:foo node3:5432:repmgr
同样,传递 REPMGR_PASSWORD 环境变量将 repmgr 用户的密码设置为 REPMGR_PASSWORD 的值(或 REPMGR_PASSWORD_FILE 中指定的文件内容)。 REPMGR_USERNAME:repmgr 用户的用户名。默认为 repmgr。 REPMGR_PASSWORD_FILE:包含 repmgr 用户密码的文件的路径。 这将覆盖 REPMGR_PASSWORD 中指定的值。没有默认值。 REPMGR_PASSWORD:repmgr 用户的密码。没有默认值。 REPMGR_PASSFILE_PATH:密码文件的位置,如果它不存在,它将使用 REPMGR 凭据创建。 REPMGR_PRIMARY_HOST:初始主节点的主机名。没有默认值。 使用 REPMGR_PASSFILE_PATH 挂载外部密码文件时,还需要相应地配置 REPMGR_PASSWORD 和 REPMGR_USERNAME。
repmgr 是一个用于 PostgreSQL 数据库复制管理的开源工具。它提供了自动化的复制管理,包括: 故障检测和自动故障切换:repmgr 可以检测到主服务器故障并自动切换到备用服务器。 灵活的复制拓扑:repmgr 支持各种复制拓扑,包括单主服务器和多主服务器。 管理和监控:repmgr 提供了用于管理和监控PostgreSQL复制的各种工具和命令。 配置 Pgpool 组件 获取 PostgreSQL-repmgr 连接地址,进入 PostgreSQL-repmgr 组件的 Web 终端内。 REPMGR_NODE_NAME value: "$(POD_NAME)" # repmgr 节点网络名称 - name: REPMGR_NODE_NETWORK_NAME value: "$( =0:postgresql-ha-repmgr-0.postgresql-ha-repmgr.dev.svc.cluster.local:5432,1:postgresql-ha-repmgr-1.postgresql-ha-repmgr.dev.svc.cluster.local
repmgr md5 host repmgr repmgr 127.0.0.1/32 md5 host repmgr repmgr 172.72.6.0/24 md5 local replication /repmgr.conf standby clone --force --dry-run repmgr -h 172.72.6.61 -U repmgr -d repmgr -f /pg13/pg13/ repmgr md5 host repmgr repmgr 127.0.0.1/32 md5 host repmgr repmgr 172.72.6.0/24 md5 local replication pg13/pg13/repmgr.conf witness register -h 172.72.6.61 -U repmgr -d repmgr --force repmgr -f /pg13/pg13 repmgr -f /pg13/pg13/repmgr.conf cluster show -- 可以debug打印详细的切换过程 repmgr -f /pg13/pg13/repmgr.conf
; create user repmgr with password 'repmgr'; (密码您随意) alter user repmgr superuser login; alter database repmgr owner to repmgr; 对 repmgr 解包进行编译 在确认已经编译好repmgr 后,需要对两台机器进行ssh 免密的工作 这里的免密建议是基于你操控postgresql ='repmgr' 进行复制的操作的账户 replication_type='physical' 复制的方式 repmgr_bindir='/usr/local/postgres/bin' repmgr 的DBA 是不是很惊喜 和pt 工具一路货) repmgr -h 192.168.198.21 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --dry-run 可以看到--dry-run 没有问题直接执行命令进行 clone repmgr -h 192.168.198.21 -U repmgr -d repmgr -f /etc/repmgr.conf
repmgr md5 host repmgr repmgr 127.0.0.1/32 md5 host repmgr repmgr 172.72.6.0/24 md5 local replication repmgr md5 host replication repmgr 127.0.0.1/32 md5 host replication repmgr 172.72.6.0/24 md5 EOF =lhr dbname=repmgr connect_timeout=2' 4.5、在主库注册主库服务 -- 注册服务 repmgr -f /pg13/pg13/repmgr.conf primary -d repmgr 执行过程: [pg13@lhrrepmgr64361 pg13]$ repmgr -f /pg13/pg13/repmgr.conf primary register INFO: password=lhr dbname=repmgr connect_timeout=2 | repmgr | | /pg13/pg13/repmgr.conf (1 row)
所以才有了这期,这期是要说说repmgr 的一些系统表,一些常见的被问及的问题,(一些深层的问题,还得继续研究) 截止到目前本文的时间点,repmgr 已经支持了postgresql 12, repmgr 的系统表我们看看有什么,如果你说我看不到,或者里面啥都没有,你一定是没有通过 repmgr 这个账号登录repmgr库 events表中包含了相关的在这个节点,所有关于repmgr 相关的事件的记录, 下方的 nodes 表则记录了数据库集群中的已经注册的节点 另外还有一些常见的命令 repmgr -f /etc/repmgr.conf node status 具体的常见的命令可以去官网去看比我介绍的要好的多 常见的疑问 1 repmgr 需要初始化数据或者有metadata 吗 为了有效地管理复制集群,repmgr需要将集群中服务器的信息存储在专用的数据库模式中。 该模式由repmgr扩展自动创建,该扩展在初始化repmgr管理的集群 其中这些元数据包含 repmgr.events repmgr.nodes repmgr.monitoring_history
2019 PGCONF Asia 中有这么一篇演讲,关于POSTGRESQL 的高可用的问题,其中提到常用的三种Postgresql 的高可用方式, 其中repmgr 之前写过了,当然其实还不完善, 另外一个就是我们今天提到的 另外还需要对于ZOOKEEPER 或者 ETCD 等有相关的知识, 设置上可能不如 repmgr 要简单方便. 当然也有一些不客气的话,对于POSTGRESQL 的其他的HA的方案,例如 DRBD, COROSYNC + pacemaker ,repmgr 等方案 用上了 out of date 的词汇. ? 实际上, repmgr 的变化方式已经在某云使用了, 不知道他们听到如此的词汇作何感想. ? 另外repmgr 本身是可以通过witeness的技术防止类似问题,但起步也是最少三个节点,但这又给了文字最初英文中,out of date 中提出的单点monitor 于口实.
repmgr 是一个用于 PostgreSQL 数据库复制管理的开源工具。它提供了自动化的复制管理,包括:故障检测和自动故障切换:repmgr 可以检测到主服务器故障并自动切换到备用服务器。 自动故障恢复:repmgr 可以检测到从服务器故障并自动将其重新加入到复制拓扑中。多个备用服务器:repmgr 支持多个备用服务器,可以在主服务器故障时自动切换到最合适的备用服务器。 灵活的复制拓扑:repmgr 支持各种复制拓扑,包括单主服务器和多主服务器。管理和监控:repmgr 提供了用于管理和监控PostgreSQL复制的各种工具和命令。 图片配置 Pgpool 组件获取 PostgreSQL-repmgr 连接地址,进入 PostgreSQL-repmgr 组件的 Web 终端内。 =0:postgresql-ha-repmgr-0.postgresql-ha-repmgr.dev.svc.cluster.local:5432,1:postgresql-ha-repmgr-1.postgresql-ha-repmgr.dev.svc.cluster.local
接上期说,(没看上期的,还是先看上期,要不从这看是看不懂的) 那到底这个手动转换的过程是如何的,这个要搞一搞清楚 repmgr -f /etc/repmgr.conf standby switchover -U repmgr --verbose 1 步 根据执行地的repmgr 数据库中的记录,开始找到那个是当前的主节点,因为你是在从库执行的 2 步 发现主节点,并且找到其node ID 3 步连接到主节点通过 集群 使用命令 repmgr standby unregister -f /etc/repmgr.conf 将降级为standby的从库从集群中注销 3 关闭分离的从库 4 清理数据目录 5 重新使用 repmgr -h 192.168.198.22 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone 命令将进行从库的clone 6 更改 postgresql.conf listen 地址 7 启动从库 8 重新注册从库 repmgr -f /etc/repmgr.conf standby register 一切正常,数据库集群完璧归赵
可以使用repmgr见证寄存器设置见证服务器。 并且也安装了 repmgr,相关的配置也和之前是一样的。 repmgr见证寄存器将见证服务器的节点记录添加到repmgr元数据中,并在必要时通过安装repmgr扩展并将repmgr元数据复制到见证服务器来初始化见证节点。 在执行repmgr见证寄存器时,还必须提供集群主服务器的数据库连接信息。 在witeness 的机器上执行下面的命令 repmgr -f /etc/repmgr.conf witness register -h 192.168.198.22 -U repmgr -d repmgr
一般来说数据库如果做了高可用(主从,非支持分布式协议的那种,类似REPMGR),在主从切换后,是可以将主变为从,继续rejoin 到repmgr 的HA中的。 首先我们要确认的是,我们已经有了两台POSTGRESQL , 并且已经安装了 REPMGR 并且,已经启用了 repmgrd 自动检测failover 的进程在两台机器上。 系统开始切换的准备和判断 最终 192.168.198.22 变成了主库 我们启动了 192.168.198.21 ,然后这就是问题中提到的出现的问题 我们怎么办, repmgr node rejoin -f /etc/repmgr.conf -d 'host=192.168.198.22 dbname=repmgr user=repmgr' --force-rewind --config-files =postgresql.conf --verbose 执行上面的这条命令,失效的主节点就会在加入到,新的主节点22 中 并且系统的启动,以及repmgr 注册的信息都会通过这一条命令完成。