一、問題描述node
第一步:在擁有3個節點的集羣中,建立一個2個片,每一個片2個replication的collectionrest
這時候,集羣的leader爲32機器(32機器的id值最小)日誌
第二步:在該collection上作dataimport,每秒1萬條記錄的導入速度(commit)。源碼
第三步:restart 32機器it
問題現象:發現集羣沒有leader,zk上無 /overseer_elect/leader nodeio
集羣出現異常,沒法寫入數據,雖然collection顯示正常import
二、問題分析集羣
按照solrcloud集羣選舉理論,在32機器重啓後,32機器的id值變成最大,而30機器的id此時是最小值,那麼30機器成爲集羣leader方法
此時30機器,沒有成爲leaderim
經過查看30機器的日誌及solrcloud選舉的源碼
源碼中,有個選舉類LeaderElector,裏面有個checkIfIamLeader方法,此方法就是「試圖選舉本身成爲leader」
該方法是先判斷實際是否能夠成爲leader,若是能夠,先刪除原有的leader node,而後建立本身成爲leader的node
經過查看30的info日誌發現,只執行了delete 原有leader node的操做,而沒有建立「本身成爲leader」的操做
三、解決辦法
重啓編號最小的那臺機器,觸發集羣重選leader