Computer >> Máy Tính >  >> Lập trình >> Redis

Giới thiệu RedisRaft, một tùy chọn triển khai mạnh mẽ nhất quán mới

RedisRaft (đang được phát triển) là một mô-đun mới dành cho mã nguồn mở Redis giúp nó có thể vận hành một số máy chủ Redis như một cụm duy nhất có khả năng chịu lỗi, nhất quán mạnh mẽ. Như tên gọi của nó, nó dựa trên thuật toán đồng thuận Raft và một thư viện C nguồn mở triển khai nó.

RedisRaft mang đến sự nhất quán mạnh mẽ mới với tùy chọn triển khai tuần tự hóa nghiêm ngặt cho Redis và hệ sinh thái Redis. Mô-đun mới giúp bạn có thể sử dụng Redis cùng với các ứng dụng khách, thư viện và kiểu dữ liệu hiện có của Redis trong các tình huống vượt quá bộ nhớ cache yêu cầu mức độ tin cậy và nhất quán cao.

Sự khởi đầu của RedisRaft

RedisRaft bắt đầu như một “dự án phụ” thử nghiệm ngay trước khi Redis 5 được phát hành. API mô-đun Redis đã được giới thiệu trong Redis 4, chủ yếu được thiết kế để hỗ trợ các mô-đun thực hiện các kiểu dữ liệu và lệnh mới. Chúng tôi muốn khám phá xem chúng tôi có thể kéo dài API đến đâu và sử dụng các mô-đun để mở rộng Redis theo những cách thậm chí còn triệt để hơn. Nhưng chúng tôi cũng muốn kết thúc với một cái gì đó hữu ích — một tùy chọn triển khai nhất quán mạnh mẽ cho Redis.

Một cụm RedisRaft cung cấp cùng một mức độ nhất quán và độ tin cậy như mong đợi từ các kho dữ liệu nổi tiếng, đáng tin cậy như ZooKeeper hoặc Etcd. Tóm lại, trong RedisRaft:

  • Các bài viết đã được công nhận được đảm bảo sẽ được cam kết và không bao giờ bị mất.
  • Đọc sẽ luôn trả về bản viết cam kết cập nhật nhất.

Như mong đợi từ các kho dữ liệu đáng tin cậy cung cấp mức độ nhất quán này, những đảm bảo như vậy mang lại sự cân bằng về hiệu suất và tính khả dụng. Trong RedisRaft:

  • Hoạt động của máy khách phụ thuộc vào các nút cụm trao đổi thông báo, vì vậy chúng bị ràng buộc với độ trễ mạng.
  • Các ghi phải được chuyển vào đĩa trước khi hoàn tất, vì vậy chúng bị ràng buộc với độ trễ I / O của đĩa.
  • Cụm chỉ khả dụng miễn là phần lớn các nút hoạt động tốt, khỏe mạnh và có thể giao tiếp với nhau.

Cách hoạt động của RedisRaft

Khi một mô-đun RedisRaft được tải vào Redis, nó sẽ tiếp quản giao tiếp giữa các nút cụm, sao chép nhật ký Raft hoặc ảnh chụp nhanh, tính bền bỉ, v.v. Lõi Redis vẫn không biết về điều này và theo như nó được biết, nó đang hoạt động như một máy chủ độc lập không có tính năng phân cụm, liên tục hoặc sao chép.

Thiết lập một cụm RedisRaft ba nút dễ dàng như khởi động ba máy chủ Redis, như được hiển thị ở đây:

redis-server --loadmodule /path/to/redisraft.so

Đây là cách kết nối với máy chủ đầu tiên và tạo cụm Raft:

10.0.0.1:6379> RAFT.CLUSTER INIT
OK 989645460313dd2ddb051f033c791222

Sau đó, bạn kết nối với hai máy chủ khác và nối chúng vào cụm:

10.0.0.2:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK
10.0.0.3:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK

Truy cập cụm

Sau khi RedisRaft được thiết lập, chúng tôi có thể ghi dữ liệu vào cụm của mình:

10.0.0.1:6379> INCR counter:1
(integer) 1

Nhận được câu trả lời cho thấy rằng bài viết của chúng tôi đã được sao chép thành ít nhất là phần lớn các nút cụm (trong trường hợp của chúng tôi là 2 nút) và cam kết lưu trữ liên tục của chúng.

