Thứ hai, 14/09/2015 | 00:00 GMT+7

Cách backup và khôi phục dữ liệu Redis của bạn trên Ubuntu 14.04

Redis là bộ nhớ đệm trong bộ nhớ, key-value và lưu trữ (tức là database ) cũng có thể được duy trì (lưu vĩnh viễn) vào đĩa. Trong bài viết này, bạn sẽ đọc cách backup database Redis trên server Ubuntu 14.04.

Dữ liệu Redis, theo mặc định, được lưu vào đĩa trong file .rdb , đây là ảnh chụp nhanh tại thời điểm của tập dữ liệu Redis của bạn. Ảnh chụp nhanh được thực hiện theo các khoảng thời gian xác định, và vì vậy rất hoàn hảo cho các bản backup của bạn.

Yêu cầu

Để hoàn thành các bước trong hướng dẫn này, bạn cần:

  • Server Ubuntu 14.04
  • Cài đặt Redis. Bạn có thể theo dõi những cài đặt tổng thể từ Redis cài đặt hướng dẫn này (mặc dù nó sẽ chỉ làm việc cũng với một cụm master-slave)
  • Đảm bảo rằng server Redis của bạn đang chạy
  • Nếu bạn đã đặt password Redis, thì bạn nên sử dụng nó. Mật khẩu nằm trong file cấu hình Redis - /etc/redis/redis.conf

Bước 1 - Định vị Thư mục Dữ liệu Redis

Redis lưu trữ dữ liệu của nó trong một folder trên server của bạn, đó là những gì ta muốn backup . Đầu tiên ta cần biết nó ở đâu.

Trong Ubuntu và các bản phân phối Linux khác, folder database Redis là /var/lib/redis . Nhưng nếu bạn đang quản lý một server mà bạn kế thừa và vị trí dữ liệu Redis đã bị thay đổi, bạn có thể xác định vị trí của nó bằng lệnh :

  • sudo locate *rdb

Ngoài ra, bạn cũng có thể tìm thấy nó từ dấu nhắc redis-cli . Để làm điều đó, hãy nhập:

  • redis-cli

Nếu server Redis không chạy, phản hồi sẽ là:

Đầu ra
Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected> 

Trong trường hợp đó, hãy khởi động Redis và kết nối lại bằng các lệnh sau:

  • sudo service redis-server start
  • redis-cli

Dấu nhắc shell bây giờ sẽ thay đổi thành:

127.0.0.1:6379> 

Trong khi kết nối với Redis, hai lệnh tiếp theo sẽ xác thực nó và lấy folder dữ liệu:

  • auth insert-redis-password-here
  • config get dir

Đầu ra của lệnh cuối cùng phải là folder dữ liệu Redis của bạn:

Đầu ra
1) "dir" 2) "/var/lib/redis" 

Ghi lại folder Redis của bạn. Nếu nó khác với folder được hiển thị, hãy đảm bảo bạn sử dụng folder này trong suốt hướng dẫn.

Bạn có thể thoát khỏi giao diện dòng lệnh của database ngay bây giờ:

  • exit

Kiểm tra xem đây có phải là folder chính xác không:

  • ls /var/lib/redis

Bạn sẽ thấy một file dump.rdb . Đó là dữ liệu của Redis. Nếu appendonly cũng được bật, bạn cũng sẽ thấy một appendonly.aof hoặc một file .aof khác, chứa log của tất cả các hoạt động ghi mà server nhận được.

Xem bài đăng này về tính bền bỉ của Redis để thảo luận về sự khác biệt giữa hai file này. Về cơ bản, file .rdb là ảnh chụp nhanh hiện tại và file .aof lưu giữ lịch sử Redis của bạn. Cả hai đều đáng để backup .

Ta sẽ bắt đầu chỉ với file .rdb và kết thúc bằng bản backup tự động của cả hai file .

(Tùy chọn) Bước 2 - Thêm dữ liệu mẫu

Trong phần này, bạn có thể tạo một số dữ liệu mẫu để lưu trữ trong database Redis của bạn . Nếu bạn đã có dữ liệu trên server của bạn , bạn chỉ có thể backup nội dung hiện có của bạn .

Đăng nhập vào giao diện dòng lệnh của database :

  • redis-cli

Xác thực:

  • auth insert-redis-password-here

Hãy thêm một số dữ liệu mẫu. Bạn sẽ nhận được phản hồi là OK sau mỗi bước.

  • SET shapes:triangles "3 sides"
  • SET shapes:squares "4 sides"

Xác nhận dữ liệu đã được thêm vào.

  • GET shapes:triangles
  • GET shapes:squares

