具體緣由:由於ZooKeeper數據不一致致使web
修復操做:修改ZooKeeper配置以下,刪除ZooKeeper全部數據、重啓ZooKeeper後,重啓全部dubbo providers/consumers服務。docker
一段時間後,未出現此類問題。app
ZooKeeper配置文件修改成:運維
clientPort=2181 dataDir=/data/zk-data dataLogDir=/data/zk-logs tickTime=5000 initLimit=10 syncLimit=20 maxClientCnxns=60 server.0=zk-0:2888:3888 server.1=zk-1:2888:3888 server.2=zk-2:2888:3888
dubbo版本號:2.5.3ide
ZooKeeper版本號:3.4.11lua
im-service是dubbo提供方(provider)spa
im-web是dubbo消費方(consumer).net
部分dubbo接口調用失敗,查看consumer方調用日誌:3d
這種Forbid consumer問題嘛,通常來講也就檢查ZooKeeper註冊中心中,對應的/providers節點下是否有提供方,若是沒有提供方,就是看看provider方是否啓動正常。日誌
因此我就查看了zk-0節點上/dubbo/com.newbanker.im.service.WbsExpertService/providers節點的子節點:
ls /dubbo/com.newbanker.im.service.WbsExpertService/providers
發現providers子節點不存在。也就是說ZooKeeper註冊中心認爲dubbo providers沒有正常啓動,因此看一下dubbo providers的運行狀態:
圖示:dubbo provider運行正常。此時就很迷茫了:docker認爲服務提供方im-service項目運行正常,可是dubbo註冊中心ZooKeeper卻認爲提供方未註冊。這裏面確定有什麼誤會。
重啓im-service服務
重啓後,一切ok!
Dubbo項目啓動後,沒有提供者。項目啓動日誌正常,DUBBO服務啓動沒有註冊到zookeeper。
tickTime修改成5000以後:2019-09-17記:目前還未發現此類問題。
今天又發現相似問題了,可是有一點不一樣的是:
遇到這種數據不一致的問題,我最初猜想ZooKeeper集羣內部應該是正在作數據同步,而致使的數據不一致狀況。
因而使用./bin/zkService.sh status命令查看一下各個ZooKeeper節點的狀態,發現一切正常:zk-2節點爲leader,zk-0、zk-1節點都是follower.......也就是,遇到了ZooKeeper集羣中,各個節點中數據不一致的狀況了。這和當初說好的數據一致性對不上號啊!!
抱着試一試的心態,百度了一下,還找到了:
這篇博客說是ZooKeeper 3.4.11版本存在bug,而此bug在ZooKeeper 3.4.12版本已經fixed。
因而,我導出了ZooKeeper日誌看了一下:
世上爲什麼有如此巧合之事?我司用的ZooKeeper還真是3.4.11版本....
沒錯,仍是重啓im-service服務!(~ ̄▽ ̄)~
因爲替換ZooKeeper版本影響範圍未知,咱們暫時沒有替換ZooKeeper版本到3.4.12,而是把dubbo provider項目重啓了一下。重啓以後,ZooKeeper數據一致了,dubbo consumer調用接口也正常了。
後續還會跟進此bug的各類緣由。。。。。
上面的【猜想緣由】裏的博客描述,是tickTime時間過小致使的。
可是根據上面的【延伸問題】看,根本緣由還在ZooKeeper,或者說,無論是否是tickTime過小,ZooKeeper的數據都不能出現不一致的狀況。
如今的焦點工做就是:找到ZooKeeper數據不一致的緣由並解決之!
(下圖:MarketingActivityService消費異常)
(下圖:ZooKeeper zk-0數據)
(下圖:ZooKeeper zk-1數據)
(下圖:ZooKeeper zk-2數據)
爲了證實上圖沒有問題,我還找了運維同事,進入docker pod中,查看ZooKeeper數據:
ZooKeeper zk-0數據:(有一個dubbo:// 說明有一個provider)
ls /dubbo/com.newbanker.ac.service.MarketingActivityService/providers [dubbo://10.233.81.217:23880/com.newbanker.ac.service.MarketingActivityService?accepts=1000&anyhost=true&application=ac-service&buffer=8192&charset=UTF-8&client=netty&default.delay=-1&default.retries=0&default.service.filter=entIdReceiveFilter&default.timeout=60000&delay=-1&dubbo=2.5.3&interface=com.newbanker.ac.service.MarketingActivityService&iothreads=9&methods=preview,costUpdate,release,selectByName,unrelease,appView,unrecommend,update,recommend,delete,timingDateUpdate,selectByNo,exportMarketingActivity,timingDateAdd,view,top,timingDateDelete,labelCount,updateChannel,queryAppPage,typeCount,selectByNos,add,previewQrcode,timingRelease,statusCount,cusView,list,untop,updateEvaluationPeriod,queryPage&payload=8388608&pid=8&queues=0&revision=0.0.1-SNAPSHOT&serialization=hessian2&server=netty&side=provider&threadpool=fixed&threads=100×tamp=1567157143813&version=1.0]
ZooKeeper zk-1數據:(沒有provider)
ls /dubbo/com.newbanker.ac.service.MarketingActivityService/providers []
ZooKeeper zk-2數據:(有兩個dubbo:// 說明有兩個provider)
ls /dubbo/com.newbanker.ac.service.MarketingActivityService/providers [dubbo://10.233.112.197:23880/com.newbanker.ac.service.MarketingActivityService?accepts=1000&anyhost=true&application=ac-service&buffer=8192&charset=UTF-8&client=netty&default.delay=-1&default.retries=0&default.service.filter=entIdReceiveFilter&default.timeout=60000&delay=-1&dubbo=2.5.3&interface=com.newbanker.ac.service.MarketingActivityService&iothreads=9&methods=preview,costUpdate,release,selectByName,unrelease,appView,update,unrecommend,recommend,delete,timingDateUpdate,selectByNo,exportMarketingActivity,timingDateAdd,view,top,timingDateDelete,labelCount,updateChannel,queryAppPage,typeCount,selectByNos,add,previewQrcode,timingRelease,statusCount,cusView,list,untop,updateEvaluationPeriod,queryPage&payload=8388608&pid=8&queues=0&revision=0.0.1-SNAPSHOT&serialization=hessian2&server=netty&side=provider&threadpool=fixed&threads=100×tamp=1567391428907&version=1.0, dubbo://10.233.81.217:23880/com.newbanker.ac.service.MarketingActivityService?accepts=1000&anyhost=true&application=ac-service&buffer=8192&charset=UTF-8&client=netty&default.delay=-1&default.retries=0&default.service.filter=entIdReceiveFilter&default.timeout=60000&delay=-1&dubbo=2.5.3&interface=com.newbanker.ac.service.MarketingActivityService&iothreads=9&methods=preview,costUpdate,release,selectByName,unrelease,appView,unrecommend,update,recommend,delete,timingDateUpdate,selectByNo,exportMarketingActivity,timingDateAdd,view,top,timingDateDelete,labelCount,updateChannel,queryAppPage,typeCount,selectByNos,add,previewQrcode,timingRelease,statusCount,cusView,list,untop,updateEvaluationPeriod,queryPage&payload=8388608&pid=8&queues=0&revision=0.0.1-SNAPSHOT&serialization=hessian2&server=netty&side=provider&threadpool=fixed&threads=100×tamp=1567157143813&version=1.0]
這tm就很尷尬了。同一個zk集羣中,每一個節點的數據居然不一致?!
看一下此環境的ZooKeeper配置:(根據運維的敘述,ZooKeeper的配置都使用docker鏡像打死的,因此ZooKeeper的配置是不會有問題的)
/zookeeper-3.4.11 # cat /conf/zoo.cfg clientPort=2181 dataDir=/data/zk-data dataLogDir=/data/zk-logs tickTime=2000 initLimit=5 syncLimit=2 maxClientCnxns=60 server.0=zk-0:2888:3888 server.1=zk-1:2888:3888 server.2=zk-2:2888:3888
仍是沒有任何頭緒。。。。。
---------------------------------------------------------------------------------------------------
2019-09-03記錄:
把ZooKeeper配置文件修改成:
clientPort=2181 dataDir=/data/zk-data dataLogDir=/data/zk-logs tickTime=5000 initLimit=10 syncLimit=20 maxClientCnxns=60 server.0=zk-0:2888:3888 server.1=zk-1:2888:3888 server.2=zk-2:2888:3888
修改配置以後,把事務日誌和快照文件刪除,重啓ZooKeeper集羣、重啓全部dubbo服務。
一天後,未發現ZooKeeper集羣存在數據不一致狀況。dubbo服務正常。
---------------------------------------------------------------------------------------------------------------------------------------------------------
2019-09-17記錄:修改完配置後,此時還沒有發現此類問題。