TL;DR#
Managed PostgreSQL is more expensive if we consider resources being assigned (CPU+RAM+DISK), but Digital Ocean provides features that makes availability and maintainability much easier compared to self-managed.
For testing and development environment, and proof of concepts, and if costs is very important, it can makes sense to choose the self-managed approach.
Overall comparison#
Managed PostgreSQL#
- General
- 1 GB RAM
- 1vCPU
- 10 GB Disk
- PostgreSQL 15
- 15€/mo
- PROS:
- Automatic updates
- Daily point-in-time backups
- High availability with automated failover (extra cost)
- Read-only nodes (extra cost)
- End-to-end security
- Cluster metrics and alerting
- CONS:
- Impossible to SSH into instance
- Some restrictions (available extensions, PostgreSQL versions, etc)
Self-managed PostgreSQL#
- General
- 1 GB RAM
- 1 vCPU
- 25GB Disk
- PostgreSQL 16 (or any version, it’s up to you)
- $7/mo
- PROS:
- Full control
- CONS:
- Managing a database instances requires knowledge, experience and time.
Managed PostgreSQL#
This is how managed PostgreSQL looks like in the UI.
List of instances#
Logs and queries#
User and database management#
Some database details#
Benchmark#
Managed PostgreSQL#
root@ubuntu-bench$ pgbench --host=private-db-PostgreSQL-fra1-88363-do-user-14767703-0.b.db.ondigitalocean.com --port=25060 --username=doadmin --initialize --foreign-keys --scale=100 defaultdb
done in 48.29 s (drop tables 0.03 s, create tables 0.01 s, client-side generate 25.40 s, vacuum 0.97 s, primary keys 16.61 s, foreign keys 5.27 s).
done in 42.72 s (drop tables 0.04 s, create tables 0.01 s, client-side generate 26.23 s, vacuum 1.09 s, primary keys 10.25 s, foreign keys 5.10 s).
done in 44.63 s (drop tables 0.03 s, create tables 0.01 s, client-side generate 25.09 s, vacuum 1.04 s, primary keys 13.37 s, foreign keys 5.08 s).
Actual benchmark:
root@ubuntu-bench$ pgbench --host=private-db-PostgreSQL-fra1-88363-do-user-14767703-0.b.db.ondigitalocean.com --port=25060 --username=doadmin --client=5 --jobs=2 --time 60 --progress=5 defaultdb
progress: 60.0 s, 524.0 tps, lat 9.531 ms stddev 2.267, 0 failed
progress: 60.0 s, 527.2 tps, lat 9.481 ms stddev 3.165, 0 failed
progress: 60.0 s, 557.0 tps, lat 8.976 ms stddev 3.438, 0 failed
Self-managed PostgreSQL#
root@ubuntu-bench$ pgbench --host=10.114.0.4 --username=bench --initialize --foreign-keys --scale=100 bench
done in 22.20 s (drop tables 0.08 s, create tables 0.02 s, client-side generate 10.61 s, vacuum 1.42 s, primary keys 6.46 s, foreign keys 3.61 s).
done in 21.57 s (drop tables 0.08 s, create tables 0.02 s, client-side generate 11.00 s, vacuum 0.93 s, primary keys 6.26 s, foreign keys 3.29 s).
done in 22.77 s (drop tables 0.09 s, create tables 0.01 s, client-side generate 10.87 s, vacuum 1.10 s, primary keys 6.68 s, foreign keys 4.03 s).
Actual benchmark:
root@ubuntu-bench$ pgbench --host=10.114.0.4 --username=bench --client=5 --jobs=2 --time 60 --progress=5 bench
progress: 60.0 s, 522.8 tps, lat 9.546 ms stddev 3.133, 0 failed
progress: 60.0 s, 450.6 tps, lat 11.075 ms stddev 3.670, 0 failed
progress: 60.0 s, 544.2 tps, lat 9.176 ms stddev 2.091, 0 failed
Results#
For some reason that I didn’t investigate yet, the performance of the initialization of the benchmark database
was very different, but the actual benchmark reported very similar results,
both solution provided ~520 tps
(5 concurrent clients, 2 threads).
Try Digital Ocean for free 🤑
Sign up and get a $200, 60-day credit to try droplets, managed Postgres, and more…