首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql 1主站多个从站故障转移

Postgresql 1主站多个从站故障转移
EN

Database Administration用户
提问于 2016-08-10 13:28:16
回答 1查看 11.3K关注 0票数 2

我的问题与以下题目中的问题相同

流复制故障转移-如何将第二个从服务器指向新的主服务器?

目前我正在使用Postgresql 9.5,我有一个主服务器和两个从服务器,在主服务器崩溃后,其中一个从服务器被指定为新的主服务器,我想要更改其他从服务器的主服务器,而不需要完全的基本备份。

我试着写了答案的步骤,但似乎不起作用,有人能指导我解决这个问题吗?

我正在写一些关于我的配置的细节,以防有帮助。

代码语言:javascript
复制
standby_mode = on
primary_conninfo = 'host=10.10.10.160 port=5432 user=repuser password=*****'
restore_command = 'cp /archivedir/%f %p'
trigger_file = '/tmp/postgresql.trigger.5432'

10.10.10.160是新主服务器的IP地址。

而且,在主服务器和从服务器中,/archivedir文件夹看起来都是空的,这正常吗?postgresql.conf中存在以下设置:

代码语言:javascript
复制
wal_level = hot_standby 
archive_mode = on
archive_command = 'test ! -f /archivedir/%f && cp %p /archivedir/%f'
max_wal_senders = 3
hot_standby = on
EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-08-12 08:01:34

我设法在德佐的帮助下解决了这个问题。

为此,我使用了级联复制。当前的体系结构类似于M -> S1 -> S2。

师父: 10.10.10.146,S1: 10.10.10.130,s2: 10:10:10:160,

首先,我使用以下命令在所有三个系统中创建了repuser。

代码语言:javascript
复制
sudo -u postgres createuser -U postgres repuser -P -c 5 --replication

它将要求您指定一个密码,键入您喜欢的内容,并创建repuser。我们将使用此用户进行与复制相关的操作。

在主服务器上,当前的配置是:

postgresql.conf

代码语言:javascript
复制
listen_addresses = 'localhost, 10,10,10,146'
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /here i wrote full directory starting from root/%f && cp %p /here i wrote full directory starting from root/%f'
max_wal_senders = 3

pg_hba.conf

代码语言:javascript
复制
# Allow replication connections
host     replication     repuser         10.10.10.130/32        md5
host     replication     repuser         10.10.10.160/32        md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

在此配置之后,重新启动主服务器。

现在,我们需要从master S1获得完全备份。首先在S1上停止postgresql服务。然后删除数据目录(我的系统的目录是var/lib/pgsql/9.5/data )。删除“运行完全备份”命令后:

代码语言:javascript
复制
sudo -u postgres pg_basebackup -h 10.10.10.146 -D /var/lib/pgsql/9.5/data -U repuser -v -P --xlog-method=stream

这将将数据文件夹复制到S1服务器。现在在postgresql.conf中打开S1,并进行以下更改

代码语言:javascript
复制
listen_addresses = 'localhost, 10,10,10,130'
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /full directory starting from root/%f && cp %p /full directory starting from root/%f'
max_wal_senders = 3
hot standby=on

打开pg_hba.conf并进行以下更改:

代码语言:javascript
复制
# Allow replication connections
host     replication     repuser         10.10.10.160/32        md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

最后,在data文件夹下创建一个recovery.conf文件。recovery.conf应该是这样的:

代码语言:javascript
复制
standby_mode=on
primary_conninfo='host=10.10.10.146 port=5432 user=repuser password=password_of_repuser'
trigger_file='/full directory starting from root/any_folder_name'

例如,如果在trigger_file = '/tmp/trigger_failover'文件中写入recovery.conf,然后在/tmp目录下创建一个名为trigger_failover的文件夹,则S1将启动故障转移进程,并开始充当主服务器。

在上述配置之后,启动S1服务器,现在M和S1应该充当主从服务器。接下来,我们需要配置S2服务器。步骤与配置S1非常相似。

首先在S2上停止postgresql服务。然后像我们在S1中所做的那样,删除数据目录。在我的示例中,S2具有与S1相同的文件夹结构,因此数据文件夹也存在于/var/lib/pgsql/9.5/数据目录中。现在运行下面的命令--这一次,我们将从S1服务器获得完全备份。

代码语言:javascript
复制
sudo -u postgres pg_basebackup -h 10.10.10.30 -D /var/lib/pgsql/9.5/data -U repuser -v -P --xlog-method=stream

不,我们将更改S2中的配置文件。在postgresql.conf中,进行以下更改:

代码语言:javascript
复制
listen_addresses = 'localhost, 10,10,10,160'
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /full directory starting from root/%f && cp %p /full directory starting from root/%f'
max_wal_senders = 3
hot standby=on

在recovery.conf中,进行以下更改:

代码语言:javascript
复制
standby_mode=on
primary_conninfo='host=10.10.10.160 port=5432 user=repuser password=password_of_repuser'
recovery_target_timeline='latest'

你就完蛋了。现在在S2中启动postgresql服务,并看到复制机制在M、S1和S2中工作。

通过这种架构:

  • 如果M下降,您可以触发S1并使其作为新的主机工作,S1将使用S2进行复制。
  • 如果S1下降,您可以轻松地将S2指向M,只需在S2中的recovery.conf文件中更改 primary_conninfo命令,就可以使用M和S2进行have复制。
  • 最后,如果S2下降,M仍将使用S1进行复制。
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/146382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档