postgresql主从复制配置

2023-05-16

postgresql主从复制是一种高可用解决方案,可以实现读写分离。postgresql主从复制是基于xlog来实现的,主库开启日志功能,从库根据主库xlog来完成数据的同步。

主从复需要注意的地方:

  • 启动从库之前,不能执行初始化。
  • 启动从库之前,需要通过base_backup从主服务器上同步配置与数据。
  • 启动从库之前,需要对同步之后的配置文件进行修改。
  • 启动从库之前,需要设置一个恢复的配置文件。
  • 从库只能读,不能写。

下面介绍主从复制的实现,这里以两台虚拟机为例,主节点IP是192.168.56.201,从节点IP是192.168.56.202,这里两台机器都是通过源码编译安装的方式安装的postgresql,版本是11.4。编译安装指定的前缀是/usr/local,因此安装完成,可执行程序会在/usr/local/bin目录下。

首先需要在主库上初始化数据库,并启动数据库服务。  

启动的时候,不能以root用户来启动。

编译安装不会创建postgres用户,因此我们需要先创建postgres用户和用户组。 我们会将postgresql数据存储路径设置在/home/postgres/data下。

groupadd postgres
useradd -g postgres postgres

切换用户,然后初始化数据库。

初始化成功之后,会有个提示,如何启动数据库,按照提示命令,我们启动数据库。

/usr/local/bin/pg_ctl -D /home/postgres/data -l logfile start

这里启动数据库之后,我们登陆数据库,做两件事情:准备一些数据,将来从节点同步之后,用来做数据验证。创建一个admin/123456的用户,用来做主从复制。

这样在主库上的操作就完成了,接下来就是修改配置文件,然后重启主库。

修改pg_hba.conf,增加刚才创建的用户到文件末尾,method指定为md5,表示密码开启md5验证。

修改postgresql.conf,开启注释,并修改以下配置:

listen_addresses="*"
wal_level=hot_standby
max_wal_senders=2
wal_keep_segments=64
max_connections=100 

重启主库,至此,完成主库的所有准备工作:

/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

下面就是配置和启动从库了,前面注意事项里面提到,不能初始化从库,因为我们需要首先从主库备份数据,备份之后,从库的/home/postgres/data里面的数据和配置信息就和主库一致了。

首先从库也需要postgres/postgres用户组和用户,先创建:

groupadd postgres
useradd -g postgres postgres
 

之后,切换到postgres用户,进行数据备份和启动操作。

首先是利用base_backup命令进行备份:

/usr/local/bin/pg_basebackup -h 192.168.56.201 -p 5432 -U admin -F p -P -D /home/postgres/data 

因为是从库访问,而且是用的admin用户,因此需要输入密码。这里显示备份成功。

因为配置postgresql.conf是从主库同步过来的,这里需要修改一些配置,改为从库的配置:

#wal_level=hot_standby                      #从库不需要这个配置
#max_wal_senders=2                         #同上
#wal_keep_segments=64                   #同上
hot_standby=on                                  #开启hot_standby模式
max_standby_streaming_delay=30s  #可选,流复制最大延迟
wal_receiver_status_interval=10s       #可选,向主库报告状态的最大间隔时间
hot_standby_feedback=on                  #可选,查询冲突时向主库反馈
max_connections=1000                      #最大连接数一般大于主库就行 

还需要准备一个恢复配置文件,这个文件在安装postgresql时,会生成到/usr/local/share/postgresql目录下,名字是recovery.conf.sample。我们复制并修改名称为recovery.conf并放置在/home/postgres/data目录下,修改配置:

recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.56.201 port=5432 user=admin password=123456' 

这三个配置很直观,recovery_target_timeline='latest'表示恢复最新的数据,standby_mode表示从节点的角色是备选,primay_conninfo表示主库连接信息。

至此,从库的配置工作准备完成,接着就可以启动数据库了。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

主从复制到此就配置完成了,接下来就是验证阶段:

1、从主从机器运行的进程验证:

主节点服务器会增加一个walsender进程

从节点服务器增加一个walreceiver进程 

 2、从数据上验证:

主库在首次启动的时候,没有做主从配置之前,就插入了4条记录在test数据库xx_user表中。如今再次插入一条数据,也显示成功,查询会显示5条记录。 

从库在首次启动之后,数据是从主库备份过来的,第一次进入查找就有4条记录。等主库插入一条记录之后,再次查看是5条记录,从库数据均同步成功,表示主从复制配置正确。

最后我们在从库中做插入操作,显示操作失败,因为从库是只读的,不能做增删改的写操作,只能查询。

3、这里可以从/usr/local/bin/pg_controldata /home/postgres/data命令的结果状态中可以验证,主从关系,主库的集群状态是in production,从库是in archive recovery,当我们的主库崩溃,我们可以切换从库为主库。这时候主库状态是shut down,而从库是in production。这里我们模拟停掉主库。

pg_ctl stop -m fast

马上在从库上切换从库为主库:

pg_ctl promote

这里显示了从库的状态由in archive recovery 变为in production的截图:

正常从库的状态:

主库shutdown,从库执行切换主库操作之后: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postgresql主从复制配置 的相关文章

  • JSON 值的模式匹配

    运行 Postgres 12 5 的本地 docker 实例 4MBwork mem 我正在实施这个图案 https dba stackexchange com q 108447 3684搜索 json 中的任意字段 目标是搜索并返回 JS
  • Postgres 平均值计算忽略 null

    这是我的 postgres 表 name revenue John 100 Will 100 Tom 100 Susan 100 Ben 5 rows 在这里 当我计算平均收入时 它返回 100 这显然不是这种情况 而总和 计数 即 400
  • 为什么我的 postgis 不在几何字段上使用索引?

    Windows 上的 postgresql 9 5 postgis 2 2 我首先创建一个表 CREATE TABLE points id SERIAL ad CHAR 40 name VARCHAR 200 然后 添加一个几何字段 geo
  • Postgresql 串行错误自动增量

    我在 postgresql 上遇到问题 我认为 postgresql 中有一个错误 我错误地实现了一些东西 有一个表包括colmn1 primary key colmn2 unique colmn3 插入一行后 如果我尝试使用现有的另一次插
  • PostgreSQL round(v numeric, s int)

    Which method http en wikipedia org wiki Rounding Tie breakingPostgres 吗round v numeric s int http www postgresql org doc
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 使用转义换行符和回车符取消转义字符串

    我正在尝试编写一个 PLPGSQL 函数来混淆 审查 编辑文本 Obfuscate a body of text by replacing lowercase letters and numbers with symbols CREATE
  • 如何在 PostgreSQL 中使用条件和子查询创建唯一索引?

    我使用 PGSQL 并尝试添加下面的索引 CREATE UNIQUE INDEX fk client ON user client fk client WHERE fk client NOT IN SELECT fk client FROM
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • Npgsql 参数化查询输出与 PostGIS 不兼容

    我在 Npgsql 命令中有这个参数化查询 UPDATE raw geocoding SET the geom ST Transform ST GeomFromText POINT longitude latitude 4326 3081
  • 如何引用下一行的数据?

    我正在 PostgreSQL 9 2 中编写一个函数 对于股票价格和日期的表 我想计算每个条目较前一天的百分比变化 对于最早一天的数据 不会有前一天 因此该条目可以简单地为 Nil 我知道WITH声明可能不应该高于IF陈述 到目前为止 这就
  • 本地 Postgres 实例和 Azure Cloud Postgres 实例之间的实时同步

    我需要在本地 postgresql 实例与云 postgresql 实例之间设置实时同步过程 请让我知道我可以通过哪些选项来实现它 我是否必须使用任何特定工具或者可以通过复制进行管理 请指教 使用 PgPool http www pgpoo
  • pg_dump 与 pg_dumpall?使用哪一个来进行数据库备份?

    I tried pg dump然后在另一台机器上我尝试导入 sql 并填充数据库 我看到 CREATE TABLE ERROR role prod does not exist CREATE TABLE ERROR role prod do
  • postgresql 登录到另一个表时发生冲突

    我正在使用 PostgreSQL 9 5 并尝试使用批量插入每天插入数百万行 INSERT INTO tours as cst adults country id price VALUES 3 129 80 2 119 120 on con
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • 如何加速spark df.write jdbc到postgres数据库?

    我是 Spark 新手 正在尝试使用 df write 加速将数据帧的内容 可以有 200k 到 2M 行 附加到 postgres 数据库 df write format jdbc options url psql url spark d
  • PLpgSQL 函数不返回匹配的标题

    当给定文本时 我试图返回电影名称以及演员和工作人员的数量 当我输入字符串并使用 ilike 时 我的查询返回不匹配的标题 我之前创建了一个视图 其中包含要在函数中输入的电影标题和工作人员数量 我的代码是 create or replace
  • 将自动增量列添加到按日期排序的现有表中

    我在数据库中有一个名为 tickets 的现有表 其中包含以下列 id string Primary Key contains UUID like e6c49164 545a 43a1 845f 73c5163962f2 date bigi
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve

随机推荐

  • linux下C++连接mysql查询数据

    windows下使用C 43 43 连接mysql相对繁琐 xff0c 这里直接在linux下通过C 43 43 连接mysql xff0c 执行查询操作 linux下连接mysql xff0c 需要本机有libmysqlclient库文件
  • linux下C++连接redis

    linux下c 43 43 连接redis 需要安装redis 同时还需要安装hiredis xff0c hiredis是c 43 43 操作redis的api库 redis的安装这里不介绍了 xff0c 很多教程 这里直接从hiredis
  • sqlite3简单入门

    linux上一般默认是自带了sqlite3的 xff0c 所以学习sqlite3 xff0c 最好使用linux 这样可以跳过安装这一步 开始 xff0c 我们可以直接运行sqlite3 testsqlite3 db databases 可
  • linux下C++连接sqlite3

    linux下 xff0c c 43 43 连接sqlite3 xff0c 不需要额外的安装依赖库 xff0c linux自带了sqlite3 xff0c 在编译的时候 xff0c 只需要将sqlite3的库加入编译参数中即可 sqlite3
  • mongodb查询两个字段做加减乘除操作

    和使用关系型数据库一样 xff0c 我们在使用mongodb的时候 xff0c 我们希望有这样的操作 xff0c 就是查询两个字段的乘积或者和 xff0c 这就需要用到聚合查询了 xff0c 聚合查询的语法大致如下 xff1a db use
  • mongodb副本集oplogSize设置过小的问题

    mongodb副本集构建的高可用方案 xff0c 最少需要三个节点 xff0c 一个主节点master xff0c 一个从节点slave xff0c 一个选举仲裁节点arbiter 当主节点奔溃的时候 xff0c 仲裁节点选举从节点来接替主
  • mongodb开启安全认证

    默认 xff0c mongodb不开启安全认证 xff0c 通过mongo shell访问 xff0c 我们会看到mongo shell报出警告 xff1a 后面两个警告很好解决 xff1a 按照提示 xff0c 我们修改 sys kern
  • CCF-201809-3-元素选择器

    题目很长 xff0c 大家自行去官网看 第三题还是一如既往的是大模拟 xff0c 模拟css元素选择器 xff0c 有接触过前端的同学对此不陌生了吧 以前学css的时候就想过层叠样式表的实现 xff0c 但是也没细究 ccf第三题有出过ma
  • hbase shell命令行下常见操作

    hbase是基于hadoop的列簇数据库 xff0c 是nosql的一种 当我们搭建了hbase环境之后 xff0c 可以通过hbase shell命令 xff0c 进入hbase的命令行下 xff0c 可以进行创建表 xff0c 添加数据
  • redis高可用sentinel哨兵模式环境搭建

    redis高可用需要保证 xff0c 在主节点崩溃的时候 xff0c 从节点能够成为主节点 xff0c 继续提供服务 默认来说主从模式master slave就能做到这一点 xff0c 但是在实际环境中 xff0c 客户端连接的是指定的主机
  • win7笔记本电脑设置WiFi热点

    一般情况下 xff0c 我们是利用路由器设置WiFi热点 xff0c 但是如果没有路由器 xff0c 而有网线 xff0c 我们可以利用笔记本电脑来设置WiFi热点 xff0c 这里介绍如何通过笔记本电脑连接网线设置WiFi热点 笔记本电脑
  • 脚本之家上的一道题:如何通过findstr查找80和443端口记录

    一般来说 xff0c 我们都是在linux上编写bash脚本 xff0c 如果是在windows系统上 xff0c 我们就需要编写批处理脚本bat来处理相关业务逻辑 脚本之家上有这么一道题 xff1a 需要找到80 443端口的记录 xff
  • scylladb:利用java api操作scylladb数据库

    博客上全是关于scylladb的介绍和性能对比 xff0c 很少有scylladb方面的干货 xff0c 这里从scylladb官网各种文档里面整合出一个java版的例子 xff0c 例子中展示如何连接scylladb xff0c 如何加载
  • scylladb:设置监听主机IP为非默认localhost

    前面介绍了通过scylladb提供的driver xff0c 编写java代码 xff0c 然后操作scylladb数据库 但是因为scylladb默认采用的监听地址是localhost即127 0 0 1 xff0c 如果想从外部连接sc
  • mysql修改记录时update 字段=字段+字符串

    在有些场景下 xff0c 我们需要对我们的varchar类型的字段做修改 xff0c 而修改的结果为两个字段的拼接或者一个字段 43 字符串的拼接 如下所示 xff0c 我们希望将xx role表中的name修改为name 43 id 在m
  • MySQL存储过程入门

    存储过程是一种在数据库中存储复杂程序 xff0c 以便外部程序调用的一种数据库对象 存储过程是为了完成特定功能的SQL语句集 xff0c 经编译创建并保存在数据库中 xff0c 用户可以通过指定存储过程的名字并给定参数来调用执行 存储过程思
  • MySQL批量插入优化

    前面介绍了MySQL批量插入可以通过存储过程的方式来实现 xff0c 这里介绍批量插入100W记录 xff0c 并做一个优化 建表语句 xff1a create table sql drop table if exists xx user
  • MySQL数据库演示内连接左外连接右外连接的区别

    sql中join的出现解决了from tableA a tableB b where a id 61 b id连接查询做笛卡尔积的问题 xff0c 而join连接查询除了条件使用关键字on取代了where之外 xff0c 他本身的连接又分为
  • Linux基础教程: 4、用户组和用户的创建

    其实在我们安装完成一个linux的系统过程中 xff0c 会需要我们输入用户名和密码 xff0c 据我所知 xff0c 这个时候会自动创建一个用户和一个以用户名命名的用户组 xff0c 但是奇怪的就是我们这个用户并没有在这个组下面他仅仅是创
  • postgresql主从复制配置

    postgresql主从复制是一种高可用解决方案 xff0c 可以实现读写分离 postgresql主从复制是基于xlog来实现的 xff0c 主库开启日志功能 xff0c 从库根据主库xlog来完成数据的同步 主从复需要注意的地方 xff