1,运行环境
OS 版本:CentOS Linux release 7.4.1708
Python 版本:Python 3.7.3
Solr 版本:Solr 7.5
Solr 运行模式:Solr Cloud(集群模式)
2,SolrCloud结构
3,主要python3应用包
urllib31.25.3
requests2.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