DEV Community

MagnoRSantos
MagnoRSantos

Posted on

Verificação de Status ReplicaSet MongoDB com Python

Este artigo apresenta um código simples que pode ser usado para auxiliar na verificação de status do replicaset MongoDB utilizando python.

Requisitos: 

- Python 2.7 ou posterior
- Pymongo
Enter fullscreen mode Exit fullscreen mode

Abaixo o script Python usado:
Nesse exemplo estamos considerando que temos 3 servidores no conjunto de replicaset com os seguintes nomes (SVRMONGO030, SVRMONGO031 e SVRMONGO032) e usamos um usuário criado somente com a role clusterMonitor.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import io   
from sys import exit
from pymongo import MongoClient

#funcao de limpeza do terminal
def cleanScreen():

        # For Windows
        if os.name == 'nt':
                os.system('cls')

        # For macOS and Linux
        else:
                os.system('clear')


#funcao de verificacao do status do replicaset mongodb
def replsetstatus():

        print('\n###############################################################\n')
        #client = MongoClient('mongodb://127.0.0.1:27017/') #localhost
        user = 'user.cluster.monitor' #user cluster monitor
        pwd = 'pwd.user.cluster.monitor' #password user cluster monitor
        client = MongoClient('mongodb://' + user + ':' + pwd + '@ipdns_server01:27017,ipdns_server02:27017,ipdns_server03:27017/')
        db = client ['admin']
        nserver = [0, 1, 2]
        rs_stats = db.command({'replSetGetStatus': 1})

        for x in nserver:
                hostnameSrv = 'SVRMONGO03' + str(x)
                IpSrv = rs_stats["members"][x]["name"]
                health = rs_stats["members"][x]["health"]
                state = rs_stats["members"][x]["state"]
                statusRepl = rs_stats["members"][x]["stateStr"]
                optimeDate = rs_stats["members"][x]["optimeDate"]

                if statusRepl == "PRIMARY":
                        syncSourceHost = "IsPrimary"
                else:
                        syncSourceHost = rs_stats["members"][x]["syncSourceHost"]

                print ("\nHost: {0} \nIP Server: {1} \nstateStr: {2} \nstate: {3} \nhealth: {4} \noptimeDate: {5} \nsyncSourceHost: {6} \n".format(str(hostnameSrv), str(IpSrv), str(statusRepl), str(state), str(health), str(optimeDate), str(syncSourceHost)))

        print('\n###############################################################\n')
        client.close()

## função inicial 
def main():
    cleanScreen()
    replsetstatus()
    input("Pressione Enter para nova verificacao. ")
    main()

#inicio da aplicacao
if __name__ == "__main__":
    main()


Enter fullscreen mode Exit fullscreen mode

Abaixo uma versão mais simples do script que pode ser usado em conjunto com o Zabbix para monitoramento de status do replicaset e envio de alertas pelo Zabbix em casos que o status do replicaset de determinado servidor for diferente do previamente esperado, por exemplo, casos em que o primário caia ou se torne um secundário e outro assuma como primário, basta fazer a chamada do script pelo Zabbix usando o recurso de UserParameter passando na chamada do script o indicador de cada servidor que no caso do nosso exemplo é:
0 - (SVRMONGO030)
1 - (SVRMONGO031)
2 - (SVRMONGO032)

Exemplos:
python verifyStatusReplSet.py 0
python verifyStatusReplSet.py 1
python verifyStatusReplSet.py 2

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from pymongo import MongoClient

def replsetstatus(nserver):
    # VARIAVEL DE INDICACAO DO SERVIDOR - nserver
    # 0 - (SVRMONGO030) | 1 - (SVRMONGO031) | - 2 (SVRMONGO032)

    # VARIAVEIS DE CONEXAO
    user = 'user.cluster.monitor'
    pwd = 'pwd.user.cluster.monitor'

    client = MongoClient('mongodb://' + user + ':' + pwd + '@ipdns_server01:27017,ipdns_server02:27017,ipdns_server03:27017/')
    db = client ['admin']
    rs_stats = db.command({'replSetGetStatus': 1})
    statusRepl= rs_stats["members"][nserver]["stateStr"]
    print (str(statusRepl))

if __name__ == "__main__":
    nserver = int(sys.argv[1])
    replsetstatus(nserver)

Enter fullscreen mode Exit fullscreen mode

Até a próxima !!!

Top comments (0)