Thứ tư, 04/12/2019 | 00:00 GMT+7

Cách di chuyển dữ liệu Redis với sao chép trên Ubuntu 18.04

Redis là một repository dữ liệu key-value trong bộ nhớ được biết đến với tính linh hoạt, hiệu suất, hỗ trợ ngôn ngữ rộng và các tính năng tích hợp như sao chép . Sao chép là việc thường xuyên sao chép dữ liệu từ database này sang database khác để có một bản sao luôn là bản sao chính xác của cá thể chính. Một cách sử dụng phổ biến của sao chép Redis là di chuyển repodata Redis hiện có sang một server mới, như một cách có thể làm khi mở rộng cơ sở hạ tầng của họ để có hiệu suất tốt hơn.

Hướng dẫn này phác thảo quy trình sử dụng các tính năng sao chép tích hợp của Redis để di chuyển dữ liệu từ một server Ubuntu 18.04 (“nguồn”) sang một server khác (“đích”). Điều này liên quan đến việc thực hiện một vài thay đổi cấu hình cho mỗi server , đặt server đích hoạt động như một bản sao của nguồn, và sau đó quảng bá bản sao trở lại một bản sao chính sau khi quá trình di chuyển hoàn tất.

Yêu cầu

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

Bước 1 - (Tùy chọn) Tải version Redis nguồn của bạn với dữ liệu mẫu

Bước tùy chọn này liên quan đến việc tải version Redis nguồn của bạn với một số dữ liệu mẫu để bạn có thể thử nghiệm với việc di chuyển dữ liệu sang version đích của bạn . Nếu bạn đã có dữ liệu mà bạn muốn chuyển sang mục tiêu của bạn , bạn có thể chuyển sang Bước 2, bước này sẽ xem xét cách backup dữ liệu đó.

Để bắt đầu, hãy kết nối với server Ubuntu mà bạn sẽ sử dụng làm version Redis nguồn của bạn với quyền là user không phải root của bạn:

  • ssh sammy@source_server_ip

Sau đó, chạy lệnh sau để truy cập server Redis của bạn:

  • redis-cli

Nếu bạn đã cấu hình server Redis của bạn để yêu cầu xác thực password , hãy chạy lệnh auth theo sau là password Redis của bạn:

  • auth source_redis_password

Tiếp theo, chạy các lệnh sau. Những điều này sẽ tạo ra một số khóa chứa một vài chuỗi, một hàm băm, một danh sách và một tập hợp:

  • mset string1 "Redis" string2 "is" string3 "fun!"
  • hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
  • rpush list1 "Redis" "is" "feature-rich!"
  • sadd set1 "Redis" "is" "free!"

Ngoài ra, hãy chạy các lệnh expire sau đây để cung cấp một số khóa trong số này có thời gian chờ. Điều này sẽ làm cho chúng dễ bay hơi , nghĩa là Redis sẽ xóa chúng sau một khoảng thời gian xác định ( 7500 giây, trong trường hợp này):

  • expire string2 7500
  • expire hash1 7500
  • expire set1 7500

Cùng với đó, bạn có một số dữ liệu mẫu có thể xuất sang version Redis mục tiêu của bạn . Hãy giữ dấu nhắc redis-cli mở ngay bây giờ, vì ta sẽ chạy thêm một vài lệnh từ nó trong bước tiếp theo để backup dữ liệu này.

Bước 2 - Backup version Redis nguồn của bạn

Khi nào bạn định di chuyển dữ liệu từ server này sang server khác, đều có nguy cơ xảy ra sự cố và bạn có thể bị mất dữ liệu. Mặc dù rủi ro này là nhỏ, ta sẽ sử dụng lệnh bgsave của Redis để tạo bản backup database Redis nguồn của bạn trong trường hợp bạn gặp lỗi trong quá trình sao chép.

Nếu bạn chưa mở nó, hãy bắt đầu bằng cách mở giao diện dòng lệnh Redis:

  • redis-cli

Ngoài ra, nếu bạn đã cấu hình server Redis của bạn để yêu cầu xác thực password , hãy chạy lệnh auth theo sau là password Redis của bạn:

  • auth password

Tiếp theo, chạy lệnh bgsave . Thao tác này sẽ tạo một ảnh chụp nhanh tập dữ liệu hiện tại của bạn và xuất nó sang file kết xuất được giữ trong folder làm việc của Redis:

  • bgsave

Lưu ý: Bạn có thể chụp nhanh database Redis của bạn bằng lệnh save hoặc bgsave . Tuy nhiên, lý do ta sử dụng lệnh bgsave ở đây là lệnh save chạy đồng bộ , nghĩa là nó sẽ chặn bất kỳ client nào khác được kết nối với database . Vì lý do này, tài liệu lệnh save khuyên bạn hầu như không nên chạy nó trong môi trường production .

