本記事では、OBKV-HBaseのサーバー側およびクライアント側の監視指標と、その確認方法について説明します。
サーバー側モニタリング指標
以下のビューを参照することで、OBKV-HBaseに関連するサーバー側のモニタリング指標を確認できます。
ビュー |
機能の説明 |
|---|---|
| GV$SYSSTAT | OBKV-HBaseのQPS/RT/ROWS関連指標を照会する |
| GV$OB_SQL_AUDIT | OBKV-HBaseの処理の遅いリクエストを特定する |
| GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM | OBKV-HBaseのP99などのパフォーマンス指標を照会する |
具体的には以下のとおりです:
QPS/RT/ROWS関連指標
QPS/RT/ROWS関連指標は、GV$SYSSTAT ビューからクエリできます。
すべてのモニタリング指標のクエリ
MySQL [oceanbase]> SELECT DISTINCT class,stat_id,name, value_type FROM GV$SYSSTAT WHERE name LIKE "hbase%";
戻り値のフィールド例は以下のとおりです(戻り値にはすべてのHBaseモニタリング指標が含まれます。完全なリストについては、以下のパラメータ説明表を参照してください)。
+-------+---------+------------------------------+------------+
| class | stat_id | name | value_type |
+-------+---------+------------------------------+------------+
| 4096 | 191001 | hbase scan count | ADD_VALUE |
+-------+---------+------------------------------+------------+
(推奨) テナントごとに特定の監視指標を照会する
クエリ例:
# checkAndMutateの指標を照会する
MySQL [oceanbase]> SELECT * FROM oceanbase.GV$SYSSTAT
WHERE name LIKE '%hbase check_mutate%'
AND con_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = 'your_tenant_name'); -- テナント名を指定する
サポートされている name パラメータのリストと説明は以下のとおりです:
Name |
説明 |
|---|---|
| hbase scan count | Scan操作の回数 |
| hbase scan time | Scan操作の実行総時間 |
| hbase scan row count | Scan操作でスキャンされたCell数 |
| hbase put count | Put操作の回数 |
| hbase put time | Put操作の実行総時間 |
| hbase put row count | Put操作のCell数 |
| hbase delete count | delete操作の回数 |
| hbase delete time | delete操作の実行総時間 |
| hbase delete row count | delete操作のCell数 |
| hbase append count | append操作の回数 |
| hbase append time | append操作の実行総時間 |
| hbase append row count | append操作のCell数 |
| hbase increment count | increment操作の回数 |
| hbase increment time | increment操作の実行総時間 |
| hbase increment row count | increment操作のCell数 |
| hbase check_put count | checkAndPut操作の回数 |
| hbase check_put time | checkAndPut操作の実行総時間 |
| hbase check_put row count | checkAndPut操作のCell数 |
| hbase check_delete count | checkAndDelete操作の回数 |
| hbase check_delete time | checkAndDelete操作の実行総時間 |
| hbase check_delete row count | checkAndDelete操作のCell数 |
| hbase check_mutate | checkAndMutate操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| hbase scan | scan操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| hbase get | get操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| hbase batch put | batch put操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| hbase batch delete | batch delete操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| hbase batch get | batch get操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
| obkv failed operation | OBKV失敗操作の回数。OBKV-Table V2.3.0とOBKV-HBase V1.5.0/V2.5.0以降のクライアントを同時に使用する必要があります |
その他の監視指標の詳細については、GV$SYSSTATを参照してください。
遅延HBaseリクエストの特定
SQL Auditは、OceanBaseデータベースにおける重要な診断ツールであり、各リクエストのキャッシュヒット率、MemTable/SSTableなどのスキャン行数、実行時間などが記録されています。これにより、遅延リクエストのボトルネックポイントを容易に特定できます。OBKV-HBaseはSQL Auditの機能に対応しており、ユーザーは以下のクエリステートメントを使用してOBKV-HBase関連の診断レコードをフィルタリングできます。
MySQL [oceanbase]> SELECT * FROM v$OB_SQL_AUDIT WHERE query_sql LIKE "table api: hbase%" \G;
実行結果の例は次のとおりです:
*************************** 1. row ***************************
SVR_IP: 11.xxx.xxx.xxx
SVR_PORT: 54302
REQUEST_ID: 13841
SQL_EXEC_ID: 0
TRACE_ID: Y1EB2D1EB6D984-0000000000000002-0-0
SID: 0
CLIENT_IP: 30.xxx.xxx.xxx
CLIENT_PORT: 60205
TENANT_ID: 1
TENANT_NAME: sys
EFFECTIVE_TENANT_ID: 1
USER_ID: 200001
USER_NAME: root
USER_GROUP: 0
USER_CLIENT_IP: 30.xxx.xxx.xxx
DB_ID: 500001
DB_NAME: test
SQL_ID: TABLEAPI0x1103vv00000000CB87E8C9
QUERY_SQL: table api: hbase_put,
request: {credential:0193808080000101C19A0CA1C21E00FABAF9E6C0B589AEDB01, table_name:"htable1$family", table_id:500014, tablet_id:{id:200055}, entity_type:2, batch_operation:{is_readonly:false, is_same_type:true, is_same_properties_names:true, operatiton_count:1, table_operations:[{operation_type:4, entity:"{rowkey_names:[]rowkey:[{"VARCHAR":"testKey0", collation:"utf8mb4_general_ci", coercibility:"EXPLICIT"}, {"VARCHAR":"column", collation:"utf8mb4_general_ci", coercibility:"EXPLICIT"}, {"BIGINT":-9223372036854775807}], properties:{V:{"VARCHAR":"putValue", collation:"utf8mb4_general_ci", coercibility:"EXPLICIT"}}}"}]}, consistency_level:0, option_flag:0, returning_affected_entity:false, returning_affected_rows:true, batch_operation_as_atomic:false}
その他の遅延リクエストの特定の詳細については、GV$OB_SQL_AUDITを参照してください。
P99などのパフォーマンス指標
OBKV-HBaseは各操作の実行時間をヒストグラムで集計しており、ユーザーはV$OB_QUERY_RESPONSE_TIME_HISTOGRAMビューを利用して、Prometheusと連携して各操作のP95、P99などのパフォーマンス指標を確認できます。
クエリ例:
# checkAndMutateのメトリクスを照会する
MySQL [oceanbase]> SELECT * FROM oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM
WHERE sql_type LIKE '%HBASE CHECK AND MUTATE%'; -- 操作タイプを指定する
サポートされているsql_typeおよびその他の詳細については、GV$OB_QUERY_RESPONSE_TIME_HISTOGRAMを参照してください。
クライアントモニタリングメトリクス
このセクションでは、OBKV-HBase MetricsExporterとjconsoleを使用してクライアント操作のモニタリングメトリクスを確認する方法について説明します。
MetricsExporterを使用した対応する操作のモニタリングメトリクスの取得
MetricsExporterには、以下のメトリクスが含まれています:
指標項目 |
説明 |
|---|---|
| FailRate | 対応インターフェースの平均失敗率 |
| FailCount | 対応インターフェースの失敗回数 |
| TotalRuntime | 対応インターフェースの総実行時間 |
| AverageSingleOpCount | 対応インターフェースに関連する操作数。バッチ操作の場合は、バッチ操作リストの長さ |
| Count | 対応インターフェースの呼び出し回数 |
| AverageOps | 対応インターフェースの平均OPS |
| OneMinuteAverageOps | 対応インターフェース1分間の平均OPS |
| FiveMinuteAverageOps | 対応インターフェース5分間の平均OPS |
| FifteenMinuteAverageOps | 対応インターフェース15分間の平均OPS |
| AverageLatency | 対応インターフェースの平均RT |
| MaxLatency | 対応インターフェースの最大RT |
| MinLatency | 対応インターフェースの最小RT |
| MedianLatency | 対応インターフェースの中央値RT |
| P75thPercentile | 対応インターフェースのP75 RT |
| P95thPercentile | 対応インターフェースのP95 RT |
| P98thPercentile | 対応インターフェースのP98 RT |
| P99thPercentile | 対応インターフェースのP99 RT |
| P999thPercentile | 対応インターフェースのP999 RT |
使用方法
# サンプルコード
Configuration conf = ObHTableTestUtil.newConfiguration();
// important!! enable metrics
conf.set(CLIENT_SIDE_METRICS_ENABLED_KEY, "true");
Connection connection = ConnectionFactory.createConnection(conf);
Table hTable = connection.getTable(TableName.valueOf("test_metrics"));
OHMetrics metrics = ((OHTable) hTable).getMetrics();
// GET_LIST metrics
MetricsExporter exporter = metrics.acquireMetrics(OHOperationType.GET_LIST);
System.out.println("AverageOps: " + exporter.getAverageOps());
System.out.println("99thPercentile: " + exporter.get99thPercentile());
System.out.println("AverageSingleOpCount: " + exporter.getAverageSingleOpCount());
JMXを使用したクライアント監視メトリクスの確認
クライアント監視メトリクスは、以下の2つの方法で確認できます:
- MBeanServerを使用して確認する
- jconsoleを使用して確認する
MBeanServerを使用した表示
MBeanServerを使用してクライアントのモニタリングメトリクスを表示するサンプルコードは以下のとおりです:
# サンプルコード
import javax.management.*;
import java.lang.management.ManagementFactory;
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
/**
* acquire the ObjectName of a specific attribute in JMX
*
* @param opType OHOperationType
* @param metricsName metrics name
* @param attributeName attribute name (latencyHistogram, failedOpCounter, totalSingleOpCount, totalRuntime)
* @return ObjectName
*/
public ObjectName getObjectName(OHOperationType opType, String metricsName,
String attributeName) {
try {
// the format of JMX name: domain:name=metricName
// example: com.alipay.oceanbase.hbase.util.OHMetrics.PUT.latencyHistogram.metricsName
String name = String.format("%s.%s.%s.%s",
OHMetrics.class.getName(),
opType.name(),
attributeName,
metricsName);
String objectNameStr = String.format("%s:name=%s",
JMX_DOMAIN, name);
return new ObjectName(objectNameStr);
} catch (MalformedObjectNameException e) {
throw new RuntimeException("Failed to create ObjectName", e);
}
}
/**
* acquire latency attribute
* Timer attributes: Count, MeanRate, OneMinuteRate, FiveMinuteRate, FifteenMinuteRate
* Min, Max, Mean, StdDev, 50thPercentile, 75thPercentile, 95thPercentile, 98thPercentile, 99thPercentile, 999thPercentile
*/
public Object getTimerAttribute(OHOperationType opType, String metricsName, String attributeName) {
try {
ObjectName objectName = getObjectName(opType, metricsName, "latencyHistogram");
return mBeanServer.getAttribute(objectName, attributeName);
} catch (Exception e) {
throw new RuntimeException("Failed to get Timer attribute: " + attributeName, e);
}
}
/**
* acquire failed operations attribute
* Meter attributes: Count, MeanRate, OneMinuteRate, FiveMinuteRate, FifteenMinuteRate
*/
public Object getMeterAttribute(OHOperationType opType, String metricsName, String attributeName) {
try {
ObjectName objectName = getObjectName(opType, metricsName, "failedOpCounter");
return mBeanServer.getAttribute(objectName, attributeName);
} catch (Exception e) {
throw new RuntimeException("Failed to get Meter attribute: " + attributeName, e);
}
}
/**
* acquire Counter attribute
* Counter attributes: Count
*/
public Object getCounterAttribute(OHOperationType opType, String metricsName,
String counterName, String attributeName) {
try {
ObjectName objectName = getObjectName(opType, metricsName, counterName);
return mBeanServer.getAttribute(objectName, attributeName);
} catch (Exception e) {
throw new RuntimeException("Failed to get Counter attribute: " + attributeName, e);
}
}
Configuration config = ObHTableTestUtil.newConfiguration();
// important!! enable metrics
config.set(CLIENT_SIDE_METRICS_ENABLED_KEY, "true");
Connection connection = ConnectionFactory.createConnection(config);
Table hTable = connection.getTable(TableName.valueOf("test_multi_cf"));
String metricsName;
if (hTable instanceof OHTable) {
OHMetrics metrics = ((OHTable) hTable).getMetrics();
if (metrics != null) {
metricsName = metrics.getMetricsName();
}
}
// PUT metrics
// latency histogram
Long totalOpCount = (Long) getTimerAttribute(OHOperationType.PUT, metricsName, "Count");
Double meanOps = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "MeanRate");
Double oneMinuteRateOps = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "OneMinuteRate");
Double meanLatency = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "Mean");
Double minLatency = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "Min");
Double maxLatency = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "Max");
Double P99thPercentile = (Double) getTimerAttribute(OHOperationType.PUT, metricsName, "99thPercentile");
// failure operations
Long failedOpCount = (Long) getMeterAttribute(OHOperationType.PUT, metricsName, "Count");
Double meanFailRate = (Double) getMeterAttribute(OHOperationType.PUT, metricsName, "MeanRate");
Double oneMinuteFailRate = (Double) getMeterAttribute(OHOperationType.PUT, metricsName, "OneMinuteRate");
// Counter
Double totalSingleOpCount = (Long) getCounterAttribute(OHOperationType.PUT, metricsName, "totalSingleOpCount", "Count");
Double totalRuntime = (Long) getCounterAttribute(OHOperationType.PUT, metricsName, "totalRuntime", "Count");
jconsoleを使用した表示
Hadoop ConfigurationでCLIENT_SIDE_METRICS_ENABLED_KEYをtrueに設定します。OBKV-HBaseクライアントプロセスを起動し、ターミナルでps -ef | grep ideaを実行してプロセスのPIDを確認します。その後、ターミナルでjconsole $PIDを実行してJMXインターフェースを開きます。MBeanの下にはcom.oceanbase.hbase.metricsフォルダが表示され、その中にはすべてのインターフェース操作に関するモニタリング項目が含まれています。