通过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'
启动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。