如何解决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 举报,一经查实,本站将立刻删除。