PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पीजीपूल के लिए एक गाइड - संकेत और अवलोकन:भाग तीन

पिछले भाग में मैंने कल्पना की कि यह कैसे काम करेगा, एक लागू नहीं की गई सुविधा के साथ खेलने का साहस किया। खैर एचए पहले स्थान पर डिजाइन और उसके बाद ही कार्यान्वयन का मामला है। यह खराब कार्यान्वयन का बहाना नहीं करता है, न ही यह भोली डिजाइनिंग को स्मार्ट बनाता है। फिर भी जब आप सभी संभावित परिदृश्यों को कवर करते हैं और अधिकांश मामलों के लिए पर्याप्त सर्वोत्तम नियम पाते हैं, तो कभी-कभी एक बहुत ही प्रारंभिक छोटा परिवर्तन गढ़ को बर्बाद कर सकता है। नीचे मैं सैंडबॉक्स करना चाहता हूं।

क्या होता है जब pgpool विफल हो जाना चाहिए, लेकिन नहीं हो सकता?

जब मास्टर के लिए स्वास्थ्य जांच विफल हो जाती है, तो फ़ेलओवर_कमांड सभी को पतित करने या अगले दास को प्राथमिक में बढ़ावा देने के लिए निकाल दिया जाता है। ठोस लगता है। क्या होगा यदि यह स्वयं विफल हो जाता है, उदाहरण के लिए ssh कनेक्शन विफल हो जाता है (जैसे कि अन्य - खराब व्यवस्थापक ~/.ssh/authorized_keys से कुंजी हटा देता है)। हमारे पास क्या है?

जैसे ही health_check_timeout (डिफ़ॉल्ट 20) समाप्त हो जाता है (पुन:प्रयास में देरी, अधिकतम सेवानिवृत्त होने आदि से भी प्रभावित होता है) नोड मृत हो जाता है, इसलिए:

t=# select nid,port,st from dblink('host=localhost port=5433','show pool_nodes') as t (nid int,hostname text,port int,st text,lb_weight float,role text,cnt int,cur_node text,del int);
 nid | port |  st
-----+------+------
   0 | 5400 | down
   1 | 5401 | up
   2 | 5402 | up
(3 rows)

इसलिए कोई पुनर्प्रयास नहीं छोड़ा गया और विफलता विफल रही। पहला विकल्प स्पष्ट रूप से मैन्युअल रूप से विफलता कर रहा है। लेकिन अगर किसी मूर्खतापूर्ण त्रुटि के कारण विफलता विफल हो जाती है, तो मास्टर रेल पर वापस आ जाता है, और आपके पास एकमात्र समस्या यह है कि पीजीपूल यह सोच रहा है कि मास्टर ऑफ़लाइन है - आप शायद चीजों को छोड़ना चाहेंगे जैसे वे दुर्घटना से पहले हुआ करते थे - है ना? बेशक सिर्फ मास्टर को ऑनलाइन वापस ले जाना ही काफी नहीं है। Pgpool पहले से ही प्राथमिक "पतित" है। बस इसे एक नए नोड के रूप में जोड़ने से भी मदद नहीं मिलेगी। सबसे बुरी बात यह है कि, घटना के बाद, पीजीपूल यह जांचने की कोशिश नहीं करेगा कि पुराना मास्टर pg_is_in_recovery() है या नहीं, इस प्रकार इसे कभी भी प्राथमिक के रूप में स्वीकार नहीं करेगा। बग ट्रैक के अनुसार आपको pgpool -D कमांड के साथ "pgpool_status फ़ाइल को त्यागें और पिछली स्थिति को पुनर्स्थापित न करें" करना होगा।

स्थिति को त्यागने के बाद, हम सर्वर को अप्रत्याशित रूप से कनेक्शन बंद करने और चलाने से बचने के लिए फिर से कनेक्ट करते हैं:

t=# select nid,port,st,role from dblink('host=localhost port=5433','show pool_nodes') as t (nid int,hostname text,port int,st text,lb_weight float,role text,cnt int,cur_node text,del int);
 nid | port | st |  role
-----+------+----+---------
   0 | 5400 | up | primary
   1 | 5401 | up | standby
   2 | 5402 | up | standby
(3 rows)

सभी नोड बैक अप और चल रहे हैं, pgpool मास्टर को पहचानता है।

