मैं एक सर्वर से दूसरे में एक रेडिस डेटाबेस कैसे स्थानांतरित करूं?


179

मेरे पास वर्तमान में एक लाइव रेडिस सर्वर एक क्लाउड इंस्टेंस पर चल रहा है और मैं इस रेडिस सर्वर को एक नए क्लाउड इंस्टेंस पर माइग्रेट करना चाहता हूं और उस उदाहरण को मेरे नए रेडिस सर्वर के रूप में उपयोग करना चाहता हूं। यदि यह MySQL होता, तो मैं पुराने सर्वर से DB को निर्यात करता और नए सर्वर में आयात करता। मुझे रेडिस के साथ यह कैसे करना चाहिए?

पुनश्च: मैं प्रतिकृति स्थापित करने के लिए नहीं देख रहा हूँ। मैं रेडिस सर्वर को पूरी तरह से एक नए उदाहरण में माइग्रेट करना चाहता हूं।


5
वर्षों बाद ... विभिन्न रेडिस संबंधित चीजों से निपटने के बाद, मैं सुझाव दूंगा कि टॉम क्लार्कसन एक दास उदाहरण स्थापित करने के दृष्टिकोण के साथ, इसे मास्टर के साथ सिंक करने दें और फिर दास को मास्टर को बढ़ावा दें। यह मेरे द्वारा स्वीकार किए गए उत्तर की तुलना में बहुत कम डाउनटाइम का कारण होगा, खासकर यदि आप कई जीबी रेडिस डेटा के साथ काम कर रहे हैं। यदि आप इस मिश्रण में एक लाल रंग के प्रहरी में फेंक सकते हैं, तो आप लगभग शून्य डाउनटाइम माइग्रेशन कर सकते हैं।
एरजब

मेरे पास एक दूरस्थ रेडिस सर्वर है और इसके डेटा को मेरे स्थानीय रूप से चल रहे रेडिस सर्वर पर कॉपी करना चाहते हैं ... डंप का उपयोग करना मुश्किल हो सकता है क्योंकि मुझे उस डेटा को नेटवर्क पर स्थानांतरित करना होगा
अलेक्जेंडर मिल्स

जवाबों:


110

डेटाबेस के एक स्नैपशॉट को डंप करें। इसे चलाकर BGSAVEया SAVEकमांड लाइन से। यह आपके रेडिस सर्वर के समान फ़ोल्डर में डंप .rdb नामक एक फाइल बनाएगा। सभी सर्वर कमांड की एक सूची देखें ।

आप जिस अन्य माइग्रेशन में माइग्रेट करना चाहते हैं, इस डंप .rdb को कॉपी करें। जब रेडिस शुरू होता है, तो यह डेटाबेस से इनिशियलाइज़ करने के लिए इस फाइल की तलाश करता है।


16
यह मुझे कुछ चीजों पर अनुमान लगाता है: SAVE कमांड ने अपना डंप कहां रखा है? Redis एक स्टार्ट अप को लोड करने के लिए "dub.rdb" फ़ाइल को कहाँ देखता है? मेरे Redis config में dbfilename को /var/db/redis/redis_state.rdb पर सेट किया गया है ... क्या यह फ़ाइल नाम है जिसे मैं "dip.rdb" के स्थान पर उपयोग करता हूं?
मोजो

23
यह भी ध्यान रखें कि आप अपने सर्वर को चलाने के दौरान इस स्वैप को नहीं कर सकते हैं, क्योंकि रनिंग सर्वर पर SHUTDOWN को कॉल करने से इसकी मेमोरी कंटेंट इसकी डंप फ़ाइल में सेव हो जाएगी, इस प्रकार आपके द्वारा वहां रखी गई कॉपी को ओवरराइट कर दिया जाएगा। सबसे पहले सर्वर को शटडाउन करें। फिर डंप फ़ाइल को अधिलेखित करें। इसके बाद सर्वर को फिर से शुरू करें।
होउन

9
यदि आप AOF लॉगिंग (redis.conf में appendonly = yes) का उपयोग करते हैं, तो इसे noRedis सर्वर शुरू करने से पहले सेट करें - अन्यथा यह नए डेटा सेट को लोड नहीं करेगा। एक बार डेटा सेट को मेमोरी में लोड कर लेने के बाद, इसे मेमोरी ( config set appendonly yes) और कॉन्फिगर फाइल दोनों में बदल दें ।
मैथ्यू रत्ज़ोल्फ

5
उबंटू पर, Redis conf फ़ाइल संग्रहीत है /etc/redis/redis.conf, और आप अपनी .rdbफ़ाइलों को खोजने के लिए इसके माध्यम से खोज कर सकते हैं cat /etc/redis/redis.conf | grep "rdb":। मेरे मामले में यह है/var/lib/redis
हरमन शेफ