Thay vào đó, nó đề xuất sử dụng lệnh bgsave chạy không đồng bộ . Điều này sẽ khiến Redis phân tách database thành hai quy trình: quy trình mẹ sẽ tiếp tục phục vụ các client trong khi quy trình con lưu database trước khi thoát:

Lưu ý nếu khách hàng thêm hoặc sửa đổi dữ liệu trong khi hoạt động bgsave đang chạy, những thay đổi này sẽ không được ghi lại trong ảnh chụp nhanh.

Sau đó, bạn có thể đóng kết nối với cá thể Redis của bạn bằng cách chạy lệnh exit :

  • exit

Nếu bạn cần nó trong tương lai, bạn có thể tìm thấy file kết xuất dữ liệu trong folder làm việc của cá thể Redis của bạn. Nhớ lại cách trong hướng dẫn cài đặt Redis yêu cầu , bạn đặt cá thể Redis của bạn để sử dụng /var/lib/redis làm folder làm việc của nó.

Liệt kê nội dung của folder làm việc Redis của bạn để xác nhận nó đang giữ file kết xuất dữ liệu:

  • sudo ls /var/lib/redis

Nếu file kết xuất được xuất chính xác, bạn sẽ thấy nó trong kết quả của lệnh này. Theo mặc định, file này có tên là dump.rdb :

Output
dump.rdb

Sau khi xác nhận dữ liệu đã được backup chính xác, bạn đã sẵn sàng cấu hình server Redis nguồn của bạn để chấp nhận các kết nối bên ngoài và cho phép sao chép.

Bước 3 - Cấu hình Phiên bản Redis Nguồn của bạn

Theo mặc định, Redis không được cấu hình để lắng nghe các kết nối bên ngoài, nghĩa là bất kỳ bản sao nào bạn cấu hình sẽ không thể đồng bộ hóa với version nguồn của bạn trừ khi bạn cập nhật cấu hình của nó. Tại đây, ta sẽ cập nhật file cấu hình của cá thể nguồn để cho phép các kết nối bên ngoài và cũng đặt password mà cá thể đích sẽ sử dụng để xác thực khi bắt đầu sao chép. Sau đó, ta sẽ thêm luật firewall để cho phép kết nối với cổng mà Redis đang chạy.

Mở file cấu hình version Redis nguồn của bạn bằng editor bạn muốn . Ở đây, ta sẽ sử dụng nano :

  • sudo nano /etc/redis/redis.conf

Điều hướng đến dòng bắt đầu bằng lệnh bind . Nó sẽ trông như thế này theo mặc định:

/etc/redis/redis.conf
. . . bind 127.0.0.1 . . . 

Chỉ thị này liên kết Redis với 127.0.0.1 , một địa chỉ lặp lại IPv4 đại diện cho localhost . Điều này nghĩa là version Redis này được cấu hình để chỉ lắng nghe các kết nối bắt nguồn từ cùng một server với server mà nó được cài đặt. Để cho phép cá thể nguồn của bạn chấp nhận bất kỳ kết nối nào được thực hiện đến địa chỉ IP công cộng của nó, chẳng hạn như những kết nối được tạo từ cá thể đích của bạn, hãy thêm địa chỉ IP của server Redis nguồn của bạn sau 127.0.0.1 . Lưu ý bạn không nên bao gồm bất kỳ dấu phẩy nào sau 127.0.0.1 :

/etc/redis/redis.conf
. . . bind 127.0.0.1 source_server_IP . . . 

Tiếp theo, nếu bạn chưa làm như vậy, hãy sử dụng chỉ thị requirepass để cấu hình password mà user phải nhập trước khi họ có thể tương tác với dữ liệu trên version nguồn. Làm như vậy bằng cách bỏ ghi chú chỉ thị và đặt nó thành password hoặc passphrase (password bảo vệ) phức tạp:

/etc/redis/redis.conf
. . . requirepass source_redis_password . . . 

Hãy nhớ ghi lại password bạn đặt ở đây, vì bạn cần password đó khi cấu hình server đích.

Sau thay đổi đó, bạn có thể lưu file cấu hình Redis. Nếu bạn đã chỉnh sửa nó bằng nano , hãy làm như vậy bằng cách nhấn CTRL+X , Y , sau đó ENTER .

Sau đó, khởi động lại dịch vụ Redis để những thay đổi này có hiệu lực:

  • sudo systemctl restart redis

