使用两个不同的服务器流式复制 Postgresql 9.3

use*_*299 6 postgresql postgresql-9.3

主服务器中的设置:

max_wal_senders = 1
wal_level = '存档'
归档模式 = 开
存档命令 = 'cd .'
wal_keep_segments = 10000

从服务器中的设置:在 recovery.conf 文件中:

待机模式 = '开'
primary_conninfo = 'host=ipaddress of master user=repuser'
trigger_file = '/tmp/postgresql.trigger.5432'

log_connections=on 在主服务器和从服务器上都设置

在主服务器的 pg_hba.conf 文件中为复制用户创建条目

主机复制 repuser ipaddress/32 信任

尝试复制时出现以下错误

2014-07-14 19:28:22 IST LOG:数据库系统在 2014-07-14 19:28:21 IST 的恢复中关闭
2014-07-14 19:28:22 IST 日志:进入待机模式
2014-07-14 19:28:22 IST 警告:WAL 是用 wal_level=minimal 生成的,数据可能丢失
2014-07-14 19:28:22 IST 提示:如果您临时设置 wal_level=min imal 而不进行新的基本备份,则会发生这种情况。
2014-07-14 19:28:22 IST 日志:在 0/19FFE28 达到一致恢复状态
2014-07-14 19:28:22 IST 日志:0/19FFE28 处长度为零的记录
2014-07-14 19:28:22 IST 致命:主数据库和备用数据库系统标识符不同
2014-07-14 19:28:22 IST 详细信息:主要的标识符是 6022019027749040119 ,备用的标识符是 6033562405193904122。
2014-07-14 19:28:23 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:23 IST 致命:数据库系统正在启动
2014-07-14 19:28:24 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:24 IST 致命:数据库系统正在启动
2014-07-14 19:28:25 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:25 IST 致命:数据库系统正在启动
2014-07-14 19:28:26 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:26 IST 致命:数据库系统正在启动
2014-07-14 19:28:27 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:27 IST 致命:数据库系统正在启动
“postgresql-2014-07-14_192822.log”6630L,756429C
2014-07-14 19:28:22 IST LOG:数据库系统在 2014-07-14 19:28:21 IST 的恢复中关闭
2014-07-14 19:28:22 IST 日志:进入待机模式
2014-07-14 19:28:22 IST 警告:WAL 是用 wal_level=minimal 生成的,数据可能丢失
2014-07-14 19:28:22 IST 提示:如果您临时设置 wal_level=minimal 而没有进行新的基本备份,则会发生这种情况。
2014-07-14 19:28:22 IST 日志:在 0/19FFE28 达到一致恢复状态
2014-07-14 19:28:22 IST 日志:0/19FFE28 处长度为零的记录
2014-07-14 19:28:22 IST 致命:主数据库和备用数据库系统标识符不同
2014-07-14 19:28:22 IST 详细信息:主要的标识符是 6022019027749040119,备用的标识符是 6033562405193904122。
2014-07-14 19:28:23 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:23 IST 致命:数据库系统正在启动
2014-07-14 19:28:24 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:24 IST 致命:数据库系统正在启动
2014-07-14 19:28:25 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:25 IST 致命:数据库系统正在启动
2014-07-14 19:28:26 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:26 IST 致命:数据库系统正在启动
2014-07-14 19:28:27 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:27 IST 致命:数据库系统正在启动
2014-07-14 19:28:28 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:28 IST 致命:数据库系统正在启动
2014-07-14 19:28:29 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:29 IST 致命:数据库系统正在启动
2014-07-14 19:28:30 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:30 IST 致命:数据库系统正在启动
2014-07-14 19:28:31 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:31 IST 致命:数据库系统正在启动
2014-07-14 19:28:32 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:32 IST 致命:数据库系统正在启动
2014-07-14 19:28:33 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:33 IST 致命:数据库系统正在启动
2014-07-14 19:28:34 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:34 IST 致命:数据库系统正在启动
2014-07-14 19:28:35 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:35 IST 致命:数据库系统正在启动
2014-07-14 19:28:36 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:36 IST 致命:数据库系统正在启动
2014-07-14 19:28:37 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:37 IST 致命:数据库系统正在启动
2014-07-14 19:28:37 IST 致命:主数据库和备用数据库系统标识符不同
2014-07-14 19:28:37 IST 详细信息:主要的标识符是 6022019027749040119,备用的标识符是 6033562405193904122。
2014-07-14 19:28:38 IST 日志:收到连接:主机=[本地]
2014-07-14 19:28:38 IST 致命:数据库系统正在启动
2014-07-14 19:28:39 IST 日志:收到连接:主机=[本地]

IST FATAL:主备数据库系统标识符不同
2014-07-14 19:28:37 IST 详细信息:主要的标识符是 6022019027749040119,备用的标识符是 6033562405193904122。

这些线是什么意思?

当我运行此命令时

service postgresql-9.3 start
Run Code Online (Sandbox Code Playgroud)

