This completes the feature set for JSON document storage so you can now use Postgres instead of NoSQL solutions. However Postgres's replication story is still a little weak compared to other solutions.
What are current best practices for configuring replicated PG with hot failover?
To be clear, what I want is:
- The ability to deploy a cluster of say, 5 replicated PostgreSQL instances
- All write transactions go to a single leader, which replicates them to the other instances
- Reads can go to any instance
- If a leader crashes the cluster will elect a new one without human intervention, and no committed transactions will be lost.
I've always been unclear on how to do this with Postgres.
I've worked mostly with MariaDB Galera Cluster which is pretty effortless to setup, but for PostgreSQL there doesn't seem to be any clear direction on how to do the same things.
I am cheating and getting more or less the same availability properties by using multi-AZ RDS i.e. postgresql with AWS managing the synchronous block replication and standby promotion.
If someone is planning to use PostgreSQL as a NoSQL solution, one can use BDR (Bi-Directional Multi-Master Replication -> https://github.com/2ndQuadrant/bdr) and its global sequences (if needed).
There are plenty of other replication solutions available for Postgres, indeed.
This is incorrect. None of these functions modify the value of a column. All of them are purely functional and return a jsonb value with the specified field(s) replaced.
The significance is one of performance and convenience: before, you would have had to construct a new jsonb object with only the field(s) you wanted modified changed. (In fact it is possible to define these new operators in terms of such; I have done so.) Now you can just use these handy built-in functions, which presumably perform better than the manual method as well.
I think you are using different interpretations of "you".
If you do:
update aTable
set loginInfo = loginInfo - 'lastLogin'
where 'loginInfo' is a jsonb column, you, the programmer, need not write out the parts of the data to keep. PostgreSQL still sees this as 'read column, evaluate expression, write result', so it will read and write the entire jsonb value.
This is only partially correct. These new features reduce the amount of data that must be transmitted to/from the postgres server and how much json must be parsed, but the full row is still written to the WAL (write ahead log). This is true even for partial updates to JSONB columns and even when only updating other non-JSONB columns in the row.
When you do need to update JSONB columns this is a big improvement. You still should consider the size of your JSONB columns and the number & frequency of updates to those rows.
So all this time people have been telling me to use Postgres instead of MongoDB without the ability to edit fields in my documents? What other basic functionality is it missing?
Ideally you should be using Postgres or any other relational database instead of MongoDB for technical reasons other than document storage. (e.g. ACID)
Document storage in Postgres is a best-of-both-worlds approach (can store documents w/ ACID), with advantages of MongoDB and fewer downsides. But it's still relatively new functionality. (I've seen use cases of document storage for logging in-database and other quick-write/read-rarely data that would be a pain to normalize with consistent schema, which seems compelling)
Why not read its extensive documentation (http://www.postgresql.org/docs/9.5/static/), evaluate its capabilities vs. those of MongoDB with respect to your particular use case and decide for yourself?
SQL has never ever been meant for "editing documents", doing so is certainly not considered "basic functionality" for anyone whose use case is best served by a RDBMS, and you'll likely be displeased by the performance of such in Postgres (or any other RDBMS) if that is something you consider "basic functionality".
(FWIW: what I've found to be the typical use case of JSON-in-SQL (or XML-in-SQL) is that of storing opaque JSON or XML blobs generated by some external service, which could perhaps benefit from indexed lookups within this data. If you're designing your main SQL database around JSON you're probably doing something wrong.)
Other comments in the HN discussion indicate that 9.5 introduces an optimization to JSONB handling. It seems that you've always been able to edit fields in your documents, this just makes Postgres do less rewriting than before.
I have read so much about postgres as a database, but sadly I have never been able to actually download install and use it, have read many tutorials but unfortunately it isn't as simple as installing mysql
I can only assume that you are not using any mainstream *nix-based operating system. Installing through package management is easy for both MySQL and PostgreSQL.
I am using elementary OS and I have installed it many times, can you give me a good tutorial about installing and configuring postgres? I want to use it with golang for development of webapps. I am not trolling here btw, I am really stuck with sqlite because of inability of installing postgrest :(
I mean, with Gentoo Linux I had to do the following things:
* If I wanted to make Postgres listen on non-localhost, modify listen_addresses in postgresql.conf.
* Add database access controls as required in pg_hba.conf. The comments in the file are illuminating, but one can examine [0] for more information. [1]
* Create a database with appropriate permissions, along with a user. [2]
* Start Postgres.
I remember having to do the equivalent of all of those things every time I had to install MySQL. :)
What -exactly- did you successfully do, what -exactly- did you fail to do? Divulging that information will help guide assistance efforts. :)
I use elementary OS and all I did was sudo apt-get install postgres
I have no idea what it installed and what it didn't, in the entire process never once it asked me for a password and while connecting to the database it says that invalid password and I can't reset password without connecting to the database!!
May I know your email ID? so I'll try to install it once and tell you how it goes.
As of now I have everything installed plus the graphical client with the elephant logo, but I just have no idea what the password is
> ...the entire process never once it asked me for a password and while connecting to the database it says that invalid password and I can't reset password without connecting to the database!!
Well, because you have access to the file that causes Postgres to determine whether or not you need to provide a password to access a given database (pg_hba.conf), you could simply change the authentication method to one that doesn't ask for a password. :)
However. On every Postgres install I've ever used, there are the following lines in pg_hba.conf:
# "local" is for Unix domain socket connections only
local all all trust
If we look carefully, we see that the Type, Database, User, and Method entries are present, but the Address entry is not. The comment also talks about a Unix domain socket connection.
Reading the "Connecting to a Database" section of the manual for psql [0] (the official command-line Postgres client) tells us that if we omit the hostname, psql attempts to connect over the Unix domain socket. So, try the following things:
* psql
When that fails, because 'role "$MY_USERNAME" does not exist', try
* psql -U $DATABASE_USER
(The Postgresql database user is typically postgres.) If that fails for some other reason, try
* sudo su - $DATABASE_USER
* psql
You should now be connected to Postgres.
If we enter help , we see that we can enter "\?" for help with psql commands. If we enter \? and look through the list of commands, we should see one that does exactly the thing that we're trying to accomplish.
Anyway, leave a message here to let me know how this all went, or to ask any follow up questions.
I'd love to hear what issues you're facing (if you can remember any specifics). Its been a long time since I first installed PostgreSQL, but I also recall some difficulties. Some things have improved since (eg. it's no longer necessary to change shared memory kernel parameters) but some things are still pretty difficult (eg. correctly configuring pg_hba.conf).
Other things are just confusing to newcomers (eg. different meanings of the term "database" between MySQL and Postgres, or understanding schemas and search_path).
Hey, I installed it via the available things on ubuntu software center, I have the graphical utility installed but when I try to connect to it, it says invalid password and I have no idea what the default password is since it didnt ask me
It's easy on any major OS. Windows and OS X have one/two-click installers, Linux distros and BSDs pre-package it. The only really difficult case is a less-mainstream OS where you'll have to compile it, which honestly isn't that hard either.
They already used "phone a friend" when they installed Python, so this time they are trying "ask the audience"; I can't wait to see them try and use "50/50" to install nginx.
I don't use OSX I use elementary OS and I installed everything but it says incorrect password and I have no damn clue what the default password is because while installation it didn't ask me for a password!
What documentation or tutorial were you following? The first thing you need to do is create a user (or act as the postgres user on your os) and if the doc or tutorial was an official one, it should be made more clear and you should file a bug, if it wasn't then you should contact the owner and tell them their tutorial isn't clear.