यदि आप PostgreSQL में नए हैं तो आपके सामने सबसे आम चुनौती यह है कि अपने डेटाबेस वातावरण को कैसे ट्यून किया जाए।
जब PostgreSQL स्थापित हो जाता है तो यह स्वचालित रूप से एक मूल postgresql.conf फ़ाइल उत्पन्न करता है। यह कॉन्फ़िगरेशन फ़ाइल सामान्य रूप से आपके द्वारा उपयोग किए जा रहे ऑपरेटिंग सिस्टम के आधार पर डेटा निर्देशिका के अंदर रखी जाती है। उदाहरण के लिए, उबंटू पोस्टग्रेएसक्यूएल में कॉन्फ़िगरेशन (pg_hba.conf, postgresql.conf, pg_ident.conf) को /etc/postgresql निर्देशिका के अंदर रखता है। इससे पहले कि आप अपने PostgreSQL डेटाबेस को ट्यून कर सकें, आपको सबसे पहले postgresql.conf फ़ाइलों का पता लगाना होगा।
लेकिन उपयोग करने के लिए सही सेटिंग्स क्या हैं? और प्रारंभ में कौन से मान सेट किए गए हैं? PGTune (और वैकल्पिक उपकरण जैसे ClusterControl) जैसे बाहरी उपकरणों का उपयोग करने से आपको इस विशिष्ट समस्या को हल करने में मदद मिलेगी।
PGTune क्या है?
PGTune एक कॉन्फ़िगरेशन विज़ार्ड है जिसे मूल रूप से 2ndQuadrant से ग्रेग स्मिथ द्वारा बनाया गया था। यह एक पायथन लिपि पर आधारित है, जो दुर्भाग्य से, अब समर्थित नहीं है। (यह PostgreSQL के नए संस्करणों का समर्थन नहीं करता है।) फिर इसे pgtune.leopard.in.ua (जो मूल PGTune पर आधारित है) में परिवर्तित हो गया और अब एक कॉन्फ़िगरेशन विज़ार्ड है जिसका उपयोग आप अपनी PG डेटाबेस कॉन्फ़िगरेशन सेटिंग्स के लिए कर सकते हैं।
PGTune का उपयोग किसी दिए गए हार्डवेयर कॉन्फ़िगरेशन के लिए अधिकतम प्रदर्शन के आधार पर PostgreSQL के कॉन्फ़िगरेशन पैरामीटर की गणना करने के लिए किया जाता है। हालाँकि, यह एक चांदी की गोली नहीं है, क्योंकि कई सेटिंग्स न केवल हार्डवेयर कॉन्फ़िगरेशन पर निर्भर करती हैं, बल्कि डेटाबेस के आकार, ग्राहकों की संख्या और प्रश्नों की जटिलता पर भी निर्भर करती हैं।
पीजीट्यून का उपयोग कैसे करें
पीजीट्यून का पुराना संस्करण पायथन लिपि पर आधारित था जिसे आप शेल कमांड (उबंटू का उपयोग करके) के माध्यम से लागू कर सकते हैं:
[email protected]:~/pgtune-master# $PWD/pgtune -L -T Mixed -i /etc/postgresql/9.1/main/postgresql.conf | sed -e '/#.*/d' | sed '/^$/N;/^\n/D'
stats_temp_directory = '/var/run/postgresql/9.1-main.pg_stat_tmp'
datestyle = 'iso, mdy'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 120MB
checkpoint_completion_target = 0.9
effective_cache_size = 1408MB
work_mem = 9MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 480MB
लेकिन नया बहुत आसान और सुविधाजनक तरीका है क्योंकि आप केवल ब्राउज़र के माध्यम से पहुंच सकते हैं। बस https://pgtune.leopard.in.ua/ पर जाएं। एक अच्छा उदाहरण नीचे जैसा है:
आपको केवल निम्नलिखित फ़ील्ड निर्दिष्ट करने की आवश्यकता है:
- DB संस्करण - आपके PostgreSQL का संस्करण। यह 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11, और 12 से PostgreSQL के संस्करणों का समर्थन करता है।
- OS प्रकार - ओएस का प्रकार (लिनक्स, ओएस एक्स, विंडोज)
- DB प्रकार - डेटाबेस प्रकार जो मुख्य रूप से आपका डेटाबेस किस प्रकार का लेनदेन प्रसंस्करण संभालेगा (वेब एप्लिकेशन, ओएलटीपी, डेटा वेयरहाउसिंग, डेस्कटॉप एप्लिकेशन, मिश्रित प्रकार के एप्लिकेशन)
- कुल मेमोरी (RAM) - कुल मेमोरी जिसे आपका PG इंस्टेंस हैंडल करेगा। इसे GiB में निर्दिष्ट करने की आवश्यकता है।
- सीपीयू की संख्या - CPU की संख्या, जो PostgreSQL CPU का उपयोग कर सकता है =थ्रेड प्रति कोर * कोर प्रति सॉकेट * सॉकेट
- कनेक्शनों की संख्या - PostgreSQL क्लाइंट कनेक्शन की अधिकतम संख्या
- डेटा संग्रहण - डेटा स्टोरेज डिवाइस का प्रकार जिसे आप SSD, HDD, या SAN आधारित स्टोरेज में से चुन सकते हैं।
फिर जेनरेट बटन दबाएं। वैकल्पिक रूप से, आप ALTER SYSTEM स्टेटमेंट भी चला सकते हैं जो postgresql.auto.conf उत्पन्न करता है, लेकिन यह तब तक नहीं लगेगा जब तक आप PostgreSQL पुनरारंभ नहीं करते।
यह कैसे मान निर्धारित करता है
इस टूल के लिए एल्गोरिदम मूल रूप से यहां config.js में पाया जा सकता है। यह pgtune#L477 से शुरू होने वाले पुराने PGTune से समान एल्गोरिथम साझा करता है। उदाहरण के लिए, PostgreSQL <9.5 के संस्करण checkpoint_segments का समर्थन करते हैं, लेकिन PG>=9.5 min_wal_size और max_wal_size का उपयोग करता है।
चेकपॉइंट_सेगमेंट या min_wal_size/max_wal_size सेट करना इस बात पर निर्भर करता है कि किस प्रकार का PostgreSQL संस्करण और DB प्रकार का डेटाबेस एप्लिकेशन लेनदेन है। नीचे दिए गए स्निपेट में देखें कि कैसे:
if (dbVersion < 9.5) {
return [
{
key: 'checkpoint_segments',
value: ({
[DB_TYPE_WEB]: 32,
[DB_TYPE_OLTP]: 64,
[DB_TYPE_DW]: 128,
[DB_TYPE_DESKTOP]: 3,
[DB_TYPE_MIXED]: 32
}[dbType])
}
]
} else {
return [
{
key: 'min_wal_size',
value: ({
[DB_TYPE_WEB]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (100 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
},
{
key: 'max_wal_size',
value: ({
[DB_TYPE_WEB]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (8192 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (16384 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
}
]
}
बस संक्षेप में समझाने के लिए, यह पता लगाता है कि क्या dbVersion <9.5 है, तो यह वेब UI फ़ॉर्म के दौरान सेट किए गए dbType मान के प्रकार के आधार पर checkpoint_segments या min_wal_size/max_wal_size वैरिएबल के लिए सुझाए गए मान निर्धारित करता है।
मूल रूप से, आप एल्गोरिथम के बारे में अधिक जान सकते हैं कि यह कैसे इस स्क्रिप्ट कॉन्फ़िगरेशन को देखकर मूल्यों का सुझाव देता है।
ClusterControl के साथ PostgreSQL कॉन्फ़िगरेशन ट्यूनिंग
यदि आप क्लस्टर बनाने, बनाने या आयात करने के लिए ClusterControl का उपयोग कर रहे हैं, तो यह स्वचालित रूप से दिए गए हार्डवेयर विनिर्देशों के आधार पर प्रारंभिक ट्यूनिंग करता है। उदाहरण के लिए, नीचे दिए गए कार्य विनिर्देशों के साथ एक क्लस्टर बनाना,
{
"command": "create_cluster",
"group_id": 1,
"group_name": "admins",
"job_data": {
"api_id": 1,
"cluster_name": "pg_11",
"cluster_type": "postgresql_single",
"company_id": "1",
"datadir": "/var/lib/postgresql/11/",
"db_password": "dbapgadmin",
"db_user": "dbapgadmin",
"disable_firewall": true,
"disable_selinux": true,
"generate_token": true,
"install_software": true,
"nodes": [
{
"hostname": "192.168.30.40",
"hostname_data": "192.168.30.40",
"hostname_internal": "",
"port": "5432"
},
{
"hostname": "192.168.30.50",
"hostname_data": "192.168.30.50",
"hostname_internal": "",
"port": "5432",
"synchronous": false
}
],
"port": "5432",
"ssh_keyfile": "/home/vagrant/.ssh/id_rsa",
"ssh_port": "22",
"ssh_user": "vagrant",
"sudo_password": "",
"user_id": 1,
"vendor": "default",
"version": "11"
},
"user_id": 1,
"user_name": "[email protected]"
}
मुझे नीचे दिखाए अनुसार निम्नलिखित ट्यूनिंग प्रदान करता है:
[[email protected] ~]# s9s job --log --job-id 84919 | sed -n '/stat_statements/,/Writing/p'
192.168.30.40:5432: Enabling stat_statements plugin.
192.168.30.40:5432: Setting wal options.
192.168.30.40:5432: Performance tuning.
192.168.30.40: Detected memory: 1999MB.
192.168.30.40:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.40:/etc/postgresql/11/main/postgresql.conf'.
192.168.30.50:5432: Enabling stat_statements plugin.
192.168.30.50:5432: Setting wal options.
192.168.30.50:5432: Performance tuning.
192.168.30.50: Detected memory: 1999MB.
192.168.30.50:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.50:/etc/postgresql/11/main/postgresql.conf'.
इसके अतिरिक्त, यह आपके सिस्टम या कर्नेल पैरामीटर जैसे,
को भी ट्यून करता है192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
निष्कर्ष
ClusterControl ट्यूनिंग पैरामीटर भी pgtune#L477 में साझा एल्गोरिथम पर आधारित हैं। यह फैंसी नहीं है, लेकिन आप इसे अपने इच्छित मूल्यों में बदल सकते हैं। इन सेटिंग मानों के साथ, यह आपको एक कच्ची शुरुआत करने की अनुमति देता है जो प्रारंभिक दिए गए मूल्यों के आधार पर उत्पादन भार को संभालने के लिए पर्याप्त रूप से तैयार है।