内容简介: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机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 如何用前端防御XSS及建立XSS报警机制(三)
- 如何建立 React 專案 ?
- 建立一个JavaScript库
- pid建立模型
- 2 - 建立 Django 博客应用
- 2 - 建立 Django 博客应用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Machine Learning
Kevin Murphy / The MIT Press / 2012-9-18 / USD 90.00
Today's Web-enabled deluge of electronic data calls for automated methods of data analysis. Machine learning provides these, developing methods that can automatically detect patterns in data and then ......一起来看看 《Machine Learning》 这本书的介绍吧!