Thứ ba, 08/10/2019 | 00:00 GMT+7

Cách quản lý bản sao và khách hàng trong Redis

Redis là một repodata key-value open-souce trong bộ nhớ. Một trong những tính năng được tìm kiếm nhiều nhất của nó là hỗ trợ sao chép: bất kỳ server Redis nào cũng có thể sao chép dữ liệu của nó sang bất kỳ số lượng bản sao nào, cho phép khả năng mở rộng đọc cao và dự phòng dữ liệu mạnh mẽ. Ngoài ra, Redis được thiết kế để cho phép nhiều client (lên đến 10000, theo mặc định) kết nối và tương tác với dữ liệu, khiến nó trở thành lựa chọn tốt cho các trường hợp nhiều user cần truy cập vào cùng một tập dữ liệu.

Hướng dẫn này trình bày về các lệnh được sử dụng để quản lý các ứng dụng client và bản sao Redis.

Cách sử dụng Hướng dẫn này

Hướng dẫn này được viết như một bảng lừa đảo với các ví dụ riêng. Ta khuyến khích bạn chuyển đến bất kỳ phần nào có liên quan đến nhiệm vụ bạn đang cố gắng hoàn thành.

Các lệnh hiển thị trong hướng dẫn này đã được thử nghiệm trên server Ubuntu 18.04 chạy Redis version 4.0.9 . Để cài đặt một môi trường tương tự, bạn có thể làm theo Bước 1 trong hướng dẫn của ta về Cách cài đặt và bảo mật Redis trên Ubuntu 18.04 . Ta sẽ chứng minh các lệnh này hoạt động như thế nào bằng cách chạy chúng với redis-cli , giao diện dòng lệnh Redis. Lưu ý nếu bạn đang sử dụng một giao diện Redis khác - ví dụ như Redli - kết quả kết quả chính xác của một số lệnh nhất định có thể khác nhau.

Ngoài ra, bạn có thể cung cấp một version database Redis được quản lý để kiểm tra các lệnh này, nhưng lưu ý tùy thuộc vào mức độ kiểm soát được nhà cung cấp database của bạn cho phép, một số lệnh trong hướng dẫn này có thể không hoạt động như được mô tả. Để cung cấp Dịch vụ database DigitalOcean, hãy làm theo tài liệu sản phẩm Dịch vụ database của ta . Sau đó, bạn phải cài đặt Redli hoặc cài đặt tunnel TLS để kết nối với Dịch vụ database qua TLS.

Lưu ý: Dự án Redis sử dụng các thuật ngữ “chính” và “ slaver ” trong tài liệu của nó và trong các lệnh khác nhau để xác định các role khác nhau trong việc sao chép, mặc dù những người đóng góp của dự án đang thực hiện các bước để thay đổi ngôn ngữ này trong trường hợp nó không gây ra vấn đề tương thích . DigitalOcean thường thích sử dụng các thuật ngữ thay thế “chính” và “bản sao”.

Hướng dẫn này sẽ mặc định là “chính” và “bản sao” khi nào có thể, nhưng lưu ý có một số trường hợp không tránh khỏi các thuật ngữ “chính” và “phụ”.

Quản lý bản sao

Một trong những tính năng nổi bật nhất của Redis là tính năng sao chép tích hợp của nó. Khi sử dụng bản sao, Redis tạo các bản sao chính xác của cá thể chính. Các bản sao thứ cấp này kết nối lại với bản chính bất kỳ khi nào kết nối của chúng bị đứt và sẽ luôn hướng tới việc duy trì một bản sao chính xác của bản chính.

Nếu bạn không chắc liệu version Redis mà bạn đang kết nối là version chính hay bản sao, bạn có thể kiểm tra bằng cách chạy lệnh role :

  • role

Lệnh này sẽ trả về master hoặc slave , hoặc có khả năng là sentinel nếu bạn đang sử dụng Redis Sentinel .

Để chỉ định một cá thể Redis làm bản sao của một cá thể khác khi đang di chuyển, hãy chạy lệnh replicaof . Lệnh này lấy tên server hoặc địa chỉ IP và cổng của server chính dự định làm đối số:

  • replicaof hostname_or_IP port

Nếu server đã là bản sao của một server chính khác, nó sẽ ngừng sao chép server cũ và ngay lập tức bắt đầu đồng bộ hóa với server mới. Nó cũng sẽ loại bỏ tập dữ liệu cũ.

Để thúc đẩy một bản sao trở lại thành bản chính, hãy chạy lệnh replicaof sau:

  • replicaof no one

