我刚刚在postgres中设置了流复制(9.3.5),虽然流式传输正如我所料,但我很难让我的备用数据库运行archive_command所以我可以存储所有的日志文件.
掌握postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 max_wal_senders = 4 wal_keep_segments = 8
备用postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 archive_mode = on archive_command = 'test ! -f /backup/postgres_archive/constant/%f && cp %p /backup/postgres_archive/constant/%f' max_wal_senders = 3 wal_keep_segments = 8 hot_standby = on
备用recovery.conf:
standby_mode = 'on' primary_conninfo = 'host=my-host.example.com port=5432 user=replicator password=my_password sslmode=require' restore_command = 'cp /backup/postgres_archive/constant/%f %p' trigger_file = '/tmp/postgresql.trigger'
我正在尝试写入的文件夹的权限是正确的,当我运行用户postgres时,我手动运行archive_command工作正常.为了确保我尝试将存档命令更改为一个简单的触摸(再次,作为postgres用户测试正常),但它没有任何区别.
有效的事情
我的数据库仍处于相对初期阶段,因此根本没有太大的负担.为此,我只是通过将随机数据写入测试表来模拟它.在我提交主人之后,我可以看到在备用数据库中直接出现的变化,所以我很满意.
我不太明白的一件事是WAL文件是备用的,主机略有不同,但它几乎看起来好像有一个或那个配置了WAL还没有开始写入(这不是在另一).这是正常的吗?
如果我在主服务器上选择pg_switch_xlog()然后再写一些,则主服务器和备用服务器似乎都会切换并开始写入下一个/同一个WAL文件.这反映了我对正在发生的事情的理解.
救命
我对这一切有几个疑问.我已经阅读了关于这个的postgres手册的每一页,但在我的特定情况下我找不到任何帮助.
我试着找到一些获取postgres的方法来向我展示更多关于它可能在日志文件中做什么/不做什么的信息,但它没有提供任何有用的东西.在调试时,我应该在配置中更改哪些内容以尽可能多地获取日志中的有用信息?
就日志存档运行的时间而言,我猜是因为主控器有点控制哪个WAL文件处于活动状态,它实际上是在备用数据库上运行日志传输时的触发器.那是对的吗?
流式复制似乎都像我期望的那样工作,但尝试在备用数据库上运行日志传送似乎甚至没有尝试.我究竟做错了什么?
archive_cleanup_command = '/var/lib/postgresql/wal_backup_mirror.sh "%r"'
该脚本的内容是(简化版):
CURRENT_WAL_FILE="$1" for WAL_FILE in $(find /pg_logs/main -maxdepth 1 -type f | sort | awk "\$0 <= \"/pg_logs/main/${CURRENT_WAL_FILE}\""); do WAL_NAME=$(basename "$WAL_FILE") gzip -c "$WAL_FILE" > "/backups/wal/${WAL_NAME}.gz" #now upload the just created .gz to S3 or some other offsite storage rm -f "${WAL_FILE}" done
请注意,我在备份之后删除了WAL段以使我的日志目录在备用数据库上保持干净,但是需要注意的是级联复制设置,因为链路上的备用数据库可能仍然需要那些文件.
最后要注意的是,请记住,备份WAL段是不够的,必须与某种常规完整备份(pg_basebackup)结合使用.我们每天都进行完整备份,然后根据需要全天备份WAL段.