Làm cách nào để di chuyển cơ sở dữ liệu redis từ máy chủ này sang máy chủ khác?


179

Tôi hiện có một máy chủ redis trực tiếp chạy trên một cá thể đám mây và tôi muốn di chuyển máy chủ redis này sang một cá thể đám mây mới và sử dụng cá thể đó làm máy chủ redis mới của tôi. Nếu đó là MySQL, tôi sẽ xuất DB từ máy chủ cũ và nhập nó vào máy chủ mới. Làm thế nào tôi nên làm điều này với redis?

PS: Tôi không tìm cách thiết lập sao chép. Tôi muốn di chuyển hoàn toàn máy chủ redis sang một thể hiện mới.


5
Nhiều năm sau ... Sau khi xử lý nhiều vấn đề liên quan đến redis, tôi khuyên bạn nên thực hiện phương pháp thiết lập nô lệ của Tom Clarkson , để nó đồng bộ hóa với chủ và sau đó thúc đẩy nô lệ thành chủ. Điều này sẽ gây ra thời gian chết ngắn hơn nhiều so với câu trả lời tôi đã chấp nhận, đặc biệt nếu bạn đang xử lý một vài GB dữ liệu redis. Nếu bạn có thể ném một câu lệnh đỏ vào hỗn hợp này, bạn có thể thực hiện di chuyển thời gian chết gần như bằng không.
ErJab

Tôi có một máy chủ Redis từ xa và muốn sao chép dữ liệu của nó sang máy chủ Redis đang chạy cục bộ của mình ... sử dụng dump.rdb có thể khó khăn vì tôi sẽ phải di chuyển dữ liệu đó qua mạng ..
Alexander Mills

Câu trả lời:


110

Lưu ảnh chụp nhanh của cơ sở dữ liệu vào dump.rdb bằng cách chạy BGSAVEhoặc SAVEtừ dòng lệnh. Điều này sẽ tạo một tệp có tên dump.rdb trong cùng thư mục với máy chủ redis của bạn. Xem danh sách tất cả các lệnh máy chủ .

Sao chép dump.rdb này sang máy chủ redis khác mà bạn muốn di chuyển đến. Khi redis khởi động, nó tìm tập tin này để khởi tạo cơ sở dữ liệu từ đó.


16
Điều này khiến tôi đoán ra một vài điều: Lệnh SAVE đặt bãi chứa của nó ở đâu? Trường hợp Redis tìm kiếm tệp "dump.rdb" để tải khởi động? Cấu hình redis của tôi có dbfilename được đặt thành /var/db/redis/redis_state.rdb ... đây có phải là tên tệp tôi sử dụng thay cho "dump.rdb" không?
Mojo

23
Ngoài ra, hãy lưu ý rằng bạn không thể thực hiện trao đổi này trong khi máy chủ của bạn đang chạy, vì việc gọi SHUTDOWN trên máy chủ đang chạy sẽ lưu nội dung bộ nhớ của nó vào tệp kết xuất của nó, do đó ghi đè lên bản sao bạn vừa đặt ở đó. Đầu tiên tắt máy chủ. Sau đó ghi đè tập tin kết xuất. Sau đó khởi động lại máy chủ.
Houen

9
Nếu bạn sử dụng ghi nhật ký AOF (trong redis.conf, appendonly = yes), hãy đặt nó notrước khi khởi động máy chủ Redis - nếu không nó sẽ không tải tập dữ liệu mới. Khi bộ dữ liệu được tải vào bộ nhớ, hãy bật lại, cả trong bộ nhớ ( config set appendonly yes) và trong tệp cấu hình.
Matthew Ratzloff

5
Trên Ubuntu, tệp conf Redis được lưu trữ /etc/redis/redis.confvà bạn có thể tìm kiếm thông qua nó để tìm vị trí các .rdbtệp của mình : cat /etc/redis/redis.conf | grep "rdb". Trong trường hợp của tôi, đó là/var/lib/redis
Herman Schaaf

5
redis-cli config get dirsẽ cung cấp cho bạn thư mục .rdbđược lưu trữ.
Kishor Pawar

253

Đầu tiên, tạo một bãi chứa trên máy chủ 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

Điều này đảm bảo dump.rdbhoàn toàn cập nhật và cho chúng tôi biết nơi nó được lưu trữ ( /var/lib/redis/dump.rdbtrong trường hợp này). dump.rdbcũng được định kỳ ghi vào đĩa tự động.

Tiếp theo, sao chép nó vào máy chủ B:

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

Dừng máy chủ Redis trên B, sao chép dump.rdb (đảm bảo quyền truy cập giống như trước), sau đó bắt đầu.

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

Phiên bản Redis trên B phải lớn hơn hoặc bằng với A hoặc bạn có thể gặp phải các vấn đề tương thích .


32
Cách tốt hơn câu trả lời được chấp nhận, có tất cả các chi tiết.
btk

1
Điều này giúp tôi tiết kiệm rất nhiều thời gian bằng cách hiển thị rằng việc nhập vào redis được thực hiện bằng cách thả kết xuất vào thư mục
redis

7
trên mac, bản sao lưu redis được lưu trữ tại / usr / local / var / db / redis /
Donovan Thomson

3
@DonovanThomson Cảm ơn. (Tôi đã sử dụng homebrew để cài đặt redis trên mac) ... Một cách chung hơn để tìm đường dẫn của bạn là sử dụng lệnh redis CONFIG GET dir, đã trả về"/usr/local/var/db/redis"
Julian Soro

Và người ta làm gì về bài viết đã đi đến A trong quá trình này?
Mike Graf

34

