主机 | 操作系统 | IP | 数据库 | 角色 | 同步方式 |
pg01 | CentOS7.7 | 192.168.137.200 | PostgreSQL10.10 | 主 | - |
pg02 | CentOS7.7 | 192.168.137.201 | PostgreSQL10.10 | 从 | 同步 |
pg03 | CentOS7.7 | 192.168.137.202 | PostgreSQL10.10 | 从 | 异步 |
所有主机已安装好PostgreSQL数据库软件。
初始化数据库
initdb -D $PGDATA -E UTF8 --locale=C -U postgres –W |
日志:
The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "C". The default text search configuration will be set to "english". Data page checksums are disabled. Enter new superuser password: Enter it again: creating directory /pgsql/pgsql/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default timezone ... Asia/Shanghai selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: pg_ctl -D /pgsql/pgsql/data -l logfile start |
vi $PGDATA/postgresql.conf listen_addresses = * # 监听所有ip port = 5432 # 监听端口 wal_level = replica # 该级别支持wal归档和复制 max_wal_senders = 10 # 并发的从库数量, 发送 wal 进程数 wal_keep_segments = 256 # 默认是0,代表主库wal日志文件保存的个数, # 可以防止主库生成日志太快而被覆盖的情况发生 wal_sender_timeout = 60s # 流复制超时时间, 发送 wal 日志超时时间 max_connections = 100 # 最大连接数 hot_standby = on # 设置为备库时是否支持可读 archive_mode = on # 开启归档模式 archive_command = cp %p $PGDATA/pg_archive/%f # 归档动作 synchronous_standby_names = pg02 # 指定备库 pg02 为同步流复制 vi $PGDATA/pg_hba.conf host replication repl 192.168.137.0/24 md5 |
创建归档目录
mkdir$PGDATA/pg_archive
pg_ctl -D $PGDATA -l $PGDATA/logfile start waiting for server to start.... done server started |
查看日志
cat$PGDATA/logfile
查看进程
ps-ef | grep postgres
psql CREATE ROLE repl LOGIN REPLICATION PASSWORD Yike_repl; |
发现命令hang住
Ctrl+C
取消后发现报错如下
因为配置文件里指定了pg02为同步流复制,但是pg02还不可用,所以报错。
虽然取消了,但是用户已经创建成功。
vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass |
复制主库
pg_basebackup -h 192.168.137.200 -p 5432 -U repl -F p -P -X s -R -D $PGDATA Password: |
配置recovery.conf
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.200 port=5432 user=repl application_name=pg02 recovery_target_timeline = latest |
配置postgresql.conf
vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 |
配置密码文件
vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass |
启动pg02备库
pg_ctl -D $PGDATA -l $PGDATA/logfile start |
主库查询:
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
从库已经成功连接到主库,同步方式为sync
主库创建测试表,发现不会再hang住了
从库查看t1表
步骤同3.1相同
pg_basebackup -h 192.168.137.200 -p 5432 -U repl -F p -P -X s -R -D $PGDATA Password: 122783/122783 kB (100%), 1/1 tablespace vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.200 port=5432 user=repl application_name=pg03 recovery_target_timeline = latest vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass pg_ctl -D $PGDATA -l $PGDATA/logfile start psql dt t1 |
主库查询发现两个从库都已连接到主库
PostgreSQL是通过PGDATA目录下的recovery.conf文件确定主从角色的,启动时如果存在该文件,则会以从库角色启动,不存在则以主库角色启动。主从切换后,新从库的recovery.conf文件会自动重命名为recovery.done。
pg_controldata $PGDATA | grep state |
pg01:
pg02:
pg03:
当前pg01 为主库,pg02、pg03为从库
pg01执行
pg_ctl -D $PGDATA stop waiting for server to shut down..... done server stopped |
此时从库日志报错
pg02执行
pg_ctl -D $PGDATA promote pg_controldata $PGDATA | grep state |
角色已切换从主库
recovery文件已自动重命名
修改recovery文件
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.201 port=5432 user=repl application_name=pg03 recovery_target_timeline = latest |
重启数据库
pg_ctl -D $PGDATA -l $PGDATA/logfile restart |
日志不再报错
pg02执行:
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
pg03已经连接到新主库
修改原主库参数
vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 |
编辑recover文件
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.201 port=5432 user=repl application_name=pg01 recovery_target_timeline = latest |
修改新库参数
vi $PGDATA/postgresql.conf synchronous_standby_names = pg01 pg_ctl –D $PGDATA reload |
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
主库查询发现两个从库都已连接到主库
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130106.html
摘要:编辑器编辑器背景编辑器前段时间遇到一个线上问题,后来排查好久发现是因为主从同步延迟导致的,所以今天写一篇文章总结一下这个问题希望对你有用。编辑器几句唠叨编辑器大家好,我是小饭,一枚后端工程师。背景前段时间遇到一个线上问题,后来排查好久发现是因为主从同步延迟导致的,所以今天写一篇文章总结一下这个问题希望对你有用。如果觉得还不错,记得加个关注点个赞哦思维导图思维导图常见的主从架构随着日益增长的访...
摘要:收到后则会调用指令一个子进程来持久化存储的数据,在的持久化的这个短短期间内,的指令则存储到内存中。经过官网的测试性能结果达到的。 HotFrameLearning Redis_01_简介 - 一、大致介绍 1、介绍Redis之前,我有一堆的疑问,Redis是什么?有什么用?它能干什么?有什么特性?能解决我们日常的哪些问题? 为什么要用Redis?Redis好在哪里?除了Redis...
摘要:前言许多数据库支持数据库复制来获得更好的数据库可用性,以及更快的服务器响应时间,减少数据库的压力。通过数据库复制功能,数据从所谓的主服务器被复制到从服务器。 前言 许多数据库支持数据库复制来获得更好的数据库可用性,以及更快的服务器响应时间,减少数据库的压力。通过数据库复制功能,数据从所谓的主服务器被复制到从服务器。主服务器做增删改,而从服务器做查询。 读写分离前提条件:linux数据库...
阅读 1247·2023-01-11 13:20
阅读 1555·2023-01-11 13:20
阅读 1008·2023-01-11 13:20
阅读 1676·2023-01-11 13:20
阅读 3968·2023-01-11 13:20
阅读 2510·2023-01-11 13:20
阅读 1305·2023-01-11 13:20
阅读 3474·2023-01-11 13:20