PostgreSQL建立Hot Standby的Replication机制

栏目: 数据库 · 发布时间: 6年前

内容简介:PostgreSQL的Replication机制,大概有三种。这里用的是第一种。Ubuntu 16.04上,PostgreSQL版本为9.5,配置文件的目录为

PostgreSQL的Replication机制,大概有三种。

类型 用户 优点
Simply streaming replication On-prem, Manual EC2 简单设置;I/O性能高;存储量大
Replicated block device RDS, Azure Postgres 数据在云环境的耐久度高
Reconstruct from WAL
(and switch to streaming replication)replicationHeroku
Heroku Citus Cloud 节点自动重启;允许fork和点恢复

这里用的是第一种。

安装PostgreSQL

sudo apt install postgresql

Ubuntu 16.04上,PostgreSQL版本为9.5,配置文件的目录为 /etc/postgresql/9.5/main/ 。 以下的配置文件都在此目录下。

当然,用 Docker 来部署也是更灵活的,需要去 library/postgres - Docker Hub 寻找合适的镜像。 配置文件的位置,可以在运行时指定。

master机

先去创建一个同步专用账户 repl

$ sudo su - postgres
$ psql
postgres=# create user repl replication password '******';

然后修改两个配置文件。 其一是 postgresql.conf

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -
listen_addresses = '*'                  # what IP address(es) to listen on;
port = 5432                             # (change requires restart)
max_connections = 10000                 # (change requires restart)

#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------

# - Settings -
wal_level = hot_standby                 # minimal, archive, hot_standby, or logical
synchronous_commit = local              # synchronization level;

#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------

# - Sending Server(s) -
max_wal_senders = 32            # max number of walsender processes
wal_keep_segments = 64          # in logfile segments, 16MB each; 0 disables

# - Master Server -
synchronous_standby_names = 'pg_standby'        # standby servers that provide sync rep
hot_standby = on                        # "on" allows queries during recovery

以上配置仅是和热备份相关的片段。 其中, 'pg_standby' 需要在 /etc/hosts 中配置为slave的IP。

其二是 pg_hba.conf 文件:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     repl        0.0.0.0/0        md5

最后一行就是允许 repl 的访问连接。

完成修改后,重启服务。

sudo systemctl restart postgresql.service

slave机

修改前,先停止服务。

sudo systemctl stop postgresql.service

先做首次备份(需要输入前面 repl 用户的密码):

rm -rf /var/lib/postgresql/9.5/main/
pg_basebackup -h pg_master -U repl -p 5432 -F p -P -x -R -D /var/lib/postgresql/9.5/main/ -l 20180907

然后修改一个配置, postgresql.conf

listen_addresses = 'localhost,pg_master'
port = 5432
max_connections = 10000
wal_level = hot_standby
max_wal_senders = 8
wal_keep_segments = 16
hot_standby = on

最后新增一个配置, recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=pg_master port=5432 user=repl password=******** sslmode=disable sslcompression=1 application_name=pg_standby'
recovery_target_timeline = 'latest'

完成修改后,启动服务。

sudo systemctl start postgresql.service

测试

在master上建表:

$ sudo su - postgres
$ psql
postgres=# create database test;
CREATE DATABASE

然后,在slave上查看结果:

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)

一些问题

端口

如果在配置时修改了默认端口 5432 ,比如改成 65432 , 则需要在 pg_basebackup 同步时添加 -p 65432 参数,否则备份失败。 也需要在所有使用的地方注意,否则会找不到数据库服务。

一个错误

FATAL:  hot standby is not possible because max_connections = 100 is a lower setting than on the master server (its value was 10000)

以上是导致slave的PostgreSQL起不来的一个原因。 在 postgresql.conf 中, max_connections 不应该小于master。 由于master设为 10000 ,这里至少需要设为 10000

一个警告

postgres=# create database test;
^CCancel request sent
WARNING:  canceling wait for synchronous replication due to user request
DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.

执行写操作时,总是无法返回; Ctrl + c 取消后,又收到警告。 而slave上,明明已经同步完成。

可以通过配置 postgresql.conf ,修改一行解决。

synchronous_commit = local                # synchronization level;

这表示每次commit设置为仅保证本地完成,不等待远程同步。 这相当于在 CAP 中取 AP ,比较适合当前的使用场景。

参考


以上所述就是小编给大家介绍的《PostgreSQL建立Hot Standby的Replication机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精益创业方法论

精益创业方法论

龚焱 / 机械工业出版社 / 2015-3 / 69.00元

为什么无数新创企业以失败告终? 为什么天才点子、完美计划和完美的执行是导致失败的关键? 颠覆性、创造性、混乱状况是否可以加以管理? Facebook在6年间以病毒一样惊人的速度传播,微信短短两年获得了6亿用户,这些公司都遵循着一套科学、严密的创业流程和工业方法,这种方法教你认清自以为是的假象,让你在亚马逊丛林的迷雾探险时成功找到水源,一切不是未来时,而是现在时,再砰然心动的点子、......一起来看看 《精益创业方法论》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试