Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

RedisRaft: Module Strong-Consistency cho Redis Cluster chịu lỗi

RedisRaft (đang phát triển) là module mới cho open source Redis cho phép vận hành nhiều Redis server như một cluster chịu lỗi, strong-consistency đơn lẻ. Như tên gọi, nó dựa trên thuật toán consensus Raft và thư viện C open-source cài đặt nó.

RedisRaft mang option triển khai strong-consistency với strict serialization đến Redis và hệ sinh thái Redis. Module mới cho phép dùng Redis cùng client, library, kiểu dữ liệu hiện có trong kịch bản beyond-cache yêu cầu độ tin cậy và consistency cao.

Khởi đầu RedisRaft

RedisRaft bắt đầu như "side project" thực nghiệm ngay trước phát hành Redis 5. Redis module API giới thiệu trong Redis 4, thiết kế chính cho module implement kiểu dữ liệu và lệnh mới. Chúng tôi muốn khám phá API co giãn đến đâu, và dùng module mở rộng Redis theo cách radical hơn. Nhưng cũng muốn kết thúc với thứ hữu ích — option triển khai strong consistency cho Redis.

RedisRaft cluster cung cấp cùng mức consistency và reliability như data store tin cậy nổi tiếng ZooKeeper hoặc Etcd. Tóm lại, trong RedisRaft:

  • Write được acknowledged đảm bảo committed và không bao giờ mất.
  • Read luôn trả về write committed mới nhất.

Như mong đợi từ data store tin cậy cung cấp mức consistency này, đảm bảo mang lại trade-off hiệu năng và availability. Trong RedisRaft:

  • Operation client phụ thuộc node cluster trao đổi message, bị ràng buộc latency mạng.
  • Write phải flush xuống disk trước khi hoàn thành, bị ràng buộc disk I/O latency.
  • Cluster available chỉ khi majority node up, healthy, giao tiếp được nhau.

Cách RedisRaft hoạt động

Một khi RedisRaft module load vào Redis, nó接管 giao tiếp giữa node cluster, replication Raft log hoặc snapshot, persistence, v.v. Redis core không biết và đối với nó, nó vận hành như server standalone không clustering, persistence, replication.

Thiết lập cluster 3-node RedisRaft dễ như khởi động 3 Redis server:

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

Kết nối server đầu và tạo Raft cluster:

10.0.0.1:6379> RAFT.CLUSTER INIT
OK 989645460313dd2ddb051f033c791222

Kết nối 2 server còn lại và join cluster:

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 cluster

Một khi RedisRaft setup xong, ghi dữ liệu vào cluster:

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

Nhận reply cho thấy write đã replicated đến ít nhất majority node cluster (2 node trường hợp này), và committed vào persistent storage.

Raft dựa trên khái niệm strong-leader, nghĩa là mọi operation client nên đi đến leader node và khởi tạo từ đó. Trong trường hợp này, client kết nối leader, nhưng leadership cluster động và client không nhất thiết biết ai là leader.

Thử cùng operation trên follower (non-leader) node tạo response:

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

Vậy client bắt error, tái kết nối leader node như chỉ định, retry command.

Nhưng nếu không muốn sửa ứng dụng hiện có? May mắn RedisRaft cũng cấu hình tự xử lý. Bật follower proxy mode, node cluster tự forward request đến leader và reply khi có:

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

Đơn giản hơn, nhưng ảnh hưởng latency và network load vì hit non-leader tạo extra network hop.

Thay đổi cluster

Khi setup cluster, thực sự thực hiện 3 operation riêng:

  1. Tạo cluster trên single node.
  2. Thêm node thứ hai.
  3. Thêm node thứ ba.

Cấu hình RedisRaft cluster không tĩnh, có thể thêm/xóa node sau khi tạo và khi active.

Ví dụ, cần thay node thứ ba. Join node mới thay thế. Lưu ý "add-then-remove" thay vì "remove-then-add" tránh để cluster và dữ liệu quý ở trạng thái degraded redundancy khi chuyển đổi:

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

Tra ID random gán cho node thứ ba:

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

Sau đó xóa nó:

10.0.0.1:6379> RAFT.NODE REMOVE 1739451728
OK

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

Là phần phát triển RedisRaft, hợp tác với Kyle Kingsbury (a.k.a Aphyr) phân tích và test RedisRaft dùng Jepsen, framework nổi tiếng test safety và correctness distributed systems. Hợp tác cho đến nay dẫn đến published analysis này.

Dù vẫn developing, hầu hết basic functionality RedisRaft đã có. Đang làm việc tới preview version đầu, dự kiến vài tháng tới. Khi generally available, RedisRaft phát hành dưới dual license, GNU AGPLv3 hoặc Redis Source Available License (RSAL).