Nếu bạn có kết nối giữa các máy chủ, tốt hơn là thiết lập sao chép (không quan trọng, không giống với SQL) với phiên bản mới là nút nô lệ - sau đó bạn có thể chuyển nút mới thành chủ bằng một lệnh duy nhất và thực hiện di chuyển với thời gian chết không.


1
Tôi có kết nối. Vì vậy, tôi có thể sử dụng cấu hình nô lệ trong máy chủ mới và đặt nó thành địa chỉ IP của máy chủ cũ. Nhưng làm thế nào để tôi biết khi nào việc truyền dữ liệu hoàn tất giữa chủ và nô lệ? Và sau đó, làm thế nào để tôi thúc đẩy nô lệ thành chủ?
ErJab

Tôi nghĩ lệnh INFO sẽ cho bạn biết khi nào nó sẵn sàng. Tuy nhiên, điều đó không quá quan trọng - vì nó là bản sao chứ không phải là bản sao một lần, bạn có thể để cả hai nút tại chỗ miễn là bạn muốn trước khi tắt nút cũ. SLAVEOF NONE là lệnh để thúc đẩy nút mới thành chủ.
Tom Clarkson

9
Âm thanh như một giải pháp tuyệt vời - sẽ tốt với một số ví dụ lệnh!
knutole

16

Cũng có thể di chuyển dữ liệu bằng lệnh SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Kiểm tra xem bạn đã nhận được các phím với KEYS *. Bạn cũng có thể kiểm tra phiên bản mới bằng bất kỳ cách nào khác và khi bạn hoàn thành, chỉ cần bật bản sao của:

SLAVEOF NO ONE

Đây là cách tiếp cận không đau nhất!
noooooooob

13

Ngày nay, bạn cũng có thể sử dụng MIGRATE, có sẵn từ 2.6.

Tôi đã phải sử dụng điều này vì tôi chỉ muốn di chuyển dữ liệu trong một cơ sở dữ liệu chứ không phải tất cả chúng. Hai trường hợp Redis sống trên hai máy khác nhau.

Nếu bạn không thể kết nối trực tiếp với Redis-2 từ Redis-1, hãy sử dụng ràng buộc cổng ssh:

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

Một tập lệnh nhỏ để lặp tất cả các khóa bằng KEYS và MIGRATE mỗi khóa. Đây là Perl, nhưng hy vọng bạn có ý tưởng:

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

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

Xem http://redis.io/commands/migrate để biết thêm thông tin.


Điều khiển từ xa mà bạn muốn di chuyển để có PASSWORD là gì?
noooooooob

4

Để kiểm tra vị trí của dump.rdb khi nhập dữ liệu redis,

bắt đầu khách hàng

$redis-cli

sau đó

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

Ở đây / Users / Admin là vị trí của dump.rdb được đọc từ máy chủ và do đó đây là tệp phải được thay thế.


2

bạn cũng có thể sử dụng rdd

nó có thể kết xuất và khôi phục máy chủ redis đang chạy và cho phép bộ lọc / khớp / đổi tên các khóa kết xuất


2

Các yếu tố chính của di chuyển thời gian chết bằng không là:

Nói ngắn gọn:

  1. thiết lập một redis đích (trống) làm nô lệ của một redis nguồn (với dữ liệu của bạn)
  2. chờ kết thúc nhân rộng
  3. cho phép ghi vào một mục tiêu redis (hiện đang là nô lệ)
  4. chuyển ứng dụng của bạn sang mục tiêu
  5. chờ kết thúc kho dữ liệu từ chủ đến nô lệ
  6. biến một mục tiêu redis từ chủ sang nô lệ

Ngoài ra, redis có các tùy chọn cho phép vô hiệu hóa một nguồn redis để chấp nhận ghi ngay sau khi tách mục tiêu:

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

Chủ đề này được bảo hiểm bởi

Giải thích rất tốt từ nhóm RedisLabs https://redislabs.com/blog/real-time-synyncization-tool-for-redis-migration

Và thậm chí công cụ tương tác của họ để di chuyển: https://github.com/RedisLabs/redis-migrate


1

Tôi cũng muốn làm điều tương tự: di chuyển một db từ một cá thể redis độc lập sang một cá thể redis khác (redis sentinel).

Vì dữ liệu không quan trọng (dữ liệu phiên), tôi sẽ thử https://github.com/yaauie/redis-copy .


1

Cách đơn giản mà tôi tìm thấy để xuất / Sao lưu dữ liệu Redis (tạo tệp kết xuất) là khởi động máy chủ thông qua dòng lệnh với cờ nô lệ và tạo bản sao trực tiếp như sau (giả sử nguồn Redis là 1.2.3.4 trên cổng 6379):

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

Tôi có một redis chạy trên máy linux mà tôi có quyền truy cập. tôi có một redis trên máy tính windows của tôi. Có thể sao chép dữ liệu cho sự kết hợp đó?
Kamran Shahid

1
Tôi tin rằng bạn có thể nếu cả hai cùng một phiên bản
Maoz Zadok

Có tôi cũng cần kiểm tra phiên bản. Nhưng phiên bản phát hành windows không vượt quá 3.0 như lần trước tôi biết
Kamran Shahid

0

Tôi vừa xuất bản một tiện ích giao diện dòng lệnh lên npm và github cho phép bạn sao chép các khóa khớp với một mẫu nhất định (thậm chí *) từ cơ sở dữ liệu Redis này sang cơ sở dữ liệu khác.

Bạn có thể tìm thấy tiện ích ở đây:

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


-2

redis-dump cuối cùng đã làm việc cho tôi. Tài liệu của nó cung cấp một ví dụ về cách kết xuất cơ sở dữ liệu Redis và chèn dữ liệu vào một cơ sở dữ liệu khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.