我在 startup.log 文件中收到以下错误

2014-07-15 11:25:59 IST 致命:锁定文件“postmaster.pid”已经存在
2014-07-15 11:25:59 IST 提示:另一个 postmaster (PID 25961) 是否在数据目录“/opt/postgres/PostgreSQL/9.3/data”中运行?

扩展问题

我们是 Postgresql 开源的新手。我们无法理解这个问题的答案。如果可能,请简要说明。我们遵循了“Postgresql 9 Administration Cook book”一书中的说明。我们遵循了本书中的这些步骤。

执行以下步骤:

  1. 确定您的主节点和备用节点,并确保它们已根据最佳实践配方进行配置。

  2. 配置复制安全。在 Master 节点上创建或确认复制用户的存在

    CREATE USER repuser 
    SUPERUSER 
    LOGIN 
    CONNECTION LIMIT 1 
    ENCRYPTED PASSWORD 'changeme'; 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 允许复制用户进行身份验证。以下示例允许使用加密密码验证从任何 ip 地址访问;您可能希望考虑更多限制性选项。添加以下行:

    host replication repuser 127.0.0.1/0 md5 
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 master 和 Standby 上的 postgresql.conf 中设置日志记录选项,以便您获得有关复制连接尝试和相关失败的更多信息。

    log_connections = on
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在 Master in 上设置 max_wal_senders postgresql.conf,如果值已经非零则增加。

    max_wal_senders = 1 
    wal_mode = 'archive' 
    archive_mode = on 
    archive_command = 'cd .' 
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在 postgresql.conf 中调整 Master 上的 wal_keep_segments。将此值设置为不高于挂载 pg_xlog 目录的驱动器上的可用空间量除以 16MB 的值。如果 pg_xlog 未安装在单独的驱动器上,则不要假设所有当前可用空间都可用于事务日志文件。

    wal_keep_segments = 10000 # e.g. 160 GB 
    
    Run Code Online (Sandbox Code Playgroud)
  7. 如果需要,调整热备参数(见后面的配方)

  8. 进行基本备份,非常类似于备份一章中描述的进行物理备份的过程。

    一种。开始备份

        psql -c "select pg_start_backup('base backup for streaming rep')" 
    
    Run Code Online (Sandbox Code Playgroud)

    湾 复制数据文件(不包括 pg_xlog 目录)

        rsync -cva --inplace --exclude=*pg_xlog* \ 
        ${PGDATA}/ $STANDBYNODE:$PGDATA 
    
    Run Code Online (Sandbox Code Playgroud)

    C。停止备份

       psql -c "select pg_stop_backup(), current_timestamp" 
    
    Run Code Online (Sandbox Code Playgroud)
  9. recovery.conf在 Standby 上设置参数。请注意,primary_conninfo 不能指定数据库名称,但可以包含任何其他 PostgreSQL 连接选项。还要注意 recovery.conf 中的所有选项都用引号括起来,而 postgresql.conf 参数不需要。

    Standby_mode = 'on' 
    primary_conninfo = 'host=192.168.0.1 user=repuser' 
    trigger_file = '/tmp/postgresql.trigger.5432' 
    
    Run Code Online (Sandbox Code Playgroud)
  10. 启动备用服务器

  11. 仔细监视复制延迟,直到追赶期结束。在最初的追赶期间,复制延迟将比我们通常预期的要高得多。建议您只在初始阶段设置hot_Standby = off。

Cra*_*ger 15

您似乎试图从一台服务器复制到另一台未使用原始服务器副本设置的服务器。这就是为什么:

主数据库和备用数据库系统标识符不同。主的标识符是 6022019027749040119,备用的标识符是 6033562405193904122。

因为每个新initdb的 PostgreSQL 都会获得一个新的随机系统标识符。当您复制现有的 PostgreSQL 安装时,它会保留相同的系统标识符。这就是 PostgreSQL 如何跟踪一个服务器是否可以从另一个服务器重放 WAL。

如果副本是主服务器的副本(例如文件系统级备份pg_basebackup),您只能使用物理复制。有关详细信息,请参阅手册对复制的详细介绍。


更新

上面显示的说明应该没问题,但它们并不像它们那样清晰。

备用服务器的数据目录应该被您在第 8 步创建的基本备份替换,如果它首先存在的话。

您不能在不替换其数据目录的情况下使现有 PostgreSQL 实例成为另一个实例的备用实例。您需要主数据目录的副本来运行备用。一种常见的设置方法是获取现有的备用数据库,删除其数据目录,用主数据库的数据目录副本替换它,然后将其配置为复制从数据库。这就是我认为第 8 步应该做的事情。

而不是这样做,我认为您可能为从站使用了现有的数据目录,并尝试将其作为主站的副本启动。那将不起作用,并会导致您显示的错误。

关于复制主要 PostgreSQL 文档是推荐的主要信息资源。我建议先去那里。

您可能还想查看repmgr,它有助于自动执行复制和故障转移任务。