Apache Derby Bài 50: Giám sát hiệu năng hệ thống qua JMX (Java Management Extensions)
1. JMX và MBeans là gì?
Khi hệ thống vận hành trên Production, bạn không thể lúc nào cũng mở tệp derby.log để đếm số lượng kết nối hoặc đoán xem máy chủ đang tiêu thụ bao nhiêu RAM. Bạn cần một bảng điều khiển (Dashboard) theo dõi các chỉ số trực tiếp (Real-time).
JMX (Java Management Extensions) là một công nghệ cốt lõi của máy ảo Java (JVM), cho phép các nhà phát triển nhúng các công cụ giám sát trực tiếp vào ứng dụng. Apache Derby cung cấp sẵn các MBeans (Managed Beans) – những đối tượng đặc biệt làm nhiệm vụ thu thập và "phơi bày" các chỉ số sức khỏe của cơ sở dữ liệu ra bên ngoài qua một cổng mạng (Port) riêng biệt.
2. Kích hoạt JMX trên Derby Network Server
Mặc định, JMX bị tắt để bảo mật. Để bật tính năng này, bạn cần truyền các tham số khởi động (System Properties) của JMX vào JVM khi chạy Network Server.
Khởi động Derby từ command line với các cờ JMX:
Bash
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar $DERBY_HOME/lib/derbyrun.jar server start
-
port=9999: Cổng mạng để các công cụ giám sát kết nối vào. -
authenticate=false&ssl=false: Tắt xác thực và mã hóa để dễ dàng test trên môi trường Local. (Lưu ý: Trên Production, bạn BẮT BUỘC phải bật hai cờ này và cấu hình file password để tránh tin tặc chiếm quyền điều khiển).
3. Theo dõi trực quan bằng JConsole / VisualVM
Bất kỳ bộ JDK nào cài đặt trên máy tính của bạn cũng đi kèm với một công cụ giám sát có giao diện tên là JConsole (hoặc bạn có thể tải VisualVM – công cụ mạnh mẽ hơn).
Cách sử dụng:
-
Mở Terminal / Command Prompt và gõ lệnh:
jconsole -
Chọn Remote Process và nhập địa chỉ:
localhost:9999 -
Chuyển sang thẻ MBeans. Tại đây, bạn sẽ thấy thư mục
org.apache.derby, chứa toàn bộ các cảm biến theo dõi của hệ thống.
4. Các MBeans quan trọng của Apache Derby
Khi mở cây thư mục org.apache.derby trong JConsole, bạn cần tập trung vào các MBean cốt lõi sau để đánh giá tình trạng hệ thống:
4.1. NetworkServerMBean (Chỉ số Mạng)
Đây là MBean quan trọng nhất trong kiến trúc Server. Nó cung cấp các thuộc tính (Attributes):
-
ConnectionCount: Số lượng kết nối hiện đang mở. Nếu con số này tăng liên tục mà không giảm, ứng dụng Java của bạn đang bị lỗi rò rỉ kết nối (Connection Leak) và chưa gọiconn.close(). -
ActiveThreads: Số lượng luồng (Threads) đang thực sự làm việc. -
BytesReceived/BytesSent: Lưu lượng mạng CSDL đã xử lý. -
Operations (Hành động): Cung cấp nút bấm
ping()để kiểm tra độ trễ mạng.
4.2. ManagementMBean (Trình quản lý lõi)
Dùng để bật/tắt tính năng theo dõi cấu trúc của từng cơ sở dữ liệu riêng biệt.
- Bằng cách gọi hành động
startManagement(), Derby sẽ kích hoạt thêm các MBean theo dõi từng CSDL cụ thể (ví dụ: hiển thị chính xác CSDLmy_company_dbđang bị khóa hay không).
4.3. VersionMBean (Quản lý phiên bản)
Cho biết chính xác phiên bản Derby Engine đang chạy trên máy chủ (ví dụ: 10.17.1.0). Hữu ích khi bạn có một cụm Cluster nhiều máy và cần xác minh tất cả đều đã được nâng cấp đồng bộ (Bài 48).
5. Viết mã Java thu thập chỉ số (Custom JMX Client)
Ngoài việc dùng JConsole, bạn hoàn toàn có thể viết một đoạn mã Java nhỏ, chạy độc lập, kết nối vào cổng JMX của Derby để tự động thu thập chỉ số và gửi cảnh báo (Alert) qua Telegram / Slack nếu số lượng kết nối vượt quá 100.
Java
package com.hieu.derby.monitor;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class DerbyJmxMonitor {
public static void main(String[] args) {
try {
// 1. Trỏ tới cổng JMX của Derby Network Server
String jmxUrl = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
JMXServiceURL url = new JMXServiceURL(jmxUrl);
// 2. Thiết lập kết nối
try (JMXConnector jmxc = JMXConnectorFactory.connect(url, null)) {
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
// 3. Khai báo định danh của NetworkServerMBean
ObjectName networkServerName = new ObjectName("org.apache.derby:type=NetworkServerMBean,system=derby");
// 4. Lấy các chỉ số theo thời gian thực
Object connCount = mbsc.getAttribute(networkServerName, "ConnectionCount");
Object activeThreads = mbsc.getAttribute(networkServerName, "ActiveThreads");
System.out.println("=== THỐNG KÊ SỨC KHỎE DERBY SERVER ===");
System.out.println("Số kết nối hiện tại : " + connCount);
System.out.println("Số luồng đang chạy : " + activeThreads);
// Logic cảnh báo
if ((Integer) connCount > 100) {
System.err.println("CẢNH BÁO: Số lượng kết nối vượt ngưỡng an toàn!");
// Code gửi API cảnh báo tới Slack/Telegram ở đây...
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6. Tổng kết
JMX là mảnh ghép cuối cùng giúp bạn kiểm soát hoàn toàn hệ thống Apache Derby trên môi trường Production. Bằng cách quan sát ConnectionCount và ActiveThreads, bạn có thể đánh giá tính hiệu quả của HikariCP (Bài 40) và dự đoán được khi nào hệ thống cần được cấp thêm RAM hay nâng cấp phần cứng.
All rights reserved