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 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
externaltrue
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
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
Bình luận
Không có code mẫu demo nên không hiểu