Cấu hình Watchdog Daemon trên Linux: Tự động phát hiện treo hệ thống và khởi động lại để đảm bảo High Availability

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bắt đầu nhanh (5 phút)

Khi một máy chủ Linux từ xa bị treo hoàn toàn, thông thường bạn sẽ phải đăng nhập vào console IPMI, truy cập hypervisor đám mây hoặc bấm nút reset vật lý. Linux watchdog daemon sẽ giúp bạn loại bỏ thao tác thủ công phiền toái đó. Nó liên tục giám sát trạng thái hoạt động của hệ điều hành và ra lệnh khởi động lại ngay lập tức nếu kernel bị treo hoặc các tài nguyên quan trọng cạn kiệt.

Bạn có thể thiết lập một software watchdog cơ bản trên Debian hoặc Ubuntu trong vòng chưa đầy năm phút bằng cách sử dụng kernel module softdog và gói watchdog tiêu chuẩn.

Đầu tiên, hãy load kernel module và cấu hình để nó tự động kích hoạt sau mỗi lần khởi động lại:

sudo modprobe softdog
echo "softdog" | sudo tee -a /etc/modules-load.d/watchdog.conf
ls -l /dev/watchdog

Xác nhận rằng character device /dev/watchdog đã tồn tại. Tiếp theo, cài đặt daemon ở user-space:

sudo apt update
sudo apt install -y watchdog

Mở file /etc/watchdog.conf bằng trình soạn thảo bạn quen dùng:

sudo nano /etc/watchdog.conf

Bỏ chú thích hoặc thêm vào các tham số cơ bản sau để thiết lập chu kỳ heartbeat và ngưỡng tải CPU:

watchdog-device = /dev/watchdog
watchdog-timeout = 60
interval = 10
max-load-1 = 24

Lưu file lại. Sau đó kích hoạt và khởi chạy dịch vụ:

sudo systemctl enable --now watchdog
sudo systemctl status watchdog

Hệ thống watchdog của bạn giờ đã sẵn sàng. Nếu kernel bị treo hoặc chỉ số load average tăng đột biến vượt quá ngưỡng cho phép (chẳng hạn như mức 24 trên một máy chủ 16 core), bộ đếm thời gian của watchdog sẽ hết hạn và buộc máy chủ khởi động lại ngay sau 60 giây.

Đi sâu vào cơ chế: Cách thức hoạt động của Linux Watchdog Daemon

Hiểu rõ mối tương tác giữa bộ đếm thời gian ở cấp độ kernel và daemon ở tầng user-space sẽ giúp bạn tránh các lần khởi động lại ngoài ý muốn cũng như những sai sót khi cấu hình.

Cơ chế Heartbeat

Mọi thứ đều xoay quanh một bộ đếm ngược phần cứng hoặc kernel. Khi được khởi tạo, bộ đếm này sẽ đếm ngược về 0 từ một khoảng thời gian xác định, ví dụ 60 giây. Trong quá trình hoạt động bình thường, daemon ở tầng user-space sẽ định kỳ ghi các byte keepalive vào /dev/watchdog. Các quản trị viên hệ thống thường gọi thao tác làm mới này là “kicking the dog” hoặc gửi heartbeat.

Điều gì xảy ra nếu hệ điều hành bị đơ? Nếu tình trạng cạn kiệt bộ nhớ (out-of-memory) làm tê liệt bộ lập lịch (scheduler) hoặc một driver gây ra lỗi kernel panic, daemon sẽ không thể thực hiện việc kiểm tra định kỳ. Bộ đếm thời gian sẽ chạm mức 0 và phần cứng watchdog bên dưới sẽ lập tức thực hiện hard reset toàn bộ hệ thống.

Hardware Watchdog so với Software Watchdog

