首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Repmgr :它会自动升级到新的主程序,但是其他待机停止了。

Repmgr :它会自动升级到新的主程序,但是其他待机停止了。
EN

Database Administration用户
提问于 2020-10-05 18:15:19
回答 1查看 458关注 0票数 0

我正在尝试用repmgr安装postgre,下面是rsult

情况是,

  1. 我试着把1台初级和2台备用。
  2. 然后我停止了初选,所以postgres-2升职了。
  3. 不幸的是,由于某些原因,postgres-3被断开了连接,但是下面是错误日志

看起来它能连接起来,但是postgres号恢复了,没有回来。4.我抛出了另一个备用,但是它所指向的主程序是旧的postgres-1,这可能是它说!running的原因,即使实际的主服务器是postgres-2,它仍然是主的。

我的问题是,我如何使其他待机,而不是每次我升职(自动由于故障等)断开。新的初选?

这是我的repmgr.conf

代码语言:javascript
复制
NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'`
NET_IP=`ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'` 

HOSTNAME='postgres-'${my_node}

cat< /etc/repmgr.conf
    node_id=${my_node}
    node_name=$HOSTNAME
    conninfo='host=${NET_IP} user=repmgr password=repmgr dbname=repmgr connect_timeout=2'
    data_directory='${PGDATA}'

    log_level=INFO
    log_facility=STDERR
    log_status_interval=300
    
    pg_bindir='/usr/lib/postgresql/10/bin'
    use_replication_slots=1
    
    failover=automatic
    promote_command='repmgr standby promote'
    follow_command='repmgr standby follow -W'
EOF

另外,我正在使用docker扩展官方postgres对接图像。

代码语言:javascript
复制
FROM postgres:10

RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main 10" \
          >> /etc/apt/sources.list.d/pgdg.list

# RUN ln -s /home/postgres/repmgr.conf /etc/repmgr.conf

RUN apt-get update && apt-get install wget -y
RUN apt-get install net-tools -y
RUN apt-get update; apt-get install -y git make postgresql-server-dev-10 libpq-dev postgresql-10-repmgr repmgr-common

#RUN wget -c https://repmgr.org/download/repmgr-5.1.tar.gz -O - | tar -xz

RUN touch /etc/repmgr.conf; \
    chown postgres:postgres /etc/repmgr.conf

ENV PRIMARY_NAME=localhost
ENV REPMGR_USER=repmgr
ENV REPMGR_DB=repmgr
ENV REPMGR_PASSWORD=repmgr

COPY postgresql.replication.conf /tmp/postgresql.replication.conf

COPY scripts/*.sh /docker-entrypoint-initdb.d/

最后,下面是我如何检查是否应该注册为主或备用的

代码语言:javascript
复制
PGHOST=${PRIMARY_NAME}

installed=$(psql -qAt -h ${PGHOST} repmgr -c "SELECT 1 FROM pg_tables WHERE tablename='nodes'")

if [ "${installed}" != "1" ]; then
    echo "Registering as PRIMARY SERVER"
    repmgr primary register
else
    my_node=$(grep node_id /etc/repmgr.conf | cut -d= -f 2)
    is_reg=$(psql -qAt -h ${PGHOST} repmgr -c "SELECT 1 FROM repmgr.nodes WHERE node_id=${my_node}")

    if [ "${is_reg}" != "1" ] && [ ${my_node} -gt 1 ]; then
        echo "Registering as STANDBY SERVER"

        pg_ctl -D ${PGDATA} stop -m fast
        rm -Rf ${PGDATA}/*
        repmgr -h ${PRIMARY_NAME} -d repmgr standby clone --fast-checkpoint
        pg_ctl -D ${PGDATA} start &
        sleep 1
        repmgr -h ${PRIMARY_NAME} -d repmgr standby register    
    fi
fi

这是我对postgres.conf的更新

代码语言:javascript
复制
sed -i "s/#*\(shared_preload_libraries\).*/\1='repmgr'/;" ${PGDATA}/postgresql.conf
sed -i "s/#port = 5432/port = 5432/g" ${PGDATA}/postgresql.conf
sed -i "s/#max_wal_senders/max_wal_senders/g"  ${PGDATA}/postgresql.conf
sed -i "s/#wal_level/wal_level/g"  ${PGDATA}/postgresql.conf
sed -i "s/#max_replication_slots/max_replication_slots/g"  ${PGDATA}/postgresql.conf
sed -i "s/#hot_standby/hot_standby/g"  ${PGDATA}/postgresql.conf

sed -i "s/#archive_mode = off/archive_mode = on/g"  ${PGDATA}/postgresql.conf

echo "archive_command = '/bin/true'" >>  ${PGDATA}/postgresql.conf

我用的是postgres:10repmgr-5.0

希望有人能帮我这个忙。谢谢,

EN

回答 1

Database Administration用户

发布于 2020-10-06 01:10:50

我发布了这个对GitHub的响应

到目前为止,我们还没有为在Docker中运行repmgr做任何特别的准备,所以可能会出现这样或那样的问题。

我还尝试添加这个#service_start_ -D =‘pg_ctl -D ${PGDATA} start’#service_ctl_ -D =‘pg_ctl -D ${PGDATA}停止-m’# service_reload_command='pg_ctl -D ${PGDATA} reload‘#service_ restart _command='pg_ctl -D ${PGDATA}重新启动-m’,但结果相同。

您是否尝试过添加这些项目而没有前面的#?也就是说。

代码语言:javascript
复制
service_start_command='pg_ctl -D ${PGDATA} start'
service_stop_command='pg_ctl -D ${PGDATA} stop -m fast'
service_reload_command='pg_ctl -D ${PGDATA} reload'
service_restart_command='pg_ctl -D ${PGDATA} restart -m fast'

默认情况下,当为standby follow操作重新启动节点时,repmgr将停止,然后使用pg_ctl启动服务器,因为在某些环境中pg_ctl restart被证明是有问题的。然而,情况可能正好相反。无论哪种方式,我们都强烈建议在可用的地方使用OS级别的服务命令,以避免出现类似的问题(不确定这些命令在这里是否可用)。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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