资讯专栏INFORMATION COLUMN

PostgreSQL10 一主多从 安装实践

IT那活儿 / 1001人阅读
PostgreSQL10 一主多从 安装实践
[
1、环境
]

主机

操作系统

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数据库软件。


[
2、主从配置
]


2.1、主节点配置

初始化数据库

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


2.2、修改配置文件

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


2.3、启动数据库

pg_ctl -D $PGDATA -l $PGDATA/logfile start

waiting for server to start.... done

server started


查看日志

cat$PGDATA/logfile


查看进程

ps-ef | grep postgres


2.4、创建复制账户

psql

CREATE ROLE repl LOGIN REPLICATION PASSWORD Yike_repl;


发现命令hang住

Ctrl+C

取消后发现报错如下

因为配置文件里指定了pg02为同步流复制,但是pg02还不可用,所以报错。


虽然取消了,但是用户已经创建成功。


2.5、配置密码文件


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



[
3、从库配置
]


3.1、配置pg02从库(同步)

复制主库

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.2、配置pg03从库(异步)

步骤同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


主库查询发现两个从库都已连接到主库


[
4、主从切换
]


PostgreSQL是通过PGDATA目录下的recovery.conf文件确定主从角色的,启动时如果存在该文件,则会以从库角色启动,不存在则以主库角色启动。主从切换后,新从库的recovery.conf文件会自动重命名为recovery.done。


4.1、角色确认

pg_controldata $PGDATA | grep state


pg01:


pg02:


pg03:


当前pg01 为主库,pg02、pg03为从库


4.2、模拟主库故障

pg01执行

pg_ctl -D $PGDATA stop

waiting for server to shut down..... done

server stopped


此时从库日志报错



4.3、提升pg02为主库

pg02执行

pg_ctl -D $PGDATA promote


pg_controldata $PGDATA | grep state


角色已切换从主库

recovery文件已自动重命名


4.4、pg03指向新主库

修改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已经连接到新主库


4.5、原主库重建为从库(同步)

修改原主库参数

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

相关文章

  • 面试官:咱们来聊一聊mysql主从延迟

    摘要:编辑器编辑器背景编辑器前段时间遇到一个线上问题,后来排查好久发现是因为主从同步延迟导致的,所以今天写一篇文章总结一下这个问题希望对你有用。编辑器几句唠叨编辑器大家好,我是小饭,一枚后端工程师。背景前段时间遇到一个线上问题,后来排查好久发现是因为主从同步延迟导致的,所以今天写一篇文章总结一下这个问题希望对你有用。如果觉得还不错,记得加个关注点个赞哦思维导图思维导图常见的主从架构随着日益增长的访...

    EasonTyler 评论0 收藏0
  • HotFrameLearning Redis_01_简介

    摘要:收到后则会调用指令一个子进程来持久化存储的数据,在的持久化的这个短短期间内,的指令则存储到内存中。经过官网的测试性能结果达到的。 HotFrameLearning Redis_01_简介 - 一、大致介绍 1、介绍Redis之前,我有一堆的疑问,Redis是什么?有什么用?它能干什么?有什么特性?能解决我们日常的哪些问题? 为什么要用Redis?Redis好在哪里?除了Redis...

    focusj 评论0 收藏0
  • Yii2 数据库复制和读写分离

    摘要:前言许多数据库支持数据库复制来获得更好的数据库可用性,以及更快的服务器响应时间,减少数据库的压力。通过数据库复制功能,数据从所谓的主服务器被复制到从服务器。 前言 许多数据库支持数据库复制来获得更好的数据库可用性,以及更快的服务器响应时间,减少数据库的压力。通过数据库复制功能,数据从所谓的主服务器被复制到从服务器。主服务器做增删改,而从服务器做查询。 读写分离前提条件:linux数据库...

    William_Sang 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<