Đó là tất cả những gì bạn cần làm về cấu hình Redis, nhưng nếu bạn đã cấu hình firewall trên server của bạn , nó sẽ tiếp tục chặn bất kỳ nỗ lực nào của server mục tiêu của bạn để kết nối với nguồn. Giả sử bạn đã cấu hình firewall của bạn với ufw , bạn có thể cập nhật nó để cho phép các kết nối tới cổng mà Redis đang chạy bằng lệnh sau. Lưu ý Redis được cấu hình để sử dụng cổng 6379 theo mặc định:

  • sudo ufw allow 6379

Sau khi thực hiện thay đổi cuối cùng đó, bạn đã hoàn tất việc cấu hình server Redis nguồn của bạn . Tiếp tục cấu hình version Redis đích của bạn để hoạt động như một bản sao của nguồn.

Bước 4 - Cấu hình Phiên bản Redis Mục tiêu của bạn

Đến thời điểm này, bạn đã cấu hình version Redis nguồn của bạn để chấp nhận các kết nối bên ngoài. Tuy nhiên, vì bạn đã khóa quyền truy cập vào nguồn bằng cách bỏ ghi chú chỉ thị requirepass , bản sao đích của bạn sẽ không thể sao chép dữ liệu được giữ trên nguồn. Tại đây, bạn sẽ cấu hình version Redis đích của bạn để có thể xác thực kết nối của nó với nguồn, do đó cho phép sao chép.

Bắt đầu bằng cách kết nối với server Redis mục tiêu của bạn với quyền là user không phải root của bạn:

  • ssh sammy@target_server_ip

Tiếp theo, mở file cấu hình Redis của server mục tiêu của bạn:

  • sudo nano /etc/redis/redis.conf

Nếu bạn chưa làm như vậy, bạn nên cấu hình password cho version Redis mục tiêu của bạn bằng lệnh requirepass :

/etc/redis/redis.conf
. . . requirepass target_redis_password . . . 

Tiếp theo, bỏ ghi chú chỉ thị masterauth và đặt nó thành password xác thực của cá thể Redis nguồn của bạn. Bằng cách làm này, server đích của bạn có thể xác thực đối tượng nguồn sau khi bạn kích hoạt sao chép:

/etc/redis/redis.conf
. . . masterauth source_redis_password . . . 

Cuối cùng, nếu bạn có khách hàng ghi thông tin vào cá thể nguồn của bạn, bạn cũng cần cấu hình họ để ghi dữ liệu vào cá thể đích của bạn. Bằng cách này, nếu một khách hàng ghi bất kỳ dữ liệu nào sau khi bạn quảng bá mục tiêu trở lại thành một version chính, nó sẽ không bị mất.

Tuy nhiên, để làm điều này, bạn cần phải điều chỉnh replica-read-only thị chỉ replica-read-only . Điều này được đặt thành yes theo mặc định, nghĩa là nó được cấu hình để trở thành một bản sao “chỉ đọc” mà khách hàng sẽ không thể ghi vào. Đặt chỉ thị này thành no để cho phép khách hàng ghi vào nó:

/etc/redis/redis.conf
. . . replica-read-only no . . . 

Đó là tất cả những thay đổi bạn cần thực hiện đối với file cấu hình của mục tiêu, vì vậy bạn có thể lưu và đóng nó.

Sau đó, khởi động lại dịch vụ Redis để những thay đổi này có hiệu lực:

  • sudo systemctl restart redis

Sau khi khởi động lại dịch vụ Redis, server mục tiêu của bạn sẽ sẵn sàng trở thành bản sao của nguồn. Tất cả những gì bạn cần làm để biến nó thành một lệnh là chạy một lệnh duy nhất mà ta sẽ thực hiện ngay sau đây.

Lưu ý: Nếu bạn có ứng dụng client nào ghi dữ liệu vào version Redis nguồn của bạn, bây giờ sẽ là thời điểm tốt để cấu hình chúng cũng ghi dữ liệu vào mục tiêu của bạn.

Bước 5 - Bắt đầu và xác minh nhân rộng

Đến thời điểm này, bạn đã cấu hình version Redis nguồn của bạn để chấp nhận các kết nối từ server mục tiêu và bạn đã cấu hình version Redis mục tiêu của bạn để có thể xác thực nguồn dưới dạng bản sao. Với những phần này, bạn đã sẵn sàng biến version đích của bạn thành một bản sao của nguồn.

Bắt đầu bằng cách mở giao diện dòng lệnh Redis trên server Redis mục tiêu của bạn:

  • redis-cli

Chạy lệnh auth để xác thực kết nối:

  • auth password

