通过repmgr实现PostgreSQL的集群化

因為沒有太多人介紹,我很想試試看它是怎麼樣的,所以我自己嘗試操作了一下。

repmgr概览

repmgr是一个命令行工具,用于执行以下管理任务,并用作将PostgreSQL用作高可用性集群的工具。

    • スタンバイサーバの設定

 

    • スタンバイサーバの昇格

 

    • スイッチオーバ

 

    クラスタのサーバステータス

repmgr是由2ndQuadrant公司开发的,并在GitHub上发布。

使用repmgr进行PostgreSQL集群构建的步骤。

前提条件和环境建设

本次将在VirtualBox上CentOS7和PostgreSQL 9.5.2的环境下进行操作。
请先准备好安装了PostgreSQL(源代码编译版)的两台虚拟机。
※本书将省略对于PostgreSQL安装方法和SSH设置等的说明。
在后半部分,对于PostgreSQL的说明部分也会略过许多内容。

其他條件

    • localhostとクラスタリングを組む対象のノード間ではsshがパス無しで通るように設定しておく。

 

    • マスタ、スレーブ側のノードではPostgreSQLをインストール済み

 

    マスタ側ではinitdbを実行済み。

顺便提一下,本次节点中的/etc/hosts已配置如下。

192.168.1.1 neko
192.168.1.2 inu

猫:我们将继续建设为主节点,狗:作为备用节点。

2. 下载repmgr源代码。(在主服务器和备服务器上执行)

尽管PostgreSQL社区提供了RPM包的下载,但我们还是选择故意使用源代码进行构建。

可以从repmgr的官方网站或GitHub上下载源代码。

3. 构建已下载的repmgr(在主节点和备节点上执行)。

将通过tar.gz下载的文件放置在contrib目录下并进行构建。

$ tar -xvf repmgr-3.1.2.tar.gz
$ mv ~/repmgr-3.1.2 ~/postgresql-9.5.2/contrib/
$ cd ~/postgresql-9.5.2/contrib/repmgr-3.1.2
$ make
$ make install

4. 进行repmgr的设置(仅在主节点执行)

创建repmgr的配置文件.

$ vi ~/local/pg952/pgsql/etc/repmgr.conf
cluster=test
node=1
node_name=neko
conninfo='host=neko user=repmgr dbname=repmgr'
項目名説明clusterレプリケーションクラスタの任意の名前。※すべてのノードで同一である必要がありますnode識別用の個別の整数node_nameノードを識別する文字列conninfo自身のrepmgrDBに接続可能な接続情報

启动PostgreSQL

请按照以下设置进行最低必要的配置。

wal_level = 'hot_standby'
max_wal_senders = 10
wal_keep_segments = 5000
hot_standby = on
archive_mode = on
archive_command = '/bin/true'

根据我的尝试,当wal_keep_segments的值较小时,repmgr会对其发出超过5000的警告。

[2016-05-23 21:51:04] [NOTICE] destination directory '/home/ikki/local/pg952/data' provided
[2016-05-23 21:51:04] [ERROR] parameter 'wal_keep_segments' must be be set to 5000 or greater (see the '-w' option or edit the postgresql.conf of the upstream server.)
[2016-05-23 21:51:04] [HINT] in PostgreSQL 9.4 and later, replication slots can be used, which do not require 'wal_keep_segments' to be set to a high value (set parameter 'use_replication_slots' in the configuration file to enable)

repmgr是负责管理WAL文件的吗?由于本次不会进行详细调查,所以这个问题会跳过,但之后想要了解它的工作机制。

4-3. repmgr为了管理集群而创建用户和数据库。

$createuser -s repmgr
$createdb repmgr -O repmgr

进行PostgreSQL认证设置。

在pg_hba.conf中添加以下内容。

local   replication   repmgr                              trust
host    replication   repmgr      127.0.0.1/32            trust
host    replication   repmgr      192.168.1.0/24          trust

local   repmgr        repmgr                              trust
host    repmgr        repmgr      127.0.0.1/32            trust
host    repmgr        repmgr      192.168.1.0/24          trust

设置repmgr用户的搜索路径。

$ psql repmgr -c 'ALTER ROLE repmgr SET search_path TO repmgr_test, "$user", public' -U repmgr

4-6. 重新启动 PostgreSQL

使编辑过的pg_hba.conf文件生效

$ pg_ctl -D ~/local/pg952/data restart

5. 将主节点注册到repmgr(仅在主节点上执行)

在主节点上执行以下命令,将节点注册到repmgr中。

$ repmgr -f ~/local/pg952/pgsql/etc/repmgr.conf master register
[2016-05-23 21:34:18] [NOTICE] master node correctly registered for cluster test with id 1 (conninfo: host=neko user=repmgr dbname=repmgr)

您可以使用以下命令来确认已注册的信息。

$ psql repmgr -c 'SELECT * FROM repmgr_test.repl_nodes' -U repmgr -x
-[ RECORD 1 ]----+------------------------------------
id               | 1
type             | master
upstream_node_id | 
cluster          | test
name             | neko
conninfo         | host=neko user=repmgr dbname=repmgr
slot_name        | 
priority         | 100
active           | t

创建一个待机数据库(仅支持待机操作)。

