前言
此脚本不包含core的创建,创建core请移步他处。
本贴侧重core快照的创建,快照状态查询,core的删除,从快照恢复core。
hbase到solr的同步不做为本贴的重点。
同步脚本syn_solr.sh内容:
#!/binbash#定义core名称listcore_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>&1done#快照制作状态检查#查询快照状态执行: curl http://${solr_point}/solr/${core_name}/replication?command=details#每10秒查询一次,快照创建成功就结束查询,最大查询次数30次(我们的数据较大,创建快照#要一两分钟,请根据你的实际情况修改查询等待时间和次数),如仍未完成就结束整个脚本。num=0for 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#*} 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 donedone#删除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 '*:*'` #获取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 donedone#执行同步命令#将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=0while [ 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 fidoneecho "【`date "+%Y-%m-%d %H:%M:%S"`】syn solr end"
定时任务:
每天8点50开始同步,并在/var/log/syn_solr.log中记录同步日志。
[root@slave2 ~]# crontab -l50 8 * * * bash /root/syn_solr.sh >> /var/log/syn_solr.log 2>&1