作者:颜博 青云科技数据库研发工程师
目前从事 PostgreSQL 产品开发工作,热衷于 PostgreSQL 数据库的学习和研究
上一期我们介绍了 PG 集群复制管理工具 repmgr,能够轻松的搭建出 PostgreSQL 的高可用集群,在主节点宕机后,挑选备机提升为主节点,继续提供服务。
本文将详细介绍 repmgr 构建 PostgreSQL 高可用集群的部署过程。
$ vim postgresql.conf
max_wal_senders = 10
max_replication_slots = 10
wal_level = 'hot_standby'
hot_standby = on
archive_mode = on # repmgr 本身不需要 WAL 文件归档。
archive_command = '/bin/true'
在 PG9.6 之前的版本中,wal_level 允许设置为archive
和hot_standby
。新版本中,仍然接受这些值,但是它们会被映射成replica
。
为 repmgr 元数据信息创建 PostgreSQL 超级用户和数据库
# su - postgres
$ /usr/lib/postgresql/11/bin/createuser -s repmgr
$ /usr/lib/postgresql/11/bin/createdb repmgr -O repmgr
alter user repmgr with password 'test1234';
repmgr 用户作为 repmgr 工具默认使用的数据库用户
$ vim pg_hba.conf
local replication repmgr trust
host replication repmgr 127.0.0.1/32 trust
host replication repmgr 0.0.0.0/0 trust
local repmgr repmgr trust
host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 0.0.0.0/0 trust
repmgr 免密登录设置
# 修改 pg_hba.conf 文件后 reload 数据库生效
$ su - postgres -c "/usr/lib/postgresql/11/bin/pg_ctl reload"
# su postgres
$ vim ~/.pgpass
# 添加以下内容到 ~/.pgpass 文件,用户、数据库和密码修改为自己的即可
*:*:repmgr:repmgr:test1234
# 修改 ~/.pgpass 文件权限
chmod 600 ~/.pgpass
在主服务器上创建一个 repmgr.conf 文件
node_id、node_name、conninfo 需要与从库不同
node_id=1 # 节点ID,高可用集群各节点标识
node_name='node1' # 节点名称,高可用集群各节点名称,对应集群中 select * from pg_stat_replication; 中查到的 application_name
conninfo='host=192.168.100.2 port=5432 user=repmgr dbname=repmgr connect_timeout=2' # 集群中的所有服务器都必须能够使用此字符串连接到本地节点
data_directory='/data/pgsql/main' # pg数据目录
replication_user='repmgr' # 流复制数据库用户,默认使用repmgr
repmgr_bindir='/usr/lib/postgresql/11/bin' # repmgr软件目录
pg_bindir='/usr/lib/postgresql/11/bin' # pg软件目录
# 日志管理
log_level=INFO
log_file='/data/pglog/repmgr/repmgrd.log' # log 文件需要提前创建
log_status_interval=10 # 此设置导致 repmgrd 以指定的时间间隔(以秒为单位,默认为 300)发出状态日志行,描述 repmgrd 的当前状态,
# 例如: [2021-09-28 17:51:15] [INFO] monitoring primary node "node1" (ID: 1) in normal state
# pg、repmgr服务管理命令
service_start_command='/usr/lib/postgresql/11/bin/pg_ctl -D /data/pgsql/main/ start -o \'-c config_file=/etc/postgresql/11/main/postgresql.conf\' -l /data/pglog/start.log'
service_stop_command='/usr/lib/postgresql/11/bin/pg_ctl stop'
service_restart_command='