मैंटीकोर खोज (जैसे कि स्फिंक्स) अभी तक सादा या आरटी सूचकांकों के लिए प्रतिकृति सीधे-सीधे समर्थित नहीं करता (हालांकि हम इस पर काम कर रहे हैं, यदि आप बीटा परीक्षक बनना चाहते हैं तो हमें [email protected] पर संपर्क करें), इसलिए आपको स्वयं इसे लागू करना होगा यदि आपको अपने मैंटीकोर खोज / स्फिंक्स डेटा की एक प्रति कहीं और चाहिए। आपको इसकी आवश्यकता क्यों हो सकती है:
- स्केलेबिलिटी: आप अपने सर्वर पर लोड को संतुलित करना चाहते हैं (उदाहरण के लिए, आप सभी मैंटीकोर प्रश्नों का आधा एक सर्वर पर भेज सकते हैं और बाकी दूसरे पर) थ्रूपुट बढ़ाने, विलंबता या सर्वर पर लोड कम करने के लिए
- उच्च उपलब्धता: आप मैंटीकोर सूचकांक प्रतिकृतियां रखना चाहते हैं जो तुरंत उपलब्ध हों जब मुख्य मैंटीकोर भंडारण किसी कारण से अनुपलब्ध हो जाए
- आप दोनों को स्वचालित समस्या पहचान और सर्वरों के बीच स्विचिंग के साथ जोड़ना चाहते हैं (जैसे जब एक सर्वर क्रैश हो जाता है तो दूसरा स्वचालित रूप से सभी प्रश्नों को संभालना शुरू कर देता है)
सादा सूचकांक प्रतिकृति का सबसे आसान तरीका बस अपना मैंटीकोर कॉन्फ़िग दूसरे सर्वर पर कॉपी करना और वहां ‘इंडेक्सर’ का उपयोग करके सब कुछ इंडेक्स करना है, लेकिन इस मामले में बुरा यह है कि सबसे पहले सूचकांक को पुनर्निर्माण के लिए आवश्यक संसाधनों की बर्बादी है और दूसरा, अच्छे डेटा सिंक्रोनाइज़ेशन स्तर प्रदान करना कठिन है: मैंटीकोर सादा सूचकांक अलग-अलग स्रोत से पुनर्निर्मित होंगे (जैसे आका मुख्य डेटाबेस), उन्हें अंत में एक जैसा होना चाहिए, लेकिन यह कुछ विलंबता के साथ हो सकता है, क्योंकि कोई सर्वर थोड़ा अधिक लोड पर है या आप स्रोत को गहनता से अपडेट करते हैं, कई कारण हो सकते हैं।
यहां एक तरीका है जो यह सुनिश्चित करेगा कि प्रतिकृतियां 100% समान हैं और डेटा दिखने में न्यूनतम विलंबता है:
- केवल एक जगह पर इंडेक्सिंग करें (इसे MASTER कहते हैं)
- rsync या कुछ और का उपयोग करके SLAVE पर कॉपी करें (या यदि आप स्लेव पर चला रहे हैं तो MASTER से)
- सभी जगहों पर मैंटीकोर को बताएं कि वह नया पुनर्निर्मित डेटा उपयोग करना शुरू कर दे
यहां एक उदाहरण है कि यह कैसे दिख सकता है:
मास्टर पर इंडेक्सेशन
यहां चाल यह है कि एक नया “छद्म” सूचकांक बनाएं जो पूरी तरह से आपके सामान्य सूचकांक से विरासत में मिला हो, केवल “पथ” संशोधित करके (idx_new देखें):
index idx {
path = sphinx_tmp/idx
source = src
}
index idx_new:idx {
path = sphinx_tmp/idx_new
}
“नए” सूचकांक को अलग नाम दिया जा सकता है या अलग पथ हो सकता है, इसका कोई महत्व नहीं है, हमें बस यह जानने की आवश्यकता है कि नया सूचकांक कहां रखा जाएगा।
“नए” सूचकांक का निर्माण करें:
[snikolaev@dev01 ~]$ indexer -c sphinx_replication.conf idx_new
Manticore 2.6.1 9a706b4@180119 dev
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2018, Manticore Software LTD (http://manticoresearch.com)
using config file 'sphinx_replication.conf'...
indexing index 'idx_new'...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 29 bytes
total 0.004 sec, 7045 bytes/sec, 728.86 docs/sec
total 7 reads, 0.000 sec, 13.7 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
उसके बाद आपके सूचकांक निर्देशिका में कुछ इस तरह होना चाहिए:
[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 460
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:09 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx_new.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx_new.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx_new.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx_new.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx_new.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spk
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx_new.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx_new.sps
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:07 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:07 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:07 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:07 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:07 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:07 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:07 idx.sps
idx.* आपके सामान्य सूचकांक फ़ाइलें हैं और idx_new.* नई सूचकांक फ़ाइलें हैं।
सूचकांक की प्रतिलिपि
अब जब आपका नया सूचकांक बन गया है, आपको इसे उन सभी स्थानों पर पहुंचाना है जहां आप इसे चलाना चाहते हैं। आप इसके लिए कुछ भी उपयोग कर सकते हैं: rsync, scp, ftp, samba आदि।
scp sphinx_tmp/idx_new.sp* SLAVE:sphinx_tmp/
सूचकांकों को रोटेट करना
अब जब आपने अपना सूचकांक सभी स्लेव पर प्रसारित कर दिया है, तो बस सूचकांक को रोटेट करना बाकी है ताकि नया सूचकांक अपनी जगह ले ले। पहले स्फिंक्स केवल सर्वर इंस्टेंस को HUP सिग्नल भेजकर या इंस्टेंस को पुनः शुरू करके ऐसा कर सकता था। स्फिंक्स 2.3.1 से और मैंटीकोर खोज में RELOAD INDEX उपलब्ध है जो SphinxQL के माध्यम से एक सूचकांक को रोटेट करने की अनुमति देता है और अधिक महत्वपूर्ण बात यह है कि searchd को बताता है कि वह सूचकांक फाइलों को कहां ढूंढे, उदाहरण के लिए हमारे मामले में:
[snikolaev@dev01 ~]$ mysql -P9314 -h0 -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new'"
उसके बाद आप देख सकते हैं कि “नई” सूचकांक फाइलें निर्देशिका में गायब हो जाती हैं:
[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 432
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:15 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:15 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx.sps
और searchd लॉग में आप देख सकते हैं कि रोटेशन सफल रहा (और केवल 1ms लिया):
[snikolaev@dev01 ~]$ tail -n 2 sphinx_replication.log
[Mon Feb 26 01:15:39.003 2018] [3346] rotating index 'idx': started
[Mon Feb 26 01:15:39.004 2018] [3346] rotating index 'idx': success
तो अब जो आप करना चाहते हैं वह है उन सभी गंतव्यों पर जहां आपने प्रतिलिपियां बनाई हैं, RELOAD INDEX कमांड को कॉल करें, जैसे:
[snikolaev@dev01 ~]$ for host in SLAVE 0; do echo $host; mysql -P9314 -h$host -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new';"; done;
SLAVE
0
नोट्स
- जब आप मैंटीकोर शुरू करते हैं तो आप निम्न चेतावनी देख सकते हैं:
WARNING: index 'idx_new': prealloc: failed to open sphinx_tmp/idx_new.sph: No such file or directory; NOT SERVING
यह चेतावनी ठीक है, क्योंकि हमें idx_new को मैंटीकोर खोज द्वारा सर्व किए जाने की आवश्यकता नहीं है, हमें इस सूचकांक की केवल नए डेटा के लिए अस्थायी भंडारण की आवश्यकता है।
- बड़े सूचकांकों के लिए सूचकांक सिंक्रोनाइज़ेशन में लगने वाला समय लंबा हो सकता है, लेकिन फिर भी fs/नेटवर्क स्तर पर डेटा सिंक करना आपके सर्वरों के लिए ‘इंडेक्सर’ से स्क्रैच से सूचकांक पुनर्निर्माण करने की तुलना में आसान है।
- याद रखें यदि आप विशेषता अपडेट करते हैं तो आपको उन्हें अपने सभी स्लेव पर भी करना होगा क्योंकि जैसा कि मैंने शुरुआत में कहा था, अभी तक उच्च स्तर की प्रतिकृति नहीं है। यदि आपको इसकी आवश्यकता है और बीटा परीक्षक बनना चाहते हैं तो हमसे संपर्क करें।
- सामान्य रूप से जो आप करते हैं वह एक इंडेक्सेशन स्क्रिप्ट है जो पहले नए सूचकांक को तैयार करती है, फिर उसे सभी आवश्यक स्थानों पर कॉपी करती है और फिर हर जगह सूचकांक को रोटेट करती है। यह करने का सबसे सरल तरीका है, वास्तविक दुनिया में आप सूचकांक सत्यापन, स्लेव पर इंडेक्सिंग भी करना चाहेंगे ताकि इंडेक्सेशन एचए प्रदान कर सकें, लॉक का उपयोग करें ताकि यह सुनिश्चित हो सके कि आप N सर्वरों पर एक ही समय में सूचकांक का पुनर्निर्माण नहीं कर रहे हैं और इसी तरह। हमने इसे अपने ग्राहकों के लिए कई बार किया है। यदि आपको इस क्षेत्र में समर्थन की आवश्यकता है तो [email protected] पर ईमेल भेजकर हमें बताएं। आप हमारी समर्थन योजनाएं यहां देख सकते हैं।
अंत में मैं कहना चाहता हूं कि जब तक आरटी सूचकांकों के लिए उच्च-ग्रेड प्रतिकृति नहीं है और अभी भी कई लोग सादे सूचकांक का उपयोग करते हैं, तब तक वर्णित विधि का अर्थ है और सादे सूचकांकों की प्रतिकृति को आसानी से करने की अनुमति देता है।