开发者

How can I use MongoDB as a cache for Postgresql?

开发者 https://www.devze.com 2023-04-12 16:32 出处:网络
I have an application that can not afford to lose data, so Postgresql is my choice for database (ACID)

I have an application that can not afford to lose data, so Postgresql is my choice for database (ACID)

However, speed and query advantages of MongoDB are very attractive, but based on what I've read so far, MongoDB can report a successful write which may not have gone to disk, so I can't m开发者_JS百科ake it my mission critical db (I'll also need transactions)

I've seen references to people using mysql and MongoDB together, one for the transactions and the other for queries. Please not that I'm not talking about keeping some data in one DB and the rest in another. I want to use Postgresql as a gateway to data entry, and MongoDB for reads.

Are there any resources that offer an architecture/guide for Postgresql + MongoDB usage in this way? I can remember seeing this topic in Postgresql conference agenda, but I could not find the link.


I don't think you'll get much speed using MongoDB just as a cache. It's strengths are replication and horizontal scalability. On one computer you'd make Mongo and Postgres compete for memory, IO bandwidth and processor time.

As you can not afford to loose transactions you'll be better with Postgres only. Its has efficient caching, sophisticated query planner, prepared queries and wide indexing support cause that read-only queries will be very fast - really comparable to MongoDB on a single computer.

Postgres can even scale horizontally now using asynchronous, or, from version 9.1, synchronous replication.


One way to achieve this would be to set up a master-slave replication with the PostgreSQL database as master, and the MongoDB database as slave. You would then do all reads from MongoDB, and all writes to PostgreSQL.

This post discusses such a setup using a tool called Bucardo: http://blog.endpoint.com/2011/06/mongodb-replication-from-postgres-using.html

You may also be able to do it with Tungsten Replicator, although it seems designed to be used with MySQL: http://code.google.com/p/tungsten-replicator/wiki/TRCHeterogeneousReplication


I can remember seeing this topic in Postgresql conference agenda, but I could not find the link.

Maybe, you are talking about this: https://www.postgresqlconference.org/content/hybrid-applications-using-mongodb-and-postgres


Depending how important transactions are to you, one option is to use MongoDb driver's safe mode and drop Postgresql.

http://www.mongodb.org/display/DOCS/getLastError+Command


How can you expect transactional consistency from Postgres but trust MongoDB for reads? How would you support rollbacks in this scenario? How do you detect when they've gotten out of sync?

I think you're better off going with memcache and implementing a higher level object cache. Alternatively, you could consider a replication slave for reads. If you have performance needs beyond what a dedicated read slave can provide, consider denormalizing your tables on your slave system.

Make sure that any of this is actually needed. For thin tables with PK lookups most modern database engines like Postgres or InnoDB are going to generally keep up with NoSQL solutions. Don't fall into the ROFLSCALE trap http://www.youtube.com/watch?v=b2F-DItXtZs


I think you can run a mongo replica set.. Let say 3 Slave and 1 Master.. Then in your app you should run all write transactions on Postgresql and then on Mongo ReplicaSet.. After that you can query read operations on Mongo Replica set.. But Synchronizing will be a problem, you should work on it..


you may find some replacement for mongo in here or here that is safer and fast as well.

but I advise to simplify your solution instead of making a complicated design.

Visual Guide to NoSQL Systems

lucky


In mongodb we can specify writeConcern property to specify that it should write to journal/ instances and then send confirmation/ acknowledgement and i think even mongodb has teh concept of transactions. Not sure why we need postgres behind it.

0

精彩评论

暂无评论...
验证码 换一张
取 消