Hi-

You can use PgCluster with Slony-II for this type of requirements.




On Mon, May 14, 2012 at 11:02 AM, Steven Crandell <steven.crand...@gmail.com
> wrote:

> Having all the dblink destinations on the same server makes it a much more
> viable option since the chances of the dblink update failing are greatly
> reduced.  That said, here's a run down on the queue system I described with
> some specificity toward your situation.
>
> You can add a flag to each customer row that denotes whether or not the
> data has been synced to the other tables,
>
> ALTER TABLE customer ADD synced BOOLEAN DEFAULT FALSE;  --watch out for
> how this default might affect existing customers
>
> and then have your sync process flip the flag to true when it has safely
> written the data to all other tables.
> Alternatively, you can store the data that needs to be sync'd in a
> separate table if making changes to the customer table isn't a viable
> option.
>
> CREATE TABLE customer_queue (LIKE customer);
> ALTER TABLE customer_queue ADD created_time TIMESTAMP DEFAULT now();
> ALTER TABLE customer_queue ADD operation CHAR(1); -- 'i' = insert, 'u' ==
> update, etc
> ALTER TABLE customer_queue ADD processed_time TIMESTAMP;
> ALTER TABLE customer_queue ADD processed BOOLEAN DEFAULT FALSE;
> ......or something similar
>
> If patching the application to write new/updated customer data to the
> customer_queue table (in addition to or instead of the customer table) is
> out of scope, you could populate it via trigger.
>
> Once you have a data structure that stores your customer data and the meta
> data which captures whether the row has been safely synced out to the other
> tables it's just a matter of writing a script that reads your sync meta
> data (queue table or your customer table where not processed) and processes
> all rows that are pending.
> SELECT foo,bar,baz FROM customer_queue WHERE NOT processed ORDER BY
> created_time;  -- FIFO
> The script should be able to verify that a given row was safely written to
> all destinations before setting processed to true.
>
> Anyway, that's one of many ways to accomplish this and it's surely far
> from the best but I hope this is helpful.
>
> regards
> -steve
>
> On Sun, May 13, 2012 at 1:01 PM, John Fabiani <jo...@jfcomputer.com>wrote:
>
>> All on the same cluster (only one server).   Although, it would be nice to
>> have only one table there are real business reasons to dup the databases.
>>
>> I am interested in how you dealt with a queue table.  Would you take a
>> little
>> time to describe the way it worked.
>>
>> Johnf
>>
>> On Saturday, May 12, 2012 08:53:52 PM you wrote:
>> > Are these 5 databases on different servers and at different locations or
>> > are they on the same local cluster?
>> > If they are all on the same local cluster you may want to rethink how
>> you
>> > are storing customer data.  The design you describe seems redundant.
>> >
>> > If you are dealing with multiple servers (and perhaps business rules
>> that
>> > require duplicate, writable user tables at each location?) then your
>> plan
>> > needs to account for network failure.  A synchronous cross-network
>> dblink
>> > trigger mechanism left to its own devices will eventually fail and you
>> will
>> > be left with inconsistent data.  Nothing wrong with dblink but you need
>> to
>> > build in some error handling.
>> >
>> > I've built systems that accomplished similar things by writing data to a
>> > queue table (in addition to your local master customer table) which is
>> then
>> > reconciled/synced out to other nodes or process by an periodic script
>> that
>> > is able to deal with or alert on locking/dupe key/network and other
>> errors
>> > that keep it from properly syncing a row to all other nodes.  This
>> > introduces added durability to your sync mechanism but also introduces
>> some
>> > lag time.  Pick your poison.
>> >
>> > -steve
>> >
>> > On Sat, May 12, 2012 at 7:28 AM, John Fabiani <jo...@jfcomputer.com>
>> wrote:
>> > > I need to maintain a sync-ed table across several databases.  For
>> > > example I have a customer table in 5 databases.  If a user of any of
>> > > the databases inserts a new customer I need to insert the new record
>> > > into the other four databases.  But question is updates and deletes.
>> > >
>> > > I can use a trigger and dblink to update the other databases when the
>> > > action
>> > > is an insert because in each of the other databases I don't have to
>> > > worry
>> > > about a locked record.  But what happens if a user is updating at the
>> > > same moment as a different user in a different database is updating
>> the
>> > > same customer.  Can a race condition occur?
>> > >
>> > > I was thinking I could create a master database.  And have all the
>> other
>> > > databases use dblink to excute the master trigger.
>> > >
>> > >
>> > > Any advise would be helpful,
>> > >
>> > > Johnf
>> > >
>> > > --
>> > > Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>> > > To make changes to your subscription:
>> > > http://www.postgresql.org/mailpref/pgsql-sql
>>
>
>


-- 
Regards,
----------------------------------------------
Trinath Somanchi,
+91 9866 235 130

Reply via email to