基于repmgr实现PostgreSQL的主备高可用
📅 2021-11-14
前面已经在两台CentOS 7服务器上从源码编译安装了PostgreSQL,当前这两台服务器的PostgreSQL数据库是相互独立,它们之间没有任何关系。
本文将介绍基于repmgr
的postgresql主备高可用方案,使用repmgr将这两个PostgreSQL设置为一个基本的复制集群,其占用一个作为主服务(primary),另一个作为备用服务(standby)。
前面已经在两台CentOS 7服务器上从源码编译安装了PostgreSQL,当前这两台服务器的PostgreSQL数据库是相互独立,它们之间没有任何关系。
本文将介绍基于repmgr
的postgresql主备高可用方案,使用repmgr将这两个PostgreSQL设置为一个基本的复制集群,其占用一个作为主服务(primary),另一个作为备用服务(standby)。
1#psql -h 服务器 -p 端口地址 -U 用户名 -d 数据库
2psql -h 127.0.0.1 -p 5432 -U <dbuser> -d <dbname>
连接到数据库,进入PostgreSQL提示符即(psql shell)后,可以使用\c dbname dbuser
切换登录用户,使用SELECT current_user;
查看当前连接使用的数据库用户。
PostgreSQL是一个开源的对象-关系数据库系统,经过十多年的开发和改进,PostgreSQL已在可靠性、稳定性上已经十分强大,并且被应用的十分广泛。 很多云原生方向的产品例如开源镜像仓库Harbor、API网关Kong都使用了PostgreSQL。本文将介绍从源码编译安装PostgreSQL 13.5的具体过程。
...上一节学习了如何为Pulsar开启基于JWT的身份认证。 Pulsar使用身份认证提供者(Authentication Provider)识别客户端,但如果只启用身份认证,那么只要客户端通过认证就可以访问集群中的所有资源,因此在启用身份认证的基础上,还必须为Pulsar开启授权以进行权限管理。 其实上一节在学习JWT身份认证时,已经开启了授权。本节将详细学习一下Pulsar的授权和权限管理。
...作为一个Gopher在刚开始学习channel的时候,一定见过以下关于关闭channel会发生什么情况
的总结:
本节将学习关闭channel,即close(ch)
的内部实现。关闭channel实际上调用的是runtime.closechan
这个函数。
Pulsar支持可插拔的身份认证和授权机制,Pulsar Proxy或者Pulsar Broker都支持该机制。认证和授权机制一起保证了客户端对Pulsar Topic、命名空间、租户的访问权限。
默认情况下,Pulsar并不会启用加密、身份认证和授权机制。之前我们使用pulsar-admin
,pulsar-client
等命令行工具,使用Java或Go语言开发的Consumer和Produmer,访问使用docker容器启动的单机Pulsar时,都未用到任何身份认证信息。
也就是说,Pulsar的默认配置是完全开放状态的,任何人都可以访问它。因此,必须启用Pulsar的认证和授权机制,为Pulsar各个组件开启安全防护。
前面在学习Topic的时候,已经了解了分区Topic的基本概念。在Pulsar中一个Topic只能由一个Broker提供服务,而单个Topic的吞吐量受限于为其提供服务的Broker的计算能力,这限制了Topic的最大吞吐量。
Pulsar通过分区Topic来提高吞吐量
,分区Topic在底层通过N个内部Topic实现,N就是分区的数量。
本节将学习从channel中接收数据的内部实现。
在Go中从channel中接收数据有两种方式:
1v <- ch
2v, ok <- ch
使用v <- ch
从channel中接收数据时,会调用runtime.chanrecv1
,chanrecv1
调用了runtime.chanrecv
。
主流消息系统都会提供很多好用的特性支持各种业务场景,死信队列
, 延迟队列
这些词在使用这些消息系统时经常被提到。
Pulsar作为下一代云原生消息系统肯定也是支持这些特性的。Pulsar中没有队列的概念, 前面在学习使用Java和Go开发Pulsar的Consumer时,在创建Consumer时可以为其设置死信策略
,并指定死信Topic
。
本节将学习Pulsar中的延迟消息投递功能。
前面学习了channel的底层数据结构hchan以及hchan是如何被创建的。
使用类似ch <- 3
往channel中发送数据时,会调用runtime.chansend1
,chansend1
调用了chansend
,本节将主要学习runtime.chansend
这个函数。