Đầu ra được bao gồm bên dưới:

Đầu ra
"3 sides"  "4 sides" 

Để commit những thay đổi này vào file /var/lib/redis/dump.rdb , hãy lưu chúng:

  • save

Bạn có thể thoát:

  • exit

Nếu muốn, bạn có thể kiểm tra nội dung của file kết xuất ngay bây giờ. Nó phải có dữ liệu , mặc dù ở dạng thân thiện với máy:

  • sudo cat /var/lib/redis/dump.rdb
/var/lib/redis/dump.rdb
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C 

Bước 3 - Backup dữ liệu Redis

Đến đây bạn đã biết dữ liệu Redis của bạn nằm ở đâu, đã đến lúc thực hiện backup . Từ trang web chính thức của Redis có trích dẫn này:

Redis rất thân thiện với việc backup dữ liệu vì bạn có thể sao chép các file RDB trong khi database đang chạy: RDB không bao giờ được sửa đổi sau khi được tạo ra và trong khi được production , nó sử dụng tên tạm thời và được đổi tên thành đích cuối cùng chỉ bằng cách sử dụng đổi tên (2) khi ảnh chụp nhanh mới hoàn tất.

Vì vậy, bạn có thể backup hoặc sao chép file database trong khi server Redis đang chạy. Giả sử rằng bạn đang backup nó vào một folder trong folder chính của bạn , việc thực hiện backup đó đơn giản như gõ:

  • sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001

Redis lưu nội dung ở đây theo định kỳ , nghĩa là bạn không được đảm bảo backup cập nhật từng phút nếu lệnh trên là tất cả những gì bạn chạy. Bạn cần lưu dữ liệu của bạn trước.

Tuy nhiên, nếu có thể chấp nhận được một lượng nhỏ dữ liệu bị mất, chỉ cần backup một file này sẽ hoạt động.

Lưu trạng thái database

Để có được một bản sao dữ liệu Redis gần đây hơn, cách tốt hơn là truy cập redis-cli , dòng lệnh Redis.

Xác thực như được giải thích trong Bước 1.

Sau đó, ra lệnh save như sau:

  • save

Đầu ra phải giống như sau :

Đầu ra
OK (1.08s) 

Thoát khỏi database .

Đến đây bạn có thể chạy lệnh cp được đưa ra ở trên, tin rằng bản backup của bạn đã được cập nhật đầy đủ.

Mặc dù lệnh cp sẽ cung cấp bản backup database một lần, giải pháp tốt nhất là cài đặt cron job sẽ tự động hóa quy trình và sử dụng công cụ có thể thực hiện cập nhật gia tăng và nếu cần, khôi phục dữ liệu.

Bước 4 - Cấu hình Cập nhật tự động với rdiff-backup và Cron

Trong phần này, ta sẽ cấu hình một bản backup tự động backup toàn bộ folder dữ liệu Redis của bạn, bao gồm cả hai file dữ liệu.

Có một số công cụ backup tự động có sẵn. Trong hướng dẫn này, ta sẽ sử dụng một công cụ mới hơn, thân thiện với user được gọi là rdiff-backup .

rdiff-backup một công cụ backup dòng lệnh. Có khả năng rdiff-backup chưa được cài đặt trên server của bạn, vì vậy trước tiên bạn sẽ phải cài đặt nó:

  • sudo apt-get install -y rdiff-backup

Bây giờ nó đã được cài đặt, bạn có thể kiểm tra nó bằng cách backup dữ liệu Redis của bạn vào một folder trong folder chính của bạn. Trong ví dụ này, ta giả định folder chính của bạn là /home/ sammy :

Lưu ý folder đích sẽ được tạo bởi script nếu nó không tồn tại. Nói cách khác, bạn không cần phải tự tạo ra nó.

Với –preserve-number-id , quyền sở hữu của các folder nguồn và đích sẽ giống nhau.

  • sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis

Giống như lệnh cp trước đó, đây là bản backup một lần. Điều thay đổi là ta đang backup toàn bộ folder /var/lib/redis và sử dụng rdiff-backup .

Bây giờ ta sẽ tự động hóa backup bằng cron, để backup diễn ra tại một thời điểm nhất định. Để thực hiện điều đó, hãy mở crontab hệ thống:

  • sudo crontab -e

(Nếu bạn chưa sử dụng crontab trước đây trên server này, hãy chọn editor yêu thích của bạn tại dấu nhắc.)

Ở cuối filek, hãy thêm mục nhập được hiển thị bên dưới.

crontab
0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis 

