PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离

文章目录

    • 概况
    • 安装PostgreSQL
    • 设置主节点
    • 设置从节点
    • 验证
    • 故障处理,主从节点切换
    • 从节点扩容

概况

  • CentOS Linux release 7.7.1908
  • PostgreSQL13
  • 三台服务器,一主两从,实时复制。主节点读写,从节点只读,读写分离
  • 不借助插件或第三方中间件,仅使用PostgreSQL自带的流复制功能Replication
  • 主节点可建库建表、可读写,两个从节点为只读,程序使用时可以将查询和统计相关服务读取从节点,通过读写分离减少数据库读写压力
  • 设置同步复制,为热备份,数据实时同步,对于大多数业务来说,可以认为三个库数据完全相同,当一个库故障时,其他库仍然可提供服务,增加服务可用性
  • 当主节点故障时,数据无法更新,只能手动将从节点升格为主节点,需要修改服务的数据库连接配置等,服务短暂不可用(也可提前准备好监控和切换脚本,服务不可用时尽早发现和切换)。需要根据自己业务特点,是否能接受此种情况,来决定是否使用此方式。
  • 单点故障,自动切换的集群,可以考虑使用PGPool-II 等第三方中间件搭建,后面研究好我会出一篇文档

安装PostgreSQL

  • 命令如下,具体可参考我之前的博客《PostgreSQL简介和安装部署》
# 安装 repository 源:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 安装 PostgreSQL13:
sudo yum install -y postgresql13-server

# 初始化数据库,并设置启动命令和开机启动:
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13

# 另外,查看状态,关闭命名和重启命令
sudo systemctl status postgresql-13
sudo systemctl stop postgresql-13
sudo systemctl restart postgresql-13
  • 三个节点安装完成后,就可以开始使用了
  • 可以创建用户、赋予权限、修改密码,可以建库建表早一些功能测试等
  • 默认安装创建的数据库,没有主从之分,都是主节点,可以使用这条语句验证下是否为从节点,查询结果为"f"表示false,当前数据库节点为主库节点
sudo -u postgres /usr/pgsql-13/bin/psql -c "select pg_is_in_recovery()"
  • 下面开始搭建集群,关闭三个PostgreSQL服务,开始改配置文件

设置主节点

主从节点可以自己规划好,准备好不同机器就行,也可以使用最小集群一主一从
主要是修改2个配置文件,都在data目录下,一个是数据库基础配置,一个是访问权限控制
默认初始化的数据库,data目录在/var/lib/pgsql/13/data

  1. 修改文件夹里面的pg_hba.conf,设置 Replication 访问策略,允许流复制
# replication privilege.
# 追加一条“允许postgres用户,通过全部网络地址使用 Replication ”的策略
host      replication              postgres    0.0.0.0/0    trust
  1. 继续修改数据库配置文件postgres.conf,进行一些参数设置,允许流复制
# -----------------------------
# PostgreSQL configuration file
# -----------------------------
# - Connection Settings -

listen_addresses = '*'		# what IP address(es) to listen on;
#port = 5432				# (change requires restart)
max_connections = 200			# (change requires restart)

# - Authentication -
#authentication_timeout = 1min		# 1s-600s
password_encryption = scram-sha-256		# md5 or scram-sha-256
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
# - Memory -
shared_buffers = 1GB			# min 128kB  官方推荐内存设置带大小为系统内存的1/4
temp_buffers = 64MB			# min 800kB
work_mem = 64MB				# min 64kB
max_stack_depth = 4MB			# min 100kB
dynamic_shared_memory_type = posix	# the default is the first option
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
wal_level = replica			# minimal, replica, or logical
fsync = on				# flush data to disk for crash safety
synchronous_commit = on		# synchronization level;
wal_log_hints = on			# also do full page writes of non-critical updates
# - Checkpoints -
checkpoint_timeout = 10min		# range 30s-1d
max_wal_size = 1GB
min_wal_size = 80MB
# - Archiving -
archive_mode = on		# enables archiving; off, on, or always
# (change requires restart)
archive_command = 'cp %p /data/postgresql/archive/%f'  # command to use to archive a logfile segment
#-----------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------

max_wal_senders = 10		# max number of walsender processes 设置了可以最多有几个流复制的链接
# (change requires restart)
wal_keep_size = 1024 		# in megabytes; 0 disables
max_slot_wal_keep_size = 10	# in megabytes; -1 disables
wal_sender_timeout = 120s	# in milliseconds; 0 disables