आखिरकार मैं pgpool का उपयोग करने के बारे में कुछ संकेत और टिप्पणियों को शामिल करना चाहता हूं:

  • बैकएंड सेटिंग्स बदलना थोड़ा मुश्किल है:नए नोड्स जोड़ने के लिए होस्टनाम, पोर्ट और निर्देशिका को पुनः लोड करने की आवश्यकता होती है, लेकिन मौजूदा संपादन के लिए पुनरारंभ की आवश्यकता होती है। जबकि वज़न और ध्वज को केवल पुनः लोड करके बदला जा सकता है।

  • कॉन्फ़िगरेशन के साथ लोड_बैलेंस_नोड कॉलम मानों को भ्रमित न करें। यदि आप केवल एक नोड को सत्य के साथ देखते हैं तो यह ठीक नहीं है - इसका मतलब है। इसका मतलब यह नहीं है कि आपके पास बैलेंसिंग पूल में केवल एक नोड है - यह सिर्फ दिखाता है कि इस विशेष सत्र के लिए कौन सा नोड चुना गया है। नीचे सभी तीन नोड्स के साथ क्वेरी परिणाम है जो सेलेक्ट स्टेटमेंट बैलेंसिंग में भाग ले रहे हैं, नोड आईडी 2 को चुना गया है:

    t=# show pool_nodes;
     node_id | hostname  | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay
    ---------+-----------+------+--------+-----------+---------+------------+-------------------+-------------------
     0       | localhost | 5400 | up     | 0.125000  | primary | 61         | false             | 0
     1       | localhost | 5401 | up     | 0.312500  | standby | 8          | false             | 0
     2       | localhost | 5402 | up     | 0.562500  | standby | 11         | true              | 0
    (3 rows)
  • आप जांच सकते हैं कि कौन सा नोड लोड संतुलन के लिए चुना गया था, लेकिन आप इसे अपनी क्वेरी के लिए जानना चाहते हैं, न कि "शो" के लिए, इसलिए इस तरह की जांच हमेशा पर्याप्त जानकारीपूर्ण नहीं होती है। ठीक है, आप निगरानी कर सकते हैं कि आप वर्तमान क्वेरी के लिए किस नोड का उपयोग करते हैं, कुछ इस तरह से:

    t=# select *,current_setting('port') from now();
                  now              | current_setting
    -------------------------------+-----------------
     2018-04-09 13:56:17.501779+01 | 5401
    (1 row)

जरूरी! लेकिन नहीं:

t=# select now, setting from now() join pg_settings on name='port';
             now             | setting
-----------------------------+---------
 2018-04-09 13:57:17.5229+01 | 5400
(1 row)

जैसा कि यह हमेशा मास्टर पोर्ट लौटाएगा। यही बात किसी भी pg_catalog SELECT पर लागू होती है।

  • जैसा कि आपने पिछले भागों में देखा था, मैं राज्य के साथ नोड्स को सूचीबद्ध करने के लिए सिर्फ पूल_नोड्स दिखाने की तुलना में अधिक जटिल तरीके का उपयोग करता हूं। मैं इसे जानबूझकर प्रदर्शित करने के लिए करता हूं कि आप परिणाम को कैसे प्रबंधनीय बना सकते हैं। जहां का उपयोग क्वेरी को लंबा बनाता है, लेकिन परिणाम स्पष्ट होता है, जो हमारे विशेष कार्य के लिए ध्यान भटकाने वाले सभी को छोड़ देता है। तुलना करें:

t=# select nid,port,st,role from dblink('host=localhost port=5433','show pool_nodes') as t (nid int,hostname text,port int,st text,lb_weight float,role text,cnt int,cur_node text,del int);
 nid | port | st |  role
-----+------+----+---------
   0 | 5400 | up | primary
   1 | 5401 | up | standby
   2 | 5402 | up | standby