Hãy lựa chọn driver watchdog phù hợp dựa trên kiến trúc phần cứng và yêu cầu về độ tin cậy của bạn:

  • Software Watchdog (softdog): Là một module đếm thời gian thuần túy bên trong kernel. Nó hoạt động tốt trong các môi trường ảo hóa như KVM, Proxmox và các instance AWS EC2 mà không cần cấu hình pass-through phần cứng đặc biệt. Tuy nhiên, do nó phụ thuộc vào ngắt bộ đếm thời gian của kernel, một sự cố treo CPU nghiêm trọng hoặc sự cố dừng hypervisor sẽ khiến softdog không thể kích hoạt reset.
  • Hardware Watchdog (IPMI / iTCO_wdt / bcm2835_wdt): Các máy chủ vật lý (chẳng hạn như Dell PowerEdge tích hợp iDRAC hoặc HPE ProLiant tích hợp iLO) cùng những dòng máy tính nhúng single-board như Raspberry Pi 4 đều có vi điều khiển đếm thời gian chuyên dụng trên bo mạch chủ. Vì đồng hồ này chạy độc lập hoàn toàn với CPU và hệ điều hành của máy chủ, nó đảm bảo khả năng reset bằng phần cứng ngay cả khi kernel ngừng hoạt động hoàn toàn.

Chạy lệnh sau để kiểm tra xem bo mạch chủ máy chủ của bạn có hỗ trợ hardware watchdog hay không:

dmesg | grep -i watchdog

Nếu bạn thấy các driver như iTCO_wdt (chipset Intel) hoặc ipmi_watchdog, hãy trỏ thẳng /etc/watchdog.conf đến node thiết bị đó thay vì load softdog.

Tính năng “Magic Close”

Điều gì giúp ngăn chặn máy chủ khởi động lại ngoài ý muốn khi bạn dừng dịch vụ để bảo trì? Daemon này triển khai một giao thức an toàn gọi là “Magic Close”. Khi được dừng một cách tuần tự thông qua lệnh systemctl stop watchdog, daemon sẽ ghi ký tự ASCII V vào /dev/watchdog ngay trước khi đóng file handle. Kernel driver nhận diện mã tắt có chủ đích này và vô hiệu hóa bộ đếm ngược một cách an toàn.

Sử dụng nâng cao: Tùy biến kiểm tra sức khỏe và ping mạng

Ngoài việc kiểm tra xem CPU scheduler có phản hồi hay không, watchdog daemon còn có thể giám sát dung lượng RAM trống, gateway mạng, PID của các daemon quan trọng và các endpoint ứng dụng tùy chỉnh.

Cấu hình ngưỡng tài nguyên và mạng

Dưới đây là một cấu hình /etc/watchdog.conf đã được kiểm chứng thực tế dành cho một máy chủ kết nối internet:

# Thiết bị watchdog và tần suất heartbeat
watchdog-device = /dev/watchdog
interval = 5
watchdog-timeout = 30

# Khởi động lại nếu RAM trống xuống dưới 128MB
min-memory = 128M

# Kích hoạt khởi động lại nếu load trung bình 1 phút vượt quá 30
max-load-1 = 30

# Ping gateway nội bộ để đảm bảo kết nối mạng
ping = 192.168.1.1
interface = eth0

# Kiểm tra xem tiến trình web server theo PID còn hoạt động không
pidfile = /var/run/nginx.pid

Nếu gateway cục bộ ngừng phản hồi gói tin ICMP quá lâu hoặc hiện tượng rò rỉ bộ nhớ khiến lượng RAM khả dụng giảm xuống dưới 128MB, watchdog sẽ phát hiện điều kiện này và tự động khởi động lại máy chủ.

Viết script kiểm tra tùy chỉnh

Các chỉ thị định sẵn không thể bao quát hết mọi tình huống biên. Rất may là bạn có thể đặt các shell script tùy chỉnh vào thư mục /etc/watchdog.d/. Daemon sẽ thực thi mọi script trong thư mục này ở mỗi chu kỳ heartbeat. Bất kỳ mã thoát (exit status) nào từ 1 đến 244 đều được coi là một lần kiểm tra thất bại.

Ví dụ: bạn có thể kiểm tra xem một microservice nội bộ trên cổng 8080 có phản hồi mã HTTP 200 trong vòng 3 giây hay không:

sudo mkdir -p /etc/watchdog.d
sudo nano /etc/watchdog.d/check_api.sh

Dán nội dung script sau vào:

#!/usr/bin/env bash

# Kiểm tra trạng thái API nội bộ với thời gian chờ 3 giây
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8080/health)

if [ "$HTTP_STATUS" -eq 200 ]; then
    exit 0
fi

exit 1

Cấp quyền thực thi cho script:

sudo chmod +x /etc/watchdog.d/check_api.sh

Tiếp theo, bật cơ chế quét thư mục kiểm tra trong /etc/watchdog.conf:

test-directory = /etc/watchdog.d
test-timeout = 10

Khởi động lại dịch vụ để kích hoạt script kiểm tra sức khỏe vừa tạo:

sudo systemctl restart watchdog

Lời khuyên thực tế cho hệ thống Production

Các thiết lập watchdog quá khắt khe có thể dễ dàng đẩy máy chủ của bạn vào vòng lặp khởi động lại vô tận. Hãy áp dụng các hướng dẫn thực tế dưới đây để giữ cho quy trình tự động phục hồi luôn an toàn.

Tinh chỉnh khoảng thời gian và giữ script gọn nhẹ

Đảm bảo mọi script kiểm tra sức khỏe luôn chạy thật ngắn gọn. Nếu một probe bị nghẽn do chờ truy vấn DNS thượng nguồn hoặc database lock, nó sẽ chiếm dụng thời gian thực thi của chính vòng lặp watchdog. Hãy tránh các truy vấn database phức tạp hoặc các subshell lồng nhau bên trong /etc/watchdog.d/.

Luôn đặt watchdog-timeout tối thiểu gấp hai đến ba lần giá trị của interval. Nếu chu kỳ heartbeat của bạn là 10 giây, hãy đặt watchdog timeout là 30 hoặc 60 giây. Khoảng dự phòng này giúp kernel có đủ thời gian xử lý các đợt tải I/O đột biến tạm thời mà không nhận định nhầm sự chậm trễ ngắn hạn đó là hệ thống bị treo cứng.

Mô phỏng tình huống treo hệ thống để kiểm thử

Hãy luôn kiểm tra cấu hình của bạn trên môi trường staging trước khi triển khai hàng loạt lên production. Bạn có thể mô phỏng một sự cố kernel panic không thể phục hồi một cách an toàn bằng các phím Linux Magic SysRq. Trước hết, đảm bảo tính năng SysRq đã được bật trong kernel:

sudo sysctl -w kernel.sysrq=1

Kết nối vào serial console hoặc out-of-band console của máy chủ. Sau đó chủ động tạo một cú crash kernel:

echo c | sudo tee /proc/sysrq-trigger

Phiên SSH sẽ bị đơ ngay lập tức. Hãy theo dõi console quản trị out-of-band: ngay khi khoảng thời gian watchdog-timeout đã cấu hình trôi qua, bộ đếm phần cứng sẽ kích hoạt, tắt bật lại nguồn hệ thống và đưa máy chủ trở lại màn hình đăng nhập bình thường.

Ngăn chặn vòng lặp khởi động và lỗi hỏng hệ thống tập tin

Hãy nhớ rằng việc reset do watchdog kích hoạt là một hard reset đột ngột từ phần cứng chứ không phải thao tác tắt máy tuần tự shutdown -r now. Các cơ sở dữ liệu như PostgreSQL, Redis hay MySQL có thể mất vài phút để chạy crash recovery khi khởi động. Nếu watchdog kiểm tra MySQL ngay khi vừa boot với thời gian timeout quá ngắn, nó có thể kích hoạt tiếp một lần khởi động lại khác trong lúc database vẫn đang xử lý replaying WAL log.

Để tránh boot loop, hãy sử dụng các quan hệ phụ thuộc trong systemd (như After=network.target) và cấu hình thời gian chờ khởi động hợp lý cho các unit ứng dụng quan trọng. Khoảng đệm đó đảm bảo các service kịp hoàn tất quá trình crash recovery trước khi watchdog bắt đầu giám sát nghiêm ngặt.

Share: