Cộng đồng chia sẻ tri thức Lib24.vn

HA Redis với Replication và Sentinel

Gửi bởi: Khoa CNTT - HCEM 28 tháng 10 2020 lúc 21:23:36


Mục lục
* * * * *

HA (High Availibity) là yêu cầu cần thiết cho bất cứ ứng dụng nào. Để làm điều đó với Redis thông thường người ta sử dụng Replication và Sentinel.

Redis Replication: nhiều thể hiện Redis được ghép với nhau, có 1 con là master, các con còn lại là slave. Mục đích để dữ liệu được phân tán ra các con, một con chết thì vẫn còn các con còn lại.

Redis Sentinel: Phương pháp bầu lại master trong replication. Khi con master chết lập tức 1 con slave nào đó sẽ được lên làm master để đảm bảo hệ thống vẫn hoạt động bình thường.

Với một nhu cầu thông thường, tốt nhất nên có 3 con Redis, đồng thời chạy Sentinel trên 3 con đó luôn.

master: 192.168.1.1
slave-1: 192.168.1.2
slave-2: 192.168.1.3

Bước 1: Cài đặt Redis trên cả 3 con:

Cần cài đặt từ source để có phiên bản mới nhất và chạy được nhiều thể hiện thay vì cài từ các repository như epel

Step 1: Tải về redis và giải nén:

https://redis.io/download

Step 2: Install

cd vào thư mục vừa giải nén gõ:

make
make install

Trường hợp make báo lỗi thì gõ lệnh:

make distclean

Xong make lại

Step 3: Create config file

Tạo thư mục redis:

sudo mkdir /etc/redis

Copy file config của redis trong bộ cài vào thư mục vừa tạo.

sudo cp redis.conf /etc/redis

Sửa file config /etc/redis/redis.conf, tìm đoạn supervised thay như sau:

supervised systemd

Tìm đoạn “dir” thay:

dir /var/lib/redis

Step 4: Create Redis systemd Unit file

sudo nano /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target
 
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
 
[Install]
WantedBy=multi-user.target

Step 5: Create user redis and dir

Tạo user redis và thư mục redis trong /var

sudo useradd -M redis	
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/redis
sudo chmod 770 /var/lib/redis

Step 6: Start redis and startup on boot

sudo systemctl start redis
sudo systemctl enable redis

Cấu hình Redis sử dụng ở IP nào.

Mặc định redis được bind ở IP local 127.0.0.1, nghĩa là bạn chỉ kết nối được redis trong chính máy đó. Nếu muốn export Redis ra ngoài, bạn cần sửa config nằm trong /etc/redis/6379.conf

Tìm dòng

bind 127.0.0.1

Thêm vào IP của máy, chẳng hạn:

bind 127.0.0.1 192.168.1.11

Nếu muốn bind ra Internet thì thêm IP WAN của server vào sau đó restart redis_6379

Bước 2: Cấu hình Redis Replication

Trên Master: cài đặt như bài viết trên. Lưu ý phải bind IP của server 192.168.1.1 để export được redis ra ngoài, từ mỗi con phải telnet được port 6379 của 2 con còn lại.

Trên 2 con Slave:

Thêm dòng này vào cuối file config (IP là IP của con master)

slaveof 192.168.1.1 6379

Khởi động lại Redis

Test thử:

Trên con master gõ lệnh:

redis-cli info replication

Nếu thấy nó báo role: master, connected 2 slaves là OK

Thử tạo 1 key trên master: redis-cli

192.168.1.1:6379> set test 'Lib24.vn'
OK

Trên 1 con slave gõ thử lệnh: redis-cli

192.168.1.2:6379> get test
'Lib24.vn'

Là OK, dữ liệu đã được đồng bộ từ master sang.

Lưu ý trong 1 redis replication, chỉ có con master là ghi dữ liệu được, các con slave chỉ read only thôi nhé.

Bước 3: Cấu hình Redis-sentinel

  • 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.

Trên con Master:

Vào thư mục chứa source Redis đã dùng để cài đặt ở bước 1 copy file sentinel.conf vào:

cp sentinel.conf /etc/redis/

Mở file lên, xóa hết nội dung đi, rồi điền như sau:

daemonize yes
pidfile "/var/run/redis/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
 
bind 192.168.1.1
port 26379
 
sentinel monitor mymaster 192.168.1.1 6379 2
sentinel down-after-milliseconds mymaster 2000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

Giải thích sơ qua:

Redis sentinel sẽ lắng nghe ở port 26379, theo dõi con master ở IP 192.168.1.1: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. Đại loại là 3 thằng bầu thằng nào có 2 phiếu thì lên đại ca.

Start sentinel lên:

redis-sentinel /etc/redis/sentinel.conf

Trên 2 con Slave:

Tương tự như trên, nhưng đổi IP Bind tương ứng với từng con.

Test thử:

Xem con nào đang là master:

redis-cli -h 192.168.1.1 -p 26379 sentinel get-master-addr-by-name mymaster

1) "192.168.1.1"
2) "6379"

Thử vào con master stop redis đi xem sao:

Giờ check lại xem thằng khác đã lên master chưa:

redis-cli -h 192.168.1.2 -p 26379 sentinel get-master-addr-by-name mymaster
 
1) "192.168.1.2"
2) "6379"

Check log của Sentinel để xem việc nó loan tin và bầu master mới như thế nào:

tail -f /var/log/redis/redis-sentinel.log

57464:X 07 Jul 16:35:30.270 # +sdown master mymaster 192.168.1.1 6379
57464:X 07 Jul 16:35:30.301 # +new-epoch 1
57464:X 07 Jul 16:35:30.301 # +vote-for-leader 2a4d7647d2e995bd7315d8358efbd336d7fc79ad 1
57464:X 07 Jul 16:35:30.330 # +odown master mymaster 192.168.1.1 6379 #quorum 3/2
57464:X 07 Jul 16:35:30.330 # Next failover delay: I will not start a failover before Tue Jul  7 16:35:50 2015
57464:X 07 Jul 16:35:31.432 # +config-update-from sentinel 192.168.1.2:16379 192.168.1.2 16379 @ mymaster 192.168.1.2 6379
57464:X 07 Jul 16:35:31.432 # +switch-master mymaster 192.168.1.2 6379 192.168.1.2 6379
57464:X 07 Jul 16:35:31.432 * +slave slave 192.168.1.3:6379 192.168.1.3 6379 @ mymaster 192.168.1.2 6379
57464:X 07 Jul 16:35:36.519 # +sdown slave 192.168.1.3:6379 192.168.1.3 6379 @ mymaster 192.168.1.2 6379

Giờ start lại redis trên con 192.168.1.1 ban nãy thì nó sẽ join lại vào replication ở role slave


Được cập nhật: 11 tháng 4 lúc 13:28:51 | Lượt xem: 1805