प्रारंभिक शो पूल_नोड्स के आउटपुट के साथ...

  • आप pgbouncer और pgpool की तुलना नहीं कर सकते। लेकिन यदि आप करते हैं, तो यह जानना सबसे महत्वपूर्ण है कि पीजीपूल में पार्सिंग क्वेरी पीजी संस्करण पर निर्भर करती है। इसलिए postgreSQL को अपग्रेड करते समय, आपको pgpool को भी अपग्रेड करना होगा, जबकि एक pgbouncer इंस्टेंस में एक ही ini फाइल में 8,9,10 अलग-अलग क्लस्टर के लिए कॉन्फिगरेशन हो सकता है।

  • मैं pgpool के बजाय केवल एक फ़ेलओवर स्क्रिप्ट का उपयोग क्यों नहीं कर सकता? तुम कर सकते हो। लेकिन pgpool इसे memcached और कनेक्शन पूलिंग और बैलेंसिंग और स्प्लिट ब्रेन कंट्रोल के साथ प्रदान करता है और दशकों के उपयोग से इसकी जाँच की जाती है।

  • बग ट्रैकिंग सिस्टम मौजूद है - अगर आप pgpool के साथ काम करते हैं तो इसे देखने लायक है:https://www.pgpool.net/mantisbt/my_view_page.php

  • प्रलेखन में कई टाइपो, जैसे बैकेंस (बैकएंड + बैलेंस? ..), स्टेटमनेट, स्वीकृत या बेमेल संस्करण में (पूल_नोड्स इंट हुआ करते थे और अब एनम हैं, लेकिन पीसीपी_नोड-इन्फो में पुराने मानों का लिंक अभी भी है) इंप्रेशन खराब करता है इस अद्भुत उत्पाद पर। दस्तावेज़ में पाए गए "बग" पर रिपोर्ट भेजने के लिए एक फ़ॉर्म (ठीक उसी तरह जैसे पोस्टग्रेज़ डॉक्स पर "सुधार सबमिट करें"), हालांकि इसमें बहुत सुधार होगा।

  • महत्वपूर्ण युक्ति: किसी भी कदम पर भरोसा करने से पहले - उसकी जांच कर लें। उदा. नोड को बढ़ावा देने के बाद आप इसे पुन:प्रचारित नहीं कर सकते (यहाँ प्रचार करना पोस्टग्रेज ऑपरेशन नहीं है, बल्कि नोड को पीजीपूल के लिए मास्टर के रूप में पंजीकृत करना है):

    [email protected]:~# sudo -u postgres pcp_promote_node -w -h 127.0.0.1 -U vao -n 1
    pcp_promote_node -- Command Successful
    [email protected]:~# sudo -u postgres pcp_promote_node -w -h 127.0.0.1 -U vao -n 1
    FATAL:  invalid pgpool mode for process recovery request
    DETAIL:  specified node is already primary node, can't promote node id 1

तर्क लगता है और बहुत अच्छा लगता है। फिर भी, यदि आप इसे गलत नोड के विरुद्ध चलाते हैं (जैसे, नोड 0 है ! pg_is_in_recovery):

[email protected]:~# for i in $(seq 1 3); do pcp_promote_node -w -h 127.0.0.1 -U vao -n 0; echo $?; done
pcp_promote_node -- Command Successful
0
pcp_promote_node -- Command Successful
0
pcp_promote_node -- Command Successful
0

जो खराब है क्योंकि आप नोड को फिर से प्रचारित नहीं कर सकते हैं और एक त्रुटि की उम्मीद नहीं कर सकते हैं, लेकिन आपको बाहर निकलने की स्थिति 0 मिल जाती है…

आज श्वेतपत्र डाउनलोड करें क्लस्टरकंट्रोल के साथ पोस्टग्रेएसक्यूएल प्रबंधन और स्वचालन इस बारे में जानें कि पोस्टग्रेएसक्यूएल को तैनात करने, मॉनिटर करने, प्रबंधित करने और स्केल करने के लिए आपको क्या जानना चाहिए। श्वेतपत्र डाउनलोड करें

महत्वपूर्ण युक्ति:बहुत अधिक न खेलें। उत्पाद पर कभी न खेलें!

pg_rewind का उपयोग करके पुनर्प्राप्ति_1st_stage_command के साथ खेलते हुए, मैंने जिज्ञासा से एक और बंदर हैक की कोशिश करने के बारे में सोचा - बिना तर्क के pgpool_recovery() को क्वेरी करना (जैसा कि मैं उन्हें वैसे भी अपने सेट अप में अनदेखा करता हूं) और फिर बस नोड को pgpool में संलग्न करने का प्रयास कर रहा हूं:

[email protected]:~# psql -p 5433 -h localhost template1 -c "SELECT pgpool_recovery('or_1st.sh', '', '', '')"
 pgpool_recovery
-----------------
 t
(1 row)

[email protected]:~# pcp_attach_node -h 127.0.0.1 -U vao -w -n 1
pcp_attach_node -- Command Successful

इस बेवकूफी भरे विचार ने मुझे यहां तक ​​पहुंचाया:

[email protected]:~# ps -aef | grep pgpool
postgres 15227     1  0 11:22 ?        00:00:00 pgpool -D
postgres 15240 15227  0 11:22 ?        00:00:00 pgpool: health check process(0)
postgres 15241 15227  0 11:22 ?        00:00:00 pgpool: health check process(1)
postgres 15242 15227  0 11:22 ?        00:00:00 pgpool: health check process(2)
postgres 15648 15227  0 11:24 ?        00:00:00 [pgpool] <defunct>
postgres 16264 15227  0 11:26 ?        00:00:00 pgpool: PCP: wait for connection request
postgres 16266 15227  0 11:26 ?        00:00:00 [pgpool] <defunct>
postgres 16506 16264  0 11:26 ?        00:00:00 pgpool: PCP: processing recovery request
postgres 16560 15227  0 11:26 ?        00:00:00 [pgpool] <defunct>
postgres 16835 15227  0 11:26 ?        00:00:00 [pgpool] <defunct>
postgres 16836 15227  0 11:26 ?        00:00:00 [pgpool] <defunct>