$ repmgr -h neko -U repmgr -d repmgr -D ~/local/pg952/data -f ~/local/pg952/pgsql/etc/repmgr.conf standby clone
[2016-05-23 21:52:55] [NOTICE] destination directory '/home/ikki/local/pg952/data' provided
[2016-05-23 21:52:55] [NOTICE] starting backup (using pg_basebackup)...
[2016-05-23 21:52:55] [HINT] this may take some time; consider using the -c/--fast-checkpoint option
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
[2016-05-23 21:53:07] [NOTICE] standby clone (using pg_basebackup) complete
[2016-05-23 21:53:07] [NOTICE] you can now start your PostgreSQL server
[2016-05-23 21:53:07] [HINT] for example : pg_ctl -D /home/ikki/local/pg952/data start
[2016-05-23 21:53:07] [HINT] After starting the server, you need to register this standby with "repmgr standby register"

在这个阶段,将创建以下的recover.conf文件用于备用节点。

standby_mode = 'on'
primary_conninfo = 'port=5432 host=neko user=repmgr application_name=inu'
recovery_target_timeline = 'latest'

7. 启动PostgreSQL(仅在备用模式下执行)

$ pg_ctl -D ~/local/pg952/data start
$ ps -ef |grep postgres
ikki      7790     1  0 19:04 pts/0    00:00:00 /home/ikki/local/pg952/pgsql/bin/postgres -D /home/ikki/local/pg952/data
ikki      7794  7790  0 19:04 ?        00:00:00 postgres: logger process   
ikki      7795  7790  0 19:04 ?        00:00:00 postgres: startup process   recovering 00000001000000000000002D
ikki      7796  7790  2 19:04 ?        00:00:00 postgres: wal receiver process   streaming 0/2D0001A0
ikki      7797  7790  0 19:04 ?        00:00:00 postgres: checkpointer process   
ikki      7798  7790  0 19:04 ?        00:00:00 postgres: writer process   
ikki      7799  7790  0 19:04 ?        00:00:00 postgres: stats collector process   
ikki      7812  2623  0 19:04 pts/0    00:00:00 grep --color=auto postgres

查看主控统计信息视图。

$ psql -h neko repmgr -c 'SELECT * FROM pg_stat_replication' -U repmgr -x
-[ RECORD 1 ]----+------------------------------
pid              | 8732
usesysid         | 20997
usename          | repmgr
application_name | inu
client_addr      | 192.168.1.2
client_hostname  | 
client_port      | 49837
backend_start    | 2016-05-24 19:04:10.347144+09
backend_xmin     | 
state            | streaming
sent_location    | 0/2D0001A0
write_location   | 0/2D0001A0
flush_location   | 0/2D0001A0
replay_location  | 0/2D0001A0
sync_priority    | 0
sync_state       | async

将启动的待机状态注册到repmgr。

在备用服务器上执行以下命令。

$ repmgr -f ~/local/pg952/pgsql/etc/repmgr.conf standby register
[2016-05-24 19:08:40] [NOTICE] standby node correctly registered for cluster test with id 2 (conninfo: host=inu user=repmgr dbname=repmgr)

主人,您可以在备用服务器上执行以下命令来确认是否已完成注册。
这将使用repmgr创建一个集群。

$ psql repmgr -c 'SELECT * FROM repmgr_test.repl_nodes' -U repmgr
 id |  type   | upstream_node_id | cluster | name |              conninfo       
        | slot_name | priority | active 
----+---------+------------------+---------+------+-------------------------------------+-----------+----------+--------
  1 | master  |                  | test    | neko | host=neko user=repmgr dbname=repmgr |           |      100 | t
  2 | standby |                1 | test    | inu  | host=inu user=repmgr dbname=repmgr  |           |      100 | t
(2 rows)

9. 待命推广

首先,请确认准备就绪。

$ psql postgres -c "SELECT pg_is_in_recovery()"
 pg_is_in_recovery 
-------------------
 t
(1 row)

让主人下来。

$ pg_ctl -D ~/local/pg952/data stop
waiting for server to shut down..... done
server stopped

使用repmgr将备用节点提升为主节点。

$ repmgr -f ~/local/pg952/pgsql/etc/repmgr.conf standby promote
[2016-05-25 00:34:14] [ERROR] connection to database failed: could not connect to server: Connection refused
    Is the server running on host "neko" (192.168.1.1) and accepting
    TCP/IP connections on port 5432?

[2016-05-25 00:34:14] [NOTICE] promoting standby
[2016-05-25 00:34:14] [NOTICE] promoting server using 'pg_ctl -D /home/ikki/local/pg952/data promote'
server promoting
[2016-05-25 00:34:16] [NOTICE] STANDBY PROMOTE successful

确认待机已晋升为主机。

$ psql -h inu postgres -c "SELECT pg_is_in_recovery()"
 pg_is_in_recovery 
-------------------
 f
(1 row)

成功了!成功地将其晋升,没有出任何问题。

顺便说一句… shuō yī jù…)

在停止主服务器之前,试图提升它会导致错误。
它被正确地作为一个集群进行管理。

$ repmgr -f ~/local/pg952/pgsql/etc/repmgr.conf standby promote
[2016-05-25 00:29:48] [ERROR] this cluster already has an active master server

以上是我写的所有内容。
虽然写了很多,但今天就到这里吧。

注意:只有repmgr本身无法实现自动故障转移。
要实现自动故障转移,需要启动一个名为repmgrd的守护进程。
接下来会介绍repmgrd。

bannerAds