Mục nhập Cron này sẽ thực hiện backup Redis hàng ngày vào lúc nửa đêm. Lựa chọn –no-file- file_statistics sẽ vô hiệu hóa việc ghi vào tệp thống kê file trong folder rdiff-backup-data , điều này sẽ làm cho rdiff-backup chạy nhanh hơn và sử dụng ít dung lượng đĩa hơn một chút.

Ngoài ra, bạn có thể sử dụng mục này để backup hàng ngày:

  • @daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

Để biết thêm về Cron nói chung, hãy đọc bài viết này về Cron .

Như hiện tại, bản backup sẽ được thực hiện mỗi ngày một lần, vì vậy bạn có thể quay lại vào ngày mai để kiểm tra lần cuối. Hoặc, bạn có thể tạm thời tăng tần suất backup đảm bảo rằng nó đang hoạt động.

Bởi vì các file được sở hữu bởi user hệ thống redis , bạn có thể xác minh chúng đang có sẵn bằng cách sử dụng lệnh này. (Đảm bảo bạn đợi cho đến khi bản backup thực sự được kích hoạt):

  • ls -l /home/sammy/redis

Đầu ra của bạn sẽ giống như sau:

Đầu ra
total 20 -rw-rw---- 1 redis redis    70 Sep 14 13:13 dump.rdb drwx------ 3 root  root  12288 Sep 14 13:49 rdiff-backup-data -rw-r----- 1 redis redis   119 Sep 14 13:09 redis-staging-ao.aof 

Như vậy, bạn sẽ có bản backup hàng ngày dữ liệu Redis của bạn , được lưu trữ trong folder chính của bạn trên cùng một server .

Bước 5 - Khôi phục database Redis từ bản backup

Đến đây bạn đã thấy cách backup database Redis, bước này sẽ hướng dẫn bạn cách khôi phục database của bạn từ file backup dump.rdb .

Khôi phục bản backup yêu cầu bạn thay thế file database Redis đang hoạt động bằng file khôi phục. Vì điều này có khả năng phá hủy, ta khuyên bạn nên khôi phục về server Redis mới nếu có thể.

Bạn sẽ không muốn overrides database trực tiếp của bạn bằng một quá trình khôi phục có vấn đề hơn. Tuy nhiên, đổi tên thay vì xóa file hiện tại sẽ giảm thiểu rủi ro ngay cả khi khôi phục về cùng một server , đó là chiến thuật mà hướng dẫn này chỉ ra.

Kiểm tra nội dung file khôi phục

Trước tiên, hãy kiểm tra nội dung của file dump.rdb của bạn. Đảm bảo rằng nó có dữ liệu bạn muốn.

Bạn có thể kiểm tra nội dung của file kết xuất trực tiếp, mặc dù hãy nhớ rằng nó sử dụng định dạng thân thiện với Redis hơn là thân thiện với con người:

  • sudo cat /home/gilly/redis/dump.rdb

Đây là một database nhỏ; kết quả của bạn sẽ giống như sau:

Đầu ra
REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,? 

Nếu bản backup mới nhất của bạn không có dữ liệu, bạn không nên tiếp tục khôi phục. Nếu nội dung ở đó, hãy tiếp tục.

Tùy chọn: Mô phỏng mất dữ liệu

Hãy mô phỏng việc mất dữ liệu, đó sẽ là lý do để khôi phục từ bản backup của bạn.

Đăng nhập vào Redis:

  • redis-cli

Trong chuỗi lệnh này, ta sẽ ủy quyền với Redis và xóa mục nhập shapes:triangles :

  • auth insert-redis-password-here
  • DEL shapes:triangles

Bây giờ, hãy đảm bảo mục nhập đã bị xóa:

  • GET shapes:triangles

Đầu ra phải là:

Đầu ra
(nil) 

Lưu và thoát:

  • save
  • exit

Tùy chọn: Cài đặt server Redis mới

Bây giờ, nếu bạn định khôi phục lại server Redis mới, hãy đảm bảo server Redis mới đang hoạt động.

Vì mục đích của hướng dẫn này, ta sẽ chỉ làm theo Bước 1 của hướng dẫn Redis Cluster này , mặc dù bạn có thể theo dõi toàn bộ bài viết nếu bạn muốn cài đặt phức tạp hơn.

Nếu bạn làm theo Bước 2 , nơi bạn thêm password và bật AOF, hãy đảm bảo bạn tính đến điều đó trong quá trình khôi phục.

Khi bạn đã xác minh Redis đã hoạt động trên server mới bằng cách chạy redis-benchmark -q -n 1000 -c 10 -P 5 , bạn có thể tiếp tục.

