前言
此脚本不包含core的创建,创建core请移步他处。
本贴侧重core快照的创建,快照状态查询,core的删除,从快照恢复core。
hbase到solr的同步不做为本贴的重点。
同步脚本syn_solr.sh内容:
#!/binbash
#定义core名称list
core_list=("core1-name_shard1_replica1" "core2-name_shard1_replica1")
#定义solr服务地址
solr_point="130.10.7.109:8983"
echo "【`date "+%Y-%m-%d %H:%M:%S"`】syn solr start"
#制作core快照
#
#/solr-backups目录是已经创建的hdfs存储目录
#目录创建命令是:
# sudo -u hdfs hdfs dfs -mkdir /solr-backups
# sudo -u hdfs hdfs dfs -chown sorl:solr /solr-backups
# sudo -u hdfs hdfs dfs -chmod 777 /solr-backups
#
for core_name in "${core_list[@]}"
do
curl http://${solr_point}/solr/${core_name}/replication?command=backup\&repository=hdfs\&location=/solr-backups/${core_name} > /dev/null 2>&1
done
#快照制作状态检查
#查询快照状态执行: curl http://${solr_point}/solr/${core_name}/replication?command=details
#每10秒查询一次,快照创建成功就结束查询,最大查询次数30次(我们的数据较大,创建快照
#要一两分钟,请根据你的实际情况修改查询等待时间和次数),如仍未完成就结束整个脚本。
num=0
for core in "${core_list[@]}"
do
while [ true ]
do
sleep 10s
http_result_xml=$(curl http://${solr_point}/solr/${core}/replication?command=details)
#echo "${http_result_xml}"
detail_rightString=${http_result_xml#*\<str\ name=\"status\"\>}
detail_delStatus=${detail_rightString%%<*}
echo ${detail_delStatus}
if [ "success" = "${detail_delStatus}" ]
then
echo "【`date "+%Y-%m-%d %H:%M:%S"`】快照 ${core} 制作完成。"
break
fi
((num+=1))
if [ ${num} -eq 30 ]
then
echo "【`date "+%Y-%m-%d %H:%M:%S"`】快照 ${core} 制作失败"
exit
fi
done
done
#删除core索引数据
#
echo "【`date "+%Y-%m-%d %H:%M:%S"`】开始删除cores"
#遍历coren,并删除core的数据
for core_name in "${core_list[@]}"
do
#当删除请求的协议状态和删除结果状态都为0时,跳出删除循环。最多循环3次。
num=0
while [ ${num} -lt 3 ]
do
#发送删除请求,并将response赋值给resultString
resultString=`curl -X post http://${solr_point}/solr/${core_name}/update?wt=json \
-H Content-Type:text/xml --data '<add><delete><query>*:*</query></delete><commit/></add>'`
#获取curl命令返回值
curlStatus=$?
#echo ${curlStatus}
#截取response中json字符串的status值
rightString=${resultString#*\"status\":}
delStatus=${rightString%,\"QTime\":*}
echo ${delStatus}
#打印完整response的json
echo ${resultString}
if [[ ${curlStatus} == 0 && ${delStatus} == 0 ]]
then
echo "【`date "+%Y-%m-%d %H:%M:%S"`】${core_name}删除成功"
break
fi
let num+=1
if [ ${num} -eq 3 ]
then
echo "【`date "+%Y-%m-%d %H:%M:%S"`】删除cores失败。"
exit
fi
done
done
#执行同步命令
#将hbase的数据同步到solr的core(hbase的数据每天都增量更新,所以solr的core每天也要更新)
#
indexs=("core1-name" "core2-name")
morphlines_path="/root/hbase-indexer"
for index in "${indexs[@]}"
do
echo "【`date "+%Y-%m-%d %H:%M:%S"`】开始同步【${index}】"
`nohup hadoop --config /etc/hadoop/conf jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.16.1-job.jar \
--conf /etc/hbase/conf/hbase-site.xml --hbase-indexer-file ${morphlines_path}/hbase-indexer/${index}/conf/morphline-hbase-mapper.xml \
--morphline-file ${morphlines_path}/morphlines.conf --zk-host master:2181,slave1:2181,slave2:2181/solr \
--collection ${index} --go-live --reducers 0 > /dev/null 2>&1 &`
done
#如果从hbase同步失败,从solr快照恢复core数据
#
num=0
while [ true ]
do
#每分钟查询一次同步状态,如果同步完成就结束while循环。
sleep 60s
syn_result=`yarn application -list -appStates All | grep "HBaseMapReduceIndexerTool\/HBaseIndexerMapper" | sort -n -k 1.27r | head -2 | grep SUCCEEDED | wc -l`
echo "已同步 [${syn_result}]"
if [ ${syn_result} == 2 ]
then
echo "同步成功。"
break
fi
((num+=1))
#如果15分钟后仍没有同步成功,就从快照恢复solr的core
#
if [ ${num} -eq 15 ]
then
echo "同步失败,开始回滚..."
for i in "${indexs[@]}"
do
curl http://${solr_point}/solr/${i}_shard1_replica1/replication?command=restore\&location=/solr-backups/${i}_shard1_replica1\&repository=hdfs
done
echo "回滚结束。"
break
fi
done
echo "【`date "+%Y-%m-%d %H:%M:%S"`】syn solr end"
定时任务:
每天8点50开始同步,并在/var/log/syn_solr.log中记录同步日志。
[root@slave2 ~]# crontab -l
50 8 * * * bash /root/syn_solr.sh >> /var/log/syn_solr.log 2>&1