PostgreSQL - 基于pg_basebackup实现主从流复制

news/2024/5/22 8:28:08/文章来源:https://blog.csdn.net/shangcunshanfu/article/details/126918761

PostgreSQL - 基于pg_basebackup实现主从流复制

  • 1 数据库节点
  • 2 安装PostgreSQL
    • 2.1 创建postgres用户
    • 2.2 安装PostgreSQL
  • 3 配置主节点
  • 4 配置从节点
  • 5 验证主从同步

1 数据库节点

节点ip节点角色
192.168.163.133主节点
192.168.163.134从节点

2 安装PostgreSQL

2.1 创建postgres用户

PostgreSQL不允许使用linux root用户进行操作,所以需要为其创建一个postgres用户。这一步不是必须的,如果不创建,在安装PostgreSQL时,会自动创建一个名为 postgres 的用户出来,不过建议自己创建一个。

[postgres@n1 12]$ groupadd postgres
[postgres@n1 12]$ useradd postgres -g postgres

2.2 安装PostgreSQL

进入PostgreSQL官网下载页面PostgreSQL下载地址
选择相应的操作系统,PostgreSQL版本后,会出现一个安装脚本。
在这里插入图片描述
在这里插入图片描述
如下就是上面截图中的安装shell脚本

# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL:
sudo yum install -y postgresql12-server# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

不过后面三行脚本可以不执行,sudo /usr/pgsql-12/bin/postgresql-12-setup initdb是初始化一个数据库实例;后面两句就开机启动跟启动当前实例。我们后续在安装完后自己初始化一个实例出来,所以后面三行可以注释掉。

主从两个节点上都安装上PostgreSQL。

3 配置主节点

初始化一个实例出来,作为主节点。
切换到postgres用户,初始化一个节点

[postgres@n1 12]$ su - postgres
[postgres@n1 12]$ /usr/pgsql-12/bin/pg_ctl initdb -D /home/app/pgsql/12/stream-test

上面命令在/home/app/pgsql/12/目录下创建了一个PostgreSQL实例,当执行完上面命令后,会在stream-test目录下生成PostgreSQL相应的实例文件及文件夹。如图
在这里插入图片描述
初始化好主节点后,可以进行相应的配置

[postgres@n1 stream-test]$ vim postgresql.conflisten_addresses = '*'          # 这一行一定要改,默认是localhost,如果是localhost,则不能进行远程登陆;
port = 5443                     # 建议修改一下端口号

其它的可以暂时不用配置了。下面配置pg_hba.conf

vim pg_hba.conf# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
##### 这行配置是我自己添加的  192.168.163.0/24  表示在192.168.163这个网段下的所有机器都允许以任务用户访问任何数据库,其它的配置都是自己带的,不用修改。
##### 当前也可以更精确的配置,比如 192.168.163.134/32,意味着只允许192.168.163.134进行远程访问
host    all             all             192.168.163.0/24            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
##### 这行配置是我自己添加的
host    replication     all             192.168.163.0/24                 trust

使用四个#号进行注释的部分是需要配置的,其它的不用修改。
配置完成后,启动主节点。

[postgres@n1 stream-test]$ /usr/pgsql-12/bin/pg_ctl start -D /home/app/pgsql/12/stream-test/

-D 表示启动PostgreSQL进程时,使用我们上面初始化出来的实例。有点像redis的意思。
现在主节点就配置完成了,下面来配置从节点。

4 配置从节点

从节点就简单一些,在安装了PostgreSQL后,只需要执行一条命令就OKAY了。
强烈建议,从节点与主节点的实例所在的目录都是相同的。

[root@n2 ~]# mkdir -p /home/app/pgsql/12/stream-test
[root@n2 ~]# cd /home/app/pgsql/12/
[root@n2 12]# chown -R postgres:postgres stream-test/
[root@n2 12]# chmod 700 stream-test/
[root@n2 12]# su - postgres

直接切换到postgres用户去创建目录好像用更好一些。
然后从主节点拉取数据过来,主节点上就不需要执行实例初始化的过程了,从节点的数据应该是从主节点那边拉取过来的,所以从节点不应该有自己的初始化数据。

pg_basebackup -D /home/app/pgsql/12/stream-test/ -h 192.168.163.133 -p 5443 -U postgres -Fp -R -X s -P -v

上面命令即完成了数据同步,-R 参数表示以从replication的方式进行数据同步,可以认为是以从从节点的身份进行数据同步。-X s表示同步方式是流式数据同步。查看同步的数据目录
在这里插入图片描述
跟主节点的目录结构不同,这里多了一个standby.signal文件,这默认是一个空文件,其实是一个标识文件。
也是因为使用了-R参数,所以在同步的数据里,所以会在postgresql.auto.conf里配置上 primary_conninfo信息。

[postgres@n2 stream-test]$ vim postgresql.auto.conf

在这里插入图片描述
现在启动从节点