Đang dừng Redis

Trước khi có thể thay thế file kết xuất Redis, ta cần dừng version Redis hiện đang chạy. Cơ sở dữ liệu sẽ offline khi bạn dừng Redis.

sudo service redis-server stop 

Đầu ra phải là:

Đầu ra
Stopping redis-server: redis-server 

Kiểm tra xem nó đã thực sự dừng chưa:

sudo service redis-server status 
Đầu ra
redis-server is not running 

Tiếp theo, ta sẽ đổi tên file database hiện tại.

Đổi tên hiện tại dump.rdb

Redis đọc nội dung của nó từ file dump.rdb . Hãy đổi tên hiện tại để mở đường cho file khôi phục của ta .

sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old 

Lưu ý bạn có thể khôi phục dump.rdb.old nếu bạn quyết định version hiện tại tốt hơn file backup của bạn .

Nếu AOF được bật, hãy tắt nó đi

AOF theo dõi mọi thao tác ghi vào database Redis. Tuy nhiên, vì ta đang cố gắng khôi phục từ bản backup tại thời điểm nên ta không muốn Redis tạo lại các hoạt động được lưu trữ trong file AOF của nó.

Nếu bạn cài đặt server Redis của bạn từ các hướng dẫn trong hướng dẫn Redis Cluster , thì AOF được bật.

Bạn cũng có thể liệt kê nội dung của folder /var/lib/redis/ . Nếu bạn thấy file .aof ở đó, bạn đã bật AOF.

Hãy đổi tên file .aof để tạm thời loại bỏ nó. Thao tác này đổi tên mọi file kết thúc bằng .aof , vì vậy nếu bạn có nhiều file AOF, bạn nên đổi tên các file riêng lẻ và KHÔNG chạy lệnh này:

  • sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old

Chỉnh sửa file cấu hình Redis của bạn để tạm thời tắt AOF:

  • sudo nano /etc/redis/redis.conf

Trong phần AOF , hãy tìm chỉ thị appendonly và thay đổi nó từ yes thành no . Điều đó vô hiệu hóa nó:

/etc/redis/redis.conf
appendonly no 

Khôi phục file dump.rdb

Bây giờ ta sẽ sử dụng file khôi phục của bạn , file này sẽ được lưu tại /home/ sammy /redis/dump.rdb nếu bạn đã làm theo các bước trước trong hướng dẫn này.

Nếu bạn đang khôi phục một server mới, bây giờ là lúc tải file từ server backup của bạn lên server mới:

  • scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb

Bây giờ, trên server khôi phục , có thể là server Redis root hoặc server mới, bạn có thể sử dụng cp để sao chép file vào folder /var/lib/redis :

  • sudo cp -p /home/sammy/redis/dump.rdb /var/lib/redis

(Nếu bạn đã tải file lên /home/ sammy /dump.rdb , hãy sử dụng lệnh sudo cp -p /home/ sammy /dump.rdb /var/lib/redis để sao chép file .)

Ngoài ra, nếu bạn muốn sử dụng rdiff-backup , hãy chạy lệnh hiển thị bên dưới. Lưu ý điều này sẽ chỉ hoạt động nếu bạn đang khôi phục từ folder mà bạn đã cài đặt với rdiff-backup ban đầu. Với rdiff-backup , bạn phải chỉ định tên của file trong folder đích:

  • sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb

Thông tin chi tiết về tùy chọn -r có trên trang web của dự án được đưa ra ở cuối bài viết này.

Đặt quyền cho file dump.rdb

Bạn có thể đã có các quyền chính xác nếu bạn đang khôi phục vào cùng một server mà bạn đã thực hiện backup .

Nếu bạn đã sao chép file backup vào một server mới, bạn có thể sẽ phải cập nhật các quyền đối với file .

Hãy xem các quyền của file dump.rdb trong folder /var/lib/redis/ .

  • ls -la /var/lib/redis/

Nếu bạn thấy thông tin như thế này:

Đầu ra
-rw-r-----  1 sammy sammy   70 Feb 25 15:38 dump.rdb -rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old 

Bạn cần cập nhật các quyền để file thuộc sở hữu của user và group redis :

  • sudo chown redis:redis /var/lib/redis/dump.rdb

Cập nhật file để group cũng có thể ghi:

  • sudo chmod 660 /var/lib/redis/dump.rdb

Bây giờ hãy liệt kê lại nội dung của folder /var/lib/redis/ :

  • ls -la /var/lib/redis/

Bây giờ file dump.rdb được khôi phục của bạn có các quyền chính xác:

