Python3实时监控SOLR Replica状态

1,运行环境

OS 版本:CentOS Linux release 7.4.1708
Python 版本:Python 3.7.3
Solr 版本:Solr 7.5
Solr 运行模式:Solr Cloud(集群模式)

2,SolrCloud结构

solrcloud

3,主要python3应用包

urllib31.25.3
requests
2.22.0
configparser==3.7.4

4,监控任务

#monitor prd solr replica state
*/10 * * * * cd /home/leiting/XXc-devops && python3 solrReplicaState.py > solrreplicastate.log 2>&1

5,监控代码

solr的客户端API,提供了一个监控CLUSTERSTATUS的接口。并且,包含一个专门用于python的输出格式,这些,在solr官方guide中都有介绍。

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# @Time: 2019/5/27
# @Author: Leiting Liu
# @Mail: leiting.liu@qq.com
# @File: solrReplicaState.py
from urllib.request import urlopen
import sendMail
from email.mime.text import MIMEText

solr_ip = '192.168.X.109'
solr_port = '8983'
collection_name = 'XXc1'
shards_list = ['shard1', 'shard2', 'shard3']
# shards_list = ['shard1']
# replicas_list = []

for shard_var in shards_list:
    replicas_list = []
    connection = urlopen('http://%s:%s/solr/admin/collections?action=CLUSTERSTATUS&collection=%s&wt=python'\
                         % (solr_ip, solr_port, collection_name))
    response = eval(connection.read())
    for n in range(0, 2):
        var = response['cluster']['collections']['%s' % collection_name]['shards']['%s' % shard_var]['replicas']
        replicas_list.append(list(var.keys())[n])
    # print(replicas_list)
        for replica_var in zip(replicas_list):  # type: Tuple[str]
        # print(','.join(shar_var), ','.join(replica_var))
        connection = urlopen('http://%s:%s/solr/admin/collections?action=CLUSTERSTATUS&collection=%s&shard=%s'\
                             '&wt=python' % (solr_ip, solr_port, collection_name, shard_var))
        # print(connection)
        response = eval(connection.read())
        core_var = response['cluster']['collections']['%s' % collection_name]['shards']['%s' % shard_var]\
            ['replicas']['%s' % replica_var]['core']
        replica_state = response['cluster']['collections']['%s' % collection_name]['shards']\
            ['%s' % shard_var]['replicas']['%s' % replica_var]['state']
        # print(shard_var, core_var, replica_state)
        
        if replica_state is not 'active':
            send_message = ('[%s]的分片[%s]的副本[%s]的core[%s]状态是[%s], 请检查Solr!'\
                            % (collection_name, shard_var, replica_var, core_var, replica_state))
            message = MIMEText(send_message, 'plain', 'utf-8')
            # print(message)
            subject = 'Solr Replica Recovering'
            sendMail.send_mail(subject, message)
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# @Time: 2019/5/27
# @Author: Leiting Liu
# @Mail: leiting.liu@qq.com
# @File: sendMail.py

import smtplib
from email.header import Header
from publicVar import *


def send_mail(subject, message):
    sender = 'china_service@XXX.com'
    # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
    receivers = g_receiver.strip().split(',')

    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    # message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
    message['From'] = '%s<china_service@XXX.com>' % Header("XXc_devops", 'utf-8')  # 发送者
    message['To'] = ",".join(receivers)  # 接收者

    # subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')

    try:
        mail_host = smtplib.SMTP('localhost')
        mail_host.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException as e:
        print("Error: 无法发送邮件")
        print(e)
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# @Time: 2019/9/19
# @Author: Leiting Liu
# @Mail: leiting.liu@qq.com
# @File: publicVar.py

from configparser import ConfigParser


# pss variables
pss1 = ConfigParser()
pss1.read('config.ini')

g_var = ConfigParser()
g_var.read('config.ini')
g_receiver = g_var.get('global-var-prd', 'RECEIVERS')

# receivers = g_receiver.strip().split(',')
# print(type(receivers))

config.ini文件内容
[global-var-prd]
RECEIVERS = leiting.liu@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值