C # में DB ऑटो फेलओवर तब काम नहीं करता जब प्रिंसिपल सर्वर फिजिकली ऑफलाइन हो जाता है


9

मैं SQL सर्वर 2008 के साथ C # में DB ऑटो फ़ेलओवर की स्थापना कर रहा हूँ और मेरे पास एक साक्षी सेटअप का उपयोग करके 'ऑटोमैटिक फ़ेलओवर दर्पण के साथ उच्च सुरक्षा' है और मेरा कनेक्शन स्ट्रिंग जैसा दिखता है

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

परीक्षण के दौरान, जब मैं प्रिंसिपल सर्वर पर SQL सर्वर सेवा को बंद कर देता हूं तो ऑटो फेलओवर एक आकर्षण की तरह काम करता है, लेकिन अगर मैं प्रिंसिपल सर्वर को ऑफलाइन लेता हूं (सर्वर को बंद करके या नेटवर्क कार्ड को मारकर) ऑटो फेलओवर काम नहीं करता है और मेरा वेबसाइट सिर्फ समय बाहर।

मुझे यह लेख मिला जहां दूसरी आखिरी पोस्ट से पता चलता है कि इसकी वजह से हम नामित पाइप का उपयोग कर रहे हैं जो प्रिंसिपल के ऑफ़लाइन होने पर काम नहीं करता है, लेकिन हम टीसीपी को अपने कनेक्शन स्ट्रिंग में मजबूर करते हैं।

मुझे यह DB ऑटो फेलओवर काम करने के लिए क्या याद आ रहा है?


क्या इसके लिए [C #] टैग की आवश्यकता है? यह किसी भी तरह से C # के लिए विशिष्ट प्रतीत नहीं होता है।
गाबे

जवाबों:


6

एक सप्ताह के लिए एमएस के साथ काम करने के बाद, हमने काम किया है कि ऐसा क्यों होता है।

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

यह पुष्टि करने की प्रक्रिया कि डेटाबेस विफल हो गया है (सभी डिफ़ॉल्ट टीसीपी रजिस्ट्री सेटिंग्स के साथ):

  1. प्रिंसिपल के साथ संवाद करने की कोशिश करें, देखें कि यह प्रिंसिपल नहीं है
  2. फेलओवर के साथ यह सुनिश्चित करने के लिए संवाद करें कि यह विफल हो गया है और यह अब नया प्रिंसिपल है।

जब प्रिंसिपल नीचे होता है, तो यह संचार लगभग 21 सेकंड लेता है क्योंकि यह होगा:

  1. प्रिंसिपल के साथ संवाद करने की कोशिश करें, 3 सेकंड प्रतीक्षा करें, टाइमआउट
  2. प्रिंसिपल के साथ फिर से संवाद करने की कोशिश करें, 6 सेकंड प्रतीक्षा करें, टाइमआउट
  3. प्रिंसिपल के साथ फिर से संवाद करने की कोशिश करें, 12 सेकंड प्रतीक्षा करें, समय समाप्त
  4. फेलओवर पार्टनर के साथ संवाद करने की कोशिश करें, देखें कि यह विफल हो गया है, इसलिए एप्लिकेशन में विफल हो गया।

इसलिए यदि आपका sql कनेक्शन 21 सेकंड (शायद वास्तविकता में अधिक) प्रतीक्षा नहीं कर रहा है, तो इससे पहले कि यह नृत्य समाप्त हो जाए और यह बिल्कुल भी विफल न हो।

समाधान आपके कनेक्शन स्ट्रिंग में बड़े समय के लिए टाइमआउट सेट करना है, हम सुरक्षित होने के लिए केवल 60 सेकंड का उपयोग करते हैं।

चियर्स


0

मुझे आश्चर्य हो रहा है कि क्या आपके परीक्षणों के समय स्वचालित फेलओवर की शर्तें पूरी नहीं हो रही हैं? विशेष रूप से - यदि डेटाबेस दर्पण के साथ सिंक्रनाइज़ नहीं किया गया है (विफलता के समय sys.database_mirroring से स्थिति देखें) और / या अगर उस समय गवाह और दर्पण जुड़े नहीं हैं (प्रतिभागी भूमिकाओं के बीच पिंग्स के माध्यम से परीक्षण)।

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

या आप कह रहे हैं कि असफलता आखिरकार होती है, लेकिन आपका पुन: कनेक्शन विफल हो जाता है? इस मामले में, पता लगाने और विफल होने का समय इस बात पर निर्भर करता है कि प्रिंसिपल विफल कैसे हुआ और दर्पण db को पुनर्प्राप्त करने के लिए कुल समय।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.