ฉันจะย้ายฐานข้อมูล redis จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นได้อย่างไร


179

ขณะนี้ฉันมีเซิร์ฟเวอร์ Redis สดที่ทำงานบนอินสแตนซ์คลาวด์และฉันต้องการย้ายเซิร์ฟเวอร์ Redis นี้ไปยังอินสแตนซ์คลาวด์ใหม่และใช้อินสแตนซ์นั้นเป็นเซิร์ฟเวอร์ Redis ใหม่ของฉัน ถ้าเป็น MySQL ฉันจะส่งออกฐานข้อมูลจากเซิร์ฟเวอร์เก่าและนำเข้าสู่เซิร์ฟเวอร์ใหม่ ฉันจะทำเช่นนี้กับ redis ได้อย่างไร

PS: ฉันไม่ต้องการตั้งค่าการจำลองแบบ ฉันต้องการย้ายเซิร์ฟเวอร์ Redis ไปยังอินสแตนซ์ใหม่อย่างสมบูรณ์


5
หลายปีต่อมา ... หลังจากจัดการกับสิ่งที่เกี่ยวข้องกับสีแดงต่าง ๆ ฉันขอแนะนำให้ใช้วิธีการของทอมคลาร์กสันในการตั้งค่าตัวอย่างทาสปล่อยให้มันซิงก์กับอาจารย์แล้วส่งเสริมทาสให้เป็นนาย นี่จะทำให้การหยุดทำงานสั้นลงมากเมื่อเทียบกับคำตอบที่ฉันยอมรับโดยเฉพาะอย่างยิ่งถ้าคุณกำลังจัดการกับข้อมูล redis หลาย GB หากคุณสามารถใส่ redis sentinel ลงในมิกซ์นี้คุณสามารถทำการดาวน์ไทม์เกือบเป็นศูนย์ได้
ErJab

ฉันมีเซิร์ฟเวอร์ Redis ระยะไกลและต้องการคัดลอกข้อมูลไปยังเซิร์ฟเวอร์ Redis ที่ใช้งานอยู่ในพื้นที่ของฉัน ... การใช้ dump.rdb อาจเป็นเรื่องยากเพราะฉันจะต้องย้ายข้อมูลนั้นผ่านเครือข่าย ..
Alexander Mills

คำตอบ:


110

บันทึกสแน็ปช็อตของฐานข้อมูลลงใน dump.rdb โดยรันBGSAVEหรือSAVEจากบรรทัดคำสั่ง สิ่งนี้จะสร้างไฟล์ชื่อ dump.rdb ในโฟลเดอร์เดียวกับเซิร์ฟเวอร์ redis ของคุณ ดูรายชื่อเซิร์ฟเวอร์ทุกคำสั่ง

คัดลอก dump.rdb นี้ไปยังเซิร์ฟเวอร์ redis อื่นที่คุณต้องการย้ายไป เมื่อ redis เริ่มต้นมันจะค้นหาไฟล์นี้เพื่อเริ่มต้นฐานข้อมูลจาก


16
สิ่งนี้ทำให้ฉันคาดเดาถึงสองสิ่ง: คำสั่ง SAVE นำการถ่ายโอนข้อมูลไปที่ใด Redis ค้นหาไฟล์ "dump.rdb" เพื่อเริ่มการโหลดได้ที่ไหน การตั้งค่า Redis ของฉันมีการตั้งค่า dbfilename เป็น /var/db/redis/redis_state.rdb ... นี่คือชื่อไฟล์ที่ฉันใช้แทนที่ "dump.rdb" หรือไม่?
Mojo

23
โปรดทราบว่าคุณไม่สามารถสลับได้ในขณะที่เซิร์ฟเวอร์ของคุณกำลังทำงานเนื่องจากการเรียก SHUTDOWN บนเซิร์ฟเวอร์ที่ทำงานอยู่จะบันทึกเนื้อหาหน่วยความจำลงในไฟล์ดัมพ์ของมันดังนั้นจึงเขียนทับสำเนาที่คุณเพิ่งวางไว้ ก่อนปิดเซิร์ฟเวอร์ จากนั้นเขียนทับไฟล์ดัมพ์ จากนั้นเริ่มเซิร์ฟเวอร์อีกครั้ง
Houen

9
หากคุณใช้การบันทึก AOF (ใน redis.conf, appendonly = yes) ให้ตั้งค่าnoก่อนที่จะเริ่มเซิร์ฟเวอร์ Redis มิฉะนั้นจะไม่โหลดชุดข้อมูลใหม่ เมื่อโหลดชุดข้อมูลลงในหน่วยความจำแล้วให้เปิดอีกครั้งทั้งในหน่วยความจำ ( config set appendonly yes) และในไฟล์กำหนดค่า
Matthew Ratzloff

