postgresql-12主从快速搭建

前言

搭建postgresql主从架构的文章已经很丰富了,从配置参数以及搭建过程都描述的比较详细,本篇将这些操作简单处理成脚本(linux),方便快速使用。

一、环境准备

1、虚拟机

主机名 主机ip 操作系统
master 192.168.195.130 centos7.7
node 192.168.195.141 centos7.7

2、安装postgresql
需要提前在两台虚拟机中分别安装好postgresql数据库,版本选择12,安装步骤此处不做赘述,附官网安装教程;设置好密码并开发对应端口,保证正常启动使用即可。
postgresql-12主从快速搭建_第1张图片

二、配置主节点

以下为主节点shell脚本,配置项已尽量抽取,依据自身需要进行灵活配置

#!/bin/bash
#命令在主数据库服务器执行
#命令执行路径
pg_commend_path="/usr/pgsql-12/bin"
pg_conf_path="/var/lib/pgsql/12/data"
pg_conf_hba_path="$pg_conf_path/pg_hba.conf"
pg_conf_postgresql_path="$pg_conf_path/postgresql.conf"
pg_commend_restart=$(systemctl restart postgresql-12)
export PATH=$pg_commend_path:/usr/bin;

# 创建热备份账号replica,密码123456
su - postgres <<EO
psql "" <F
exit;
EO

#允许从服务器连接到主服务器,范围自行修改
sed -i '/host.*all.*all.*/d' ${pg_conf_hba_path}
sed -i '/host.*replication.*/d' ${pg_conf_hba_path}
echo "host    all             all           0.0.0.0/0         md5" >> ${pg_conf_hba_path}
#允许从服务器使用replica用户复制
echo "host    replication     replica         0.0.0.0/0         md5" >> ${pg_conf_hba_path}

#修改postgresql.conf,参数可自行修改
sed -i '/wal_level =.*/d' ${pg_conf_postgresql_path}
sed -i '/max_wal_senders =.*/d' ${pg_conf_postgresql_path}
sed -i '/wal_keep_segments =.*/d' ${pg_conf_postgresql_path}
sed -i '/wal_sender_timeout =.*/d' ${pg_conf_postgresql_path}
sed -i '/max_connections =.*/d' ${pg_conf_postgresql_path}
sed -i '/hot_standby =.*/d' ${pg_conf_postgresql_path}
sed -i '/max_standby_streaming_delay =.*/d' ${pg_conf_postgresql_path}
sed -i '/wal_receiver_status_interval =.*/d' ${pg_conf_postgresql_path}
sed -i '/hot_standby_feedback =.*/d' ${pg_conf_postgresql_path}
sed -i '/wal_log_hints =.*/d' ${pg_conf_postgresql_path}

cat >> ${pg_conf_postgresql_path} << EOF
wal_level = replica  # 这个是设置主为wal的主机
max_wal_senders = 5 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 128 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 200 # 一般查多于写的应用从库的最大连接数要比较大$$$
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈
wal_log_hints = on # also do full page writes of non-critical updates

EOF

#重启服务
echo $pg_commend_restart
echo "主数据库配置修改成功"

三、配置从节点

以下为从节点shell脚本,配置项已尽量抽取,依据自身需要进行灵活配置

#!/bin/bash
#命令在从数据库服务器执行
#命令执行路径
pg_commend_path="/usr/pgsql-12/bin"
pg_conf_path="/var/lib/pgsql/12/data"
pg_conf_hba_path="$pg_conf_path/pg_hba.conf"
pg_conf_postgresql_path="$pg_conf_path/postgresql.conf"
pg_conf_standby_path="$pg_conf_path/standby.signal"
pg_master_ip="192.168.195.130"
pg_master_port="5432"
pg_master_user="replica"
pg_master_pwd="123456"
pg_commend_stop=$(systemctl stop postgresql-12)
pg_commend_restart=$(systemctl restart postgresql-12)
export PATH=$pg_commend_path:/usr/bin;

#关闭数据库
echo $pg_commend_stop

# 当前数据库进行备份
if [ -d "$pg_conf_path" ];then
  time=$(date '+%Y%m%d%H%M%S')
  mv  ${pg_conf_path}{,$time.bak}
fi

#复制主数据库的data目录
PGPASSWORD=$pg_master_pwd pg_basebackup -h ${pg_master_ip} -p ${pg_master_port} -U ${pg_master_user}  -Fp -Xs -Pv -R -D ${pg_conf_path}

#postgresql.conf文件修改,参数可自行修改
sed -i '/primary_conninfo =.*/d' ${pg_conf_postgresql_path}
sed -i '/recovery_target_timeline =.*/d' ${pg_conf_postgresql_path}
sed -i '/hot_standby =.*/d' ${pg_conf_postgresql_path}
sed -i '/max_standby_archive_delay =.*/d' ${pg_conf_postgresql_path}
sed -i '/wal_receiver_status_interval =.*/d' ${pg_conf_postgresql_path}
sed -i '/hot_standby_feedback =.*/d' ${pg_conf_postgresql_path}