5
redis-cli config get dirआपको वह निर्देशिका प्रदान करेगा जिसमें .rdbसंग्रहित है।
किशोर पवार

253

सबसे पहले, सर्वर ए पर एक डंप बनाएं।

A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK

यह सुनिश्चित करता dump.rdbहै कि यह पूरी तरह से अद्यतित है, और हमें दिखाता है कि यह कहाँ संग्रहीत है ( /var/lib/redis/dump.rdbइस मामले में)। dump.rdbसमय-समय पर स्वचालित रूप से डिस्क पर लिखा जाता है।

इसके बाद, इसे सर्वर B पर कॉपी करें:

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

बी पर रेडिस सर्वर को रोकें, डंप की प्रतिलिपि बनाएँ। यह सुनिश्चित करना (अनुमतियाँ पहले जैसी ही हैं), फिर शुरू करें।

B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start

बी पर रेडिस का संस्करण ए की तुलना में अधिक या बराबर होना चाहिए, या आप संगतता मुद्दों को मार सकते हैं


32
स्वीकृत उत्तर की तुलना में बेहतर तरीके से, सभी विवरण हैं।
btk

1
इसने मुझे यह दिखाते हुए बहुत समय बचाया कि रेडिस में आयात डंप को रेडिस फ़ोल्डर में छोड़ कर किया जाता है
RonnyKnoxville

7
एक मैक पर रेडिस बैकअप / usr / लोकल / var / db / redis /
Donovan थॉमसन

3
@DonovanThomson धन्यवाद। (मैंने मैक पर रेडिस स्थापित करने के लिए होमब्रे का इस्तेमाल किया) ... अपने रास्ते को खोजने के लिए एक अधिक सामान्य तरीका है रेडिस कमांड का उपयोग करना CONFIG GET dir, जो वापस लौटा"/usr/local/var/db/redis"
जूलियन सोरो

और इस प्रक्रिया के दौरान A में गए लेखन के बारे में कोई क्या करता है?
माइक ग्राफ

34

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


1
मेरे पास कनेक्टिविटी है। इसलिए मैं नए सर्वर में स्लेवऑफ कॉन्फ़िगरेशन का उपयोग कर सकता हूं और इसे पुराने सर्वर के आईपी पते पर सेट कर सकता हूं। लेकिन मुझे कैसे पता चलेगा कि मास्टर और गुलाम के बीच डेटा ट्रांसफर कब पूरा होता है? और उसके बाद, मैं दास को मास्टर के रूप में कैसे बढ़ावा देता हूं?
एरजब

मुझे लगता है कि INFO कमांड तैयार होने पर आपको बताएगा। हालाँकि, यह बहुत ज्यादा मायने नहीं रखता है - चूँकि यह ऑनटाइम कॉपी के बजाय प्रतिकृति है, आप पुराने नोड को स्विच करने से पहले दोनों नोड्स को तब तक के लिए छोड़ सकते हैं जब तक आप चाहते हैं। SLAVEOF NONE मास्टर को नए नोड को बढ़ावा देने के लिए कमांड है।
टॉम क्लार्कसन

9
एक महान समाधान की तरह लगता है - कुछ कमांड उदाहरणों के साथ अच्छा होगा!
नॉटआउट

16

SLAVEOF कमांड का उपयोग करके डेटा को माइग्रेट करना भी संभव है:

SLAVEOF old_instance_name old_instance_port

जांचें कि आपको कुंजी के साथ प्राप्त हुआ है KEYS *। आप किसी अन्य तरीके से भी नए उदाहरण का परीक्षण कर सकते हैं, और जब आप किया जाता है तो केवल प्रतिकृति की बारी:

SLAVEOF NO ONE

यह सबसे दर्द रहित दृष्टिकोण है!
noooooooob

13

आजकल आप 2.6 से उपलब्ध MIGRATE का भी उपयोग कर सकते हैं।

मुझे इसका उपयोग करना था क्योंकि मैं केवल एक डेटाबेस में डेटा को स्थानांतरित करना चाहता था और उन सभी को नहीं। दो रेडिस उदाहरण दो अलग-अलग मशीनों पर रहते हैं।

यदि आप Redis-2 से सीधे Redis-1 से नहीं जुड़ सकते हैं, तो ssh पोर्ट बाइंडिंग का उपयोग करें:

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379