5
บน Ubuntu แฟ้ม conf Redis ถูกเก็บไว้ใน/etc/redis/redis.confและคุณสามารถค้นหาผ่านมันจะหาสถานที่ของคุณไฟล์:.rdb cat /etc/redis/redis.conf | grep "rdb"ในกรณีของฉันมัน/var/lib/redis
Herman Schaaf

5
redis-cli config get dirจะให้ไดเรกทอรีที่.rdbเก็บไว้
Kishor Pawar

253

ก่อนอื่นให้สร้างดัมพ์บนเซิร์ฟเวอร์ A

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

หยุดเซิร์ฟเวอร์ Redis บน B คัดลอก 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

เวอร์ชันของ Redis บน B ต้องมากกว่าหรือเท่ากับ A หรือคุณอาจโดน ปัญหาความเข้ากัน


32
วิธีที่ดีกว่าคำตอบที่ยอมรับมีรายละเอียดทั้งหมด
btk

1
สิ่งนี้ช่วยให้ฉันประหยัดเวลาได้มากโดยแสดงให้เห็นว่าการนำเข้าสู่ Redis ทำได้โดยการทิ้งดัมพ์ลงในโฟลเดอร์
Redis

7
สำหรับ Mac การสำรองข้อมูล Redis จะถูกเก็บไว้ที่ / usr / local / var / db / redis /
Donovan Thomson

3
@ DonovanThomson ขอบคุณ (ฉันใช้ homebrew เพื่อติดตั้ง redis บน mac) ... วิธีทั่วไปที่จะค้นหาเส้นทางของคุณคือการใช้คำสั่ง redis CONFIG GET dirซึ่งส่งคืน"/usr/local/var/db/redis"
Julian Soro

และสิ่งใดที่เกี่ยวกับการเขียนที่ไปที่ A ในระหว่างกระบวนการนี้
Mike Graf

34

หากคุณมีการเชื่อมต่อระหว่างเซิร์ฟเวอร์จะเป็นการดีกว่าที่จะตั้งค่าการจำลองแบบ (ซึ่งไม่สำคัญเหมือน SQL) กับอินสแตนซ์ใหม่เป็นโหนดทาส - จากนั้นคุณสามารถสลับโหนดใหม่เป็นหลักด้วยคำสั่งเดียวและย้ายด้วย ศูนย์หยุดทำงาน


1
ฉันมีการเชื่อมต่อ ดังนั้นฉันสามารถใช้การกำหนดค่า slaveof ในเซิร์ฟเวอร์ใหม่และตั้งค่าเป็นที่อยู่ IP ของเซิร์ฟเวอร์เก่า แต่ฉันจะรู้ได้อย่างไรว่าการถ่ายโอนข้อมูลเสร็จสมบูรณ์ระหว่างต้นแบบและทาส และหลังจากนั้นฉันจะส่งเสริมทาสให้เป็นผู้เชี่ยวชาญได้อย่างไร
ErJab

ฉันคิดว่าคำสั่ง INFO จะบอกคุณเมื่อพร้อม อย่างไรก็ตามนั่นไม่สำคัญมากนัก - เนื่องจากเป็นการจำลองแบบมากกว่าการทำสำเนาเพียงครั้งเดียวคุณสามารถปล่อยให้โหนดทั้งสองอยู่ได้นานเท่าที่คุณต้องการก่อนที่จะปิดโหนดเก่า SLAVEOF NONE เป็นคำสั่งเพื่อโปรโมตโหนดใหม่เป็นมาสเตอร์
Tom Clarkson

9
ฟังดูเป็นคำตอบที่ยอดเยี่ยม - น่าจะดีกับตัวอย่างคำสั่ง!
Knutole

16

นอกจากนี้ยังเป็นไปได้ที่จะย้ายข้อมูลโดยใช้คำสั่ง SLAVEOF:

SLAVEOF old_instance_name old_instance_port

KEYS *ตรวจสอบว่าคุณมีรับกุญแจด้วย คุณสามารถทดสอบอินสแตนซ์ใหม่ด้วยวิธีอื่นเช่นกันและเมื่อคุณทำเสร็จแล้วให้เปิดการทำซ้ำของ:

SLAVEOF NO ONE

นี่เป็นวิธีที่ไม่เจ็บปวดที่สุด!
noooooooob

13

ทุกวันนี้คุณสามารถใช้ MIGRATE ได้ตั้งแต่ 2.6

ฉันต้องใช้สิ่งนี้เนื่องจากฉันต้องการย้ายข้อมูลในฐานข้อมูลเดียวและไม่ใช่ทั้งหมด อินสแตนซ์ Redis สองรายการอาศัยอยู่บนเครื่องที่แตกต่างกันสองเครื่อง