[postgres@n2 12]$ /usr/pgsql-12/bin/pg_ctl start -D /home/app/pgsql/12/stream-test/waiting for server to start....2022-09-18 16:57:49.669 CST [44990] LOG:  starting PostgreSQL 12.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2022-09-18 16:57:49.669 CST [44990] LOG:  listening on IPv4 address "0.0.0.0", port 5443
2022-09-18 16:57:49.669 CST [44990] LOG:  listening on IPv6 address "::", port 5443
2022-09-18 16:57:49.669 CST [44990] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5443"
2022-09-18 16:57:49.670 CST [44990] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5443"
2022-09-18 16:57:49.677 CST [44990] LOG:  redirecting log output to logging collector process
2022-09-18 16:57:49.677 CST [44990] HINT:  Future log output will appear in directory "log".done
server started

如果此时观察一下启动日志,会发现从节点以只读形式启动的。

[postgres@n2 stream-test]$ cd /home/app/pgsql/12/stream-test/log/
[postgres@n2 log]$ vim postgresql-Sun.log

在这里插入图片描述
这样一个PostgreSQL的主从复制就搭建好的,其实就用了一个命令/usr/pgsql-12/bin/pg_ctl start -D /home/app/pgsql/12/stream-test/,感觉比mysql要方便很多。

5 验证主从同步

连接主节点PostgreSQL实例

[postgres@n1 stream-test]$ psql -p 5443
postgres=# \lList of databasesName    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +|          |          |             |             | postgres=CTc/postgrestemplate1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +|          |          |             |             | postgres=CTc/postgres
(3 rows)postgres=# create table t1(id int,name varchar(32),create_time timestamptz);
CREATE TABLE
postgres=# 
postgres=# insert into t1 select generate_series(1,10), 'name1-10', now();
INSERT 0 10
postgres=# select * from t1;id |   name   |         create_time          
----+----------+------------------------------1 | name1-10 | 2022-09-18 17:04:12.39975+082 | name1-10 | 2022-09-18 17:04:12.39975+083 | name1-10 | 2022-09-18 17:04:12.39975+084 | name1-10 | 2022-09-18 17:04:12.39975+085 | name1-10 | 2022-09-18 17:04:12.39975+086 | name1-10 | 2022-09-18 17:04:12.39975+087 | name1-10 | 2022-09-18 17:04:12.39975+088 | name1-10 | 2022-09-18 17:04:12.39975+089 | name1-10 | 2022-09-18 17:04:12.39975+0810 | name1-10 | 2022-09-18 17:04:12.39975+08
(10 rows)postgres=# 

连接从节点PostgreSQL实例

[postgres@n2 log]$ psql -p 5443
psql (12.12)
Type "help" for help.postgres=# \lList of databasesName    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +|          |          |             |             | postgres=CTc/postgrestemplate1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +|          |          |             |             | postgres=CTc/postgres
(3 rows)postgres=# \dtList of relationsSchema | Name | Type  |  Owner   
--------+------+-------+----------public | t1   | table | postgres
(1 row)postgres=# select * from t1;id |   name   |         create_time          
----+----------+------------------------------1 | name1-10 | 2022-09-18 17:04:12.39975+082 | name1-10 | 2022-09-18 17:04:12.39975+083 | name1-10 | 2022-09-18 17:04:12.39975+084 | name1-10 | 2022-09-18 17:04:12.39975+085 | name1-10 | 2022-09-18 17:04:12.39975+086 | name1-10 | 2022-09-18 17:04:12.39975+087 | name1-10 | 2022-09-18 17:04:12.39975+088 | name1-10 | 2022-09-18 17:04:12.39975+089 | name1-10 | 2022-09-18 17:04:12.39975+0810 | name1-10 | 2022-09-18 17:04:12.39975+08
(10 rows)postgres=#

可以看到数据已成功同步到了从节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9815.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——数据链路层(滑动窗口协议: 选择重传)(点对点协议 PPP)

目录 滑动窗口协议: 选择重传 选择重传协议 选择重传协议 点对点协议 PPP PPP 的主要特点 PPP 协议有三个组成部分 PPP 协议的帧格式 PPP 有一个 2 个字节的协议字段 透明传输问题 PPP 的字符填充 PPP 的工作状态 滑动窗口协议: 选择重传 选择重传协议 GBN相对简单&a…

【周末闲谈】谈谈数学转码这一年来的体会与反思

——我们走了太远,以至于忘了为何出发 前言 笔者本科读的是数学专业,就是每天和数学分析、高等代数、概率论、随机过程等等这些理论打交道的专业,这个专业出来工作好像一般有两个方向就是金融和计算机,我选择了计算机方向。主要…

2022 第五届 浙江省大学生网络与信息安全竞赛技能赛 预赛 Writeup,5题

文章目录1、Web:nisc_easyweb2、Web:nisc_学校门户网站3、Web:吃豆人吃豆魂4、MISC:好怪哦5、RE:ManyCheck1、Web:nisc_easyweb 题目描述: 打开网站,是一个php的初始页面。 思路…

