Replica redis

24 tháng 07, 2021 - 1940 lượt xem

Một ngày đẹp trời, bạn đang đi chơi với người yê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 vội vã giã từ người yêu như bộ đội chuẩn bị sắp đi nghĩa vụ 2 năm vậy và chạy lật đật 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ì, rớt mạng, ...

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

High Availability

High Availability có thể được hiểu là:

  • Hệ thống có khả năng phục vụ liên tục
  • Chịu nhiệt cao (phục vụ tốt khi có nhiều yêu cầu)

Redis replication

Là phương pháp sử dụng slave (dự bị), lên đảm nhiệm vai trò của master (chủ lực) khi chủ lực vì một lý do nào đó mà die chẳng hạn.

Mình sẽ sử dụng 1 thằng chủ lực (master) và 1 thằng dự bị (slave) chạy trên 2 node khác nhau trong docker swarm

Redis replication

  • Redis master chạy trên node manager 192.168.0.26
  • Redis slave chạy trên node worker 192.168.0.27

Tạo docker-swarm

Trên node 192.168.0.26 (chỉ định đây là node manager), mình sẽ thực hiện init swarm như sau:

docker swarm init --advertise-addr 192.168.0.26

Lúc này sẽ sinh ra 1 mã token để join swarm.

Ví dụ

docker swarm join --token SWMTKN-1-1ao5302b0vdn4ie6ul9u00v6p7paw42hcpbjakcjae9dxl2s1j-912dfk517iy37k8gmx1ylypml 192.168.0.26:2377

Chúng ta sẽ copy mã này sang 192.168.0.27

Để kiểm các node đã ở trong swarm chưa, chúng ta có thể sử dụng lệnh sau để kiểm tra

docker node ls

Bây giờ chúng ta sẽ viết docker file để triển khai 1 stack trong docker swarm

Viết docker-compose file

version: "3.8"
networks:
  my-network:
    external: true

services:
  redis:
    ...

  redis-slave:
    ...

Ở trên mình có sử dụng overlay network đã có sẵn. Để tạo network chúng ta có thể sử dụng lệnh sau

docker network create -d overlay my-network

1.Cấu hình redis master

  redis: #tên service
    image: redis #tên image
    command: redis-server --requirepass mypassword # set password cho redis
    ports:
      - "6379:6379" # ánh xạ cổng 6379 của container ra ngoài cổng 6379 trên máy host
    volumes:
      - /home/dev/redis1:/data # mount volume từ thư mục /data của container ra ngoài thư mục /home/dev/redis1 trên máy host
    networks:
      - my-network # network overlay để các container trong Network này có thể giao tiếp được với nhau
    deploy:
      placement:
        constraints: # Chỉ định node quản lý
          - node.role == manager
          - node.hostname == 192.168.0.26

2.Cấu hình redis slave

  redis-slave: #tên service
    image: redis #tên image
    command: redis-server --masterauth mypassword --slaveof redis 6379
    depends_on:
      - redis
    ports:
      - "6380:6379" # ánh xạ cổng 6379 của container ra ngoài cổng 6380 trên máy host
    volumes:
      - /home/dev/redis2:/data # mount volume từ thư mục /data của container ra ngoài thư mục /home/dev/redis2 trên máy host
    networks:
      - my-network # Network overlay để các container trong Network này có thể giao tiếp được với nhau
    deploy:
      placement:
        constraints: # Chỉ định node quản lý
          - node.role == manager
          - node.hostname == 192.168.0.27

Chi tiết file docker-compose, các bạn có thể tham khảo ở đây

Triển khai stack

Sau khi viết xong docker-compose file. Bây giờ chúng ta sẽ tiến hành depoy stack

docker stack deploy --compose-file docker-compose.yml stackdemo

Để kiểm tra các service trong stack, chúng ta thực hiện lệnh sau:

docker service ls

3.Kiểm tra

Kiểm tra thử xem 2 service đã hoạt động ngon chưa. Chúng ta sẽ exec vào từng container để kiểm tra như sau:

  • Trong container redis master thực hiện insert một bản ghi
  • Trong container redis slave thực hiện tìm kiếm bản ghi đó theo key

Kiểm tra trên redis master

Kịch bản kiểm tra như sau

  • SSH vào VPS quản lý service redis master (trong trường hợp này là node 192.168.0.26)
  • Tìm kiếm container chạy redis master (docker container ps)
  • Exec vào trong container (docker exec -it [container ID] /bin/bash)
  • Sử dụng redis CLI Interface để tương tác với redis (redis-cli)
  • Xác thực mật khẩu (auth [password])
  • Insert record (SET key "value")
  • Read record (GET key)

Hình minh họa cho kịch bản trên

Minh họa redis trên node manager

Kiểm tra trên redis slave

Kịch bản kiểm tra trên redis slave tương tự như redis master như sau

  • SSH vào VPS quản lý service redis master (trong trường hợp này là node 192.168.0.27)
  • Tìm kiếm container chạy redis master (docker container ps)
  • Exec vào trong container (docker exec -it [container ID] /bin/bash)
  • Sử dụng redis CLI Interface để tương tác với redis (redis-cli)
  • Read record (GET key)

Hình minh họa cho kịch bản trên

Minh họa redis trên node worker

Bình luận

avatar
Trịnh Minh Cường 2021-07-25 01:15:47.520154 +0000 UTC

Không có code mẫu demo nên không hiểu

Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +1 Thích
+1