Redis High Availibility với Sentinel và Replication

Bối cảnh

Bạn dùng redis để đệm dữ liệu cho 1 ứng dụng chat.

Một ngày đẹp trời, bạn đang đi nhậu với chiến hữu, sếp điện thoại kêu lên công ty gấp, server bị sập không truy cập được.

Bạn lật đật giã từ vũ khí và chạy lên công ty…

Server bị sập thì có vô vàn lý do: loại trừ lý do chủ quan là code cùi, code lỗi, thì còn các lý do khách quan mà không ai muốn nó xảy ra cả: server bảo trì, data center bị chập điện, rớt mạng, phần mềm trong máy xung đột, server bị virus…

Lúc này bạn sẽ nghĩ đến chuyện làm sao để nếu server có cúp điện thì hệ thống mình vẫn chạy bình thường. Google 1 hồi nó sẽ dẫn bạn đến khái niệm High Availability: khả năng đáp ứng cao.

High Availability – HA

HA được hiểu nôm na là (1) hệ thống mình có khả năng phục vụ liên tục và (2) chịu nhiệt cao (tức là khi nhiều người yêu cầu phục vụ thì anh cũng cân được tuốt).

Bài viết này mình sẽ tập trung vào mục (1).

Redis replication

Là phương pháp sử dụng “lính dự bị”, lên đảm nhiệm vai trò của “lính chủ lực” khi ông chủ lực kiệt sức chết.

Mình sẽ sử dụng 1 thằng chủ lực (master) và 2 thằng dự bị (slave).

Tổng cộng sẽ cần 3 server vật lý, sau này sẽ gọi là node để khỏi nhầm lẫn với redis server.

3 node này có IP lần lượt là:

Cài đặt redis

Mình sử dụng Ubuntu 16.04.

Cài redis vào CẢ 3 NODE

Cấu hình cho node master

node master, mở file /etc/redis/redis.conf lên và cấu hình:

Tìm đến dòng bind 127.0.0.1, đây là khai báo redis server sẽ lắng nghe request ở đâu.

Với cấu hình mặc định thì nó chỉ lắng nghe từ localhost (hiện tại đang là dòng 69) nên mình đổi về IP của node:

Lưu lại file sau đó khởi động lại redis server:

Test thử server master

Mặc định, redis server sẽ chạy ở cổng 6379.

Ghi dữ liệu vào để lát nữa đọc thử từ slave ra:

Thoát redis server:

Cấu hình cho các node slave

Trên 2 node slave:

Trước khi cấu hình thì kết nối vào server để đảm bảo rằng nó chưa có dữ liệu bên master (tất nhiên :D)

Tiếp đến, mở file /etc/redis/redis.conf lên và cấu hình:

slave 2:

Tiếp, tìm đến dòng có slaveof <masterip> <masterport> (dòng 281), điền vào:

Cấu hình này sẽ khai báo đây là node dự bị (slave) cho node chính 223.223.223.100 và liên lạc với nó thông qua cổng 6379-cổng mà bên kia đang lắng nghe.

OK, lưu lại rồi khởi động lại redis server:

Test thử server slave

Bây giờ mình sẽ vào server slave và đọc dữ liệu ở bên server master ra:

Kiểm tra thông tin về replication:

Nếu bạn kiểm tra thông tin tương tự bên server master thì sẽ thấy có chút cập nhật so với lúc nãy:

OK, đến đây là xong phần redis replication. Tiếp đến, mình dùng sentinel để quản lý việc đưa salve lên làm master khi ông master bị down.

Sentinel

Cơ chế hoạt động

  • Các sentinel sẽ luôn quan sát master server, khi master sập, các sentinels sẽ loan truyền nhau 1 tín hiệu sdown: tao thấy đại ca chết rồi thì phải.
  • Khi đủ 1 số lượng n sentinel đồng ý rằng tao cũng thấy master sập rồi, tụi sentinels sẽ loan tiếp tín hiệu odown: nó thực sự chết rồi đó.
  • Lúc này, tụi sentinels sẽ bầu chọn ra 1 slave để nâng cấp lên làm master mới, đồng thời cập nhật các cấu hình theo bộ máy chính quyền mới.
  • Khi thằng master kia sống lại, nó sẽ được tham gia vào băng nhóm với vai trò slave.

Cài đặt và cấu hình

Cài đặt sentinel trên CẢ 3 NODE:

Mở file /etc/redis/sentinel.conf và cấu hình:

  • bind 223.223.223.100: báo cho các sentinel ở node khác biết rằng tao đang lắng nghe ở địa chỉ này.
  • port 26379: để cho dễ nhớ thì thường là lấy cổng của redis + 20000 rồi làm cổng sentinel.
  • sentinel monitor mymaster 223.223.223.100 6379 2: lệnh này khai báo tao sẽ lắng nghe thằng master ở địa chỉ 223.223.223.100:6379, tham số cuối cùng (2) là số lượng sentinel tối thiểu để tham gia việc bầu chọn (lúc xác định đại ca chết, và bầu đại ca mới), mymaster là cái tên thôi.
  • sentinel down-after-milliseconds mymaster 2000: sau 2000 mili giây mà không thấy đại ca phản hồi thì tao sẽ loan tin sdown đi.
  • 2 config cuối cùng thì bạn có thể đọc thêm ở file config mặc định

Config cho 2 slave server cũng tương tự cho master, chỉ khác 1 chỗ duy nhất là địa chỉ để bind-dùng IP của slave server tương ứng:

OK, bây giờ khởi động lại cả 3 sentinel:

Kiểm tra việc bầu cử

Đầu tiên, mở các file log ra để xem diễn biến băng nhóm:

Kiểm tra xem ai đang là master

Đánh sập master để bầu master mới

Trên master server:

Nhìn vào log, bạn sẽ thấy thông tin về việc loan tin và bầu cử:

Giờ thì kiểm tra xem cháu nào được lên làm đại ca:

Bạn thử khởi động lại cháu đại ca lúc nãy, và xem trong log sẽ thấy nó được gia nhập băng nhóm lại, nhưng với vai trò là slave 😀

OK, từ nay trở đi, server có sập thì cũng cứ an tâm mà uống bia, mai tỉnh dậy rồi gọi ông đại ca cũ dậy sau :v

Cài đặt HA cho server là 1 công việc đòi hỏi nhiều công sức, mình sẽ viết tiếp trong các bài sau, mời bạn đón đọc 🙂

Lập trình và hơn thế nữa

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

2 Comments on "Redis High Availibility với Sentinel và Replication"

Notify of
avatar
Sort by:   newest | oldest | most voted
HNinh
Guest

Bạn có thể hướng dẫn mình cách đồng bộ dữ liệu giữa 2 thằng redis: master và slave được không, nếu thằng master chết thì slave có get được dữ liệu “test” nữa không?