[技术干货] Postgresql流复制配置方法

[复制链接]
乐维 发表于 2020-9-30 17:48:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
背景:在两个或多个部署了postgresql数据库上,进行配置流复制。或基于原来的流复制架构进行扩展备用节点。出现问题可进行手动切换主库
环境如下
postgresql 版本为11.7
master   172.16.1.11   主库
slave     172.16.1.12  备库
建议:数据库服务器之间配置ntp进行时间定期(加到定期任务crontab -e)同步,否则可能会导致数据异常
一、搭建master服务器主库master
1、修改 master服务器 pg_hba.conf ,添加如下
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# 表示允许任意网段的用户通过MD5进行认证连接
host    all             all             0.0.0.0/0               md5  
# 表示允许该网段172.16.1.0 的repl 用户进行流复制
host    replication     repl            172.16.1.0/0            trust
host    replication     all             ::1/128                 trust
11.png
修改master服务器 postgresqlconf 参数配置如下,  为注释
listen_addresses = '*'                       
port = 5432                                 
max_connections = 2000                        
superuser_reserved_connections = 10         
wal_level = logical                          
full_page_writes = on                        
wal_log_hints = off                          
archive_mode = on                           
archive_command = '/bin/true'
max_wal_senders = 50                        
hot_standby = on                             
log_destination = 'csvlog'                  
logging_collector = on                        
log_directory = 'log'                        
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'  
log_rotation_age = 1d                        
log_rotation_size = 10MB                    
log_statement = 'mod'                        
12.png
master服务器启动pg服务
postgres@MASTER > pg_ctl -D /data/postgresql/ start
waiting for server to start....2020-09-18 15:00:21.403 CST [9609] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2020-09-18 15:00:21.403 CST [9609] LOG:  listening on IPv6 address "::", port 5432
2020-09-18 15:00:21.405 CST [9609] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-09-18 15:00:21.412 CST [9609] LOG:  redirecting log output to logging collector process
2020-09-18 15:00:21.412 CST [9609] HINT:  Future log output will appear in directory "log".
done
server started
13.png
master服务器修改默认用户 postgres 的密码和创建用于 流复制的用户 repl
postgres=# ALTER USER postgres WITH PASSWORD 'p@ssw0rd';
ALTER ROLE
postgres=# CREATE USER  repl WITH PASSWORD 'p@ssw0rd' REPLICATION;
CREATE ROLE
postgres=# \du
                                   List of roles
Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
repl      | Replication                                                | {}
创建使用的测试数据库 pgpool 和 表 pgpool
postgres=# CREATE DATABASE pgpool ;
CREATE DATABASE
postgres=# \c pgpool
You are now connected to database "pgpool" as user "postgres".
pgpool=#
pgpool=# CREATE TABLE pgpool (id serial,age bigint,insertTime timestamp default now());
CREATE TABLE
pgpool=# insert into pgpool (age) values (1);
INSERT 0 1
pgpool=# select * from pgpool;
id | age |         inserttime
----+-----+----------------------------
  1 |   1 | 2020-09-18 15:07:03.329849