# - Standby Servers -
hot_standby = on			# "off" disallows queries during recovery
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------

# - Where to Log -

log_destination = 'stderr'		# Valid values are combinations of
logging_collector = on			# Enable capturing of stderr and csvlog
log_directory = 'log'			# directory where log files are written,
# can be absolute or relative to PGDATA
log_filename = 'postgresql-%a.log'	# log file name pattern,
log_truncate_on_rotation = on		# If on, an existing log file with the
log_rotation_age = 1d			# Automatic rotation of logfiles will
log_rotation_size = 50MB			# Automatic rotation of logfiles will

log_min_duration_statement = 2000 # 配置数据库慢查询时间,如果超过配置的时间,就会将查询的SQL语句记录到日志

# - What to Log -
log_connections = on
log_disconnections = on
log_line_prefix = '%m [%p] '		# special values:
log_timezone = 'Asia/Shanghai'

datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
timezone = 'Asia/Shanghai'

# These settings are initialized by initdb, but they can be changed.
lc_messages = 'en_US.UTF-8'			# locale for system error message
# strings
lc_monetary = 'en_US.UTF-8'			# locale for monetary formatting
lc_numeric = 'en_US.UTF-8'			# locale for number formatting
lc_time = 'en_US.UTF-8'				# locale for time formatting

# default configuration for text search
default_text_search_config = 'pg_catalog.english'
shared_preload_libraries = ''	# citus (change requires restart)
  1. 启动服务,使配置生效,主节点设置完毕
sudo systemctl start postgresql-13
# 或
sudo systemctl restart postgresql-13

设置从节点

主从要保持一致,主要是 data 保持一致,我们可以直接将主节点data同步到从节点

  1. 如果从节点没有关闭,可以先关闭 sudo systemctl stop postgresql-13
  2. 去默认的data位置,删除所有文件
cd /var/lib/pgsql/13/data
rm -rf *
  1. 使用pg_basebackup命令将主节点的data同步过来
sudo -u postgres  /usr/pgsql-13/bin/pg_basebackup -h 192.168.1.76 -U postgres -p 5432 -F p   -X s -v -P -R -D /var/lib/pgsql/13/data

其中:-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。

备份完成,在数据库实例目录下自动生成standby.signal“信号”文件,并在postgresql.auto.conf文件写入了主库的连接信息
4. 以上就配置完了,启动服务,验证是否为从节点,会得到t,即true,为从节点

sudo systemctl start postgresql-13
sudo -u postgres /usr/pgsql-13/bin/psql -c "select pg_is_in_recovery()"

验证

  1. 在主节点执行命令可以查看集群状态
sudo -u postgres /usr/pgsql-13/bin/psql -x -c "select * from pg_stat_replication" -d postgres

PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离_第1张图片

  1. 在主从节点,各测试新建、修改、删除表,数据增删改查操作
    结果符合预期,主节点可以进行ddl操作和增删改查,从节点只允许数据查询,结构和数据已经实时同步

故障处理,主从节点切换

  1. 修改新的主节点的配置文件postgres.auto.conf,将之前生成的 主从信息primary_conninfo 注释掉或者删掉,重启服务使之生效
    PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离_第2张图片
  2. 主要使用PostgreSQL的命令pg_ctl promote,在某个从节点执行,将该节点升格为主节点
sudo -u postgres /usr/pgsql-13/bin/pg_ctl promote -D /var/lib/pgsql/13/data

此节点执行前为从节点,执行后,变为主节点
PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离_第3张图片
3. 注意:此时已经没有主从集群了,只是这个从节点可以读写了,并不会将数据同步到另一个从节点
在这里插入图片描述
5. 按照之前主从设置步骤,将坏掉的主节点和剩余的从节点服务停止,将data目录清空,使用pg_basebackup命令将主节点的data同步过来,之后启动服务
PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离_第4张图片
6. 验证,现在去查看是否为从节点和集群状态,会发现新集群已生效。去验证增删改查,会发现结构和数据都能同步了,切换完成
PostgreSQL13使用流复制Replication功能搭建主从集群实现读写分离_第5张图片

从节点扩容

如果一开始只有一个主节点或一主一从,查询较多,存在慢查询,数据库服务压力过大,可以考虑扩容。
新节点扩容很简单,按照之前步骤,安装数据库,使用pg_basebackup即可。

你可能感兴趣的:(数据库及存储技术,postgresql,数据库,流复制,postgresql主从集群,Replication)