Raft dựa trên khái niệm người lãnh đạo mạnh mẽ, có nghĩa là tất cả các hoạt động của khách hàng phải đi đến nút người dẫn đầu và bắt đầu từ đó. Trong trường hợp này, khách hàng của chúng tôi thực sự được kết nối với người lãnh đạo, nhưng lãnh đạo cụm rất năng động và khách hàng có thể không nhất thiết phải biết người lãnh đạo là ai.

Thử thao tác tương tự trên nút người theo dõi (không phải người dẫn đầu) sẽ tạo ra phản hồi sau:

10.0.0.3:6379> INCR counter:1
(error) MOVED 10.0.0.1:6379

Vì vậy, với tư cách là một khách hàng, bây giờ chúng tôi có thể bắt lỗi này, thiết lập lại kết nối với nút lãnh đạo như đã chỉ định và thử lại lệnh của chúng tôi.

Nhưng nếu chúng ta không muốn sửa đổi ứng dụng hiện có của mình thì sao? May mắn thay, RedisRaft cũng có thể được định cấu hình để tự động xử lý việc này cho chúng tôi. Bằng cách bật chế độ proxy người theo dõi , chúng tôi có thể có các nút cụm tự động chuyển tiếp yêu cầu của chúng tôi đến người lãnh đạo và cung cấp câu trả lời khi có sẵn:

10.0.0.3:6379> RAFT.CONFIG SET follower-proxy yes
OK
10.0.0.3:6379> INCR counter:1
(integer) 2

Tất nhiên, điều này đơn giản hơn nhiều, nhưng ảnh hưởng đến độ trễ và tải mạng vì việc chạm vào một nút không dẫn đầu sẽ tạo ra một bước nhảy mạng bổ sung.

Thay đổi cụm

Khi thiết lập cụm của chúng tôi, chúng tôi thực sự đã thực hiện ba hoạt động riêng biệt:

  1. Đã tạo cụm trên một nút duy nhất.
  2. Đã thêm nút thứ hai.
  3. Đã thêm nút thứ ba.

Cấu hình cụm RedisRaft không tĩnh và có thể thêm hoặc xóa các nút bổ sung sau khi cụm được tạo và trong khi nó đang hoạt động.

Ví dụ:chúng tôi có thể cần phải thay thế nút thứ ba của mình. Đầu tiên, chúng tôi tham gia một nút mới sẽ thay thế nó. Lưu ý rằng chúng tôi “thêm vào rồi xóa” chứ không phải “xóa rồi thêm” để tránh để nhóm và dữ liệu quý giá của chúng tôi ở trạng thái dự phòng bị suy giảm trong quá trình chuyển đổi:

10.0.0.4:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK

Tiếp theo, chúng tôi tìm kiếm ID được chỉ định ngẫu nhiên cho nút thứ ba của chúng tôi:

redis-cli -h 10.0.0.1 --raw RAFT.INFO | grep 10.0.0.3
node2:id=1739451728,state=connected,voting=yes,addr=10.0.0.3,port=6379,
last_conn_secs=3537,conn_errors=0,conn_oks=1

Và sau đó chúng tôi xóa nó:

10.0.0.1:6379> RAFT.NODE REMOVE 1739451728
OK

Trạng thái phát hành RedisRaft

Là một phần của công việc phát triển RedisRaft, chúng tôi đã cộng tác với Kyle Kingsbury (còn gọi là Aphyr) để phân tích và kiểm tra RedisRaft bằng cách sử dụng Jepsen, một khuôn khổ nổi tiếng để kiểm tra tính an toàn và tính đúng đắn của các hệ thống phân tán. Sự hợp tác này cho đến nay đã dẫn đến phân tích được xuất bản này.

Mặc dù vẫn đang được phát triển, hầu hết các chức năng cơ bản của RedisRaft đều đã có sẵn. Chúng tôi hiện đang làm việc để hướng tới một phiên bản xem trước đầu tiên, dự kiến ​​sẽ có trong một vài tháng tới. Khi có sẵn thông thường, RedisRaft sẽ được phát hành theo giấy phép kép, GNU AGPLv3 hoặc Giấy phép có sẵn nguồn Redis (RSAL).