springboot+微信小程序的点餐系统(开题报告+论文+答辩PPT+源码)

技术架构 SprongBootMysql微信小程序 简介 本点餐小程序是使用Java/JavaScript编程语言开发的,存储数据方面则用到了MySQL数据库。顾客可以使用小程序扫码功能扫描餐厅桌角的二维码就座,也可以点击排号等位由后台工作人员安排就座;通过首页…

通关GO语言10 Context:你必须掌握的多线程并发控制神器

在上一节课中我留了一个作业,也就是让你自己练习使用 sync.Map,相信你已经做出来了。现在我为你讲解 sync.Map 的方法。 Store:存储一对 key-value 值。 Load:根据 key 获取对应的 value 值,并且可以判断 key 是否存在…

GO面试题集锦

GO面试题集锦 目录GO面试题集锦slice 扩容机制slice 为什么不是线程安全的map 底层原理map 扩容机制map 遍历为什么无序map 为什么不是线程安全的Map 如何查找Map 冲突解决方式Map 负载因子为什么是 6.5Map 和 Sync.Map 哪个性能好Channel 底层实现原理Channel 有什么特点Chann…

docker实战教程(七):镜像的分层概念

联合文件系统(UnionFS) 联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像…

Zookeeper简介

文章目录Zookeeper简介zookeeper能做什么zookeeper的数据模型zookeeper工作机制zookeeper集群的选举机制1、第一次启动选举机制2、非第一次启动选举机制搭建zookeeper的集群Zookeeper简介 zookeeper能做什么 master节点选举:主节点挂了以后,从节点就会…

基于 ANFIS 的非线性回归(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 👨‍🎓博主课外兴趣:中西方哲学,送予读者: 👨‍&a…

字符串函数以及内存函数的模拟实现(超详细,全面理解字符串函数!!!)

目录 一、strlen 1.参数指向的字符串必须要以 \0 结束。 2.注意strlen函数的返回值为size_t,是无符号的 3.模拟实现strlen 二、strcpy 1.源字符串中的 \0 拷贝到目标空间 2.源字符串必须以 \0 结束 3.目标空间必须足够大,以确保能存放源字符串 4…

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入 @Configuration//告诉springboot这是一个配置类 public class MyConfig {@Bean("tom")public Stu stu01(){return new Stu("汤姆");}@ConditionalOnBean(name="tom")//当容器中有tom组件时…

windows工具:推荐一款可以截长图(滚动截图)的工具FSCapture

windows工具:推荐一款可以截长图(滚动截图)的工具前言一、FSCapture是什么?二、使用方法1.下载地址和安装2.使用方法前言 有的时候你画的框架图太大,已经超过了一屏,想要导出图片,用普通窗口截…

汇编常用寄存器以及寻址方式

寄存器概览 常用寄存器 AX accumulator 累加寄存器 BX base 基址寄存器 CX count 计数寄存器 DX data 数据寄存器 SP stack pointer 堆栈寄存器 BP base pointer 基址指针寄存器 SI source index 源变址寄存器 DI destination index 目的变址寄存器 IP instruction pointer 指…

ch4 报错修正 Sophus使用

ch4 报错& 修正 (1) # 添加Eigen头文件 include_directories( "/usr/include/eigen3" )(2) #include "sophus/so3.hpp" #include "sophus/se3.hpp"(3) 大量报错但都…

定制qga(作业截图)

文章目录一、qga介绍二、证明qga命令可以正常使用三、创建qga安装包四、总步骤一、qga介绍 qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service), 他可以管理应用程序,执行宿主机发…

声呐直线阵正交混频实验(HEU信息与信号处理创新实践项目一)

写在前面 这个实验原要求是要实现 969696 通道的正交混频变换(后来老师说只要不是单通道都行),因此必须使用 FIRFIRFIR IP核(手搓FIR一两个通道还行,96通道就太费劲了),所以实验成功的关键就是…

BNU002期-学术沙龙-写好综述

文章目录综述的介绍什么是综述为什么要读综述为什么要写综述怎样写综述综述案例中的问题对于综述写作问题的分类如何避免综述写作问题讨论综述问题框架环节并完善做个升华:谈谈科研和读综述的乐趣本文引用资料的链接补充综述的介绍 本文围绕 什么是综述 我创设这…

微服务基础---认识微服务

1.1认识微服务 1.1.1微服务架构演变 单体架构 将业务的所有功能都集中在一个项目中进行开发,打成一个包部署. 优点:架构简单、部署成本低缺点:耦合度高 分布式架构 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发&am…

软件流程和管理(八):Ethics

目录 1. Ethics 1.1 道德(Ethics)是什么? 1.2 关于计算机伦理的错误假设 1.3 为什么你要关心建立道德技能和知识 1.4 信息技术的道德责任 1.5 澳大利亚计算机协会的道德准则 1.6 组织中的道德是很重要的 1.7 道德:实用指…

zephyr线程生命周期

ephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期。 线程状态 线程在其生命周期中有下面6种状态: New 创建:线程被创建起来但…