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机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

腾讯之道

腾讯之道

艾永亮、刘官华、梁璐 / 机械工业出版社 / 2016-7-19 / 59

放眼整个中国乃至全球,腾讯都是一家成功的互联网企业,它代表中国企业在世界互联网版图中竖起了一面高高的旗帜。腾讯为何能取得如此大的成就,它的成功方法和商业逻辑是什么?你是不是和无数中国企业和商界人士一样,都想向腾讯取取经,但是又不得其门而入? 腾讯一直以低调、务实著称,所 以腾讯及其内部员工都极少对外界分享他们的经验;加之腾讯的商业模式多元、业务繁多且交叉、体量又极其庞大,使得从外部来系统研究......一起来看看 《腾讯之道》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具