キャッシュ レプリケーションの監視
キャッシュ レプリケーションについての統計情報は、メインの Jira ログ ファイル、atlassian-jira.log
に記載されています。これらは、ローカル キューのサイズや、キャッシュ変更のレプリケーションの平均所要時間などの、キャッシュ レプリケーションの詳細を示しています。
記録される統計情報
各ノードは、キャッシュ レプリケーションの状態を示す統計情報を記録します。統計情報には 2 つのタイプがあります。
Total: ノードの開始以降に集計された統計情報。
Snapshot: 前回のスナップショットの取得後 (既定では 60 秒) に集計された統計情報。
例:
3 ノード クラスタでは、ノード 1 に次の統計情報があります。
- Total: ノード 1 からノード 2 へのレプリケーション
- Total: ノード 1 からノード 3 へのレプリケーション
- Snapshot: ノード 1 からノード 2 へのレプリケーション
- Snapshot: ノード 1 からノード 3 へのレプリケーション
キャッシュ レプリケーションの監視
統計情報の例
統計は JSON 形式で表示されます。出力例は次のようになります。
基本的な監視方法
これらの数個のパラメーターを監視することで、キャッシュ レプリケーションが正常に機能しているかどうかを確認できます。次の表の推奨値を確認し、お使いの環境で表示される内容と比較してください。
パラメーター | 説明 | 推奨値 |
---|---|---|
queueSize | キューの現在のサイズ (レプリケーションを待機しているキャッシュ変更の数)。 | 値は 0 に近づける必要があります。 これは、変更が正常にレプリケートされ、キューから削除されたことを示します。 |
| ノードの開始時のキューの初期サイズと、それ以降にキューに追加された変更の数。 |
これは、キューに追加されたすべての変更が正常にレプリケートされ、キューから削除されたことを示します。 |
| 他のノードにレプリケートされた変更の数、およびキューから削除された変更の数。 | |
| ローカル キューに変更を追加および削除するのにかかる時間。 |
この値よりも極端に大きい場合、ローカル ホーム ディレクトリが格納されているストレージに I/O の問題が発生している可能性があります。 |
| ||
timeToSendMillis | RMI 経由でローカル キューから他のノードに変更を送信するのにかかる時間。 | |
| キューに追加できなかった変更や、他のノードにレプリケートできなかった変更の数。 | 値は 0 に近づける必要があります。 これは、すべての変更が正常にキューに追加され、他のノードにレプリケートされたことを示します。 |
パラメーター
以下の表は、統計情報で確認できるすべてのパラメーターを示します。
localq への変更と新しい統計
ここでは、localq に加えられたいくつかの変更点を説明します。
[VIA-COPY] と [VIA-INVALIDATION]
Jira 8.12
JIRA 8.12 以降、コピーによってレプリケートされたキャッシュからのメッセージをレプリケートするチャンネルは、無効化によってレプリケートされたキャッシュからのメッセージとは少し異なります。
主な違いは、無効化によってレプリケートされたキャッシュのメッセージは配信が保証されて、コピーによってレプリケートされたキャッシュのメッセージは配信が保証されないことです。技術的に、主な違いは次のとおりです。
メッセージがキューに追加された後は、ファイルに同期されない [via-copy]
キューのサイズが非常に小さい (10x10 k [via-copy]、10x100 k [via-invalidation])
他ノードへの配信が失敗しても再試行しない [via-copy]
メッセージはライブ ノード (アクティブなハートビート) にのみ配信される [via-copy]、すべてのアクティブ (オフラインではないアクティブ状態) ノードに配信される [via-invalidation]
このため、異なるプレフィックスの付いた両方のチャンネルでは LOCALQ 統計のセットが異なります。
[LOCALQ][VIA-COPY]
[LOCALQ][VIA-INVALIDATION]
ほとんどの場合、[via-copy] は DBR、ユーザー、グループのレプリケーションに、[via-invalidation] は他のすべてのレプリケーションに関連しています。
上位キャッシュ
Jira 8.13.4
数え切れないほど大量に発生するレプリケーション メッセージの原因がどのキャッシュにあるのかについて、疑問に思ったことはありませんか。きっとあるはずです。しかし今までは、この情報を得るのは本当に難しいことでした。レプリケーション メッセージごとに DEBUG ロギングを有効にして集約する必要がありました。大規模なインスタンスでは生成されるログ メッセージの量も多いため、本番インスタンスでは選択肢にすらならない場合もあります。
これからは、すべての LOCALQ 統計で 上位 10 のキャッシュ コントリビューターが表示されるようになりました。合計統計ではこのインスタンスの開始時点における上位コントリビューターが、スナップショット統計では直近 5 分の上位コントリビューターが表示されます。
これは JIRA 8.14 以降でご利用いただけます。また、JIRA 8.13.4 にもバックポートされたばかりです。
新しい統計の例
...
"numberOfCaches": 29,
"addCounterTopN": 1421,
"addCounterOthers": 113,
"addCounterByCacheTopN": {
"UserPropertyManager.ApplicationUser.cache": 543,
"com.atlassian.jira.crowd.embedded.ofbiz.LazyOfBizUserCache.userCache": 291,
"com.atlassian.servicedesk.internal.feature.queue.ProjectStateCacheManagerImpl.sdProjectStateCache": 182,
"com.atlassian.gadgets.renderer.internal.cache.messageBundles": 153,
"com.atlassian.gadgets.renderer.internal.cache.httpResponses": 94,
"DbBackedCachedPropertySetManager.jira.properties.cache": 66,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizInternalMembershipDao.childrenCache": 37,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizInternalMembershipDao.parentsCache": 37,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizDirectoryDao.directoryCache": 10,
"com.atlassian.jira.workflow.CachingDraftWorkflowStore.draftWorkflowCache": 8
}
...
numberOfCaches
- レプリケート中のキャッシュ数 (アクティブにレプリケート中)
addCounterTopN
- 上位 N キャッシュによってレプリケートされたメッセージ数
addCounterOthers
- 他のすべてのキャッシュによってレプリケートされたメッセージ数
addCounterByCacheTopN
- 上位 N (10) キャッシュのソート済みリスト: キャッシュ名 + メッセージ数
したがって、ここで最もアクティブなキャッシュは、1421
+ 113
合計レプリケーションから 543
メッセージを送信する UserPropertyManager.ApplicationUser.cache
です。
上位 N の設定
上位 10 では不十分な場合は、次のシステム プロパティで値を変更できます。
-Dcom.atlassian.jira.cluster.distribution.localq.stats.queue.names.topN=20
フル ログ メッセージの例
[LOCALQ] [VIA-INVALIDATION] Cache replication queue stats per node: node2 total stats:
{
"timestampMillis": 1610720566437,
"nodeId": "node2",
"queueSize": 0,
"startQueueSize": 0,
"startTimestampMillis": 1610707317150,
"startMillisAgo": 13249287,
"closeCounter": 0,
"addCounter": 1534,
"droppedOnAddCounter": 0,
"criticalAddCounter": 0,
"criticalPeekCounter": 0,
"criticalRemoveCounter": 0,
"peekCounter": 0,
"peekOrBlockCounter": 1594,
"removeCounter": 1534,
"backupQueueCounter": 0,
"closeErrorsCounter": 0,
"addErrorsCounter": 0,
"peekErrorsCounter": 0,
"peekOrBlockErrorsCounter": 0,
"removeErrorsCounter": 0,
"backupQueueErrorsCounter": 0,
"lastAddTimestampMillis": 1610720560592,
"lastAddMillisAgo": 5845,
"lastPeekTimestampMillis": 0,
"lastPeekMillisAgo": 0,
"lastPeekOrBlockTimestampMillis": 1610720560592,
"lastPeekOrBlockMillisAgo": 5845,
"lastRemoveTimestampMillis": 1610720560595,
"lastRemoveMillisAgo": 5842,
"lastBackupQueueTimestampMillis": 0,
"lastBackupQueueMillisAgo": 0,
"timeToAddMillis": {
"count": 1534,
"min": 1,
"max": 13,
"sum": 2124,
"avg": 1,
"distributionCounter": {
"10": 1531,
"20": 3,
"50": 0,
"100": 0
}
},
"timeToPeekMillis": {
"count": 0,
"min": 0,
"max": 0,
"sum": 0,
"avg": 0,
"distributionCounter": {}
},
"timeToPeekOrBlockMillis": {
"count": 1594,
"min": 0,
"max": 1549827,
"sum": 131262632,
"avg": 82347,
"distributionCounter": {}
},
"timeToRemoveMillis": {
"count": 1534,
"min": 0,
"max": 13,
"sum": 1376,
"avg": 0,
"distributionCounter": {
"10": 1533,
"20": 1,
"50": 0,
"100": 0
}
},
"timeToBackupQueueMillis": {
"count": 0,
"min": 0,
"max": 0,
"sum": 0,
"avg": 0,
"distributionCounter": {}
},
"staleCounter": 0,
"sendCounter": 1479,
"droppedOnSendCounter": 0,
"timeToSendMillis": {
"count": 1479,
"min": 0,
"max": 2114,
"sum": 8830,
"avg": 5,
"distributionCounter": {
"10": 1461,
"20": 6,
"50": 2,
"100": 2,
"200": 3,
"500": 0,
"1000": 1,
"5000": 4
}
},
"sendRuntimeExceptionCounter": 7,
"sendCheckedExceptionCounter": 0,
"sendNotBoundExceptionCounter": 108,
"numberOfCaches": 29,
"addCounterTopN": 1421,
"addCounterOthers": 113,
"addCounterByCacheTopN": {
"UserPropertyManager.ApplicationUser.cache": 543,
"com.atlassian.jira.crowd.embedded.ofbiz.LazyOfBizUserCache.userCache": 291,
"com.atlassian.servicedesk.internal.feature.queue.ProjectStateCacheManagerImpl.sdProjectStateCache": 182,
"com.atlassian.gadgets.renderer.internal.cache.messageBundles": 153,
"com.atlassian.gadgets.renderer.internal.cache.httpResponses": 94,
"DbBackedCachedPropertySetManager.jira.properties.cache": 66,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizInternalMembershipDao.childrenCache": 37,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizInternalMembershipDao.parentsCache": 37,
"com.atlassian.jira.crowd.embedded.ofbiz.OfBizDirectoryDao.directoryCache": 10,
"com.atlassian.jira.workflow.CachingDraftWorkflowStore.draftWorkflowCache": 8
}
}