postgresql主从java_PostgreSQL流复制-主从切换

news/2024/6/19 6:25:38 标签: postgresql主从java

主从复制

1.基于文件的日志传送

创建一个高可用性(HA)集群配置可采用连续归档,集群中主服务器工作在连续归档模式下,备服务器工作在连续恢复模式下(1台或多台可随时接管主服务器),备持续从主服务器读取WAL文件。

连续归档不需要对数据库表做任何改动,可有效降低管理开销,对主服务器的性能影响也相对较低。

直接从一个数据库服务器移动WAL记录到另一台服务器被称为日志传送,PostgreSQL通过一次一文件(WAL段)的WAL记录传输实现了基于文件的日志传送。

日志传送所需的带宽取根据主服务器的事务率而变化;

日志传送是异步的,即WAL记录是在事务提交后才被传送,那么在一个窗口期内如果主服务器发生灾难性的失效则会导致数据丢失,还没有被传送的事务将会被丢失;

数据丢失窗口可以通过使用参数archive_timeout进行限制,可以低至数秒,但同时会增加文件传送所需的带宽。

2.流复制

PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。

默认情况下流复制是异步的,这种情况下主服务器上提交一个事务与该变化在备服务器上变得可见之间客观上存在短暂的延迟,但这种延迟相比基于文件的日志传送方式依然要小得多,在备服务器的能力满足负载的前提下延迟通常低于一秒;

在流复制中,备服务器比使用基于文件的日志传送具有更小的数据丢失窗口,不需要采用archive_timeout来缩减数据丢失窗口;

将一个备服务器从基于文件日志传送转变成基于流复制的步骤是:把recovery.conf文件中的primary_conninfo设置指向主服务器;设置主服务器配置文件的listen_addresses参数与认证文件即可。

一、主从环境

1.操作系统

CentOS-7-x86_64

2.PostgresSQL版本

PostgreSQL 9.6

3.主机

主机名

IP

端口

角色

pg_master

192.168.159.150

5432

主库

pg_slave

192.168.159.151

5432

从库

二 、主库配置

三.主库配置

1. 使用postgres用户登陆数据库,创建复制用户

#需要一个账号进行主从同步

postgres=#create role replica login replication encrypted password 'replica';

2.认证文件pg_hba.conf

#配置从库可以采用replica账号进行同步

[root@psql_master ~]#vim /var/lib/pgsql/9.6/data/pg_hba.conf

host replication replica 192.168.159.0/24 md5

3.主库配置文件postgresql.conf

[root@psql_master ~]# vim /var/lib/pgsql/9.6/data/postgresql.conf

listen_addresses = '*'

max_connections = 1000

wal_level = replica

max_wal_senders = 1

wal_keep_segments = 64

archive_mode = on

archive_command = 'cp %p /var/lib/pgsql/pg_archive/%f'

wal_log_hints = on

full_page_writes = on

hot_standby = on

4.创建pg_archive目录

mkdir -p /var/lib/pgsql/pg_archive

chown -R postgres:postgres  /var/lib/pgsql/pg_archive

5.配置.pgpass

su - postgres

vim ~/.pgpass

192.168.159.150:5432:replication:replica:replica

192.168.159.151:5432:replication:replica:replica

6.配置recovery文件(主库recovery.done,从库recovery.conf)

vim /var/lib/pgsql/9.6/data/recovery.done

standby_mode = on

primary_conninfo = 'host=192.168.159.151 port=5432 user=replica password=replica'

recovery_target_timeline = 'latest'

7.权限变更

chown -R postgres:postgres /var/lib/pgsql/9.6/data/

8.重启服务

#同时注意打开防火墙端口打开

[root@psql_master ~]# systemctl restart postgresql-9.6

三、从库配置

先清空data目录(默认/var/lib/pgsql/9.6/data)

cd /var/lib/pgsql/9.6/data

rm -fr *

1.基础备份(主库需索表,只读不能写)

[root@pg_slave ~]# pg_basebackup -h 192.168.159.150 -p 5432 -U replica -F p -P -D /var/lib/pgsql/9.6/data/

#-h,主库主机,-p,主库服务端口;

#-U,复制用户;