(1 row)
查看数据库是否为主库f 表示为主库
postgres=# select * from pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
14.png
至此master服务器主库搭建完毕
二、搭建slave服务器备库 slave
slave服务器创建数据库 data 目录
postgres@SLAVE:/date> mkdir postgresql
slave服务器使用 pg_basebackup 命令在线创建一个备库,使用该命令请确保 主库已经启动
postgres@SLAVE:/data/postgresql> pg_basebackup -h 172.16.1.11 -p 5432 -U repl -w -Fp -Xs -Pv -R -D /data/postgresql/
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
31133/31133 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/20000F8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed
参数说明
-h  启动的主库数据库地址               -p  主库数据库端口
-U  流复制用户                        -w  不使用密码验证
-Fp 备份输出正常的数据库目录           -Xs 使用流复制的方式进行复制
-Pv 输出复制过程的详细信息             -R  为备库创建recovery.conf文件
-D  指定创建的备库的数据库目录
slave服务器 在 recovery.conf 添加 application_name 为slave,配置如下
注:12版本以上无须此操作(且无此文件),默认使用IP做为名称
postgres@SLAVE:/data/postgresql> vim recovery.conf
standby_mode = 'on'
primary_conninfo = 'application_name=slave user=repl passfile=''/home/postgres/.pgpass'' host=172.16.1.11 port=5432 sslmode=disable sslcompression=1 target_session_attrs=any'
slave服务器修改postgresql.conf参数如下
max_connections = 2000   # 允许的最大数据库连接数
max_wal_senders = 100  # 该参数需要大于主库,否则可能导致备库无法读操作
slave服务器分配700 给数据库data目录
postgres@SLAVE:/data/postgresql> chmod 700 /data/postgresql/
slave服务器启动备库
postgres@SLAVE:/data/postgresql> pg_ctl -D /data/postgresql/ start
waiting for server to start....2020-09-18 15:20:19.966 CST [23907] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2020-09-18 15:20:19.966 CST [23907] LOG:  listening on IPv6 address "::", port 5432
2020-09-18 15:20:19.970 CST [23907] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-09-18 15:20:20.007 CST [23907] LOG:  redirecting log output to logging collector process
2020-09-18 15:20:20.007 CST [23907] HINT:  Future log output will appear in directory "log".
done
server started
slave服务器连接数据库pgpool,查看数据是否同步
postgres@SLAVE:/data/postgresql> psql -h 172.16.1.12  -p 5432 -U postgres pgpool
Password for user postgres:
psql (10.3)
Type "help" for help.
pgpool=# \dt
         List of relations
Schema |  Name  | Type  |  Owner
--------+--------+-------+----------
public | pgpool | table | postgres
(1 row)
pgpool=# select * from pgpool;
id | age |         inserttime
----+-----+----------------------------
  1 |   1 | 2020-09-18 15:07:03.329849
(1 row)
pgpool=#
参数说明
-h 备库数据库服务器地址      -p  备库数据库端口
-U 连接数据库的用户     
slave服务器查看数据库是否为备库,t 表示为备库
pgpool=# select * from pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
15.png
master服务器查看数据库的状态
postgres=# select client_addr,usename,backend_start,application_name,sync_state,sync_priority FROM pg_stat_replication;
client_addr | usename |         backend_start         | application_name | sync_state | sync_priority
-------------+---------+-------------------------------+------------------+------------+---------------
172.16.1.12 | repl    | 2020-09-18 15:20:20.066431+08 | slave           | async      |             0
(1 row)
postgres=#
参数说明
client_addr:备库服务器的地址         usename:使用的流复制用户
backend_start:流复制开始的时间       application_name:备库的名称
sync_state:备库与主库的同步状态      sync_priority:备库与主库变成同步状态的优先级
至此slave服务器备库slave搭建完毕
三、故障迁移思路
1、由于流复制为主备架构,默认只有主库才会写入数据,可通过命令把备库改为主库进行写入数据
在备库执行后,可在备库写入数据
[postgres@slave ~]#/postgresql/bin/pg_ctl promote -D /data/postgresql
思路:2台服务器配置流复制,通过pgpool或者keepalive进行VIP迁移。脚本通过测试连接VIP进入数据库,当出现无法连接时,主库把VIP关闭,备库执行上述命令,进行写入就数据,使得备库可写入数据,并启用VIP;

技术交流欢迎加入Q群:177428068





上一篇:Zabbix技术交流|Linux客户端连接oracle数据方法
下一篇:grep -oP快速筛选出weblogic实例名
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝0

帖子241

发布主题

乐维社区

微信公众号

版权所有 © 2016-2019 九一乐维丨粤ICP备17007026号