搭建PostgreSQL冗余配置(同步流复制)
我尝试使用PostgreSQL的标准功能——复制功能来构建冗余配置(主:备份=1:1)。我之前只有在AWS控制台上点击几下来进行冗余配置的经验,所以这次我要手动进行构建。不包含自动故障转移。
复制的方法
PostgreSQL的标准功能有两种复制方法:日志传送和流复制。标准复制功能没有自动故障切换功能,如果需要实现自动故障切换,需要引入构建高可用集群的中间件。
日志购物
日志传送技术(log shipping)是将有关更新的日志文件(WAL – 写前日志)传输到备份服务器,在基于WAL的基础上更新备份服务器的数据,以实现主服务器和备份服务器之间的同步。
流媒体复制
与日志传送 (log shipping) 以文件为单位将WAL传输到备机不同,流复制 (streaming replication) 则是按记录为单位进行传输。因此,流复制的同步延迟要比日志传送少。
其他
原本,PostgreSQL 总体上并没有默认实现构建冗余配置的功能。因此,在 PostgreSQL 9.0 之前,为了构建冗余配置,需要建立 HA(高可用)集群中间件,并且有许多中间件被开发出来。然而,从9.0版本开始,Replication 功能被引入。
如果您对此感兴趣,请参阅 PostgreSQL Wiki 进行了解。我认为最有名的可能是 Pgpool-II。
环境
Ubuntu 14.04
PostgreSQL 9.6
Ubuntu 14.04
PostgreSQL 9.6
程序
-
- 虚拟机的准备
-
- 主服务器(db1)的配置
- 备用服务器(db2)的配置
准备虚拟机
使用Vagrant来准备虚拟机。由于可以使用一个Vagrantfile启动多个虚拟机,非常方便。
安装PostgreSQL 9.6
将PostgreSQL安装在db1和db2这两个数据库上。
$ sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main"
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install postgresql-9.6
设置主(db1)的配置
进入db1,并切换到postgres用户。
$ vagrant ssh db1
$ sudo su - postgres
创建用于复制的用户repl_user。用户名和密码可以任意设置。
$ psql
psql (9.6.3)
Type "help" for help.
postgres=# CREATE ROLE repl_user LOGIN REPLICATION PASSWORD 'password';
我会修改pg_hba.conf文件中的设置,以确定哪个用户可以从哪个IP地址进行连接。为了安全起见,我会先备份默认设置到另一个文件中。
$ cp /etc/postgresql/9.6/main/pg_hba.conf /etc/postgresql/9.6/main/pg_hba.conf.org
$ vim /etc/postgresql/9.6/main/pg_hba.conf
请添加以下内容:
主机 复制 复制用户 192.168.50.2/32 md5
接下来,我们将对postgresql.conf进行修改。为了安全起见,我们也会提前备份一份。
$ cp /etc/postgresql/9.6/main/postgresql.conf /etc/postgresql/9.6/main/postgresql.conf.org
$ vim /etc/postgresql/9.6/main/postgresql.conf
请添加以下内容。
listen_addresses = '*'
wal_level = replica
synchronous_commit = on
max_wal_senders = 2
synchronous_standby_names = 'db2'
我之前不了解为什么需要设置「listen_addresses = ‘*’」,但由于无法从备机获取基础备份,所以我添加了这个设置。
从9.6版本开始,wal_level的设置发生了变化。archive和hot_standby选项已被移除,取而代之的是replica选项。以下是它们的用法区别。
我們將synchronous_commit設為on,以實現同步複製。每個設置如下:同步:on、記憶體同步:remote_write、非同步從屬:local、完全非同步:off。詳細信息可以在這裡找到。
max_wal_senders参数用于设置从备库到主库的最大并发连接数。通常情况下,设置为备库的数量+1。
如果要使用同期复制,需要进行synchronous_standby_names的设置。如果没有进行这个设置,将使用异步复制作为备用。在9.6之前,只能在一个备用服务器上进行同步复制,但是从9.6开始,可以在多个备用服务器上进行同步复制。
由于主机配置已完成,现在切换回vagrant用户并重新启动PostgreSQL。
$ sudo service postgresql restart
DB2的待机设置。
如果正在运行PostgreSQL,将其暂停一下。
$ sudo service postgresql stop
清空 PGDATA 并从主节点获取基本备份。
$ cd /var/lib/postgresql/9.6/main
$ rm -rf *
$ pg_basebackup -h 192.168.50.1 -p 5432 -U repl_user -D ~/9.6/main --xlog --checkpoint=fast --progress
在备份了postgresql.conf之后进行修改。
$ sudo su - postgres
$ cp /etc/postgresql/9.6/main/postgresql.conf /etc/postgresql/9.6/main/postgresql.conf.org
$ vim /etc/postgresql/9.6/main/postgresql.conf
为了启用热备用(可参考),请添加以下内容:
hot_standby = 开启
最后,创建recovery.conf文件。
$ vim /etc/postgresql/9.6/main/recovery.conf
为了将待机模式与主控制器进行协作,我们需要添加以下内容。
standby_mode = on
primary_conninfo = 'host=192.168.50.1 port=5432 user=repl_user password=password application_name=db2'
回到vagrant用户,并重新启动PostgreSQL。
$ sudo service postgresql start
确认启动
如果主数据库(db1)的状态是流式传输(streaming),就可以了。
$ psql -c "SELECT * FROM pg_stat_replication;"
让我们输入数据并进行确认。在主数据库(db1)中插入数据。
$ psql postgres -c "CREATE TABLE test_table(i int);"
CREATE TABLE
$ psql postgres -c "INSERT INTO test_table VALUES (1);"
INSERT 0 1
在准备状态(db2)下检查数据。如果有值,则表示复制成功。
$ postgres@db2:~$ psql postgres -c "SELECT * FROM test_table;"
i
---
1
(1 row)
请在这份文件中查找相应信息。
请使用这份文档作为参考。
请参阅这份文件以获取更多信息。
请参考以下文件。
-
- How to install PostgreSQL 9.6 on any Ubuntu version
-
- Postgresqlレプリケーション ストリーミングレプリケーション仕組み
- 19.5. ログ先行書き込み(WAL)
配置文件 (shè
最近设定的conf文件已经全部上传到Github上。
https://github.com/kouyaf77/postgresql-replication-sample