Cấu hình Coordinator để quản lý Ingestion và Compaction
Bước đầu tiên là thiết lập file cấu hình cho Coordinator. Component này đóng vai trò là "người điều phối", chịu trách nhiệm giám sát các task ingestion, đảm bảo dữ liệu được phân phối đều và kích hoạt quá trình compaction để gộp các đoạn dữ liệu nhỏ thành lớn.
Tạo file cấu hình tại đường dẫn /opt/druid/conf/druid/0.25.0/standalone/coordinator.properties. Nội dung file dưới đây được tùy chỉnh để hoạt động với ZooKeeper đã cài đặt ở phần trước và HDFS làm lưu trữ.
druid.coordinator.runtimeType=standalone
druid.extensions.loadList=[]
# Cấu hình ZooKeeper
druid.zk.service.host=127.0.0.1:2181
druid.zk.base=/druid
druid.zk.paths.base=/druid
# Cấu hình lưu trữ (HDFS hoặc Local FS)
druid.storage.type=hdfs
druid.storage.rootDirectory=/druid/storage
# Cấu hình Coordinator
druid.coordinator.startCompaction=true
druid.coordinator.startIngestion=true
druid.coordinator.numShards=1
# Cấu hình lịch sử (History) để biết vị trí dữ liệu
druid.history.storage.type=hdfs
druid.history.storage.rootDirectory=/druid/storage
# Cấu hình ZooKeeper cho các dịch vụ khác
druid.indexer.zk.service.host=127.0.0.1:2181
druid.broker.zk.service.host=127.0.0.1:2181
druid.historical.zk.service.host=127.0.0.1:2181
Kết quả mong đợi: File được lưu thành công, không báo lỗi cú pháp. Khi khởi động, Coordinator sẽ đăng ký vào ZooKeeper tại đường dẫn /druid/coordinator và sẵn sàng nhận các nhiệm vụ phân phối dữ liệu.
Để xác minh cấu hình, hãy chạy lệnh sau để kiểm tra quyền đọc ghi và nội dung file:
cat /opt/druid/conf/druid/0.25.0/standalone/coordinator.properties | grep -E "druid.storage.rootDirectory|druid.zk.base"
Đầu ra phải hiển thị đúng đường dẫn HDFS và base path của ZooKeeper đã định nghĩa. Nếu xuất hiện thông báo "Permission denied", hãy kiểm tra lại quyền sở hữu thư mục.
Cấu hình Broker để xử lý truy vấn từ Client
Broker là thành phần chịu trách nhiệm nhận yêu cầu truy vấn từ client (như SQL, REST API), phân tích query plan và phân tán yêu cầu này đến các Historical nodes hoặc Indexer nếu cần. Đây là điểm vào duy nhất cho các truy vấn OLAP.
Tạo file cấu hình tại đường dẫn /opt/druid/conf/druid/0.25.0/standalone/broker.properties. Cấu hình này cần đảm bảo Broker biết kết nối đến ZooKeeper để tìm Historical và biết địa chỉ của Coordinator để lấy lịch sử phân vùng.
druid.broker.runtimeType=standalone
druid.extensions.loadList=[]
# Cấu hình ZooKeeper
druid.zk.service.host=127.0.0.1:2181
druid.zk.base=/druid
druid.zk.paths.base=/druid
# Cấu hình lịch sử để Broker biết nơi lấy dữ liệu
druid.history.storage.type=hdfs
druid.history.storage.rootDirectory=/druid/storage
# Cấu hình Broker
druid.broker.start=true
druid.broker.http.host=0.0.0.0
druid.broker.http.port=8083
druid.broker.exportedHttpPort=8083
# Thời gian chờ để Historical tải dữ liệu (tùy chọn, mặc định hợp lý)
druid.broker.maxPendingTaskTime=PT10M
druid.broker.maxQueryTime=PT10M
# Cấu hình ZooKeeper cho các dịch vụ khác
druid.indexer.zk.service.host=127.0.0.1:2181
druid.coordinator.zk.service.host=127.0.0.1:2181
druid.historical.zk.service.host=127.0.0.1:2181
Kết quả mong đợi: Broker sẽ lắng nghe trên cổng 8083. Khi khởi động, nó sẽ đăng ký vào ZooKeeper tại /druid/broker và bắt đầu quét danh sách Historical để xây dựng bản đồ phân vùng dữ liệu.
Để kiểm tra Broker đã sẵn sàng, hãy sử dụng curl để gọi endpoint health check:
curl -s http://localhost:8083/druid/broker/v1/status
Đầu ra phải trả về JSON với trường "status": "OK" hoặc "active". Nếu nhận lỗi 404 hoặc Connection refused, hãy kiểm tra lại port 8083 và trạng thái của tiến trình Broker.
Cấu hình Historical để lưu trữ dữ liệu nóng và lạnh
Historical là nơi lưu trữ dữ liệu thực tế (dữ liệu lạnh và nóng) từ HDFS hoặc Local FS. Nó tải các segment (đoạn dữ liệu) vào bộ nhớ RAM khi Broker yêu cầu để trả lời truy vấn. Cấu hình này quyết định dung lượng bộ nhớ và chiến lược cache của node.
Tạo file cấu hình tại đường dẫn /opt/druid/conf/druid/0.25.0/standalone/historical.properties. Cần chú ý đặc biệt đến phần cấu hình bộ nhớ Java và giới hạn dung lượng cache để tránh lỗi OutOfMemoryError trên server thật.
druid.historical.runtimeType=standalone
druid.extensions.loadList=[]
# Cấu hình ZooKeeper
druid.zk.service.host=127.0.0.1:2181
druid.zk.base=/druid
druid.zk.paths.base=/druid
# Cấu hình lưu trữ (HDFS)
druid.storage.type=hdfs
druid.storage.rootDirectory=/druid/storage
# Cấu hình Historical
druid.historical.start=true
druid.historical.http.host=0.0.0.0
druid.historical.http.port=8083
druid.historical.exportedHttpPort=8083
# Cấu hình bộ nhớ (Quan trọng cho Historical)
druid.processors.numThreads=4
druid.historical.cache.capacity=2048MB
druid.historical.cache.type=managed
# Cấu hình ZooKeeper cho các dịch vụ khác
druid.indexer.zk.service.host=127.0.0.1:2181
druid.coordinator.zk.service.host=127.0.0.1:2181
druid.broker.zk.service.host=127.0.0.1:2181
Kết quả mong đợi: Historical sẽ khởi động, kết nối vào ZooKeeper tại /druid/historical và bắt đầu tải các segment từ HDFS vào cache. Nó sẽ báo trạng thái "Ready" khi hoàn tất việc tải dữ liệu ban đầu.
Để xác minh Historical đã tải dữ liệu, hãy truy cập console quản trị hoặc dùng lệnh sau để xem trạng thái:
curl -s http://localhost:8083/druid/historical/v1/status
Đầu ra phải hiển thị JSON với trạng thái "OK" và danh sách các segment đã được tải (segments loaded). Nếu không thấy segment nào, hãy kiểm tra lại đường dẫn druid.storage.rootDirectory trong HDFS xem đã có dữ liệu chưa.
Khởi động và kiểm tra tổng thể các thành phần
Sau khi đã tạo xong 3 file cấu hình, bước cuối là khởi động từng tiến trình để đảm bảo chúng hoạt động đồng bộ. Chúng ta sẽ chạy chúng ở chế độ standalone trên cùng một máy để mô phỏng cluster đơn giản.
Khởi động Coordinator trước để nó thiết lập các phân vùng trong ZooKeeper:
cd /opt/druid
./bin/druid/coordinator/standalone/coordinator.sh /opt/druid/conf/druid/0.25.0/standalone/coordinator.properties
Chờ khoảng 10-15 giây để Coordinator ổn định, sau đó khởi động Historical để nó tải dữ liệu:
./bin/druid/historical/standalone/historical.sh /opt/druid/conf/druid/0.25.0/standalone/historical.properties
Khởi động Broker cuối cùng để nó có thể phân phối truy vấn đến Historical đã sẵn sàng:
./bin/druid/broker/standalone/broker.sh /opt/druid/conf/druid/0.25.0/standalone/broker.properties
Để kiểm tra toàn bộ hệ thống đã chạy, sử dụng lệnh ps để liệt kê các tiến trình Druid:
ps aux | grep druid | grep -v grep
Đầu ra phải hiển thị 3 dòng tiến trình riêng biệt cho Coordinator, Historical và Broker. Nếu thiếu tiến trình nào, hãy xem file log tại /var/log/druid/ để tìm nguyên nhân lỗi.
Để xác nhận kết nối giữa Broker và Historical, thực hiện truy vấn đơn giản:
curl -s -X POST http://localhost:8083/druid/v2/query/aggregation -H 'Content-Type: application/json' -d '{"queryType": "timeseries", "dataSource": "your_dataset", "granularity": "day", "intervals": ["2023-01-01/2023-12-31"]}'
Đầu ra trả về JSON chứa dữ liệu thời gian (timeseries) chứng tỏ Broker đã liên lạc thành công với Historical và lấy được dữ liệu từ HDFS. Nếu nhận lỗi "No data found", hãy kiểm tra lại tên dataSource và khoảng thời gian intervals.
Điều hướng series:
Mục lục: Series: Triển khai Database OLAP với Apache Druid trên Ubuntu 24.04
« Phần 4: Cấu hình ZooKeeper và HDFS cho Druid Cluster
Phần 6: Cấu hình Indexer và Web Console để quản lý dữ liệu »