Đầu ra
-rw-rw----  1 redis redis   70 Feb 25 15:38 dump.rdb -rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old 

Nếu daemon server Redis của bạn đã chạy trước khi bạn khôi phục file và bây giờ sẽ không khởi động - nó sẽ hiển thị thông báo như Could not connect to Redis at 127.0.0.1:6379: Connection refused - hãy kiểm tra log của Redis.

Nếu bạn thấy một dòng trong log như Fatal error loading the DB: Permission denied. Exiting. , thì bạn cần kiểm tra các quyền của file dump.rdb , như được giải thích trong bước này.

Khởi động Redis

Bây giờ ta cần khởi động lại server Redis.

sudo service redis-server start 

Kiểm tra nội dung database

Hãy xem việc khôi phục có hiệu quả không.

Đăng nhập vào Redis:

  • redis-cli

Kiểm tra các shapes:triangles mục nhập shapes:triangles :

  • GET shapes:triangles

Đầu ra phải là:

Đầu ra
"3 sides" 

Tuyệt quá! Việc khôi phục của ta đã hoạt động.

Lối ra:

  • exit

Nếu bạn không sử dụng AOF, bạn đã hoàn tất! Phiên bản Redis đã khôi phục của bạn sẽ trở lại bình thường.

(Tùy chọn) Bật AOF

Nếu bạn muốn tiếp tục hoặc bắt đầu sử dụng AOF để theo dõi tất cả các lần ghi vào database của bạn , hãy làm theo các hướng dẫn sau. Tệp AOF phải được tạo lại từ dòng lệnh Redis.

Đăng nhập vào Redis:

  • redis-cli

Bật AOF:

  • BGREWRITEAOF

Bạn sẽ nhận được kết quả :

Đầu ra
Background append only file rewriting started 

Chạy lệnh info . Điều này sẽ tạo ra khá nhiều kết quả :

  • info

Cuộn đến phần Persistence và kiểm tra xem các mục nhập aof trùng với những gì được hiển thị ở đây. Nếu aof_rewrite_in_progress0 , thì quá trình tạo lại file AOF đã hoàn tất.

Đầu ra
# Persistence  . . .  aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:0 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok 

Nếu được xác nhận quá trình tạo lại file AOF đã hoàn tất, bây giờ bạn có thể thoát khỏi dòng lệnh Redis:

  • exit

Bạn có thể liệt kê lại các file trong /var/lib/redis :

  • ls /var/lib/redis

Bạn sẽ thấy lại file .aof đang .aof , chẳng hạn như appendonly.aof hoặc redis-staging-ao.aof , cùng với file dump.rdb và các file backup khác.

Sau khi điều đó được xác nhận, hãy dừng server Redis:

  • sudo service redis-server stop

Bây giờ, bật lại AOF trong file redis.conf :

  • sudo nano /etc/redis/redis.conf

Sau đó, bật lại AOF bằng cách thay đổi giá trị của appendonly thành yes :

/etc/redis/redis.conf
appendonly yes 

Khởi động Redis:

  • sudo service redis-server start

Nếu bạn muốn xác minh nội dung của database , chỉ cần chạy qua phần Kiểm tra nội dung database .

Đó là nó! Phiên bản Redis đã khôi phục của bạn sẽ trở lại bình thường.

Kết luận

Backup dữ liệu Redis của bạn theo cách được đưa ra trong bài viết này rất hữu ích khi bạn không ngại backup dữ liệu vào một folder trên cùng một server .

Tất nhiên, cách tiếp cận an toàn nhất là backup vào một máy khác. Bạn có thể khám phá thêm các tùy chọn backup bằng cách đọc bài viết này về các bản backup :

Bạn có thể sử dụng nhiều phương pháp backup này với các file giống nhau trong folder /var/lib/redis .

Hãy theo dõi bài viết trong tương lai của ta về việc di chuyển và phục hồi của Redis. Bạn cũng có thể cần tham khảo các ví dụ của tài liệu rdiff-backup để biết cách sử dụng rdiff-backup một cách hiệu quả:


Tags:

Các tin liên quan

Cách thiết lập server Redis làm Trình xử lý phiên cho PHP trên Ubuntu 14.04
2015-08-21
Cách cấu hình một cụm Redis trên CentOS 7
2015-07-30
Cách cấu hình cụm Redis trên Ubuntu 14.04
2015-07-16
Cách cấu hình bộ đệm Redis để tăng tốc WordPress trên Ubuntu 14.04
2014-12-15
Cách cấu hình giám sát Sensu, RabbitMQ và Redis trên Ubuntu 14.04
2014-09-29