2016-11-30 9 views
16

मेरे पास दो लिनक्स सर्वर हैं (A और B) PostgreSQL 9.5 डेटाबेस स्थापित के साथ। documentation में वर्णित अनुसार मैंने हॉट स्टैंडबाय मोड कॉन्फ़िगर किया है। इस सेटअप में, A को हॉट स्टैंडबाय मोड में मास्टर, B के रूप में कॉन्फ़िगर किया गया है। यह अच्छी तरह से काम कर रहा है और उम्मीद के रूप में व्यवहार करता है।एक जावाईई अनुप्रयोग में PostgreSQL हॉट स्टैंडबाय सेटअप के लिए कनेक्शन विफलता को कॉन्फ़िगर कैसे करें?

अब, मैं इस डेटाबेस सेटअप करने के लिए एक TomEE डेटा स्रोत के माध्यम से Hibernate/JDBC के माध्यम से एक स्वतंत्र Java EE आवेदन (एक अलग मशीन पर चल) जुड़ना चाहते हैं।

PostgreSQL driver प्रलेखन राज्यों, जो एक से अधिक मेजबान JDBC कनेक्शन URL में निर्दिष्ट किया जा सकता है:

jdbc:postgresql://host1:port1,host2:port2/database 

तो मेरी प्रश्न हैं:

  1. तो A नीचे है और B सामान्य करने के लिए मैन्युअल रूप से स्विच कर दिया गया ऑपरेशन मोड, क्या मेरा आवेदन अभी भी ऊपर बताए गए एक जेडीबीसी कनेक्शन यूआरएल के साथ डेटाबेस ऑपरेशन के साथ आगे बढ़ने में सक्षम है?
  2. क्या मुझे अन्य पैरामीटर/पुस्तकालयों को कॉन्फ़िगर करना है?

नोट: विभिन्न स्रोतों मुझे पता चला, कि PostgreSQL स्वत: विफलता का समर्थन नहीं करता (जब तक कि तीसरे पक्ष के सॉफ़्टवेयर की प्रक्रिया में शामिल किया जाता है - नीचे टिप्पणी देखें) से। इस कारण से, फेलओवर को मैन्युअल रूप से करने की आवश्यकता है, जो इस विशेष उपयोग-मामले के लिए ठीक है।

संपादित-1:

मैं pgBouncer परीक्षण करने के लिए (के रूप में टिप्पणी में सुझाव दिया) एक वैकल्पिक हल के लिए फैसला किया। यह मेरे उपयोग-मामले के लिए अच्छा काम करता है। ,

  1. लगातार जांच करता है, तो A अभी भी जीवित है और आने वाले कनेक्शन के लिए सुनता है: मैं एक प्रहरी स्क्रिप्ट, जो मैनुअल चरणों को स्वचालित लिखा था।
  2. विफलता के मामले में, सामान्य ऑपरेशन मोड में B स्विच करें और इसे नया मास्टर बनें और सेवा को पुनरारंभ करें।
  3. pgBouncerA के बजाय B पर इंगित करने के लिए सेटिंग को बदलें और सेवा को पुनरारंभ करें।

हालांकि, अगर कोई तीसरे पक्ष के सॉफ्टवेयर के बिना अनुभव करता है, तो भी मुझे दिलचस्पी होगी?

+2

सबसे आसान सेटअप दो सर्वर के सामने pgBouncer या pgPool की तरह कुछ रखा है और अपने आवेदन के माध्यम से कनेक्ट करने के लिए है। –

+0

@a_horse_with_no_name आपके संकेत के लिए धन्यवाद। क्या आप अब pgPool (उबंटू रिपॉजिटरीज़ से) स्थापित करने के लिए कोई उपयोगी मार्गदर्शिका है, जिसे आप अनुशंसा करेंगे? – rzo

+1

मेरे पास एक मास्टर के साथ एक समान सेटअप है और एक केवल गर्म स्टैनबी पोस्टग्रेस्क्ल 9.6 सर्वर पढ़ता है। उनके सामने एक pgbouncer चल रहा है। मैं pgbouncer config फ़ाइल की एक पंक्ति को बदलकर आसानी से नए मास्टर पर स्विच कर सकता हूं। मैंने स्वचालित फेलओवर क्लस्टर (कोरोसिनक और पेसमेकर के साथ) के बारे में कागजात पढ़े हैं, लेकिन वे मेरे लिए बहुत जटिल थे। यदि आपको उन्नत लिनक्स सिस्टम प्रशासन के साथ अनुभव है तो आपको उन्हें आजमाएं। http://clusterlabs.org/ –

उत्तर

8

इस तरह की स्थितियों में, परीक्षण और मापने के लिए शायद सबसे अच्छा है।

मेरे पास PostrgeSQL हॉट स्टैंडबाय मोड के साथ 'हैंड-ऑन' अनुभव नहीं है, लेकिन मैंने जावा एप्लिकेशन के लिए डेटाबेस विफल हो गया है।

पहले, ?targetServerType=master पैरामीटर (पृष्ठ के तल पर उल्लेख किया) के बारे में PostgreSQL driver प्रलेखन पेज पर दावों का परीक्षण करें।
एक मुख्य जावा विधि के साथ एक छोटा जावा "पीजीएचएसएम" वर्ग लिखें जो DriverManager.getConnection के माध्यम से PostgreSQL जेडीबीसी ड्राइवर का उपयोग करता है और एक साधारण अद्यतन क्वेरी चलाता है।
इसे अद्यतन क्वेरी करने के लिए सर्वर ए का उपयोग करना चाहिए। सर्वर ए पर PostgreSQL रोकें, PgHsm चलाएं: यह कनेक्ट करने में विफल होना चाहिए क्योंकि सर्वर बी मास्टर नहीं है।
सर्वर बी मास्टर बनाएं, PgHsm चलाएं: इसे ठीक चलाना चाहिए।

