当前位置: 首页 > news >正文

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

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.conf

listen_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=# \l
                                  List of databases
   Name    |  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/postgres
 template1 | 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+08
  2 | name1-10 | 2022-09-18 17:04:12.39975+08
  3 | name1-10 | 2022-09-18 17:04:12.39975+08
  4 | name1-10 | 2022-09-18 17:04:12.39975+08
  5 | name1-10 | 2022-09-18 17:04:12.39975+08
  6 | name1-10 | 2022-09-18 17:04:12.39975+08
  7 | name1-10 | 2022-09-18 17:04:12.39975+08
  8 | name1-10 | 2022-09-18 17:04:12.39975+08
  9 | name1-10 | 2022-09-18 17:04:12.39975+08
 10 | 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=# \l
                                  List of databases
   Name    |  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/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# \dt
        List of relations
 Schema | 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+08
  2 | name1-10 | 2022-09-18 17:04:12.39975+08
  3 | name1-10 | 2022-09-18 17:04:12.39975+08
  4 | name1-10 | 2022-09-18 17:04:12.39975+08
  5 | name1-10 | 2022-09-18 17:04:12.39975+08
  6 | name1-10 | 2022-09-18 17:04:12.39975+08
  7 | name1-10 | 2022-09-18 17:04:12.39975+08
  8 | name1-10 | 2022-09-18 17:04:12.39975+08
  9 | name1-10 | 2022-09-18 17:04:12.39975+08
 10 | name1-10 | 2022-09-18 17:04:12.39975+08
(10 rows)

postgres=#

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

相关文章:

  • Java项目源码ssm+mysql实现进销存系统|仓库
  • 黑马瑞吉外卖之套餐信息的分页查询
  • 9.14 c++基础
  • python创建智能问答机器人
  • MyBatis的简介和核心的组件(映射器、执行器、SqlSession及其工厂)
  • 《计算几何》学习笔记
  • 干货分享:Docker 容器应用示例
  • 闭包的定义,原理,应用场景,优点,缺点
  • js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
  • 黑客进行攻击中最重要的环节“信息收集”
  • Vue(6)
  • JSON 数据类型转换工具
  • CSP-J 2019 入门级 第一轮 第17题
  • 小程序map组件一——使用腾讯地图个性化地图组件、腾讯云可视化大屏展示
  • 【项目实战】高并发内存池
  • AHK 中 = 和 == 等比较运算符的用法
  • eclipse的离线汉化
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js中的正则表达式入门
  • Laravel 实践之路: 数据库迁移与数据填充
  • learning koa2.x
  • Linux各目录及每个目录的详细介绍
  • Markdown 语法简单说明
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Twitter赢在开放,三年创造奇迹
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 回顾 Swift 多平台移植进度 #2
  • 区块链将重新定义世界
  • 学习笔记TF060:图像语音结合,看图说话
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​iOS实时查看App运行日志
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C#)获取字符编码的类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)EXC_BREAKPOINT僵尸错误
  • ***利用Ms05002溢出找“肉鸡
  • .NET 4.0中的泛型协变和反变
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 解决重复提交问题
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET成年了,然后呢?
  • .net通用权限框架B/S (三)--MODEL层(2)
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证