मुझे बचना नहीं है:

[email protected]:~# kill -9 
[email protected]:~# rm /var/run/pgpoolql/.s.PGSQL.5433
[email protected]:~# rm /var/run/pgpoolql/.s.PGSQL.9898

5433 से ऊपर पीजीपूल पोर्ट है और 9898 पीसीपी पोर्ट है। स्पष्ट रूप से क्रैश के बाद, फ़ाइलें नहीं बहती हैं, इसलिए आपको इसे मैन्युअल रूप से करना होगा।

  • पीजीपूल को प्रोडक्शन में ले जाने से पहले ध्यान से पढ़ें और खूब खेलें। पीजीपूल के साथ सहायता प्राप्त करना बहुत कठिन है, फिर खुद को पोस्ट करता है। कुछ सवालों के जवाब कभी नहीं मिलते। खासकर जब गलत जगह पर पूछा गया (मैंने जवाब पाने के लिए सही जगह के आधार पर इसका जवाब दिया)...
  • कैस्केडिंग प्रतिकृति के लिए नवीनतम समयरेखा को न भूलें (वास्तव में पीजीपूल संकेत नहीं, लेकिन अक्सर लोग यह नहीं समझते हैं कि एक नया मास्टर लेने के लिए रिसीवर के लिए एक सही समापन बिंदु निर्दिष्ट करना पर्याप्त नहीं है)।
  • ली>
  • आरेख के साथ वास्तुकला यहां पाई जा सकती है।

निष्कर्ष

10 वर्षों में नई आशाजनक विशेषताएं (वॉचडॉग और वर्चुअल आईपी) और महत्वपूर्ण सुधार (जैसे serialize_accept) दिखाई दिए, लेकिन कुल मिलाकर यह एक कम प्रभाव डालता है। डॉक्स में टाइपो हैं जो वहां 10 वर्षों से रह रहे हैं। मुझे विश्वास नहीं है कि कोई भी दस्तावेज़ नहीं पढ़ता है। मुझे विश्वास नहीं है कि किसी ने ध्यान नहीं दिया। आप उन्हें किसी भी आसान तरीके से रिपोर्ट नहीं कर सकते। नौसिखिए उपयोगकर्ता को पैर के खिलाफ इंगित करने और ट्रिगर खींचने के लिए प्रलेखन साइट पर बहुत सारी बंदूकें भरी हुई और तैयार की गई हैं। मुझे नहीं पता कि इसे कैसे सुधारा जाए - मैं सिर्फ निशानेबाजों को चेतावनी दे रहा हूं। एक पैरामीटर की गलत व्याख्या करना आपको अपनी गलती खोजने के लिए रिवर्स इंजीनियरिंग की हताश स्थिति में डाल सकता है। इन सभी वर्षों में pgpool उन्नत उपयोगकर्ताओं के लिए एक उत्पाद की तरह हुआ करता था और बना रहता है। प्रलेखन पढ़ना मैं शर्लक होम्स के बारे में पुराने रूसी मजाक को याद नहीं कर सका:शर्लक और वाटसन गुब्बारे पर उड़ते हैं। अचानक तेज हवा उन्हें हजारों मील दूर उड़ा देती है। जब वे उतर सकते हैं, तो वे लड़की को भेड़ चरते हुए देखते हैं। होम्स लड़की से पूछता है:"प्रिय, हम कहाँ हैं?" और लड़की जवाब देती है "आप गुब्बारे पर हैं!"। शर्लक धन्यवाद और जैसे ही वे उड़ान भरते हैं कहते हैं "हवा हमें बहुत दूर ले गई - हम रूस में हैं"। "लेकिन आप कैसे जानते हैं?" वाटसन पूछता है। "यह स्पष्ट है - केवल रूस में कोडर्स भेड़ चरते हैं" शर्लक जवाब देता है। "लेकिन आप कैसे जानते हैं कि लड़की कोडर है?" - "यह स्पष्ट है - उसने हमें बिल्कुल सटीक और पूरी तरह से बेकार जवाब दिया"।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle से PostgreSQL:ANSI बाहरी PostgreSQL में सिंटैक्स में शामिल हों

  2. JSON पर PostgreSQL इंडेक्स

  3. PostgreSQL के लिए अपग्रेड प्रक्रिया का स्वचालित परीक्षण

  4. PostgreSQL में INSERT या UPDATE से प्रभावित रिकॉर्ड्स की संख्या प्राप्त करें

  5. गैर-विशेषाधिकार प्राप्त बेनामी एक्सेस के माध्यम से PostgreSQL में उपयोगकर्ता खातों का स्व-प्रावधान