PostgreSQL - अतुल्यकालिक प्रतिकृति + पूलिंग + विफलता

Postgresql 9.1-आधारित अतुल्यकालिक मास्टर-दास प्रतिकृति विकल्प


पहली बार, कार्य पूर्ण प्रतिकृति को पूरी तरह से लागू करना था, और पहली बार एक मिनी-मैनुअल लिखा गया था, जिसे मैं यहां पेश करना चाहता हूं।

मास्टर स्लेव प्रतिकृति प्रणाली के लिए, एक संयोजन का उपयोग किया गया था।


Bucardo

Asynchronous Postgres प्रतिकृति प्रणाली Perl5 में लिखी गई है।

यह डेटाबेस में परिलक्षित पोस्टग्रेज और आसान ट्यूनिंग के लिए सुविधाजनक है।

अपना खुद का डेटाबेस बनाता है, जिसमें प्रतिकृति सर्वर, डेटाबेस, टेबल दर्ज किए जाते हैं, जो शीट (सूची) में संलग्न हैं।
संचार प्रकार पुशडेल्टा (ट्रिगर है। एक तरह से मास्टर-दास)।
संरचना को बदलने का समर्थन नहीं करता है। यह दोनों तरीकों से काम करता है, अर्थात मास्टर के अस्थायी बंद होने के मामले में, जब इसे बहाल किया जाता है, तो यह दास के साथ स्वचालित रूप से "पकड़" करेगा।

जादूगर पर बुकार्डो स्थापित करने के लिए एक अनुमानित योजना:

sudo aptitude install bucardo # + install Perl mods (DBI, DBD::Pg, DBIx::Safe) sudo bucardo_ctl install # connection settings 


इसके बाद, मैन्युअल रूप से नियंत्रण डेटाबेस बुकार्डो बनाएं, इसे bucardo.schema से भरें (डिफ़ॉल्ट रूप से यह 8.4 से जुड़ा हुआ है और पुराने संस्करणों में नियंत्रण डेटाबेस के स्वत: निर्माण के साथ एक मिसफायर है)

  sudo bucardo_ctl add db bucardo_dbname name=master_dbname #  - # +      bucardo.db (   ) sudo bucardo_ctl add db bucardo_dbname name=slave_dbname #  - sudo bucardo_ctl add table tbl_name db=bucardo_dbname herd=source_name #     (herd) sudo bucardo_ctl add sync sync_name type=pushdelta source=herd_name targetdb=slave_dbname #     sudo bucardo_ctl start #   


मैंने इसे दास पर स्थापित किया, लेकिन इसे इसमें नहीं भरा (क्योंकि केवल एक दास है और वहाँ से कहीं और जाना नहीं है)

PgPool द्वितीय

पर्याप्त अवसर हैं, मैनुअल की कमी से ग्रस्त हैं। यह समानांतर प्रश्नों, भार संतुलन, पूल द्वारा डेटाबेस कनेक्शन के वितरण का समर्थन करता है, और यह फेलोवर भी है, अर्थात्। कनेक्शन समस्याओं के मामले में मास्टर से गुलाम और वापस स्वचालित स्विच।

यह रिपॉजिटरी से डेबियन पर स्थापित है, यह पोस्टग्रेज के संस्करण पर निर्भर नहीं करता है।
  sudo aptitude install pgpool2 


/ Etc / pgpool2 /


मैंने PgPool को एक खींचने वाले, एक लोड बैलेंसर के रूप में और, सबसे महत्वपूर्ण रूप से, एक फ़िलर के रूप में इस्तेमाल किया।

विज़ार्ड के लिए उदाहरण /etc/pgpool2/pgpool.conf (आंशिक रूप से) सेट करना:
  listen_addresses = '*' port = 9999 socket_dir = '/var/run/postgresql' pcp_port = 9898 pcp_socket_dir = '/var/run/postgresql' backend_hostname0 = master_server backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/master_data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = slave_server backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/slave_data' backend_flag1 = 'ALLOW_TO_FAILOVER' connection_cache = on replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' parallel_mode = on pgpool2_hostname = '' system_db_hostname = master_server system_db_port = 5432 system_db_dbname = 'pgpool' system_db_schema = 'pgpool_catalog' system_db_user = 'pgpool' system_db_password = '' failover_command = '/etc/pgpool2/failover.sh %d %P %H %R' recovery_user = 'postgres' recovery_password = '' recovery_1st_stage_command = '/etc/pgpool2/recovery_1st_stage.sh' recovery_2nd_stage_command = '' recovery_timeout = 90 client_idle_limit_in_recovery = 0 


इसके अलावा / etc / pgpool2 / लिपियों में निम्न निर्दिष्ट सामग्री के साथ बनाया जाता है:

