PostgreSQL的一主一从集群搭建部署

1. PostgreSQL的一主一从集群搭建部署

1. 目标

​ 掌握Postgresql数据库主从部署搭建配置

2. 脉络

  • 部署规划
  • PostgreSQL单节点安装
  • PostgreSQL主从部署配置
  • 主从同步验证

3. 部署搭建

3.1 基础准备

1.1 创建两台虚拟机
虚拟机名 IP hostname 主从划分
test11 192.168.198.146 node236 主节点
test12 192.168.198.144 node237 从节点1
1.2 创建两台虚拟机

对于本文部署涉及到的软件版本如下表所示。

操作系统发行版本 CentOS 7
操作系统版本 Linux
PostgreSQL 9.2.24
本地虚拟化软件 VMware® Workstation

3.2 安装软件包

3.2.1 查看软件版本

安装之前首先查看软件是否已经安装。输入命令:

rpm -qa | grep postgresql

一般来讲,从虚拟机安装系统,自然是不会安装PostgreSQL。因此输出为空。

安装软件包有多种方式可选,对于PostgreSQL本文选用的方式是尽量选择yum安装默认版本的软件,以便后期维护。

2.2.2 安装与初始化

两台机器安装过程相同。

(1)安装postgresql postgresql-server

yum install -y postgresql postgresql-server

(2)查看安装结果。

rpm -qa | grep postgresql
[root@localhost ~]# rpm -qa | grep postgresql
postgresql-libs-9.2.24-9.el7_9.x86_64
postgresql-server-9.2.24-9.el7_9.x86_64
postgresql-9.2.24-9.el7_9.x86_64

(3)初始化

service postgresql initdb

(4)启动

systemctl start postgresql

(5)设置为开机自启

systemctl enable postgresql.service

(6)开放端口(如果防火墙已经关闭则可以省略)

iptables -I INPUT -p tcp --dport 5432 -j ACCEPT

(6)验证安装结果,首先输入 su - postgres切换用户,然后输入psql,如下图所示,则安装成功。

[root@localhost ~]# su - postgres
-bash-4.2$ psql
psql (9.2.24)
输入 "help" 来获取帮助信息.
postgres=# 

(7)对posgres用户和数据库管理员设置密码。

# 切换到root用户设置postgres用户密码
passwd postgres
# 在输入两次新密码即可


# 进入posgresql数据中
su - postgres
psql
postgres=# alter user postgres with password '654321';
ALTER ROLE

3.2 主节点配置

(1)创建用于主从访问的用户

# su - postgres
-bash-4.2$ psql
postgres=# create role repl login replication encrypted password 'postgres';

(2)在pg_hba.conf和postgresql.conf中增加配置内容

pg_hba.conf是对访问权限的以下配置,需要根据实际情况配置。其中192.168.198.143是从节点的IP,用于主从的配置。repl是刚刚创建的用户。最后一行是用于子网内客户端的登录。

# vi /var/lib/pgsql/data/pg_hba.conf
host    replication    repl    192.168.198.143/32    trust
host    replication    repl    192.168.198.146/32    trust
host    all    		  all      192.168.198.0/24     md5
host    all	    	  all      0.0.0.0/0            md5

postgresql.conf是postgresql本身配置。

# vi /var/lib/pgsql/data/postgresql.conf

# 要修改的地方
# 监听地址
listen_addresses = '*'
#  写入WAL的级别(minimal:不能通过基础备份和wal日志恢复数据库; replica: 支持wal归档和复制; logical: 在replica级别添加了逻辑解码所需的信息)
wal_level = hot_standby
# 允许最多的流复制连接发送数量, 根据从节点数量来设定
max_wal_senders= 6
# 设置流复制保留的最多的xlog数目
wal_keep_segments = 10240
# 设置流复制发送数据的超时时间
wal_sender_timeout = 60s 
# 最大连接数量,根据从节点与客户端连接数来设定
max_connections = 512

参数说明:

listen_addresses = '*' 可以连接服务器使用的IP,一般初始值为 localhost或者local,意味着只有本机可以连接数据库。这里一般设置为 " * " ,允许全部的IP连接数据库。
wal_level = hot_standby wal_level中有三个主要的参数:minimal、archive和hot_standby1.minimal是默认的值,它仅写入崩溃或者突发关机时所需要的信息(不建议使用)。2.archive是增加wal归档所需的日志(最常用)。3.hot_standby是在备用服务器上增加了运行只读查询所需的信息,一般是在流复制的时候使用到。
max_wal_senders= 6 最多多少个流复制链接
wal_keep_segments = 10240 流复制保留最多的xlog数,xlog这个日志是记录的Postgresql的WAL信息
max_connections = 512 允许的最大并发连接数,简单来说就是同时多少客户端能连接你的数据库。

