आइए, Postgres को खुद होस्ट करके देखें
(pierce.dev)- Postgres self-hosting जटिल या जोखिमभरा नहीं है, और managed services की तुलना में सस्ता तथा performance tuning के लिए अधिक लचीला तरीका है
- अधिकांश cloud database services, open source Postgres के हल्के संशोधित रूप पर चलती हैं, और वास्तविक अंतर मुख्यतः operational automation के स्तर में होता है
- वास्तविक production उदाहरणों में self-hosted Postgres हज़ारों users और करोड़ों queries को स्थिर रूप से संभालता है, और maintenance समय भी बहुत कम लगता है
- AWS RDS जैसी managed services की बढ़ती कीमतों के कारण, उसी लागत में कहीं अधिक शक्तिशाली server सीधे चलाया जा सकता है
- जिन मध्यम आकार की teams के लिए infrastructure management बहुत जटिल नहीं है, उनके लिए self-hosting लागत और performance दोनों के लिहाज़ से एक व्यावहारिक विकल्प बनता है
cloud-केंद्रित narrative में बदलाव
- पहले अधिकांश कंपनियाँ अपने सर्वर पर database सीधे चलाती थीं, और यह कम network latency के कारण तेज़ setup होता था
- 1980~2000 के दशक में application server और database server अक्सर एक ही physical machine पर होते थे
- Amazon RDS(2009) का लॉन्च backup, patching और monitoring को automate करने वाले आकर्षक प्रस्ताव के रूप में देखा गया
- शुरुआती दौर में यह dedicated server जैसी कीमत पर operational burden कम कर देता था
- 2015 के बाद cloud adoption तेज़ होने के साथ, infrastructure को खुद manage करना अक्षम माना जाने लगा
- AWS infrastructure संभाले और developers application logic पर ध्यान दें, यह मॉडल standard बन गया
- 2025 तक RDS की कीमतें काफ़ी बढ़ चुकी हैं, और अब उसी लागत पर कहीं बेहतर specification वाला dedicated server किराए पर लिया जा सकता है
- उदाहरण: db.r6g.xlarge instance (4 vCPU, 32GB RAM) की कीमत $328 प्रति माह है, जबकि उसी रकम में 32-core·256GB RAM server किराए पर मिल सकता है
managed service की वास्तविक संरचना
- AWS RDS मूल रूप से standard Postgres में AWS-विशेष monitoring और backup systems जोड़कर बनाया गया रूप है
- इसमें EBS snapshot-आधारित backup, Chef/Puppet/Ansible के ज़रिये configuration management, PgBouncer connection pooling, CloudWatch monitoring, और automatic failover scripts शामिल हैं
- तकनीकी रूप से यह setup बहुत जटिल नहीं है, और इसका मुख्य मूल्य operations automation और initial deployment की सुविधा में है
- समान specification वाले server पर RDS से self-hosting में migration करने पर performance समान रही या बेहतर हुई
- RDS में सीमित parameters को सीधे adjust कर पाने से performance optimization संभव हुआ
self-hosting की operational complexity
- DigitalOcean के 16 vCPU / 32GB RAM / 400GB disk server पर migration में लगभग 4 घंटे लगे, और उसके बाद स्थिर संचालन की पुष्टि हुई
- high availability products के लिए प्रति माह लगभग 30 मिनट का management समय चाहिए, और कम traffic वाली services को पूरी तरह automate किया जा सकता है
- नियमित management cycle
- साप्ताहिक(10 मिनट) : backup verification, slow query logs की समीक्षा, disk capacity की जाँच
- मासिक(30 मिनट) : security updates, backup retention policy की समीक्षा, capacity planning
- त्रैमासिक(2 घंटे) : monitoring dashboard अपडेट, configuration optimization, recovery test
- incident response की ज़िम्मेदारी सीधे आपकी होती है, लेकिन RDS में भी failures होते हैं और अंततः developers को ही प्रतिक्रिया देनी पड़ती है
- सीधे संचालन करने पर update timing और risk windows को खुद नियंत्रित किया जा सकता है, जिससे stability बनाए रखना आसान होता है
कब self-hosting उपयुक्त नहीं है
- जब शुरुआती developers को तेज़ी से prototype बनाना हो, तब managed service अधिक सुविधाजनक होती है
- बड़ी कंपनियाँ dedicated database engineers रख सकती हैं, या labor cost घटाने के लिए cloud को outsource करना अधिक प्रभावी हो सकता है
- regulated industries (PCI-DSS, HIPAA आदि) में प्रमाणित managed platform का उपयोग आवश्यक हो सकता है
मुख्य configuration points
- memory settings: hardware के अनुसार
shared_buffers,effective_cache_size,work_mem,maintenance_work_memआदि को adjust करना चाहिए- उदाहरण:
shared_buffersको RAM का 25%,effective_cache_sizeको 75% पर सेट करना
- उदाहरण:
- connection management:
pgbouncerका उपयोग कर connection pooling सेट करें, जो Python asyncio environment में कुशलता से काम करता हैmax_connections = 200,log_connections = onजैसी basic settings के उदाहरण दिए गए हैं
- storage tuning: NVMe SSD environment में
random_page_cost = 1.1,effective_io_concurrency = 200जैसी settings की जा सकती हैं- इससे random read speed बेहतर होती है और query planning optimize होती है
- WAL settings: durability और performance के लिए
wal_level = replica,max_wal_size = 2GB,checkpoint_completion_target = 0.9आदि को adjust किया जा सकता है
निष्कर्ष
- हर infrastructure को खुद चलाने की ज़रूरत नहीं है, लेकिन Postgres उन क्षेत्रों में आता है जहाँ self-hosting एक तर्कसंगत विकल्प है
- यदि आप RDS पर प्रति माह $200 से अधिक खर्च कर रहे हैं, तो non-core database को test server पर ले जाकर आज़माना उपयोगी हो सकता है
- आगे चलकर infrastructure का रूप managed services और self-hosting के मिश्रित hybrid model में विकसित होने की संभावना है
- Postgres को लागत के मुकाबले उच्च दक्षता वाला self-hosting उम्मीदवार माना जा सकता है
4 टिप्पणियां
स्टोरेज भी 11 nines की गारंटी देता है, तो क्लाउड इस्तेमाल करने जैसा ऑपरेशन मुश्किल होता है, इसलिए क्लाउड का इस्तेमाल करते हैं haha
असल में, 3 node क्लस्टर चलाना इतना आसान नहीं होगा।
Hacker News की राय
मैं self-hosting को ज़िम्मेदारी के सवाल के रूप में देखता हूँ
मैं कुछ SaaS प्रोडक्ट्स को खुद होस्ट कर रहा हूँ, और यह AWS से कहीं सस्ता है जबकि परफ़ॉर्मेंस भी बहुत बेहतर है
लेकिन client projects में मैं AWS का खर्च देने के लिए मनाता हूँ, क्योंकि इससे hardware availability की ज़िम्मेदारी दूसरी तरफ़ डाली जा सकती है
जब budget सीमित हो, तब RDS की लागत भारी लगती है. Hetzner पर 3-node Galera cluster को कुछ डॉलर में चलाना कहीं ज़्यादा किफायती है
लेकिन Cloudflare या SQS जैसी managed services में भी कभी-कभी outage आता है. आखिरकार पूरी तरह स्थिरता कहीं नहीं है
AWS Aurora Serverless
cloud SQL में उल्टा cost structure काफ़ी जटिल है, और backup configuration तो बस एक बार सेट कर दो, फिर काम ख़त्म
मैं इस दावे से सहमत नहीं हूँ कि self-hosting ज़्यादातर लोगों के लिए सही विकल्प है
मेरे हिसाब से यह तभी तर्कसंगत है जब budget बहुत तंग हो, या फिर scale इतना बड़ा हो कि dedicated engineer रखा जा सके
छोटी कंपनियों के लिए cloud पर छोड़ देना ज़्यादा व्यावहारिक है. setup के बाद महीने में 30~120 मिनट management काफ़ी होता है
Heroku या Render जैसे PaaS को सामान्य developer भी संभाल सकता है, लेकिन वे काफ़ी महंगे हैं
आख़िरकार अगर application recovery automation नहीं है, तो रात 3 बजे उठना वैसे ही पड़ता है
अगर यह internal tool है, तो Docker में Postgres जोड़ने में 5 मिनट ही लगते हैं
‘managed database’ की परिभाषा ही उलझी हुई है
मेरे लिए बुनियादी शर्तें हैं automatic backup, index optimization, multi-datacenter failover, point-in-time recovery, slow query analysis, storage forecasting
अगर यह सब monthly fee में मिलता है, तो self-hosting पर बहस का मतलब ही नहीं रह जाता
आख़िरकार दो लोग रखने पड़ते हैं, और फिर काम कम होने पर वे गैर-ज़रूरी सुधारों में लगकर 6 महीने भी बर्बाद कर सकते हैं
managed DB, VPS के मुकाबले बहुत महंगा है
मैंने convenience premium की उम्मीद की थी, लेकिन असल में यह कई गुना ज़्यादा महंगा निकला. इसलिए बड़े projects के अलावा मैं इसका इस्तेमाल नहीं करता
लेख में high availability (HA) वाला हिस्सा कमज़ोर है. सिर्फ़ WAL settings से बात पूरी नहीं होती. replication महंगा पड़ता है
समझ नहीं आता कि HN पर Postgres को इतना बढ़ा-चढ़ाकर क्यों देखा जाता है
MongoDB की तरह automatic failover वाला HA cluster आसानी से बनाने का तरीका नहीं है. जानना चाहता हूँ कि production services में लोग इसे कैसे सुलझाते हैं
संबंधित चर्चा: PostgreSQL mailing list
व्यवहार में सभी connections टूट जाते हैं, cache reset हो जाता है, और upgrade के समय service interruption अनिवार्य होती है
Oracle RAC ही अपवाद है, और PostgreSQL उस तरह की architecture नहीं है. YugabyteDB कुछ हद तक विकल्प है
ज़्यादातर apps कुछ घंटों के downtime को स्वीकार कर लेते हैं. सिर्फ़ बड़ी कंपनियाँ ही इस जटिल automation का खर्च उठा सकती हैं
Kubernetes environment में CloudNativePG भी अच्छा है.
pg_auto_failover सरल है, लेकिन इसकी सीमाएँ हैं
Autobase को देखें तो यह self-hosting के लिए ज़रूरी कामों को अपने-आप संभाल देता है
15 साल से मैं Postgres को हमेशा self-hosted रूप में इस्तेमाल करता आया हूँ, और लगभग कभी समस्या नहीं हुई
एकमात्र चिंता तब होती थी जब ORM upgrade के हिसाब से PG version migration करना पड़ता था. सावधानी से system administration करके इसे संभाला जा सकता था
मैंने Fly.io पर unmanaged Postgres खुद चलाया था, और बहुत परेशान हुआ
nodes बार-बार मर जाते थे, इसलिए repmgr से manual recovery करनी पड़ती थी, और आखिरकार मैंने internal wiki में पूरा procedure लिख दिया
cluster का मक़सद high availability है, तो फिर zombie primary को अपने-आप handle क्यों नहीं करता, यह समझ नहीं आया
आख़िर में मैं managed Postgres पर चला गया, और outage के समय किसी दूसरे के उसे संभाल लेने की सुविधा सच में बहुत राहत देती है
इस thread में बहुत-सी टिप्पणियाँ scale, workload, staffing, time, business stage, scalability requirements जैसे वास्तविक कारकों को नज़रअंदाज़ करती हैं
self-hosting सही भी हो सकता है, ग़लत भी, लेकिन चर्चा ज़रूरत से ज़्यादा सरल बना दी गई है
डेवलपर्स की चिंता में शायद यह भी अहम होगा कि ऐसी चीज़ों को self-hosting करने पर उस मेहनत को मान्यता मिलेगी या नहीं। अगर cloud cost ज़्यादा भी आए, लेकिन self-hosting से की गई cost saving को मान्यता न मिले, तो बस cloud service इस्तेमाल करके कवर कर लेना और हैंडल करने वाले एरिया को कम करना ही ज़्यादा आसान लगेगा।