डेटासोर्स को टॉमईई में डेटाबेस कनेक्शन पूल द्वारा समर्थित किया जाता है। This page टॉमईई में उपलब्ध लोगों को सूचीबद्ध करता है। लेकिन सभी डेटाबेस कनेक्शन पूल बराबर नहीं हैं और अब मैं हिकारीसीपी पसंद करता हूं क्योंकि, मेरे अनुभव में, यह "डेटाबेस डाउन" परिदृश्य को अधिक अनुमानित रूप से संभालता है। HikariCP के handling database down पृष्ठ पर परिणामों के साथ परीक्षण भी देखें।

दुर्भाग्य से, HikariCP JDBC के get/setNetworkTimeout का उपयोग करता है जाहिर व्यवहार करने के लिए और PostgreSQL JDBC ड्राइवर does not implement this। इसलिए यह सुनिश्चित करने के लिए कि (जावाईई) अनुप्रयोग धागे डेटाबेस कार्रवाई पर हमेशा के लिए नहीं लटकाएंगे, आपको connectTimeout और socketTimeout जेडीबीसी ड्राइवर विकल्प सेट करने की आवश्यकता है। socketTimeout सेट करना अनिश्चित है क्योंकि यह स्वचालित रूप से डेटाबेस के सभी प्रश्नों के लिए समय सीमा निर्धारित करता है।

प्रदर्शन करने के लिए दूसरे परीक्षण में जावा "पीजीएचएसएम" कक्षा को आपके के डेटाबेस कनेक्शन पूल कार्यान्वयन का उपयोग करने के लिए अद्यतन करना शामिल है और (कम से कम) दो धागे शुरू करें जो लगातार लूप में सरल अपडेट क्वेरी चलाते हैं (लूप में डेटाबेस कनेक्शन पूल से प्राप्त किया जाता है और प्रतिबद्ध/रोलबैक के बाद पूल में लौटाया जाता है)। जब आप सर्वर ए को नीचे लाते हैं और सर्वर बी को "मास्टर" मोड में स्विच करते हैं, तो "PgHsm" द्वारा लॉग अप किए गए अपवादों की निगरानी करें और डेटाबेस कार्रवाई करने पर थ्रेड कितना समय तक प्रतीक्षा/लटकता है।
परीक्षणों के परिणाम जेडीबीसी ड्राइवर विकल्पों और पूल सेटिंग्स को अद्यतन करने के लिए उपयोग किए जा सकते हैं। परिणाम पर ध्यान दें जहां:

  • अवैध कनेक्शन जितनी जल्दी हो सके पूल से हटा दिया जाता है ताकि अनुप्रयोग पूल
  • संभव के रूप में कुछ आवेदन धागे समय की कम से कम राशि के लिए लटका (से ज्यादातर वैध कनेक्शन हो जाता है) जब एक डेटाबेस

दूसरा परीक्षण सर्वर ए पर निर्भर करता है तो उपलब्ध नहीं है ताकि कनेक्शन परीक्षण क्वेरी (डेटाबेस कनेक्शन पूल द्वारा निष्पादित) विफल हो जाएं। ऐसे मामले में जहां दोनों सर्वर उपलब्ध रहते हैं, लेकिन मास्टर और गुलाम स्विच, एक कनेक्शन परीक्षण क्वेरी की सहायता नहीं करेगी और डेटाबेस कनेक्शन पूल एप्लिकेशन के लिए गलत (अब केवल पढ़ने के लिए) डेटाबेस कनेक्शन प्रदान करेगा। उस स्थिति में, मैन्युअल हस्तक्षेप की आवश्यकता है। ए 'असफल ओवर पैटर्न "HikariCP के लिए here वर्णन किया गया है (केवल उपलब्ध विकल्प allowPoolSuspensionconfiguration पृष्ठ पर वर्णित के साथ):

  • suspendPool()
  • softEvictConnections()
  • प्रतीक्षा जब तक activeConnections 0 को जाता है ।
  • resumePool()

तीसरे टेस्ट JavaEE आवेदन के साथ और अब तक हो जाएगा, तो आप एक अच्छा आईडीई होना चाहिए एक समस्या क्या उम्मीद है। "डेटाबेस डाउन" परिदृश्य (जैसे सेटिंग (डिफ़ॉल्ट) query-timeouts) को संभालने में सुधार के लिए इन प्रकार के परीक्षणों के बाद एप्लिकेशन को अपडेट करना असामान्य नहीं है। आपके मामले में, मैन्युअल फेलओवर के दौरान उपयोग करने के लिए "निलंबित, फ्लश और डेटाबेस कनेक्शन पूल फिर से शुरू करें" सुविधा (ऊपर वर्णित पैटर्न) भी वांछनीय होगा।

+0

बहुत गहरा जवाब! – MWiesner

+0

आपके उत्तर में आपके विस्तृत स्पष्टीकरण के लिए धन्यवाद। यह मेरी सेटिंग में व्यवहार का परीक्षण करने के लिए शुरू करने के लिए एक अच्छा तरीका लगता है। – rzo

संबंधित मुद्दे

 संबंधित मुद्दे