Dựng hệ thống redis/ sentinel trên Centos
TIL
745
White

Thỏ viết ngày 16/01/2020

Các khái niệm cơ bản

Redis là gì? Ưu điểm và ứng dụng trong thực tế.

Redis (REmote DIctionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker. Nó là hệ thống lưu trữ dữ liệu với dạng KEY-VALUE rất mạnh mẽ. Redis hỗ trợ nhiều cấu trúc dữ liệu cơ bản như:hash, list, set, sorted set, string… Tất cả dữ liệu được ghi và lưu trên ram, do đó tốc độ đọc ghi dữ liệu rất là nhanh.

Redis ngoài tính năng lưu trữ KEY-VALUE trên RAM thì Redis còn hỗ trợ tính năng xắp xếp, query, backup dữ liệu trên đĩa cứng cho phép bạn có thể phục hồi dữ liệu khi hệ thống gặp sự cố…và có thể mở rộng với nhiều server.

Redis được sử dụng để làm nhiều chức năng như:

  • Cache: Sử dụng làm bộ nhớ đệm. Chính tốc độ đọc ghi nhanh mà Redis có thể làm bộ nhớ đệm, nơi chia sẻ dữ liệu giữa các ứng dụng hoặc làm database tạm thời. Ngoài ra Redis có thể sử dụng để làm Full Page Cache cho website. Cũng vì tính nhất quán của Redis, cho dù restart Redis thì người dùng cũng không có cảm nhận chậm khi tải trang.
  • Counter: Sử dụng làm bộ đếm. Với thuộc tính tăng giảm thông số rất nhanh trong khi dữ liệu được lưu trên RAM, sets và sorted sets được sử dụng thực hiện đếm lượt view của một website, các bảng xếp hạng trong game chẳng hạng. Redis hỗ trợ thread safe do đó nó có thể đồng bộ dữ liệu giữa các request.
  • Queues: Tạo hàng đợi để xử lý lần lượt các request. Redis cho phép lưu trữ theo list và cung cấp rất nhiều thao tác với các phần tử trong list, vì vậy nó còn được sử dụng như một message queue.
  • Pub/ Sub: Tạo kênh chia sẻ dữ liệu. Redis hỗ trợ tạo các channel để trao đổi dữ liệu giữa publisher và subscriber giống như channel trong Socket Cluster hay topic trong Apache Kafka. Ví dụ: Pub/Sub được sử dụng theo dõi các kết nối trong mạng xã hội hoặc các hệ thống chat.

Sentinel là gì?

Redis-Sentinel cung cấp giải pháp HA cho cụm Redis Server. Khi đó, cho dù một số instance Redis bị down thì cụm Redis Server vẫn có thể hoạt động tốt.

Sentinel sẽ thực hiện các nhiệm vụ sau:

  • Monitor: Check định kỳ các server redis master và slave trong cụm.
  • Notification Alert: Thông báo khi có một instance/ node trong cụm bị failure.
  • Automatic failover: Là một quy trình bao gồm một chuỗi các tác vụ khi có một instance/ node là master trong cụm Redis bị failure:
    • Các Sentinel tiến hành vote để pick một node slave lên làm master mới.
    • Cấu hình lại toàn bộ cụm Redis để các node slave sẽ tương tác với master mới.
    • Khi node master cũ được tái hoạt động thì sẽ cấu hình nó để trở thành slave cho node master vừa được bầu chọn.

Mô hình hệ thống :

Với bài lab này ta triển khai hai server Redis, với 1 server là Master và server kia là Slave.
Đồng thời ta triển khai ba server Sentinel với nhiệm vụ ngang hàng nhau là monitoring các server Redis.

Với nhiều trường hợp có thể chỉ cần triển khai 3 server, trong đó cài cả Redis-Server lẫn Redis-Sentinel song song trên từng mỗi server. Nhưng để đảm bảo trong trường hợp một trong các server Redis/ Sentinel down hẳn thì các server Sentinel vẫn làm được nhiệm vụ moniror và quorum thì sẽ cài đặt Redis-server và Redis-Sentinel riêng biệt nhau.

Minh họa Google:

alt text

Triển khai :

Các server triển khai đều là Centos7.
Version Redis : 5.07
User: root.
Ports : 6379/tcp, 26379/tcp.
IP/ Hostname:
Redis1: 192.168.100.18
Redis2: 192.168.100.19
Sentinel1: 192.168.100.23
Sentinel2: 192.168.100.22
Sentinel3: 192.168.100.21

Cài đặt redis repo trên cả 5 server (chung cho cả redis-server và redis-sentinel):

Setup epel và remi để có thể cài đặt version mới nhất

yum install epel-release yum-utils
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi

Cài đặt redis với yum: yum install redis
Hãy chắc chắn là redis được cài đặt với version mới nhất.

Cấu hình và chạy Redis-server với mô hình Master/Slave:

Cấu hình redis (trên cả 2 server): vim /etc/redis.conf
Ta thay các tham số sau ở cả hai server :
bind 0.0.0.0
protected-mode no

Riêng server Slave ta thêm tham số:
slaveof 192.168.100.18 6379

Cấu hình firewall để chạy trên port 6379:
firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --reload

Chạy redis trên cả hai server:
systemctl enable redis
systemctl start redis

Kiểm thử Replication và đồng bộ dữ liệu:

Trên cả 2 server ta gõ redis-cli info replication, nếu trên 2 server hiện ra như thế này thì ok:

Master:
Capture1.JPG

Slave:
Capture2.JPG

Ta tạo một cặp key-value trên server master : SET Test "Chi la demo"
Ta get thử value trên slave : Get Test >> "Chi la demo"
Như vậy là ok.

Cấu hình và chạy redis Sentinel:

Trên cả 3 server Sentinel ta đồng thời cùng cấu hình và chạy Redis-Sentinel tương đồng nhau.

vi /etc/redis-sentinel.conf

daemonize yes
pidfile "/var/run/redis/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"

bind 0.0.0.0
port 26379

sentinel monitor mymaster 192.168.100.18 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

Cài đặt firewall để sentinel chạy trên port 26379:
firewall-cmd --permanent --add-port=26379/tcp
firewall-cmd --reload

Trong đó:
sentinel monitor mymaster 192.168.100.18 6379 2 : Có nghĩa là Sentinel sẽ quan sát cụm Redis với tên gọi là mymaster với master node IP là 192.168.100.18 trên port 6379. Và 2 là thông số quorum, tức là sẽ cần ít nhất 2 sentinel để có thể vote master mới cho cụm.

sentinel down-after-milliseconds mymaster: Quy định khoảng thời gian Sentinel không thể liên hệ được với master thuộc cụm Redis có tên gọi mymaster thì mặc định là master bị down.

sentinel failover-timeout mymaster : Quy định khoảng thời gian mà sau khi Master của cụm bị down thì các sentinel sẽ bầu chọn master mới.

Chạy Sentinel trên cả 3 server:
systemctl enable redis-sentinel
systemctl start redis-sentinel

Kiểm tra log của sentinel :
tail -f /var/log/redis/redis-sentinel.log

Kiểm thử hệ thống:

Stop Redis trên master server :
systemctl stop redis-server

... sau một khoảng thời gian thì bật lại:
systemctl start redis

Quan sát log trên sentinel :

Capture3.JPG

=> Ta thấy, ở dòng đầu tiên sentinel thông báo là không liên hệ được với master của cụm. Sau một khoảng thời gian xác định, sentinel quyết định rằng master đã down và quyết định sẽ chọn master mới ở dòng thứ 3 và 4. Dòng thứ 5 là quá trình chuyển từ redis2 từ slave lên master. Ở dòng cuối cùng, khi bật redis1 thì chức năng của nó lập tức bị chuyển từ master sang slave.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Thỏ

3 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
1 0
Làm quen với Ansible 1. Cài đặt Ansible trên Centos: yum install epelrelease git python pythondevel pythonpip openssl ansible Kiểm tra version...
Thỏ viết 24 ngày trước
1 0
Bài viết liên quan
White
0 4
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết hơn 1 năm trước
0 4
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 12 tháng trước
2 0
White
23 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 3 năm trước
23 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!