`` failover.sh '' - वास्तव में एक स्क्रिप्ट जो दुर्घटना के मामले में चलती है
  #!/bin/bash -x FALLING_NODE=$1 # %d OLDPRIMARY_NODE=$2 # %P NEW_PRIMARY=$3 # %H PGDATA=$4 # %R if [ $FALLING_NODE = $OLDPRIMARY_NODE ]; then if [ $UID -eq 0 ] then su postgres -c "ssh -T postgres@$NEW_PRIMARY touch $PGDATA/trigger" else ssh -T postgres@$NEW_PRIMARY touch $PGDATA/trigger fi exit 0; fi; exit 0; 

'' Recovery_1st_stage.sh '' - एक बात कर नाम के साथ स्क्रिप्ट
  #!/bin/bash -x PGDATA=$1 REMOTE_HOST=$2 REMOTE_PGDATA=$3 PORT=5432 PGHOME=/home/yugo-n/pgsql-9.2.1 ARCH=$PGHOME/data/arch rm -rf $ARCH/* ssh -T postgres@$REMOTE_HOST " LD_LIBRARY_PATH=$PGHOME/lib:LD_LIBRARH_PATH; rm -rf $REMOTE_PGDATA $PGHOME/bin/pg_basebackup -h $HOSTNAME -U r_user -D $REMOTE_PGDATA -x -c fast rm $REMOTE_PGDATA/trigger" ssh -T postgres@$REMOTE_HOST "rm -rf $ARCH/*" ssh -T postgres@$REMOTE_HOST "mkdir -p $REMOTE_PGDATA/pg_xlog/archive_status" ssh -T postgres@$REMOTE_HOST " cd $REMOTE_PGDATA; cp postgresql.conf postgresql.conf.bak; sed -e 's/#*hot_standby = off/hot_standby = on/' postgresql.conf.bak > postgresql.conf; rm -f postgresql.conf.bak; cat > recovery.conf << EOT standby_mode = 'on' primary_conninfo = 'host="$HOSTNAME" port=$PORT user=r_user' restore_command = 'scp $HOSTNAME:$ARCH/%f %p' trigger_file = '$PGDATA/trigger' EOT " 


एक महत्वपूर्ण बिंदु! यह आवश्यक है कि pgpool द्वारा उपयोग की जाने वाली सभी फाइलें / फ़ोल्डर स्वामी के साथ हैं :: पोस्टग्रेज

स्लेव के लिए सब कुछ लगभग समान है, केवल मास्टर_स्लेव_मोड = ऑफ और फेलओवर_कमांड = '

PgPool को सबसे सरल कंसोल द्वारा लॉन्च किया गया है
 sudo pgpool 


इस प्रकार, हम लोड संतुलन और फाइलर के साथ मास्टर मोनोस्लेव प्रतिकृति प्राप्त करते हैं।

कनेक्शन हमेशा केवल pPPool'a पोर्ट (यहां - 9999) के माध्यम से मास्टर के लिए होता है।
सामान्य ऑपरेशन के दौरान, मास्टर में एक रिकॉर्ड होता है, बैकएंड को दास को दोहराया जाता है, और रीडिंग दोनों से की जाती है।
यदि दास को बंद कर दिया जाता है, जब वह अपने ऑपरेशन को फिर से शुरू करता है, तो डाउनटाइम के सभी डेटा स्वचालित रूप से दोहराया जाता है।
विज़ार्ड को डिस्कनेक्ट करने के मामले में, उपयोगकर्ता कनेक्शन को तोड़े बिना, पगपुल रीडायरेक्ट को पूरी तरह से प्रतिकृति में पढ़ता और लिखता है, अस्थायी रूप से इसे "विज़ार्ड" बनाता है। विज़ार्ड को बढ़ाते समय, यह दास से सभी डेटा को पकड़ता है और उपयोगकर्ता कनेक्शन को तोड़ने के बिना फिर से वापस स्विच करता है।

इसमें एक निश्चित समस्या यह है कि किसी भी तरह से राइट्स मैनेजमेंट बनाना संभव नहीं था, इसलिए एक जीवित मास्टर के साथ, केवल आरओ को दास को अनुमति दी जाएगी, और जब यह गिर गया, तो वे आरडब्ल्यू को स्विच करेंगे (और फिर इसे वापस बहाल करेंगे), लेकिन जब से बाहरी लोग केवल चले जाते हैं मास्टर का पता, खतरा केवल डेवलपर्स के चंचल पेन में रहता है।

मुझे उम्मीद है कि लेख शुरुआती डीबीए में आवेदन प्राप्त करेगा।
और आप सभी का ध्यान देने के लिए धन्यवाद!

Source: https://habr.com/ru/post/In158731/


All Articles