#-F,p是默认输出格式,输出数据目录和表空间相同的布局,t表示tar格式输出;

#-P,同--progress,显示进度;

#-D,输出到指定目录;

#因为主库采用的是md5认证,这里需要密码认证。

2.备份目录权限

#基于root账号做的基础备份,需要将相关目录文件的权限变更

[root@pg_slave ~]# chown -R postgres:postgres /var/lib/pgsql/9.6/data/

3.修改recovery文件

mv recovery.done recovery.conf

vim recovery.conf

standby_mode = on

primary_conninfo = 'host=192.168.159.150 port=5432 user=replica password=replica'

recovery_target_timeline = 'latest'

4.创建pg_archive目录

mkdir -p /var/lib/pgsql/pg_archive

chown -R postgres:postgres  /var/lib/pgsql/pg_archive

5.配置.pgpass

su - postgres

vim ~/.pgpass

192.168.159.150:5432:replication:replica:replica

192.168.159.151:5432:replication:replica:replica

6.启动服务

systemctl start postgresql-9.6

四、验证主从

1.查看进程

1.1主库sender进程

d778f291081245bcdca5b0441203163e.png

1.2从库receive进程

b4c0e9f910b0bbbcf7673ebeed39ae5e.png

2.在主库上查看复制状态

postgres=# \x

postgres=# select * from pg_stat_replication;

#pid,sender进程;

#usesysid,复制用户id;

#usename,复制用户名;

#application_name,复制进程名;

#client_addr,从库客户端地址;

#client_hostname,从库客户端名;

#client_port,从库客户端port;

#backend_start,主从复制开始时间;

#backend_xmin,当前后端的xmin范围,由备机提供;

#state,同步状态,startup:连接中;catchup:同步中;streaming:同步; #sent_location,主传送wal的位置;

#write_location,从接收wal的位置;

#flush_location,从刷盘的wal位置;

#replay_location,从同步到数据库的wal位置;

#sync_priority,同步优先级,0表示异步;1~?表示同步,数字越小优先级越高; #sync_state, async:异步;sync:同步;potential;当前是异步,但可能升级到同步模式;

#另外,”select pg_is_in_recovery();“命令也可以查看主从状态,false是主,true为从。


http://www.niftyadmin.cn/n/1427312.html

相关文章

IO介绍与File

1、流 1.1、基本概念 1.2、流分类 2、File(文件和文件夹) 2.1、分隔符 public class IOTEST01 {public static void main(String[] args) {/*** \ / 名称分隔符 separator*/String path "F:\\My_Project\\Java基础练习\\src\\2019总结.png&quo…

01Java基础模块面试题

文章目录JAVA基础模块1、JDK与JRE的区别2、和equals的区别3、hashCode()与equals()的关系4、final的作用5、Java中的Math.round(-1.5)等于多少6、String属于基本数据类型吗7、Java中的字符串都有哪些类?他们之间有什么区别8、String str "a"与String str …

第一章网络基础知识

1、网络基础知识 1.1计算机网络出现的背景 起初,计算机以单机模式被广泛使用(这种方式也叫独立模式)。然而随着计算机的不断发展,人们已不再局限于单机模式,而是将一个个计算机连接在一起,形成一个计算机网…

转载MySql中的锁

MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)

02Java容器模块面试题

1、Java容器有哪些 Java容器分别为Collection和Map两大类,其下右分为很多子类 2、Collection和Collections有什么区别 Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、S…

防sql注入电子商务java_java防止sql注入

public final static String filterSQLInjection(String s) {if (s null || "".equals(s)) {return "";}try {s s.trim().replaceAll("?[s,S][c,C][r,R][i,I][p,P][t,T]>?", "");//scripts s.trim().replaceAll("[a,A][l…

数据库中的行锁和表锁

1、MyISAM表锁 MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎&am…

java 监听在线人数_2016.10.12日--利用servlet监听器实现用户在线人数统计

servlet中监听器主要的监听对象有三个:ServletContext HttpSession ServletRequest.分别可以监听三个对象的创建 销毁,以及属性的更改。实现监听在线人数:在开始实现功能之前首先创建一个用户模型,为了区别每个用户,我…