Re: Behaviour of take over the synchronous replication - Mailing list pgsql-hackers

From Sawada Masahiko
Subject Re: Behaviour of take over the synchronous replication
Date
Msg-id CAD21AoCEvKxGCHDV2ADaxyJ08DKpigRW3xbMDwA0Nq3PObwK3g@mail.gmail.com
Whole thread Raw
In response to Re: Behaviour of take over the synchronous replication  (Amit Kapila <amit.kapila16@gmail.com>)
Responses Re: Behaviour of take over the synchronous replication  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
On Sun, Aug 25, 2013 at 3:21 PM, Amit Kapila <amit.kapila16@gmail.com> wrote:
> On Sat, Aug 24, 2013 at 2:46 PM, Sawada Masahiko <sawada.mshk@gmail.com> wrote:
>> On Sat, Aug 24, 2013 at 3:14 AM, Josh Berkus <josh@agliodbs.com> wrote:
>>> On 08/23/2013 12:42 AM, Sawada Masahiko wrote:
>>>> in case (a), those priority is clear. So I think that re-taking over
>>>> is correct behaviour.
>>>> OHOT, in case (b), even if AAA and BBB are set same priority, AAA
>>>> server steals SYNC replication.
>>>> I think it is better that BBB server continue behaviour SYNC standby,
>>>> and AAA should become potential server.
>>>
>>> So, you're saying that:
>>>
>>> 1) synchronous_standby_names = '*'
>>>
>>> 2) replica 'BBB' is the current sync standby
>>>
>>> 3) replica 'AAA' comes online
>>>
>>> 4) replica 'AAA' grabs sync status
>>>
>>> ?
>> I'm sorry that you are confuse.
>> It means that
>>
>> 1) synchronous_standby_names = '*'
>>
>> 2) replica 'AAA' is the current sync standby
>>
>> 3) replica 'BBB' is the current async standby (potential sync standby)
>>
>> 4) replica 'AAA' fail. after that, replica 'BBB' is current sync standby.
>>
>> 5) replica 'AAA' comes online
>>
>> 6) replica 'AAA' grabs sync status
>>
>>>
>>
>>
>>> If that's the case, I'm not really sure that's undesirable behavior.
>>> One could argue fairly persuasively that if you care about the
>>> precendence order of sync replicas, you shouldn't use '*'. And the rule
>>> of "if using *, the lowest-sorted replica name has sync" is actually a
>>> predictable, easy-to-understand rule.
>>>
>>> So if you want to make this a feature request, you'll need to come up
>>> with an argument as to why the current behavior is bad. Otherwise,
>>> you're just asking us to document it better (which is a good idea).
>> It is not depend on name of standby server. That is, The standby server,
>> which was connected to the master server during initial configration
>> replication, is top priority even if priority of two server are same.
>
> What is happening here is that incase of '*' as priority of both are
> same, system will choose whichever
> comes in list of registered standby's first (list is maintained in
> structure WalSndCtl).
> Each standby is registered with WalSndCtl when a new WALSender is
> started in function InitWalSenderSlot().
> As 'AAA' has been registered first it becomes preferred sync standby
> even if priorities of both are same.
> When 'AAA' goes down, it marks that Slot entry as free (by setting
> pid=0 in function WalSndKill),
> now when 'AAA' comes back again, it gets that free Slot entry and
> again becomes preferred sync standby.
>
> Now if we want to fix as you are suggesting which I don't think is
> necessary, we might need to change WalSndKill and some other place so
> that whenever any standby goes down, it changes slots for already
> registered standby's.
>> User must remember that which standby server connected to master server at
>> first.
>> I think that this behavior confuse user.
>> so I think that we need to modify this behaviour or if '*' is used, priority
>> of server is not same (modifying manual is also good).
>
> Here user has done the settings (setting synchronous_standby_names =
> '*'), after which he will not have any control which standby will
> become sync standby, so ideally he should not complain.
>
> It might be case that for some users current behavior is good enough
> which means that with '*' whichever standby has become sync standby
> first, it will be the sync standby always if alive.
I'm thinking that it is not necessary to change WalSndKill.
For example, we add the value (e.g., sync_standby) which have that
which wal sender is active SYNC rep.
And if sync_standby is already set and it is active, server doesn't
looking for active standby.
Only if sync_standby is not set and it is inactive, server looking for
that which server is active SYNC rep.
If so, we also prevent to find active SYNC rep whenever
SyncRepReleaseWaiters() is called.

In pg_stat_get_walsenders(), looking for active SYNC rep is already
used. I think that it is also able to here.

Thought?

-- 
Regards,

-------
Sawada Masahiko



pgsql-hackers by date:

Previous
From: David Rowley
Date:
Subject: Re: Patch: Allow formatting in log_line_prefix
Next
From: Robert Haas
Date:
Subject: Re: Backup throttling