(3)重启主节点

建议先停止,再启动,而不是重启。之后再验证一下是否启动成功

systemctl stop postgresql
systemctl start postgresql

2.4 从节点配置

从节点的操作建议全部在postgres用户下进行。

(1)切换postgres用户

su - postgres

(2)对主节点的数据进行备份,其中192.168.198.143对应主机IP,repl是上一节主节点创建的用户。

# 删除原有的data目录下数据
-bash-4.2$ rm -rf /var/lib/pgsql/data/*
# 从主库中拷贝数据
-bash-4.2$ pg_basebackup -h 192.168.198.143 -U repl -D /var/lib/pgsql/data -X stream -P

(3)拷贝recovery.conf,编辑recovery.conf内容,其中192.168.198.143对应主机IP,repl是上一节主机创建的用户。

-bash-4.2$ cp /usr/share/pgsql/recovery.conf.sample /var/lib/pgsql/data/recovery.conf
-bash-4.2$ vi /var/lib/pgsql/data/recovery.conf

# 要修改的值
# 从机不仅用于数据归档,也可用于数据查询
standby_mode = on
primary_conninfo = 'host=192.168.198.143 port=5432 user=repl password=postgres'
recovery_target_timeline = 'latest'
# 根据实际应用情况, 设定最大连接数
max_connections = 1000
# 如果有错误的数据复制,是否向主进行反馈
hot_standby_feedback = on 
# 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
wal_receiver_status_interval = 10s 
# 数据流备份的最大延迟时间
max_standby_streaming_delay = 3

参数说明。

standby_mode 开启standby模式
primary_conninfo 主节点信息
recovery_target_timeline = 'latest' 指定恢复到一个特定的时间线中。默认值是沿着基础备份建立时的当前时间线恢复。将这个参数设置为latest会恢复到该归档中能找到的最新的时间线。
trigger_file = '/tmp/trigger_file0' '/tmp/trigger_file0'是一个自定义的文件,在后面主从切换的时候能够用得上。倘若检测到该文件的创建,则PostgreSQL由主节点的状态切换为主。如果下文在failover_stream.sh采用文件触发的办法,则必须配置此项,若采用命令触发方法则无需配置此项,但配置此项对命令方式没有影响。

(4)在postgresql.conf中添加一行,用于开启standby模式。

-bash-4.2$ vi /var/lib/pgsql/data/postgresql.conf
# 要修改的值
hot_standby = on

(5)退出postgres用户,重启PostgreSQL

systemctl stop postgresql
systemctl start postgresql

4. 验证主从

(1)在主节点写数据,从节点读数据。

在主节点,切换到psql界面

create database test;

可以看见提示创建成功。

在从节点上查看分别在创建之前和创建之后查看数据库。可以看见,数据库同步了。

# 主库
                                 资料库列表
   名称    |  拥有者  | 字元编码  | 校对规则 | Ctype |       存取权限        
-----------+----------+-----------+----------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C        | C     | 
 template0 | postgres | SQL_ASCII | C        | C     | =c/postgres          +
           |          |           |          |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C        | C     | =c/postgres          +
           |          |           |          |       | postgres=CTc/postgres
 test      | postgres | SQL_ASCII | C        | C     | 
(4 行记录)


# 从库
                                 资料库列表
   名称    |  拥有者  | 字元编码  | 校对规则 | Ctype |       存取权限        
-----------+----------+-----------+----------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C        | C     | 
 template0 | postgres | SQL_ASCII | C        | C     | =c/postgres          +
           |          |           |          |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C        | C     | =c/postgres          +
           |          |           |          |       | postgres=CTc/postgres
 test      | postgres | SQL_ASCII | C        | C     | 
(4 行记录)

(2)在从节点写数据

postgres=# create database test2;
ERROR:  cannot execute CREATE DATABASE in a read-only transaction

可以看见,提示,从节点是个只读数据库。

5. 总结

  • 通过PostgreSQL主从同步部署, 能够有效保障主节点数据的安全, 即便主库归档日志损坏, 也可以通过从节点恢复获取数据,主从部署还可以有效减少主节点的负载压力, 将集中读取的数据通过从节点处理,减少主节点的IO瓶颈和CPU负载, 如果一台从节点不够, 也可以参照以上部署方式,扩展多个从节点, 从而提升整体数据库吞吐性能。
  • 虽然PostgreSQL原生对多主集群模式没有较好的支持,对于复杂的海量数据的业务, 我们可以从架构设计上做改进, 将复杂的业务进行拆分, 设为多个微服务, 搭建多个PostgreSQL主从服务群, 分散负载, 消除瓶颈,从而有效支撑海量数据的业务服务。
posted @   零の守墓人  阅读(539)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示