微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL 卡在等待同步复制

如何解决PostgreSQL 卡在等待同步复制

我已经将 Postgresql 集群配置为这样的同步复制:

if (a <= k) // (k < a)
{
    return mediansearch(S1,k,a);
}
else if (a + b <= k) // (k < a + b)
{
    return A[ran];
}
else
{
    return mediansearch(S3,k - a - b,c);
}

每当我们尝试对数据库执行某些操作(插入/更新/创建)时,该进程就会挂起,如果我取消该进程,则会收到此警告:

#include <iostream>
#include <stdlib.h>
#include <assert.h>
#include <time.h>

using namespace std;

int medianSearch(int A[],int size,int k)
{
    int *lows = (int *)calloc(size,sizeof(int));
    int  lowsLen = 0;

    int *highs = (int *)calloc(size,sizeof(int));
    int  highsLen = 0;

    int *pivots = (int *)calloc(size,sizeof(int));
    int  pivotsLen = 0;

    int  median;
    int  pivot;
    int  i;

    if (size == 1)
        return A[0];

    // Other ways of randomly picking a pivot
    // pivot = 0;
    // pivot = size-1;
    // pivot = size/2;

    assert(size > 0);
    pivot = rand() % size;

    for (i = 0; i < size; ++i)
    {
        if (A[i] < A[pivot])
        {
            lows[lowsLen] = A[i];
            lowsLen++;
        }
        else if (A[i] > A[pivot])
        {
            highs[highsLen] = A[i];
            highsLen++;
        }
        else
        {
            pivots[pivotsLen] = A[i];
            pivotsLen++;
        }
    }

    if (k < lowsLen)
        median = medianSearch(lows,lowsLen,k);
    else if (k < lowsLen + pivotsLen)
        median = A[pivot];
    else
        median = medianSearch(highs,highsLen,k - lowsLen - pivotsLen);

    free(lows);
    free(highs);
    free(pivots);

    return median;
}

int compare(const void *a,const void *b)
{
    return ( *(int *)a - *(int *)b );
}

int medianSorted(int A[],int k)
{
    qsort(A,size,sizeof(int),compare);

    return A[k];
}

#define N 1000

int main()
{
    int arr[N];
    int brr[N];
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 200;
    int x;
    int y;
    
    for (int i = 0; i < n; ++i)
        arr[i] = brr[i] = rand();
    
    x = medianSearch(arr,n,(k-1)%n);
    y = medianSorted(brr,(k-1)%n);
    
    string suffix;

    switch (k % 10)
    {
        case 1: suffix = "st"; break;
        case 2: suffix = "nd"; break;
        case 3: suffix = "rd"; break;
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 0: suffix = "th"; break;
    }
    cout << k << suffix << " smallest is: " << x << endl;
    cout << k << suffix << " smallest is: " << y << endl;
}

我可以看到更新后,数据仅在主服务器中更新,但不会复制到备用服务器。

我检查了 synchronous_standby_names = '1("server_1","server_2")' synchronous_commit = remote_apply 中的进程,我发现进程等待 SyncRep。 WARNING: canceling wait for synchronous replication due to user request DETAIL: The transaction has already committed locally,but might not have been replicated to the standby. ... 中的进程记录如下所示:

pg_stat_activity

我试图检查复制。我已经检查了 pg_stat_activity... wait_event_type = IPC wait_event = SyncRep ... 。所有复制槽都处于活动状态,pg_replication_slot 看起来更新正确。在 pg_stat_replication 中没有延迟,但看起来所有插槽的复制 lsn 都是 pg_stat_replication

我也检查了备用服务器中的sync_state,里面好像没什么特别的。我还检查了 async 并将其配置为 10 秒。

你知道是什么导致了这个问题吗?

Postgresql 版本:10.7

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?