On Apr 14, 2016, at 8:41 AM, Craig Ringer wrote:

> On 1 April 2016 at 19:50, Konstantin Knizhnik <k.knizh...@postgrespro.ru> 
> wrote:
> 
> Right now the main problem is parallel apply: we need to apply changes 
> concurrently to avoid unintended dependencies causing deadlocks and provide 
> reasonable performance.
> 
> How do you intend to approach that?

Actually we already have working implementation of multimaster...
There is a pool of pglogical executors. pglogical_receiver just reads 
transaction body from connection and append it to ready-for-execution queue.
Any vacant worker form this pool can dequeue this work and proceed it.
To provide correct  replication session context, I have to setup replication 
session for each transaction. It looks dummy but fortunately has no effect on 
performance.

It is certainly possible with this approach that order of applying transactions 
can be not the same at different nodes.
But it is not a problem if we have DTM. The only exception is recovery of 
multimaster node. In this case we have to apply transaction exactly in the same 
order as them were applied at the original node performing recovery. It is done 
by applying changes in recovery mode by pglogical_receiver itself.

> 
> You should be able to do parallel apply between nodes trivially, i.e. node A 
> applies changes in parallel from nodes B C and D. 
> 
> Doing parallel apply of multiple changes from node A to node B is much 
> harder. I wrote about parallel logical apply separately so I won't repeat it 
> here; search the archives for the notes if interested.
>  
> We also need 2PC support but this code was sent to you by Stas, so I hope 
> that sometime it will be included in PostgreSQL core and pglogical plugin.
> 
> I never got a response to my suggestion that testing of upstream DDL is 
> needed for that. I want to see more on how you plan to handle DDL on the 
> upstream side that changes the table structure and acquires strong locks. 
> Especially when it's combined with row changes in the same prepared xacts. 

We are now replicating DDL in the way similar with one used in BDR: DDL 
statements are inserted in special table and are replayed at destination node 
as part of transaction.
We have also alternative implementation done by Artur Zakirov 
<a.zaki...@postgrespro.ru> 
which is using custom WAL records: 
https://gitlab.postgrespro.ru/pgpro-dev/postgrespro/tree/logical_deparse
Patch for custom WAL records was committed in 9.6, so we are going to switch to 
this approach.

Right now we are trying to run all Postgres regression tests for multimaster. 
Currently about 50 tests are failed. There are a lot of different issues: with 
temporary tables, GUC variables, ...
Some we have fixed, investigation of others is in progress...


> 
> I'd really like separate patches for the core changes and the pglogical 
> support for them, too.
>  
> There are also some minor technical issues which lead us to making few 
> changes in pglogical code but we tried to do our best to keep original 
> versions unchanged, so we can switch to public version in future.
> 
> Details?
>  
> Now is exactly the time to address those points.
> 

Well, recently I have made attempt to merge our code with the latest version of 
pglogical plugin (because our original implementation of multimaster was based 
on the code partly taken fro BDR) but finally have to postpone most of changes. 
My primary intention was to support metadata caching. But presence of multiple 
apply workers make it not possible to implement it in the same way as it is 
done node in pglogical plugin. 

Also now pglogical plugin contains a lot of code which performs mapping between 
source and target database schemas. So it it is assumed that them may be 
different.
But it is not true in case of multimaster and I do not want to pay extra cost 
for the functionality we do not need.

Frankly speaking I do not wan to spent much time on integration of multimaster 
with pglogical plugin right now,  because  both of them are actively developed 
now. We should definitely do it, but  when we have stable version, so there is 
no need to repeat this work once and once again.

We can try to prepare our "wish list" for pglogical plugin.

> 
> -- 
>  Craig Ringer                   http://www.2ndQuadrant.com/
>  PostgreSQL Development, 24x7 Support, Training & Services

Reply via email to