इस लेख में हम चर्चा करेंगे कि Sphinx/Manticore Search का उपयोग करते हुए ProxySQL के साथ वितरित RT इंडेक्स में इन्सर्ट को कैसे रूट किया जाए।
मंटिकोर में वितरित इंडेक्स बहु-रियल टाइम इंडेक्स पर अपडेट की अनुमति देता है जहां अपडेट सभी इंडेक्स पर भेजा जाता है, लेकिन परिवर्तन केवल एक इंडेक्स पर होता है (यह मानते हुए कि आपके पास सभी इंडेक्स में अद्वितीय आईडी हैं)।
इन्सर्ट के लिए, वितरित इंडेक्स यह नहीं जानता कि किस इंडेक्स को चुना जाए, इसका मतलब है कि हमें इन्सर्ट को एक रियल टाइम सब-इंडेक्स पर भेजना होगा, जिसे एप्लिकेशन कोड में लागू किया जाना चाहिए। इसका नुकसान यह है कि वितरित इंडेक्स में बदलाव करने के लिए (उदाहरण के लिए, एक नया RT सब-इंडेक्स जोड़ना), एप्लिकेशन कोड में बदलाव करने की आवश्यकता होती है।
ProxySQL
MySQL के लिए एक SQL-जागरूक प्रॉक्सी है। चूंकि Sphinx और Manticore Search में MySQL-संगत प्रोटोकॉल है, ProxySQL का उपयोग Manticore सर्वर के सरल संतुलन के लिए किया जा सकता है। लेकिन ProxySQL एक महान सुविधा के साथ आता है: एक RegExp क्वेरी रूटिंग इंजन, जो न केवल क्वेरी को रूट करने की अनुमति देता है, बल्कि उन्हें पुनर्लिखित भी कर सकता है।
अगला जो हम करने जा रहे हैं वह है वितरित इंडेक्स पर इन्सर्ट भेजना और ProxySQL की सहायता से क्वेरी को पुनर्लिखित करना, चुने गए मानदंड के आधार पर इन्सर्ट के लक्ष्य इंडेक्स को बदलकर। इस तरह, यदि हम वितरित इंडेक्स में नए शार्ड्स जोड़ते हैं या दस्तावेजों को शार्ड्स में कैसे वितरित किया जाता है, तो हमें एप्लिकेशन कोड में बदलाव करने की आवश्यकता नहीं होगी।
आइए दो RT सब-इंडेक्स से बने वितरित इंडेक्स पर विचार करें। हम दस्तावेज आईडी की सम-विषमता के आधार पर दस्तावेजों के प्रवेश को वितरित करना चाहते हैं।
index myrt {
type = distrubuted
local = myrt1
local = myrt2
}
Manticore Search सर्वर को बैकएंड के रूप में जोड़ना
इस उदाहरण में, हम Manticore सर्वर के लिए होस्ट समूह आईडी 2 पर विचार करेंगे।
Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES(2,'192.168.1.224',9306);
Admin> LOAD MYSQL SERVERS TO RUNTIME;
ProxySQL में पुनर्लेखन नियम जोड़ना
हम विषम आईडी वाले दस्तावेजों को myrt1
में और सम आईडी वाले दस्तावेजों को myrt2
में डालना चाहते हैं। हम 2 नियम परिभाषित करते हैं, जो आईडी को पकड़ते हैं और आईडी की विषमता के आधार पर क्वेरी को Manticore भेजने से पहले इंडेक्स का नाम बदल देते हैं।
Admin> INSERT INTO mysql_query_rules(rule_id,match_pattern,replace_pattern,destination_hostgroup,active)
VALUES(32,
'^INSERT INTO (\w+)\(id,content,title,user_id,group_id\) VALUES\(([0-9]*)([02468])',
'INSERT INTO \12(id,content,title,user_id,group_id) VALUES(\2\3',2,1);
Admin> INSERT INTO mysql_query_rules(rule_id,match_pattern,replace_pattern,destination_hostgroup,active)
VALUES(33,
'INSERT INTO (\w+)\(id,content,title,user_id,group_id\) VALUES\(([0-9]*)([13579])',
'INSERT INTO \11(id,content,title,user_id,group_id) VALUES(\2\3',2,1);
Admin> LOAD MYSQL QUERY RULES TO RUNTIME;
RegExp पैटर्न बनाते समय और अपने एप्लिकेशन कोड से क्वेरी कैसे बनाते हैं, इस पर बहुत ध्यान दें ताकि क्वेरी पकड़ी जा सके।
ProxySQL के माध्यम से SphinxQL चलाना
अपनी पहली क्वेरी चलाने से पहले, हमें ProxySQL में एक उपयोगकर्ता बनाना होगा जो डिफ़ॉल्ट रूप से होस्ट समूह आईडी 2 पर हो, ताकि उस द्वारा चलाई गई क्वेरी हमारे Manticore सर्वर पर रूट हो सके।
Admin> INSERT INTO mysql_users(username,password,active,default_hostgroup) VALUES('test','pass',1,2);
Admin> LOAD MYSQL USERS TO RUNTIME;
और कुछ इन्सर्ट चलाएं (ProxySQL कनेक्शन का उपयोग करते हुए):
mysql> INSERT INTO myrt(id,content,title,user_id,group_id) VALUES(1,'test1','test1',1,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO myrt(id,content,title,user_id,group_id) VALUES(2,'test2','test2',1,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO myrt(id,content,title,user_id,group_id) VALUES(20,'test20','test20',1,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO myrt(id,content,title,user_id,group_id) VALUES(11,'test11','test11',1,1);
mysql> select * from myrt;
+------+---------+----------+--------+
| id | user_id | group_id | title |
+------+---------+----------+--------+
| 1 | 1 | 1 | test1 |
| 2 | 1 | 1 | test2 |
| 11 | 1 | 1 | test11 |
| 20 | 1 | 1 | test20 |
+------+---------+----------+--------+
4 rows in set (0.00 sec)
mysql> select * from myrt1;
+------+---------+----------+--------+
| id | user_id | group_id | title |
+------+---------+----------+--------+
| 1 | 1 | 1 | test1 |
| 11 | 1 | 1 | test11 |
+------+---------+----------+--------+
2 rows in set (0.00 sec)
mysql> select * from myrt2;
+------+---------+----------+--------+
| id | user_id | group_id | title |
+------+---------+----------+--------+
| 2 | 1 | 1 | test2 |
| 20 | 1 | 1 | test20 |
+------+---------+----------+--------+
2 rows in set (0.00 sec)
अंत में, ProxySQL में किए गए परिवर्तनों को स्थायित्व के लिए डिस्क पर सहेजना न भूलें:
Admin> SAVE MYSQL QUERY RULES TO DISK; SAVE MYSQL SERVERS TO DISK; SAVE MYSQL USERS TO DISK;