搭建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

程序

    1. 虚拟机的准备

 

    1. 主服务器(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选项。以下是它们的用法区别。

wal_level説明minimalクラッシュまたは即時停止から回復するのに必要な情報のみ書き出します。replicaWALアーカイビングに必要なログ出力、およびスタンバイサーバ上で読み取り専用問い合わせを実行するために必要な情報を追加します。logical更にロジカルデコーディングをサポートするのに必要な情報を追加します。

我們將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

广告
将在 10 秒后关闭
bannerAds