Điều này sẽ ngăn version sao chép server chính, nhưng sẽ không hủy tập dữ liệu mà nó đã sao chép. Cú pháp này hữu ích trong trường hợp bản chính ban đầu bị lỗi. Sau khi chạy bản sao replicaof no one trên bản sao của bản sao chính bị lỗi, bản sao cũ được dùng làm bản sao chính mới và có các bản sao của chính nó làm an toàn dự phòng.

Lưu ý: Trước version 5.0.0, Redis đã bao gồm một version của lệnh này có tên là slaveof .

Quản lý khách hàng

Máy khách là bất kỳ máy hoặc phần mềm nào kết nối với server để truy cập dịch vụ. Redis đi kèm với một số lệnh giúp theo dõi và quản lý các kết nối client .

Lệnh client list trả về một tập hợp thông tin con người có thể đọc được về các kết nối client hiện tại:

  • client list
Output
"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client "

Đây là ý nghĩa của mỗi trường trong số các trường này:

  • id : một ID khách hàng 64-bit duy nhất
  • name : tên của kết nối client , như được xác định bởi lệnh client setname trước
  • addr : địa chỉ và cổng mà client đang kết nối
  • fd : bộ mô tả file tương ứng với socket mà client đang kết nối
  • age : tổng thời lượng của kết nối client , tính bằng giây
  • flags : một tập hợp một hoặc nhiều cờ đơn ký tự cung cấp thông tin chi tiết hơn về các client ; xem tài liệu lệnh client list để biết thêm chi tiết
  • db : số ID database hiện tại mà client được kết nối (có thể từ 0 đến 15 )
  • sub : số kênh khách hàng đã đăng ký
  • psub : số lượng đăng ký phù hợp với mẫu của khách hàng
  • mutli : số lượng lệnh mà khách hàng đã xếp hàng đợi trong một giao dịch (sẽ hiển thị -1 nếu khách hàng chưa bắt đầu một giao dịch hoặc 0 nếu nó chỉ bắt đầu một giao dịch và chưa xếp hàng đợi bất kỳ lệnh nào)
  • qbuf : độ dài cache truy vấn của khách hàng, với 0 nghĩa là nó không có truy vấn đang chờ xử lý
  • qbuf-free : lượng không gian trống trong cache truy vấn của khách hàng, với 0 nghĩa là cache truy vấn đã đầy
  • obl : độ dài cache kết quả của khách hàng
  • oll : độ dài của danh sách kết quả của khách hàng, nơi các câu trả lời được xếp hàng đợi khi cache của nó đầy
  • omem : bộ nhớ được sử dụng bởi cache kết quả của client
  • events : events trình mô tả file của khách hàng, những sự kiện này có thể là r cho "có thể đọc được", w cho "có thể ghi" hoặc cả hai
  • cmd : lệnh cuối cùng do client chạy

Đặt tên client rất hữu ích để gỡ lỗi rò rỉ kết nối trong bất kỳ ứng dụng nào đang sử dụng Redis. Mọi kết nối mới đều bắt đầu mà không có tên được chỉ định, nhưng có thể sử dụng tên client setname để tạo một kết nối cho kết nối client hiện tại. Không có giới hạn về độ dài của tên khách hàng, mặc dù Redis thường giới hạn độ dài chuỗi ở 512 MB. Tuy nhiên, lưu ý tên khách hàng không được bao gồm khoảng trắng:

  • client setname elaine

Để truy xuất tên của kết nối client , hãy sử dụng lệnh client getname :

  • client getname
Output
"elaine"

Để truy xuất ID kết nối của client , hãy sử dụng lệnh client id :

  • client id
Output
(integer) "19492"

Các ID khách hàng của Redis không bao giờ được lặp lại và có tính đơn điệu tăng dần. Điều này nghĩa là nếu một khách hàng có ID lớn hơn ID khác, thì nó đã được cài đặt sau đó.

Chặn khách hàng và đóng kết nối với khách hàng

Hệ thống sao chép thường được mô tả là đồng bộ hoặc không đồng bộ . Trong sao chép đồng bộ, khi nào khách hàng thêm hoặc thay đổi dữ liệu, nó phải nhận được một số loại xác nhận từ một số bản sao nhất định để đăng ký thay đổi như đã được commit . Điều này giúp ngăn chặn các node xung đột dữ liệu nhưng nó phải trả giá bằng độ trễ, vì client phải đợi để thực hiện một hoạt động khác cho đến khi nhận được phản hồi từ một số bản sao nhất định.