Tiếp theo, biến cá thể đích thành một bản sao của nguồn bằng lệnh replicaof . Đảm bảo thay thế source_server_ip bằng địa chỉ IP công khai của version nguồn và source_port bằng cổng được Redis sử dụng trên version nguồn của bạn:

  • replicaof source_server_ip source_port

Từ dấu nhắc , hãy chạy lệnh scan sau. Thao tác này sẽ trả về tất cả các khóa hiện được giữ bởi bản sao:

  • scan 0

Nếu bản sao đang hoạt động như mong đợi, bạn sẽ thấy tất cả các khóa từ bản sao nguồn của bạn được giữ trong bản sao. Nếu bạn đã tải nguồn của bạn với dữ liệu mẫu ở Bước 1, kết quả của lệnh scan sẽ giống như sau:

Output
1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

Lưu ý: Hãy lưu ý lệnh này có thể trả về các phím theo thứ tự khác với thứ tự được hiển thị trong ví dụ này.

Tuy nhiên, nếu lệnh này không trả về cùng các khóa được giữ trên version Redis nguồn của bạn, thì có thể có lỗi trong một trong các file cấu hình server của bạn ngăn database đích kết nối với nguồn. Trong trường hợp này, hãy đóng kết nối với version Redis đích của bạn và kiểm tra kỹ xem bạn đã chỉnh sửa các file cấu hình trên cả server Redis nguồn và mục tiêu của bạn một cách chính xác chưa.

Trong khi bạn mở kết nối, bạn cũng có thể xác nhận các khóa bạn đặt để hết hạn vẫn còn dễ bay hơi. Làm như vậy bằng cách chạy lệnh ttl với một trong các phím này làm đối số:

  • ttl hash1

Thao tác này sẽ trả về số giây trước khi khóa này bị xóa:

Output
5430

Khi bạn đã xác nhận dữ liệu trên bản sao nguồn của bạn đã được đồng bộ hóa chính xác với mục tiêu của bạn, bạn có thể thúc đẩy mục tiêu trở lại thành bản sao chính bằng cách chạy lại lệnh replicaof . Tuy nhiên, lần này, thay vì theo dõi bản replicaof với địa chỉ IP và cổng, hãy theo dõi nó mà no one . Điều này sẽ khiến version đích ngừng đồng bộ hóa với nguồn ngay lập tức:

  • replicaof no one

Để xác nhận dữ liệu được sao chép từ nguồn vẫn tồn tại trên đích, hãy chạy lại lệnh scan mà bạn đã nhập trước đó:

scan 0 

Bạn sẽ thấy các khóa tương tự trong kết quả của lệnh này như khi bạn chạy lệnh scan khi mục tiêu vẫn đang sao chép nguồn:

Output
1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

Như vậy, bạn đã di chuyển thành công tất cả dữ liệu từ version Redis nguồn sang mục tiêu của bạn . Nếu bạn có ứng dụng client nào vẫn đang ghi dữ liệu vào cá thể nguồn, thì bây giờ sẽ là thời điểm tốt để cấu hình chúng để chỉ ghi vào đích.

Kết luận

Có một số phương pháp ngoài sao chép mà bạn có thể sử dụng để di chuyển dữ liệu từ version Redis này sang version Redis khác, nhưng sao chép có lợi thế là yêu cầu tương đối ít thay đổi cấu hình để hoạt động và chỉ có một lệnh duy nhất để bắt đầu hoặc dừng.

Nếu bạn muốn tìm hiểu thêm về cách làm việc với Redis, ta khuyên bạn nên xem loạt bài hướng dẫn của ta về Cách quản lý database Redis . Ngoài ra, nếu bạn muốn di chuyển dữ liệu Redis của bạn sang version Redis do DigitalOcean quản lý, hãy làm theo hướng dẫn của ta về cách thực hiện .


Tags:

Các tin liên quan

Cách thêm Sidekiq và Redis vào ứng dụng Ruby on Rails
2019-11-22
Cách quản lý các bộ được sắp xếp trong Redis
2019-11-22
Cách hết hạn khóa trong Redis
2019-10-08
Cách quản lý bản sao và khách hàng trong Redis
2019-10-08
Cách thực hiện giao dịch trong Redis
2019-10-01
Cách phân tích thống kê database Redis được quản lý bằng cách sử dụng elastic trên Ubuntu 18.04
2019-09-27
Cách quản lý bộ trong Redis
2019-09-26
Cách quản lý database và khóa Redis
2019-09-20
Cách quản lý danh sách trong Redis
2019-09-20
Cách quản lý hàm băm trong Redis
2019-09-20