cat >> ${pg_conf_postgresql_path} << EOF

primary_conninfo = 'host=$pg_master_ip port=$pg_master_port user=$pg_master_user password=$pg_master_pwd' #从机信息和连接用户
recovery_target_timeline = latest #说明恢复到最新状态
hot_standby = on #说明这台机器不仅可以用户数据归档,还可以用于数据查询
max_standby_archive_delay = 30s #流备份的最大延迟时间
wal_receiver_status_interval = 10s #向主机汇报本地状态的间隔时间
hot_standby_feedback = on #出现错误复制,向主机反馈

EOF

# standby.signal 文件
if [ -f "${pg_conf_standby_path}" ];then
  touch ${pg_conf_standby_path}
fi
sed -i '/standby_mode =.*/d' ${pg_conf_standby_path}
cat >> ${pg_conf_standby_path} << EOF
standby_mode = 'on'
EOF

# 设置文件所属
sudo chmod 750 -R ${pg_conf_path}
sudo chown postgres -R ${pg_conf_path}

#重启服务
echo $pg_commend_restart
echo "从数据库配置修改成功"

四、验证

启动成功后面可以在主节点用以下sql查看从节点是否有效

select * from pg_stat_replication;

postgresql-12主从快速搭建_第2张图片

五、注意点

1、从节点 max_connections 设置需要大于等于父节点的值

附:pg_basebackup 参数

-D directory
--pgdata=directory
将输出写到哪个目录。如果必要,pg_basebackup将创建该目录及任何父目录。该目录可能已经存在,但是如果该目录已经存在并且非空就是一个错误。
当备份处于 tar 模式中并且目录被指定为-(破折号)时,tar 文件将被写到stdout。
这个选项是必需的。

-F format
--format=format

-r rate
--max-rate=rate
从该服务器传输数据的最大传输率。值的单位是千字节每秒。加上一个后缀M表示兆字节每秒。也接受后缀k,但是没有效果。合法的值在 32 千字节每秒到 1024 兆字节每秒之间。其目标是限制在运行服务器上的pg_basebackup产生的影响。这个选项总是会影响数据目录的传输。如果收集方法是fetch时,只有 WAL 文件受到影响。

-R
--write-recovery-conf
在输出目录中(或者当使用 tar 格式时再基础归档文件中)建立 standby.signal 并附加连接设置到postgresql.auto.conf 来简化设置一个后备服务器。 postgresql.auto.conf文件将记录连接设置(如果有)以及pg_basebackup所使用的复制槽,这样流复制后面就会使用相同的设置。

-T olddir=newdir
--tablespace-mapping=olddir=newdir
在备份期间将目录olddir中的表空间重定位到newdir中。为使之有效,olddir必须正好匹配表空间所在的路径(但如果备份中没有包含olddir中的表空间也不是错误)。olddir和newdir必须是绝对路径。如果一个路径凑巧包含了一个=符号,可用反斜线对它转义。对于多个表空间可以多次使用这个选项。例子见下文。如果以这种方法重定位一个表空间,主数据目录中的符号链接会被更新成指向新位置。因此新数据目录已经可以被一个所有表空间位于更新后位置的新服务器实例使用。

--waldir=waldir
指定用于预写式日志目录的位置。waldir必须是绝对路径。只有当备份是平面文件模式时才能指定事务日志目录。

-X method
--wal-method=method
在备份中包括所需的预写式日志文件(WAL文件)。这包括所有在备份期间产生的预写式日志。除非指定了方法none,可以直接在提取出的目录中启动postmaster而无需参考日志归档,所以这样得到的是一种完整的独立备份。支持下列收集预写式日志的方法:
n
none
不要在备份中包括预写式日志。

f
fetch
在备份末尾收集预写式日志文件。因此,有必要把wal_keep_segments参数设置得足够高,这样在备份末尾之前日志不会被移除。如果在要传输日志时它已经被轮转,备份将失败并且是不可用的。如果使用tar格式,预写式日志文件将被写入到base.tar文件。

s
stream
在备份被创建时流传送预写式日志。这将开启一个到服务器的第二连接并且在运行备份时并行开始流传输预写式日志。因此,它将使用最多两个由max_wal_senders参数配置的连接。只要客户端能保持接收预写式日志,使用这种模式不需要在主控机上保存额外的预写式日志。如果使用tar格式,预写式日志文件被写入到一个单独的名为pg_wal.tar的文件(如果服务器的版本超过10,该文件将被命名为pg_wal.tar)。

这个值是默认值。

-z
--gzip
启用对 tar 文件输出的 gzip 压缩,使用默认的压缩级别。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。