Mặt khác, trong sao chép không đồng bộ, client thấy xác nhận hoạt động đã kết thúc ngay sau khi dữ liệu được ghi vào bộ nhớ local . Tuy nhiên, có thể có độ trễ giữa điều này và thời điểm các bản sao thực sự ghi dữ liệu. Nếu một trong các bản sao bị lỗi trước khi nó có thể ghi thay đổi, thì bản ghi đó sẽ bị mất vĩnh viễn. Vì vậy, trong khi sao chép không đồng bộ cho phép client tiếp tục thực hiện các hoạt động mà không có độ trễ do chờ đợi bản sao, nó có thể dẫn đến xung đột dữ liệu giữa các node và có thể yêu cầu người quản trị database làm việc thêm để giải quyết các xung đột đó.

Do tập trung vào hiệu suất và độ trễ thấp, Redis thực hiện sao chép không đồng bộ theo mặc định. Tuy nhiên, bạn có thể mô phỏng sao chép đồng bộ bằng lệnh wait . wait khối kết nối client hiện tại trong một khoảng thời gian cụ thể (tính bằng mili giây) cho đến khi tất cả các lệnh ghi trước đó được chuyển thành công và được chấp nhận bởi một số bản sao cụ thể. Lệnh này sử dụng cú pháp sau:

  • wait number_of_replicas number_of_milliseconds

Ví dụ: nếu bạn muốn chặn kết nối client của bạn cho đến khi tất cả các lần ghi trước đó được đăng ký bởi ít nhất 3 bản sao trong repository ảng thời gian chờ 30 mili giây, thì cú pháp wait của bạn sẽ như sau:

  • wait 3 30

Lệnh wait trả về một số nguyên đại diện cho số lượng bản sao đã chấp nhận lệnh ghi, ngay cả khi không phải bản sao nào cũng làm như vậy:

Output
2

Để bỏ chặn một kết nối ứng dụng client đã bị chặn trước đó, cho dù từ lệnh wait , brpop hay xread , bạn có thể chạy lệnh client unblock với cú pháp sau:

  • client unblock client_id

Để tạm ngừng mọi ứng dụng client hiện đang kết nối với server Redis, bạn có thể sử dụng lệnh client pause . Điều này hữu ích trong trường hợp bạn cần áp dụng các thay đổi đối với cài đặt Redis của bạn theo cách có kiểm soát. Ví dụ: nếu bạn đang quảng cáo một trong các bản sao của bạn thành bản sao chính, bạn có thể tạm dừng mọi ứng dụng client trước đó để bạn có thể quảng cáo bản sao và để các khách hàng kết nối với bản sao đó làm bản sao chính mới mà không mất bất kỳ thao tác ghi nào trong quá trình này.

Lệnh client pause yêu cầu bạn chỉ định lượng thời gian (tính bằng mili giây) mà bạn muốn tạm dừng ứng dụng client . Ví dụ sau sẽ tạm ngưng tất cả các client trong một giây:

  • client pause 1000

Cú pháp ngắt client kill cho phép bạn đóng một kết nối đơn lẻ hoặc một tập hợp các kết nối cụ thể dựa trên một số bộ lọc khác nhau. Cú pháp có dạng như sau:

  • client kill filter_1 value_1 ... filter_n value_n

Trong Redis version 2.8.12 trở lên, các bộ lọc sau có sẵn:

  • addr : cho phép bạn đóng kết nối client từ một địa chỉ IP và cổng được chỉ định
  • client-id : cho phép bạn đóng kết nối client dựa trên trường ID duy nhất của nó
  • type : đóng mọi ứng dụng client của một loại nhất định, có thể là normal , master , slave hoặc pubsub
  • skipme : các tùy chọn giá trị cho bộ lọc này là yesno :
    • nếu no được chỉ định, ứng dụng client gọi lệnh client kill sẽ không bị bỏ qua và sẽ bị hủy nếu các bộ lọc khác áp dụng cho nó
    • nếu yes được chỉ định, client đang chạy lệnh sẽ bị bỏ qua và lệnh hủy sẽ không có hiệu lực đối với client . skipme luôn yes theo mặc định

Kết luận

Hướng dẫn này trình bày chi tiết một số lệnh được sử dụng để quản lý các ứng dụng client và bản sao Redis. Nếu có các lệnh, đối số hoặc quy trình liên quan khác mà bạn muốn xem được nêu trong hướng dẫn này, vui lòng hỏi hoặc đưa ra đề xuất trong phần comment bên dưới.

Để biết thêm thông tin về các lệnh Redis, hãy xem loạt bài hướng dẫn của ta về Cách quản lý database Redis .


Tags:

Các tin liên quan

Cách hết hạn khóa 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
Cách khắc phục sự cố trong Redis
2019-09-20
Cách quản lý chuỗi trong Redis
2019-09-20
Cách quản lý danh sách trong Redis
2019-09-20