Introduzione
In questo documento viene descritta la procedura per risolvere l'avviso di frammentazione di MongoPrimaryDB in Cisco Policy Suite (CPS).
Prerequisiti
Requisiti
Cisco raccomanda la conoscenza dei seguenti argomenti:
Nota: Cisco consiglia di disporre dell'accesso privilegiato alla CLI di CPS root.
Componenti usati
Le informazioni fornite in questo documento si basano sulle seguenti versioni software e hardware:
- CPS 20.2
- MongoDB v3.6.17
- Unified Computing System (UCS)-B
Le informazioni discusse in questo documento fanno riferimento a dispositivi usati in uno specifico ambiente di emulazione. Su tutti i dispositivi menzionati nel documento la configurazione è stata ripristinata ai valori predefiniti. Se la rete è operativa, valutare attentamente eventuali conseguenze derivanti dall'uso dei comandi.
Premesse
CPS utilizza MongoDB dove i processi mongood eseguiti sulle macchine virtuali (VM) di Sessionmgr costituiscono la struttura di base del database.
Quando i documenti vengono spostati o rimossi, lasciano dei buchi. MongoDB tenta di riutilizzare questi fori per nuovi documenti quando possibile, ma nel tempo si trova a possedere molti fori lentamente e costantemente, che non possono essere riutilizzati perché i documenti non possono essere contenuti in essi. Questo effetto è denominato frammentazione ed è comune in tutti i sistemi che allocano memoria, incluso il sistema operativo.
L'effetto della frammentazione è sullo spreco di spazio. Poiché MongoDB utilizza file mappati alla memoria, qualsiasi frammentazione sul disco si riflette anche nella frammentazione nella RAM. Ciò determina la creazione di una minore quantità di "working set" che si adatta alla RAM e provoca un maggiore scambio del disco.
CPS supporta KPI per monitorare la frammentazione a livello di MongoDB mediante l'uso di Grafana e genera un allarme SNMP (Simple Network Management Protocol) quando la percentuale di frammenti MongoDB supera un valore specificato.
OSPF (Open Shortest Path First) /etc/collectd.d/dbMonitorList.cfg
il file presente nelle macchine virtuali di sessionmgr contiene l'elenco dei database e i rispettivi valori percentuali di soglia di frammentazione. Per impostazione predefinita, il valore di soglia della frammentazione è 40 %. Il valore predefinito della soglia di frammentazione può essere modificato in base alle esigenze.
Le statistiche di frammentazione per i database session_cache, sk_cache, diameter e Subscriber Profile Repository (SPR) (tramite l'utilizzo di membri primari) possono essere verificate con questo comando:
[root@installer ~]# diagnostics.sh --get_frag
CPS Diagnostics HA Multi-Node Environment
---------------------------
Ping check for qns03 Adding to IGNORED_HOSTS...[FAIL]
|----------------------------------------------------------------------------------------------------------------------------------------|
| Mongo:v3.6.17 DATABASE LEVEL FRAGMENTATION STATUS INFORMATION Date : 2022-09-17 07:19:29 |
| SET TYPE : HA [MEMBER_ROLE : PRIMARY] |
|----------------------------------------------------------------------------------------------------------------------------------------|
| setname dbName storageSize(MB) datasize(MB) indexSize(MB) fileSize(MB) derivedFS(MB) frag% |
|----------------------------------------------------------------------------------------------------------------------------------------|
| ADMIN:set06 |
| Status via sessionmgr01:27721 |
| set06 diameter 9.56 0.04 0.05 64.00 0 NoFrag |
|----------------------------------------------------------------------------------------------------------------------------------------|
| BALANCE:set02 |
| Status via sessionmgr01:27718 |
| set02 balance_mgmt db not found - - - - - - |
|----------------------------------------------------------------------------------------------------------------------------------------|
| SESSION:set01 |
| Status via sessionmgr01:27717 |
| set01 session_cache 0.02 0.00 0.02 16.00 0 NoFrag |
|----------------------------------------------------------------------------------------------------------------------------------------|
| SESSION:set01 |
| Status via sessionmgr01:27717 |
| set01 sk_cache 0.02 0.00 0.01 16.00 0 NoFrag |
|----------------------------------------------------------------------------------------------------------------------------------------|
| SPR:set04 |
| Status via sessionmgr01:27720 |
| set04 spr 0.04 0.00 0.13 64.00 0 NoFrag |
|----------------------------------------------------------------------------------------------------------------------------------------|
[root@installer ~]#
Problema
Quando la percentuale di frammentazione del membro primario per il set di repliche supera il valore di frammentazione soglia configurato, viene generato questo allarme. Se il valore di soglia non è configurato, l'allarme viene generato se la percentuale di frammentazione supera il valore predefinito (40%).
Avviso "La frammentazione di MongoPrimaryDB ha superato il valore di soglia" di esempio:
id=7100,values={sub_id=7107, event_host=sessionmgr01, status=down, msg=MongoPrimaryDB fragmentation exceeded the threshold value, CURR_FRAG = 40%, THRESHOLD = 40% at sessionmgr01:27717 for session_cac
Procedura per risolvere l'avviso di frammentazione del database primario MongoPrimaryDB
Per ridurre la percentuale di frammentazione, ridurre il database quando viene generato un allarme. Una volta ridotto il database (la percentuale di frammentazione diminuisce), viene inviato un chiaro allarme.
Questa procedura consente di risolvere l'avviso di frammentazione MongoPrimaryDB nell'esempio fornito.
Passaggio 1. Eseguire questo comando da Cluster Manager o da pcrfclient per verificare lo stato dei membri primari e secondari nel set di repliche.
#diagnostics.sh --get_r
|----------------------------------------------------------------------------------------------------------------------------------------|
|SESSION:set01a|
|Status via sessionmgr01:27717 sessionmgr02:27717 |
|Member-1-27717 : 192.168.29.14-ARBITER-pcrfclient01- ON-LINE--0| --------|
|Member-2-27717 : 192.168.29.35-PRIMARY-sessionmgr01- ON-LINE--3| --------|
|Member-3-27717 : 192.168.29.36-SECONDARY-sessionmgr02- ON-LINE--2| 1 sec|
|----------------------------------------------------------------------------------------------------------------------------------------|
Passaggio 2. Eseguire questo comando da Cluster Manager o da pcrfclient per modificare la priorità di sessionmgr01 e renderla un membro secondario.
#sh set_priority.sh --db session --replSet set01a --asc
Expected output in #diagnostics.sh --get_r
|----------------------------------------------------------------------------------------------------------------------------------------|
|SESSION:set01a|
|Status via sessionmgr02:27717 sessionmgr01:27717 |
|Member-1-27717 : 192.168.29.14-ARBITER-pcrfclient01- ON-LINE--0| --------|
|Member-2-27717 : 192.168.29.35-PRIMARY-sessionmgr02- ON-LINE--3| --------|
|Member-3-27717 : 192.168.29.36-SECONDARY-sessionmgr01- ON-LINE--2| 1 sec|
|----------------------------------------------------------------------------------------------------------------------------------------|
Nota: Verificare che sessionmgr01 non sia più primario (diagnostics.sh —get_r) e che sia disponibile un membro primario per il set di repliche.
Passaggio 3. Eseguire questo comando da Sessionmgr01 per arrestare il client AIDO.
#monit stop aido_client
Passaggio 4. Eseguire questo comando da Sessionmgr01 per arrestare la rispettiva istanza di Mongo (portNum è il numero di porta del membro frammentato).
Command syntax:
#/etc/init.d/sessionmgr-<portNum> stop
Example:
#/etc/init.d/sessionmgr-27717 stop
Passaggio 5. Per pulire la directory del database in sessionmgr01, rimuovere la directory dei dati dal percorso indicato in base all'attributo —dbpath del comando mongo. Eseguire questo comando da Sessionmgr01 per recuperare il valore (utilizzare il valore portNum del membro frammentato).
Nota: Poiché il numero di porta e le directory associate ad altri database sessionmgr sono diversi, assicurarsi di disporre delle directory corrette per pulire altri database sessionmgr.
Command syntax:
#grep -w DBPATH= /etc/init.d/sessionmgr-<portNum>
Example:
#grep -w DBPATH= /etc/init.d/sessionmgr-27717
Sample Output: DBPATH=/var/data/sessions.1/a
Copy the DBPATH from output.
Command syntax:
#rm -rf <DBPATH>/*
Example:
#rm -rf /var/data/sessions.1/a/*
Passaggio 6. Eseguire questo comando da Sessionmgr01 per avviare la rispettiva istanza di Mongo.
Command syntax:
#/etc/init.d/sessionmgr-<portNum> start
Example:
#/etc/init.d/sessionmgr-27717 start
Passaggio 7. Eseguire questo comando da Sessionmgr01 per avviare il client AIDO.
#monit start aido_client
Passaggio 8. Eseguire questo comando da Gestione cluster o da pcrfclient per reimpostare le priorità dei membri del set di repliche.
#sh set_priority.sh --db session --replSet set01a
Passaggio 9. Eseguire questo comando da Cluster Manager o da pcrfclient per verificare lo stato dei membri primari e secondari nel set di repliche.
#diagnostics.sh --get_r
|----------------------------------------------------------------------------------------------------------------------------------------|
|SESSION:set01a|
|Status via sessionmgr01:27717 sessionmgr02:27717 |
|Member-1-27717 : 192.168.29.14-ARBITER-pcrfclient01- ON-LINE--0| --------|
|Member-2-27717 : 192.168.29.35-PRIMARY-sessionmgr01- ON-LINE--3| --------|
|Member-3-27717 : 192.168.29.36-SECONDARY-sessionmgr02- ON-LINE--2| 1 sec|
|----------------------------------------------------------------------------------------------------------------------------------------|