Postgresql实现主从复制
young / / / 阅读量

前言

下面是基于Standby的异步流复制主从的实现方式的记录

流复制(streaming replication)这是PostgreSQL9.x版本之后提供的一个功能

Standby数据库原理

在postgresql中提供读写全功能的服务器称为primary database或master database,在接收主库同步数据的同时又能提供读服务的从库服务器称为hot standby server。

PostgreSQL在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。而把WAL日志传送到另一台服务器有两种方式,分别是:

WAL日志归档(base-file)

流复制(streaming replication)

第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,简言之就是通过cp命令实现远程备份,这样通常备库会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低的同步延迟,所以我们肯定也会选择流复制的方式。

在实际操作之前还有一点需要说明就是standby的搭建中最关键的一步——在standby中生成master的基础备份。postgresql9.1之后提供了一个很方便的工具—— pg_basebackup,关于它的详细介绍和参数说明可以在官网中查看( https://www.postgresql.org/docs/current/app-pgbasebackup.html)

详细配置

主机信息

10.196.11.138 pgsql_master pgsql-10.5.1 centos6.10
10.196.11.139 pg_sql_standby pgsql-10.5.1 centos6.10

pgsql_master

安装

10.196.11.138安装 postgresql

需要初始化并创建一个super权限的用户,账号 amtdb 密码 GlnR_V2917

配置文件

pg_hba.conf 增加以下配置

# 允许从数据库连接主数据库去拖wal日志数据
host replication repl 10.196.11.139/32 md5
# 允许内网网段连接
host    all             all             10.196.11.0/24            md5

postgresql.conf

# 监听在 *
listen_addresses = '*'
# 决定有多少内存可以被PostgreSQL用于缓存数据(推荐内存的1/4)
shared_buffers=4096MB
# 使内部排序和一些复杂的查询都在这个buffer中完成
work_mem=1MB
# 这个是设置主为wal的主机
wal_level = hot_standby
# 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
max_wal_senders = 24 
# 设置流复制保留的WAL日志个数 单个16M
wal_keep_segments = 256 
# 设置流复制主机发送数据的超时时间
wal_sender_timeout = 60s 
# 这个设置要注意下,从库的max_connections必须要大于主库的
max_connections = 1000 

# 以下为默认
dynamic_shared_memory_type = posix  # the default is the first option
log_timezone = 'PRC'
datestyle = 'iso, mdy'
timezone = 'PRC'
lc_messages = 'en_US.UTF-8'         # locale for system error message
lc_monetary = 'en_US.UTF-8'         # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'          # locale for number formatting
lc_time = 'en_US.UTF-8'             # locale for time formatting
default_text_search_config = 'pg_catalog.english'

启动

 /web/soft/pgsql/bin/pg_ctl -D /web/data/pgsql_data -l /web/soft/pgsql/logs/logs.out start

pgsql-slave

安装

10.196.11.139安装 postgresql

从库安装完成后,不初始化,若已经初始化,删除其data目录

执行以下命令将主数据库的数据同步过来。

./bin/pg_basebackup -D /web/data/pgsql_data -F p -X stream -v -P -R -h 10.196.11.138 -p 5432 -U amtdb

下面简单做一下参数说明(可以通过pg_basebackup –help进行查看)

-h指定连接的数据库的主机名或IP地址,这里就是主库的ip。
-U指定连接的用户名,此处是我们刚才创建的专门负责流复制的repl用户。-F指定了输出的格式,支持p(原样输出)或者t(tar格式输出)。
-X表示备份开始后,启动另一个流复制连接从主库接收WAL日志。
-P表示允许在备份过程中实时的打印备份的进度。
-R表示会在备份结束后自动生成recovery.conf文件,这样也就避免了手动创建。
-D指定把备份写到哪个目录,这里尤其要注意一点就是做基础备份之前从库的数据目录(/web/data/pgsql_data)目录需要手动清空。

运行命令后看到如下进度提示就说明生成基础备份成功:

Password: 
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
24439/24439 kB (100%), 1/1 tablespace                                         
pg_basebackup: write-ahead log end point: 0/2000130
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed

配置文件

pg_hba.conf 增加以下配置

# 允许内网网段连接
host    all             all             10.196.11.0/24            md5

postgresql.conf

在基础备份时,初始化文件是从主库复制来的,所以配置文件一致,注释掉

wal_level
max_wal_senders
wal_keep_segments
wal_sender_timeout

打开如下参数:

#在备份的同时允许查询
hot_standby = on   
#可选,流复制最大延迟
max_standby_streaming_delay = 30s 
#可选,从向主报告状态的最大间隔时间
wal_receiver_status_interval = 10s 
#可选,查询冲突时向主反馈
hot_standby_feedback = on
#默认参数,非主从配置相关参数,表示到数据库的连接数,一般从库做主要的读服务时,设置值需要高于主库
max_connections = 1000 

recovery.conf

创建恢复文件recovery.conf,在执行pg_basebackup的时候指定-R 参数,自动创建

启动

 /web/soft/pgsql/bin/pg_ctl -D /web/data/pgsql_data -l /web/soft/pgsql/logs/logs.out start

检查主从复制是否有效

修改配置后需分别重启主从数据库,重启成功后使用命令查看进程情况

# 分别查看主从数据库是否有包含wal sender/receiver process
ps -ef | grep postgres

查询主从状态

select pg_is_in_recovery();
# f为主 t为从

最后在主库中进行数据操作,查看对应的从库是否有数据变化

支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章