कुंजी और कुंजी प्रत्येक कुंजी का उपयोग कर सभी कुंजी को लूप करने के लिए एक छोटी स्क्रिप्ट। यह पर्ल है, लेकिन उम्मीद है कि आपको यह विचार मिलेगा:

 foreach ( $redis_from->keys('*') ) {

    $redis_from->migrate(
        $destination{host},    # localhost in my example
        $destination{port},    # 1234
        $_,                    # The key
        $destination{db},
        $destination{timeout} 
    );
 }

अधिक जानकारी के लिए http://redis.io/commands/migrate देखें ।


वह रिमोट रेडिस है जिसे आप PASSWORD के लिए माइग्रेट करना चाहते हैं
noooooooob

4

रेडिस डेटा आयात करते समय यह जाँचने के लिए कि डंप.बर्ड को कहाँ रखा जाना है,

ग्राहक शुरू करें

$redis-cli

तथा

फिर

redis 127.0.0.1:6379> CONFIG GET *
 1) "dir"
 2) "/Users/Admin"

यहां / उपयोगकर्ता / व्यवस्थापक डंप का स्थान है। सर्वर से पढ़ा जाता है और इसलिए यह वह फ़ाइल है जिसे प्रतिस्थापित किया जाना है।


2

आप rdd का उपयोग भी कर सकते हैं

यह चल रहे रेडिस सर्वर को डंप और रिस्टोर कर सकता है और फ़िल्टर / मैच / नाम बदलकर डंप कीज़ की अनुमति देता है


2

शून्य डाउनटाइम माइग्रेशन के मुख्य तत्व हैं:

  • प्रतिकृति ( http://redis.io/commands/SLAVEOF )
  • आवेदन स्विचिंग के दौरान एक दास में लिखने की संभावना ( CONFIG SET slave-read-only no)

संक्षेप में:

  1. स्रोत रेडिस के गुलाम के रूप में एक लक्ष्य रेडिस (खाली) सेटअप करें (अपने डेटा के साथ)
  2. प्रतिकृति समापन की प्रतीक्षा करें
  3. परमिट एक लक्ष्य रेडिस को लिखता है (जो वर्तमान में गुलाम है)
  4. अपने ऐप्स को लक्ष्य रेडियों पर स्विच करें
  5. मास्टर से दास तक खत्म डेटास्ट्रीम की प्रतीक्षा करें
  6. मास्टर से दास के लिए एक लक्ष्य रेडिस चालू करें

इसके अतिरिक्त रेडिस के पास विकल्प होते हैं जो किसी स्रोत को फिर से लिखने के लिए राइट्स को निष्क्रिय करने की अनुमति देता है।

  • min-slaves-to-write
  • min-slaves-max-lag

इस विषय द्वारा कवर किया गया

RedisLabs टीम से बहुत अच्छी व्याख्या https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

और यहां तक ​​कि प्रवास के लिए उनके इंटरैक्टिव उपकरण: https://github.com/RedisLabs/redis-migrate


1

मैं भी यही काम करना चाहता हूं: एक स्टैंडअलोन रेडिस उदाहरण से एक डीबी को दूसरे रेडिस इंस्टेंस (रेडिस प्रहरी) में माइग्रेट करें।

क्योंकि डेटा क्रिटिकल (सत्र डेटा) नहीं है, मैं https://github.com/yaauie/redis-copy एक कोशिश करूँगा।


1

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

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379

मेरे पास लिनक्स मशीन पर चलने वाली एक रेडिस है जो मेरे पास है। मेरी खिड़कियों की मशीन पर लाल रंग है। क्या इस तरह के संयोजन के लिए डेटा की प्रतिलिपि बनाना संभव है?
कामरान शाहिद

1
मेरा मानना ​​है कि अगर आप दोनों एक ही संस्करण के साथ हैं
माओज़

हाँ, मुझे भी संस्करण की जाँच करने की आवश्यकता है। लेकिन विंडोज़ रिलीज़ संस्करण 3.0 से ऊपर नहीं है जैसा कि मुझे पता है
कामरान शाहिद

0

मैंने सिर्फ npm और github के लिए एक कमांड लाइन इंटरफ़ेस उपयोगिता प्रकाशित की है जो आपको एक रेडिस डेटाबेस से दूसरे में दिए गए पैटर्न (यहां तक ​​कि *) से मेल खाने वाली कुंजियों की प्रतिलिपि बनाने की अनुमति देता है।

आप यहाँ उपयोगिता पा सकते हैं:

https://www.npmjs.com/package/redis-utils-cli


-2

रेडिस-डंप ने आखिरकार मेरे लिए काम किया। इसका प्रलेखन एक उदाहरण प्रदान करता है कि रेडिस डेटाबेस को कैसे डंप किया जाए और डेटा को दूसरे में डाला जाए।

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