หากคุณไม่สามารถเชื่อมต่อโดยตรงกับ Redis-2 จาก Redis-1 ให้ใช้การเชื่อมพอร์ต ssh:

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

สคริปต์ขนาดเล็กเพื่อวนลูปทั้งหมดโดยใช้ KEYS และ MIGRATE แต่ละคีย์ นี่คือ Perl แต่หวังว่าคุณจะได้ความคิด:

 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

ในการตรวจสอบตำแหน่งที่จะต้องวาง dump.rdb เมื่อนำเข้าข้อมูล Redis

เริ่มไคลเอนต์

$redis-cli

และ

แล้วก็

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

ที่นี่ / ผู้ใช้ / ผู้ดูแลระบบเป็นที่ตั้งของ dump.rdb ที่อ่านจากเซิร์ฟเวอร์และนี่คือไฟล์ที่จะถูกแทนที่


2

คุณยังสามารถใช้rdd

มันสามารถถ่ายโอนและเรียกคืนเซิร์ฟเวอร์ redis ที่กำลังทำงานอยู่และอนุญาตให้ใช้คีย์ตัวกรอง / การจับคู่ / เปลี่ยนชื่อ


2

องค์ประกอบสำคัญของการโยกย้ายแบบไม่ต้องหยุดทำงานคือ:

  • การจำลองแบบ ( http://redis.io/commands/SLAVEOF) )
  • ความเป็นไปได้ที่จะเขียนลงในทาสระหว่างการสลับแอปพลิเคชัน ( CONFIG SET slave-read-only no)

ในระยะสั้น:

  1. ตั้งค่า redis เป้าหมาย (ว่าง) เป็นทาสของ redis ต้นทาง (ด้วยข้อมูลของคุณ)
  2. รอการจำลองแบบเสร็จสิ้น
  3. อนุญาตให้เขียนไปยัง Redis เป้าหมาย (ซึ่งปัจจุบันเป็นทาส)
  4. เปลี่ยนแอปของคุณเป็นเป้าหมายสีแดง
  5. รอ datastream ที่เสร็จสิ้นจากต้นแบบไปเป็นทาส
  6. เปลี่ยนเป้าหมายสีแดงจากต้นแบบเป็นทาส

นอกจากนี้ redis ยังมีตัวเลือกที่อนุญาตให้ปิดการใช้งานแหล่ง redis เพื่อยอมรับการเขียนทันทีหลังจากแยกเป้าหมาย:

  • 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

ฉันต้องการทำสิ่งเดียวกัน: โอนย้ายฐานข้อมูลจากอินสแตนซ์ Redis แบบสแตนด์อโลนไปยังอินสแตนซ์ Redis อื่น (Redis Sentinel)

เนื่องจากข้อมูลไม่สำคัญ (ข้อมูลเซสชัน) ฉันจะให้https://github.com/yaauie/redis-copyลอง


1

วิธีง่ายๆที่ฉันค้นพบเพื่อส่งออก / สำรองข้อมูล Redis (สร้างไฟล์ดัมพ์) คือการเริ่มต้นเซิร์ฟเวอร์ผ่านบรรทัดคำสั่งด้วยแฟล็กของทาสและสร้างแบบจำลองสดดังต่อไปนี้ (สมมติว่า Redis แหล่งคือ 1.2.3.4 บนพอร์ต 6379):

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

ฉันมี Redis ที่ทำงานบนเครื่อง Linux ซึ่งฉันสามารถเข้าถึงได้ ฉันมี Redis บนเครื่อง windows ของฉัน เป็นไปได้ไหมที่จะคัดลอกข้อมูลสำหรับชุดค่าผสมดังกล่าว
Kamran Shahid

1
ฉันเชื่อว่าคุณสามารถทำได้หากทั้งสองรุ่นเดียวกัน
Maoz Zadok

ใช่ฉันต้องตรวจสอบเวอร์ชั่นด้วย แต่รุ่นที่วางจำหน่ายของ windows ไม่สูงกว่า 3.0 เท่าที่ฉันรู้
Kamran Shahid

0

ฉันเพิ่งเผยแพร่ยูทิลิตีอินเตอร์เฟสบรรทัดคำสั่งไปยัง npm และ github ที่ให้คุณคัดลอกคีย์ที่ตรงกับรูปแบบที่กำหนด (แม้แต่ *) จากฐานข้อมูล Redis หนึ่งไปยังอีกฐานข้อมูลหนึ่ง

คุณสามารถหายูทิลิตีได้ที่นี่:

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


-2

ในที่สุดRedis-dumpก็ทำงานให้ฉันได้ เอกสารประกอบของมันแสดงตัวอย่างวิธีการดัมพ์ฐานข้อมูล Redis และแทรกข้อมูลลงในอีกฐานข้อมูลหนึ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.