-Z level
--compress=level
启用对 tar 文件输出的 gzip 压缩,并且制定压缩机别(0 到 9,0 是不压缩,9 是最佳压缩)。只有使用 tar 格式时压缩才可用,并且会在所有tar文件名后面自动加上后缀.gz。

下列命令行选项控制备份的生成和程序的运行。

-c fast|spread
--checkpoint=fast|spread
将检查点模式设置为 fast(立刻)或 spread(默认)(见第 25.3.3 节)。

-C
--create-slot
这个选项会导致在开始备份前创建一个由--slot选项指定名称的复制槽。如果槽已经存在则会发生错误。

-l label
--label=label
为备份设置标签。如果没有指定,将使用一个默认值“pg_basebackup base backup”。

-n
--no-clean
默认情况下,当pg_basebackup因为一个错误而中止时,它会把它意识到无法完成该工作之前已经创建的目录(例如数据目录和预写式日志目录)都移除。这个选项可以禁止这种清洗,因此可以用于调试。

注意不管哪一种方式都不会清除表空间目录。

-N
--no-sync
默认情况下,pg_basebackup将等待所有文件被安全地写到磁盘上。这个选项导致pg_basebackup不做这种等待就返回,这样会更快一些,但是也意味着后续发生的操作系统崩溃可能会使得这个基础备份损坏。通常这个选项对测试比较有用,在创建生产安装时不应该使用。

-P
--progress
启用进度报告。启用这个选项将在备份期间发表一个大致的进度报告。由于数据库可能在备份期间改变,这仅仅是一种近似并且可能不会刚好在100%结束。特别地,当 WAL 日志被包括在备份中时,总数据量无法预先估计,并且在这种情况中估计的目标尺寸会在它经过不带 WAL 的总估计后增加。

当这个选项被启用时,备份开始时会列举整个数据库的尺寸,并且接着回头开始发送实际的内容。这可能使备份需要多花一点点时间,并且它在发送第一个数据之前花费的时间更长。

-S slotname
--slot=slotname
这个选项仅能与-X stream一起使用。它导致WAL流使用指定的复制槽。如果该基础备份的目的是被用作一台使用复制槽的流复制后备,则它应该使用与primary_slot_name中相同的复制槽名称。通过这种方式,可以确保服务器不会移除位于该基础备份结束与流复制开始之间产生的任何所需的WAL数据。

指定的复制槽必须已经存在,除非同时使用了选项-C。

如果这个选项没有被指定并且服务器支持临时复制槽(版本10以后),则会自动使用一个临时复制槽来进行WAL流。

-v
--verbose
启用冗长模式。将在启动和关闭期间输出一些额外步骤,并且如果进度报告也被启用,还会显示当前正在被处理的确切文件名。

--no-slot
如果服务器支持临时复制槽,这个选项防止备份期间创建临时复制槽。在使用日志流时,如果没有用选项-S指定槽名称,则默认会创建临时复制槽。这个选项的主要目的是允许在服务器没有空闲复制槽可用时制作基础备份。使用复制槽几乎总是最好的方式,因为它能防止备份期间所需的WAL被删除。

--no-verify-checksums
如果在取基础备份的服务器上启用了校验码验证,则禁用校验码验证。默认情况下,校验码会被验证并且校验码失败将会导致一种非零的退出状态。不过,基础备份在这种情况下将不会被移除,就好像使用了--no-clean选项一样。校验和验证失败也将报告在pg_stat_database视图中。

# 下列命令行选项控制数据库连接参数。

-d connstr
--dbname=connstr
以一个连接字符串的形式指定用于连接到服务器的参数。为了和其他客户端应用一致,该选项被称为--dbname。但是因为pg_basebackup并不连接到集簇中的任何特定数据库,连接字符串中的数据库名将被忽略。

-h host
--host=host
指定运行服务器的机器的主机名。如果该值以一个斜线开始,它被用作 Unix 域套接字的目录。默认值取自PGHOST环境变量(如果设置),否则会尝试一个 Unix 域套接字连接。

-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展。默认用PGPORT环境变量中的值(如果设置),或者一个编译在程序中的默认值。

-s interval
--status-interval=interval
指定发送回服务器的状态包之间的秒数。这允许我们更容易地监控服务器的进度。一个零值完全禁用这种周期性的状态更新,不过当服务器需要时还是会有一个更新会被发送来避免超时导致的断开连接。默认值是 10 秒。

-U username
--username=username
要作为哪个用户连接。

-w
--no-password
从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那儿连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。

-W
--password
强制pg_basebackup在连接到一个数据库之前提示要求一个口令。这个选项不是必不可少的,因为如果服务器要求口令认证,pg_basebackup将自动提示要求一个口令。但是,pg_basebackup将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下值得用-W来避免额外的连接尝试。

-V
--version
打印pg_basebackup版本并退出。

-?
--help
显示有关pg_basebackup命令行参数的帮助并退出。

你可能感兴趣的:(postgresql,数据库)