免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

ZooKeeper實(shí)戰(zhàn)總結(jié):分布式鎖、服務(wù)發(fā)現(xiàn)與配置中心落地指南

ZooKeeper實(shí)戰(zhàn)總結(jié):分布式鎖、服務(wù)發(fā)現(xiàn)與配置中心落地指南 接手一個(gè)需要多服務(wù)協(xié)作的項(xiàng)目時(shí)我踩過的第一個(gè)大坑就是所有節(jié)點(diǎn)各干各的沒有一套統(tǒng)一的協(xié)調(diào)機(jī)制。后來我把ZooKeeper引入整個(gè)架構(gòu)先后解決了配置同步、服務(wù)上下線感知和分布式鎖這幾個(gè)最頭疼的問題。這篇文章就是我基于實(shí)際項(xiàng)目做的階段性總結(jié)寫給正在學(xué)Java分布式、并且準(zhǔn)備把ZooKeeper用起來的開發(fā)者尤其是那些剛看完理論、想知道怎么落地的朋友。我會(huì)從ZooKeeper的定位講起帶著你理解它的數(shù)據(jù)模型和會(huì)話機(jī)制然后給出Java客戶端選型的關(guān)鍵對(duì)比再手把手拆解節(jié)點(diǎn)CRUD、Watch監(jiān)聽、分布式鎖和服務(wù)發(fā)現(xiàn)這些高頻實(shí)戰(zhàn)場(chǎng)景最后聊幾個(gè)我親身踩過的坑。整個(gè)內(nèi)容不求面面俱到但保證每一個(gè)步驟和代碼示例都能讓你直接抄作業(yè)改一改就能跑。1. 為什么分布式系統(tǒng)里需要ZooKeeper這個(gè)協(xié)調(diào)員分布式系統(tǒng)的難點(diǎn)往往不在功能實(shí)現(xiàn)而在多個(gè)進(jìn)程之間怎么達(dá)成一致。我剛接手項(xiàng)目X的時(shí)候服務(wù)數(shù)量從幾臺(tái)擴(kuò)展到幾十臺(tái)馬上就遇到三個(gè)問題配置文件散落在各節(jié)點(diǎn)上、改了配置要一臺(tái)臺(tái)重啟、服務(wù)掛了其他調(diào)用方感知不到。這些問題的共性就是缺少一個(gè)可以讓所有節(jié)點(diǎn)共同依賴的協(xié)調(diào)者。1.1 沒有協(xié)調(diào)框架時(shí)的混亂場(chǎng)景舉個(gè)例子項(xiàng)目X里有三個(gè)服務(wù)需要共享一份DB開關(guān)配置。我最初的做法是把配置寫在每個(gè)服務(wù)本地的properties文件里運(yùn)維改配置時(shí)用腳本批量推送。聽起來簡(jiǎn)單但實(shí)際會(huì)發(fā)生兩種情況推送時(shí)部分節(jié)點(diǎn)成功、部分節(jié)點(diǎn)失敗失敗節(jié)點(diǎn)繼續(xù)跑舊邏輯新邏輯和舊邏輯并行。服務(wù)擴(kuò)容時(shí)新拉起來的機(jī)器如果配置文件不是最新版會(huì)帶著舊配置進(jìn)入生產(chǎn)環(huán)境。更麻煩的是分布式鎖。早期我用數(shù)據(jù)庫的唯一索引做鎖通過insert一條記錄來占用鎖最后delete釋放。在高并發(fā)下數(shù)據(jù)庫連接會(huì)被打滿而且鎖的續(xù)租、異常釋放、死鎖檢測(cè)全部要自己寫。后來我決定徹底改造用ZooKeeper把這些分散的麻煩事統(tǒng)一收攏。1.2 ZooKeeper到底替我們解決了什么問題ZooKeeper在架構(gòu)里扮演的角色簡(jiǎn)單說就是一個(gè)帶強(qiáng)一致性的分布式文件系統(tǒng)同時(shí)具備通知機(jī)制。它讓你可以像操作目錄一樣存數(shù)據(jù)又能在數(shù)據(jù)變化時(shí)主動(dòng)告訴訂閱者。如果把這個(gè)模型放到業(yè)務(wù)場(chǎng)景里可以看到幾個(gè)核心能力統(tǒng)一配置存儲(chǔ)配置放ZooKeeper節(jié)點(diǎn)上集中修改所有客戶端實(shí)時(shí)收到變更通知。服務(wù)注冊(cè)和發(fā)現(xiàn)服務(wù)啟動(dòng)時(shí)注冊(cè)臨時(shí)節(jié)點(diǎn)服務(wù)掛掉后節(jié)點(diǎn)自動(dòng)消失調(diào)用方通過Watch感知上下線。分布式鎖利用ZooKeeper的臨時(shí)順序節(jié)點(diǎn)多個(gè)客戶端可以排隊(duì)獲取鎖避免了單點(diǎn)故障。這三類能力基本覆蓋了中小團(tuán)隊(duì)80%的協(xié)調(diào)需求。ZooKeeper之所以能承擔(dān)這些職責(zé)是因?yàn)樗澈蟮腪ab協(xié)議保證了寫入順序的一致性和高可用。集群內(nèi)部通過選舉產(chǎn)生Leader所有寫請(qǐng)求都交給Leader廣播給Follower超過半數(shù)確認(rèn)后返回成功保證數(shù)據(jù)不會(huì)因?yàn)楣?jié)點(diǎn)故障而分叉。1.3 它不是萬能存儲(chǔ)適用邊界要先劃清楚我在團(tuán)隊(duì)內(nèi)部做技術(shù)分享時(shí)總強(qiáng)調(diào)一句話不要把ZooKeeper當(dāng)數(shù)據(jù)庫用。它默認(rèn)單個(gè)節(jié)點(diǎn)的數(shù)據(jù)大小限制通常是1MB不適合存業(yè)務(wù)大對(duì)象。它更適合存配置項(xiàng)、元數(shù)據(jù)、鎖標(biāo)識(shí)這類小而關(guān)鍵的信息。如果你發(fā)現(xiàn)某個(gè)ZNode里的數(shù)據(jù)超過幾十KB就要停下來想想是不是設(shè)計(jì)有問題。ZooKeeper的強(qiáng)順序一致性也是有時(shí)機(jī)代價(jià)的寫請(qǐng)求需要多數(shù)派確認(rèn)所以吞吐量跟Redis沒法比。業(yè)務(wù)向的高頻寫操作建議放RedisZooKeeper只做協(xié)調(diào)類數(shù)據(jù)。把邊界劃清楚后面用起來才不別扭。2. 數(shù)據(jù)模型與會(huì)話機(jī)制入門ZooKeeper前必須搞懂的四個(gè)核心概念跳過這些底層概念直接寫代碼很容易遇到各種摸不著頭腦的問題。我見過不少同事在寫節(jié)點(diǎn)操作時(shí)搞不清持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)的區(qū)別結(jié)果服務(wù)重啟后舊節(jié)點(diǎn)還掛在線上服務(wù)注冊(cè)信息一直重復(fù)。所以我想先把四個(gè)核心概念講透。2.1 樹形數(shù)據(jù)模型ZNode不是傳統(tǒng)的文件ZooKeeper的命名空間是一棵類似文件系統(tǒng)的樹每個(gè)節(jié)點(diǎn)叫ZNode。路徑比如 /config、/config/db_switch寫法上和Linux目錄一樣訪問某個(gè)ZNode就是直接按路徑定位。與傳統(tǒng)文件系統(tǒng)不同ZNode既可以有子節(jié)點(diǎn)本身也可以存數(shù)據(jù)這一點(diǎn)要特別注意。每個(gè)ZNode的數(shù)據(jù)量很小實(shí)際操作時(shí)一般存JSON字符串或特定業(yè)務(wù)標(biāo)識(shí)。ZNode上不僅有數(shù)據(jù)還附帶一系列元信息比如版本號(hào)、創(chuàng)建時(shí)間、數(shù)據(jù)長(zhǎng)度。這里最關(guān)鍵的一個(gè)元信息是版本號(hào)因?yàn)閆ooKeeper的并發(fā)改造成靠版本號(hào)來實(shí)現(xiàn)類似樂觀鎖的機(jī)制。2.2 節(jié)點(diǎn)類型持久、臨時(shí)、順序節(jié)點(diǎn)各自的使用場(chǎng)景ZooKeeper把ZNode分成幾種類型每個(gè)類型都對(duì)應(yīng)一個(gè)典型業(yè)務(wù)場(chǎng)景節(jié)點(diǎn)類型特點(diǎn)典型用途持久節(jié)點(diǎn)客戶端斷開后節(jié)點(diǎn)依然存在保存配置數(shù)據(jù)、全局元信息持久順序節(jié)點(diǎn)持久節(jié)點(diǎn)基礎(chǔ)上帶全局自增序號(hào)記錄有序事件、任務(wù)編號(hào)臨時(shí)節(jié)點(diǎn)客戶端會(huì)話結(jié)束自動(dòng)刪除服務(wù)注冊(cè)、分布式鎖占位臨時(shí)順序節(jié)點(diǎn)臨時(shí)節(jié)點(diǎn)基礎(chǔ)上帶全局自增序號(hào)分布式鎖的排隊(duì)隊(duì)列我最初用過持久節(jié)點(diǎn)做服務(wù)注冊(cè)結(jié)果服務(wù)宕機(jī)后節(jié)點(diǎn)不會(huì)消失手動(dòng)清理又容易出錯(cuò)。后來改成臨時(shí)節(jié)點(diǎn)服務(wù)進(jìn)程退出、會(huì)話斷開節(jié)點(diǎn)馬上被刪除整個(gè)上下線流程就自動(dòng)化了。順序節(jié)點(diǎn)雖然不常用但分布式鎖里它是核心因?yàn)殒i競(jìng)爭(zhēng)退出時(shí)可以利用序號(hào)的先后關(guān)系確定獲取順序避免驚群效應(yīng)。2.3 會(huì)話與心跳客戶端和服務(wù)器如何維持連接ZooKeeper客戶端和服務(wù)端之間的連接基于會(huì)話會(huì)話本質(zhì)是一個(gè)帶超時(shí)時(shí)間的TCP長(zhǎng)連接。客戶端通過發(fā)送心跳請(qǐng)求來?;罘?wù)端在會(huì)話超時(shí)時(shí)間內(nèi)收到心跳會(huì)話就保持有效超過時(shí)間還沒收到會(huì)話過期臨時(shí)節(jié)點(diǎn)隨之被清理。Java操作時(shí)我一般配置會(huì)話超時(shí)時(shí)間為3000到5000毫秒這個(gè)值既不能太大也不能太小。太大會(huì)話過期識(shí)別慢臨時(shí)節(jié)點(diǎn)殘留時(shí)間久太小網(wǎng)絡(luò)抖動(dòng)就會(huì)導(dǎo)致會(huì)話誤判超時(shí)服務(wù)頻繁掉線。再配合客戶端自動(dòng)重連機(jī)制即使網(wǎng)絡(luò)短暫異常原來創(chuàng)建的臨時(shí)節(jié)點(diǎn)也會(huì)在重連后恢復(fù)但這個(gè)恢復(fù)并不自動(dòng)需要代碼回滾業(yè)務(wù)邏輯。2.4 Watch通知機(jī)制一次性觸發(fā)循環(huán)注冊(cè)Watch是ZooKeeper最實(shí)用也最容易寫錯(cuò)的機(jī)制。客戶端可以對(duì)某個(gè)事務(wù)操作注冊(cè)監(jiān)聽比如節(jié)點(diǎn)數(shù)據(jù)變化、子節(jié)點(diǎn)列表變化、節(jié)點(diǎn)刪除只要事件發(fā)生客戶端會(huì)收到一次通知。注意是“一次”因?yàn)槊看瓮ㄖ曛蟊O(jiān)聽就失效了想繼續(xù)監(jiān)聽必須重新注冊(cè)。這個(gè)一次性規(guī)則讓很多初學(xué)者困惑為什么第一次修改配置能收到通知第二次就不行原因就是沒做再次注冊(cè)。后面的代碼示例里我會(huì)專門封裝一個(gè)帶循環(huán)注冊(cè)的工具類把每次收到通知后重新設(shè)置Watch這個(gè)動(dòng)作固化進(jìn)去。3. 客戶端選型原生API、ZkClient與Curator的取舍Java操作ZooKeeper時(shí)選型直接影響開發(fā)效率和后期維護(hù)。我在這部分有比較明確的答案但為了讓你做技術(shù)決策時(shí)有依據(jù)我先把三種方案的實(shí)際體驗(yàn)都列出來。3.1 三種客戶端方案的橫向?qū)Ρ染S度原生ZooKeeper APIZkClientCurator依賴程度JDK自帶輕量封裝完整框架Watch處理手動(dòng)循環(huán)注冊(cè)自動(dòng)監(jiān)聽自動(dòng)監(jiān)聽重連機(jī)制需自己實(shí)現(xiàn)簡(jiǎn)單封裝完善分布式鎖需要手寫需要手寫內(nèi)置實(shí)現(xiàn)維護(hù)活躍度保持更新基本停滯活躍學(xué)習(xí)曲線較陡平滑中間原生API最大的問題不是功能不夠而是重復(fù)代碼太多。每次操作都要處理連接狀態(tài)、重連邏輯、Watch重新注冊(cè)這些都是極其容易出錯(cuò)的邊角料。ZkClient曾經(jīng)流行過一段但封裝程度有限遇到復(fù)雜會(huì)話事件處理比較吃力。如果你問我現(xiàn)在的建議我會(huì)直接推薦Curator它在國(guó)內(nèi)項(xiàng)目里已經(jīng)積累了足夠的驗(yàn)證文檔也相對(duì)齊全。3.2 為什么我建議直接上CuratorCurator把ZooKeeper客戶端做成了可以開箱即用的框架提供了連接狀態(tài)監(jiān)聽、自動(dòng)重連、Watch管理器還內(nèi)置了InterProcessMutex這類分布式鎖實(shí)現(xiàn)。引入Curator之后代碼量對(duì)比原生API至少減少一半同時(shí)可讀性和健壯性明顯提升。當(dāng)然這不意味著原生API不值得學(xué)。我建議你先把原生API的基本操作跑一遍理解它怎么建立連接、怎么注冊(cè)Watch、怎么處理回調(diào)然后切到Curator你會(huì)更清楚框架替你做了什么遇到問題時(shí)也能定位到ZooKeeper底層還是框架封裝層。這種學(xué)習(xí)路徑比直接上手Curator更扎實(shí)。3.3 環(huán)境準(zhǔn)備單機(jī)部署和偽集群搭建本地開發(fā)時(shí)單機(jī)模式就夠用。下載解壓后修改配置文件zoo.cfg設(shè)置dataDir和clientPort默認(rèn)2181端口然后執(zhí)行啟動(dòng)腳本。確認(rèn)啟動(dòng)成功的命令是連接2181端口并輸入stat能看到ZooKeeper版本信息就說明通了。如果需要模擬生產(chǎn)環(huán)境的故障轉(zhuǎn)移我建議用偽集群模式也就是在同一臺(tái)機(jī)器上跑三個(gè)ZooKeeper實(shí)例。三個(gè)實(shí)例分別監(jiān)聽2181、2182、2183端口dataDir也分成三份并且在每個(gè)實(shí)例的data目錄中都要新建myid文件內(nèi)容分別是1、2、3。配置文件里通過server.1127.0.0.1:2888:3888這樣的格式聲明集群成員。偽集群能驗(yàn)證選舉和會(huì)話轉(zhuǎn)移對(duì)理解ZooKeeper高可用機(jī)制幫助很大。4. 手寫Java操作ZooKeeper從連接、CRUD到Watch監(jiān)聽這一章是實(shí)操的重點(diǎn)。我會(huì)同時(shí)給出原生API和Curator兩套代碼方便你根據(jù)項(xiàng)目實(shí)際情況選用。所有代碼我都基于實(shí)際跑通的示例整理你復(fù)制到自己的項(xiàng)目里改幾個(gè)參數(shù)就能用。4.1 基礎(chǔ)依賴與連接建立如果用Curator需要在pom.xml中加入dependency groupIdorg.apache.curator/groupId artifactIdcurator-framework/artifactId version5.5.0/version /dependency dependency groupIdorg.apache.curator/groupId artifactIdcurator-recipes/artifactId version5.5.0/version /dependency如果只是想體驗(yàn)原生API只需要引入ZooKeeper官方客戶端依賴。不過下文除了最基礎(chǔ)的連接示例用原生API后面的業(yè)務(wù)操作我都用Curator因?yàn)镃urator的API設(shè)計(jì)更適合工程落地。原生API建立連接的方式ZooKeeper zooKeeper new ZooKeeper(127.0.0.1:2181, 3000, event - { System.out.println(收到事件 event.getType()); });原生API的構(gòu)造函數(shù)中第一個(gè)參數(shù)是連接串第二個(gè)是會(huì)話超時(shí)時(shí)間第三個(gè)是Watcher回調(diào)。連接本身是異步的所以構(gòu)造完成后要等待一下確認(rèn)連接穩(wěn)定再繼續(xù)執(zhí)行后續(xù)操作。用Curator建立連接的代碼會(huì)更直觀RetryPolicy retryPolicy new ExponentialBackoffRetry(1000, 3); CuratorFramework client CuratorFramework.builder() .connectString(127.0.0.1:2181) .sessionTimeoutMs(3000) .connectionTimeoutMs(3000) .retryPolicy(retryPolicy) .build(); client.start();ExponentialBackoffRetry設(shè)置了初始重試間隔1000毫秒、最多重試3次。Curator啟動(dòng)后不是馬上連上實(shí)際操作前最好調(diào)用blockUntilConnected等待連接建立避免在未連接狀態(tài)執(zhí)行命令拋異常。4.2 節(jié)點(diǎn)的增刪改查與版本控制用Curator操作節(jié)點(diǎn)非常方便。創(chuàng)建持久節(jié)點(diǎn)的代碼client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.PERSISTENT) .forPath(/config/db_switch, on.getBytes(StandardCharsets.UTF_8));creatingParentContainersIfNeeded會(huì)自動(dòng)創(chuàng)建父節(jié)點(diǎn)這個(gè)特性很實(shí)用避免手動(dòng)判斷父路徑是否存在。withMode指定節(jié)點(diǎn)類型CreateMode.PERSISTENT是持久節(jié)點(diǎn)如果做服務(wù)注冊(cè)就換成EPHEMERAL。讀取節(jié)點(diǎn)數(shù)據(jù)byte[] data client.getData().forPath(/config/db_switch); String value new String(data, StandardCharsets.UTF_8);更新節(jié)點(diǎn)有兩種情況。第一種直接覆蓋用setData第二種是帶版本號(hào)的更新。ZooKeeper里的setData可以指定期望版本如果當(dāng)前版本和期望版本不一致會(huì)拋出BadVersionException。這種機(jī)制適合保證多人同時(shí)改配置時(shí)不覆蓋別人的修改client.setData() .withVersion(0) .forPath(/config/db_switch, off.getBytes(StandardCharsets.UTF_8));刪除節(jié)點(diǎn)也有版本控制并且刪除有子節(jié)點(diǎn)的節(jié)點(diǎn)會(huì)失敗需要先遞歸刪除子節(jié)點(diǎn)。Curator的刪除方法支持guaranteed和deletingChildrenIfNeeded前者保證網(wǎng)絡(luò)異常時(shí)后臺(tái)重試刪除后者自動(dòng)清理子節(jié)點(diǎn)client.delete().guaranteed().deletingChildrenIfNeeded().forPath(/config);4.3 一個(gè)能落地的Watch監(jiān)聽循環(huán)Watch是ZooKeeper最核心的機(jī)制代碼也最容易出錯(cuò)。原生API的寫法是注冊(cè)Watcher但一次觸發(fā)后失效所以要在回調(diào)里再次注冊(cè)。下面是封裝好的循環(huán)監(jiān)聽工具public class ConfigWatcher { private final ZooKeeper zooKeeper; public ConfigWatcher(ZooKeeper zooKeeper) { this.zooKeeper zooKeeper; } public void watch(String path) throws Exception { // 用getData注冊(cè)監(jiān)聽監(jiān)聽的事件是節(jié)點(diǎn)數(shù)據(jù)變化 byte[] data zooKeeper.getData(path, event - { System.out.println(配置發(fā)生變化 event.getPath()); try { // 實(shí)際業(yè)務(wù)處理比如刷新本地緩存 handleConfigChange(path); // 重點(diǎn)重新注冊(cè)監(jiān)聽 watch(path); } catch (Exception ex) { ex.printStackTrace(); } }, null); System.out.println(當(dāng)前配置值 new String(data)); } }這段代碼的關(guān)鍵點(diǎn)就在watch方法末尾再次調(diào)用自己注冊(cè)下一次監(jiān)聽。漏掉這一步監(jiān)聽只會(huì)觸發(fā)一次。我在項(xiàng)目里看到過很多次這個(gè)問題造成的現(xiàn)象是配置第一次修改生效以后再也收不到通知。用Curator時(shí)可以借助CuratorCache或者NodeCache來簡(jiǎn)化監(jiān)聽邏輯。NodeCache在節(jié)點(diǎn)數(shù)據(jù)變化時(shí)觸發(fā)支持再次監(jiān)聽不需要手動(dòng)循環(huán)NodeCache nodeCache new NodeCache(client, /config/db_switch); nodeCache.getListenable().addListener(() - { String newValue new String(nodeCache.getCurrentData().getData()); System.out.println(最新配置 newValue); }); nodeCache.start();NodeCache啟動(dòng)后內(nèi)部自己處理了Watch重新注冊(cè)你只需要關(guān)心業(yè)務(wù)邏輯。這也是我更推薦Curator的原因把最容易錯(cuò)的邊角料封住了。4.4 關(guān)于序列化傳數(shù)據(jù)到底傳什么操作ZNode時(shí)雖然接口接收的是byte[]但實(shí)際傳什么內(nèi)容我建議先約定好。寫項(xiàng)目X時(shí)我統(tǒng)一用JSON字符串把配置項(xiàng)封裝成對(duì)象后序列化存儲(chǔ)到節(jié)點(diǎn)里。讀取時(shí)再反序列化回對(duì)象。如果直接用Java原生序列化雖然類實(shí)現(xiàn)了Serializable就能存但跨語言調(diào)用會(huì)很痛苦而且序列化內(nèi)容體積大浪費(fèi)ZooKeeper有限的存儲(chǔ)空間。所以我的建議是存量小字段直接用字符串比如開關(guān)狀態(tài)寫on/off。結(jié)構(gòu)化成組配置用JSON字符串。切勿存大對(duì)象或大數(shù)組。深度思考一下ZooKeeper節(jié)點(diǎn)的數(shù)據(jù)是給所有客戶端看的用通用的JSON格式意味著不同語言的服務(wù)也能解析這比綁定Java序列化的方案通用性強(qiáng)很多。5. 實(shí)戰(zhàn)分布式鎖、服務(wù)發(fā)現(xiàn)、配置下發(fā)這三個(gè)場(chǎng)景怎么拆掌握基礎(chǔ)操作后關(guān)鍵是把它們組合成真正的業(yè)務(wù)解決方案。這一章我會(huì)挑三個(gè)最有代表性的實(shí)戰(zhàn)場(chǎng)景完整說明設(shè)計(jì)思路和實(shí)現(xiàn)步驟。5.1 用臨時(shí)順序節(jié)點(diǎn)實(shí)現(xiàn)分布式鎖項(xiàng)目X里有個(gè)定時(shí)任務(wù)需要保證集群里只有一個(gè)實(shí)例在執(zhí)行。最初用數(shù)據(jù)庫鎖后來切到ZooKeeper后穩(wěn)定很多。原理很簡(jiǎn)單多個(gè)客戶端在同一個(gè)鎖路徑下創(chuàng)建臨時(shí)順序節(jié)點(diǎn)序號(hào)最小的獲得鎖其他客戶端監(jiān)聽序號(hào)比自己小的節(jié)點(diǎn)等它刪除后再嘗試獲得鎖。用Curator內(nèi)置的InterProcessMutex代碼幾乎沒有門檻InterProcessMutex lock new InterProcessMutex(client, /lock/order_task); boolean acquired lock.acquire(5, TimeUnit.SECONDS); if (acquired) { try { // 執(zhí)行定時(shí)任務(wù) doTask(); } finally { lock.release(); } }acquire方法第二個(gè)參數(shù)是獲取鎖的超時(shí)時(shí)間超過則放棄避免線程長(zhǎng)時(shí)間卡死。release方法必須在finally里調(diào)用否則鎖不會(huì)釋放其他實(shí)例會(huì)一直阻塞。還要注意如果進(jìn)程崩潰鎖節(jié)點(diǎn)因?yàn)槭桥R時(shí)節(jié)點(diǎn)會(huì)自動(dòng)被ZooKeeper清除這也是這個(gè)方案比數(shù)據(jù)庫鎖穩(wěn)的原因之一。如果不用Curator也可以基于原生API自己實(shí)現(xiàn)分布式鎖核心代碼邏輯是創(chuàng)建臨時(shí)順序節(jié)點(diǎn)然后獲取父節(jié)點(diǎn)下所有子節(jié)點(diǎn)列表判斷自己序號(hào)是否最小。不過這部分代碼要處理監(jiān)聽和重試細(xì)節(jié)我強(qiáng)烈建議直接用InterProcessMutex。5.2 服務(wù)注冊(cè)與發(fā)現(xiàn)沒有注冊(cè)中心時(shí)怎么辦服務(wù)注冊(cè)與發(fā)現(xiàn)是ZooKeeper非常經(jīng)典的場(chǎng)景。服務(wù)啟動(dòng)時(shí)在 /services/服務(wù)名下創(chuàng)建臨時(shí)節(jié)點(diǎn)節(jié)點(diǎn)里存服務(wù)地址。調(diào)用方監(jiān)聽 /services/服務(wù)名 下的子節(jié)點(diǎn)列表變化就能實(shí)時(shí)感知服務(wù)的上下線。服務(wù)端注冊(cè)的示例String servicePath /services/order-service; String instancePath servicePath /instance- UUID.randomUUID(); String address 192.168.1.10:8080; client.create().creatingParentContainersIfNeeded() .withMode(CreateMode.EPHEMERAL) .forPath(instancePath, address.getBytes(StandardCharsets.UTF_8));客戶端訂閱服務(wù)列表的示例PathChildrenCache cache new PathChildrenCache(client, /services/order-service, true); cache.getListenable().addListener((curator, event) - { System.out.println(服務(wù)列表發(fā)生變化 event.getType()); cache.getCurrentData().forEach(data - { String address new String(data.getData()); System.out.println(可用實(shí)例 address); }); }); cache.start();PathChildrenCache是Curator提供的子節(jié)點(diǎn)監(jiān)聽工具啟動(dòng)后監(jiān)聽子節(jié)點(diǎn)新增、刪除、數(shù)據(jù)修改。服務(wù)上下線時(shí)監(jiān)聽回調(diào)會(huì)收到事件客戶端就可以更新本地服務(wù)列表。配合臨時(shí)節(jié)點(diǎn)能夠?qū)崿F(xiàn)服務(wù)宕機(jī)自動(dòng)摘除整個(gè)過程不需要人工介入。5.3 配置中心動(dòng)態(tài)下發(fā)與App內(nèi)熱更新配置中心是ZooKeeper比較容易上手的場(chǎng)景。我把項(xiàng)目X的數(shù)據(jù)庫連接池參數(shù)、功能開關(guān)、限流閾值全部放到了 /config 路徑下每個(gè)子節(jié)點(diǎn)對(duì)應(yīng)一個(gè)配置項(xiàng)。服務(wù)啟動(dòng)時(shí)讀取一次然后注冊(cè)監(jiān)聽配置更新后應(yīng)用自動(dòng)刷新對(duì)應(yīng)組件。一個(gè)典型的配置模型// 啟動(dòng)加載 byte[] data client.getData().forPath(/config/db_pool_max_active); String maxActive new String(data); // 修改數(shù)據(jù)庫連接池 dataSource.setMaxActive(Integer.parseInt(maxActive)); // 啟動(dòng)監(jiān)聽后續(xù)變化實(shí)時(shí)更新 NodeCache cache new NodeCache(client, /config/db_pool_max_active); cache.getListenable().addListener(() - { String newMaxActive new String(cache.getCurrentData().getData()); dataSource.setMaxActive(Integer.parseInt(newMaxActive)); }); cache.start();這套配置中心實(shí)現(xiàn)上非常簡(jiǎn)單比引入完整的配置中心中間件輕量得多。如果你只是需要十幾個(gè)配置項(xiàng)的熱更新ZooKeeper是性價(jià)比極高的方案。但要注意配置項(xiàng)應(yīng)該集中在一個(gè)路徑下方便管理還要為沒有經(jīng)驗(yàn)的運(yùn)維同學(xué)準(zhǔn)備好配置變更的操作文檔避免改錯(cuò)數(shù)據(jù)格式導(dǎo)致應(yīng)用啟動(dòng)時(shí)解析失敗。5.4 三個(gè)場(chǎng)景的通用套路總結(jié)拆完三個(gè)場(chǎng)景你能發(fā)現(xiàn)它們共享同一套設(shè)計(jì)模式選定ZNode路徑、確定節(jié)點(diǎn)類型、注冊(cè)Watch。服務(wù)注冊(cè)用臨時(shí)節(jié)點(diǎn)是因?yàn)橐詣?dòng)清理配置存儲(chǔ)用持久節(jié)點(diǎn)是因?yàn)橐L(zhǎng)期保存分布式鎖用臨時(shí)順序節(jié)點(diǎn)是因?yàn)橐抨?duì)和自動(dòng)釋放。所以學(xué)習(xí)ZooKeeper時(shí)不需要死記硬背API關(guān)鍵是能把業(yè)務(wù)需求翻譯成“節(jié)點(diǎn)類型 監(jiān)聽事件”的二元組。翻譯對(duì)了代碼只是時(shí)間問題。6. 生產(chǎn)環(huán)境必須面對(duì)的幾個(gè)硬骨頭把ZooKeeper放到生產(chǎn)環(huán)境之前有幾個(gè)問題必須提前想清楚。我在項(xiàng)目X推進(jìn)的過程中就踩過不少坑這里挑影響最大的幾個(gè)說。6.1 會(huì)話超時(shí)與心跳假死ZooKeeper客戶端會(huì)話超時(shí)機(jī)制是它高可用的基礎(chǔ)但也容易造成假死?,F(xiàn)象是服務(wù)進(jìn)程還在但ZooKeeper服務(wù)端判斷會(huì)話過期把臨時(shí)節(jié)點(diǎn)清掉了其他客戶端看到你的服務(wù)已經(jīng)下線實(shí)際你的進(jìn)程還在運(yùn)行。我遇到過一次比較典型的情況某服務(wù)因?yàn)镕ull GC暫停了幾秒心跳沒發(fā)出去ZooKeeper判定會(huì)話超時(shí)把臨時(shí)節(jié)點(diǎn)刪了。Full GC恢復(fù)后服務(wù)還在處理業(yè)務(wù)下游已經(jīng)把流量切走了。這個(gè)問題靠代碼很難完全規(guī)避但可以通過調(diào)大sessionTimeout來降低誤判概率。我線上一般設(shè)sessionTimeoutMs為10秒比本地開發(fā)時(shí)大不少。處理方式是在客戶端加上ConnectionStateListener監(jiān)聽會(huì)話的重連和過期事件。Curator里這個(gè)Listener會(huì)告訴你RECONNECTED或者LOST。收到LOST事件時(shí)業(yè)務(wù)側(cè)必須主動(dòng)檢查自己的臨時(shí)節(jié)點(diǎn)是否還存在不存在就需要重新注冊(cè)。6.2 Watch風(fēng)暴與重復(fù)注冊(cè)Watch機(jī)制雖然好用但用不好會(huì)造成嚴(yán)重問題。如果幾百個(gè)客戶端對(duì)同一個(gè)父節(jié)點(diǎn)注冊(cè)子節(jié)點(diǎn)監(jiān)聽那么這個(gè)節(jié)點(diǎn)一變化幾百個(gè)客戶端全部被打醒同時(shí)執(zhí)行后續(xù)邏輯這就是Watch風(fēng)暴。我在項(xiàng)目X早期犯過這個(gè)錯(cuò)誤所有服務(wù)實(shí)例都在監(jiān)聽同一個(gè)服務(wù)列表節(jié)點(diǎn)導(dǎo)致服務(wù)上下線時(shí)通知量爆炸。優(yōu)化方案是把監(jiān)聽改為客戶端主動(dòng)輪詢或者說改變數(shù)據(jù)組織方式讓每個(gè)客戶端只關(guān)心自己需要的那部分節(jié)點(diǎn)。比如把子節(jié)點(diǎn)按租戶分隔客戶端只監(jiān)聽自己租戶的路徑。這個(gè)調(diào)整之后通知量降了一個(gè)數(shù)量級(jí)效果立竿見影。另外就是重復(fù)注冊(cè)的坑。在緩存框架里一個(gè)節(jié)點(diǎn)被多個(gè)模塊同時(shí)監(jiān)聽很容易產(chǎn)生重復(fù)的Watcher。釋放節(jié)點(diǎn)緩存時(shí)必須調(diào)用close清理監(jiān)聽否則舊監(jiān)聽會(huì)一直駐留不僅浪費(fèi)內(nèi)存還會(huì)造成重復(fù)通知。6.3 單機(jī)模式的坑與集群容錯(cuò)本地開發(fā)用單機(jī)模式?jīng)]問題但生產(chǎn)環(huán)境千萬不能只部署一個(gè)ZooKeeper實(shí)例。一旦這個(gè)單點(diǎn)宕機(jī)依賴它的配置中心和分布式鎖全部癱瘓整個(gè)系統(tǒng)都被卡住。我建議生產(chǎn)環(huán)境至少部署三個(gè)實(shí)例并且滿足奇數(shù)個(gè)。這是ZooKeeper選舉機(jī)制決定的3個(gè)實(shí)例允許掛1個(gè)5個(gè)允許掛2個(gè)。如果只部署2個(gè)掛1個(gè)就達(dá)不到多數(shù)派條件集群直接不可用還不如單機(jī)。部署時(shí)還要注意ZooKeeper和業(yè)務(wù)應(yīng)用盡量分離部署不要圖省事混在同一個(gè)宿主機(jī)上否則宿主機(jī)資源被業(yè)務(wù)占滿時(shí)ZooKeeper的磁盤和端口也會(huì)受影響容易產(chǎn)生連鎖故障。6.4 ACL權(quán)限不要讓ZNode裸奔很多團(tuán)隊(duì)搭建ZooKeeper后節(jié)點(diǎn)默認(rèn)不設(shè)任何權(quán)限所有人都能讀寫。在開發(fā)環(huán)境可以容忍但生產(chǎn)環(huán)境這樣做風(fēng)險(xiǎn)很大。如果有誤操作或者在從節(jié)點(diǎn)路徑上亂寫數(shù)據(jù)可能導(dǎo)致線上配置被覆蓋。ZooKeeper的ACL不像Linux文件權(quán)限那么簡(jiǎn)單它包含scheme、id和permission三層。我目前用的是digest認(rèn)證給節(jié)點(diǎn)設(shè)置用戶名密碼客戶端訪問時(shí)必須攜帶認(rèn)證信息。雖然MultiDocker內(nèi)部的網(wǎng)絡(luò)環(huán)境相對(duì)可控但加上認(rèn)證至少能擋住誤操作和弱安全要求的臨時(shí)腳本訪問。設(shè)置認(rèn)證的示例client.setACL().withACL(ZooDefs.Ids.CREATOR_ALL_ACL).forPath(/config);同時(shí)客戶端連接后要調(diào)用addAuthInfoclient.getZookeeperClient().getZooKeeper() .addAuthInfo(digest, admin:password.getBytes());ACL的好處是防止未授權(quán)客戶端亂寫數(shù)據(jù)代價(jià)是每次連接多一步認(rèn)證但這對(duì)生產(chǎn)安全是有價(jià)值的。如果你所在團(tuán)隊(duì)安全要求比較高建議一開始就按這套方式設(shè)計(jì)節(jié)點(diǎn)權(quán)限體系。作為Java開發(fā)者在項(xiàng)目中落地ZooKeeper我從最開始的只會(huì)寫CRUD到后來能獨(dú)立完成分布式鎖、服務(wù)發(fā)現(xiàn)和配置中心整個(gè)過程中最大的體會(huì)是ZooKeeper的API并不難難的是把“節(jié)點(diǎn)類型 Watch事件”這兩個(gè)概念靈活組合出正確的解決方案。我在項(xiàng)目X里真正穩(wěn)定運(yùn)行之后才慢慢把之前踩過的坑變成團(tuán)隊(duì)內(nèi)部的排查手冊(cè)。最后分享一個(gè)小技巧排查ZooKeeper相關(guān)問題時(shí)可以先用命令行客戶端連接上去手動(dòng)執(zhí)行g(shù)et和ls操作確認(rèn)數(shù)據(jù)狀態(tài)是否和預(yù)期一致再回頭查代碼邏輯這樣能快速縮小問題范圍比直接翻代碼有效率得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产伊人五月天| 精品亚洲国产成AV人片传媒 | 亚洲黄色影视| www·五月天| 日本欧美成人片AAAA| 激情婷婷在线中文字幕| 色婷婷五月天成人网| 99精品国产乱码久久久人妻| 色国产五月| 婷婷丁香日韩五月| 五月天激情国产综合婷婷婷| 男人天堂亚洲综合| 97碰碰视频| 天天天天干| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 看婷婷五月天网| 五月激情综合网| 丁香婷婷六月在线资源观看| 午夜丁香久久久久久| 99热这里有精品2| 91免费啪视频| 噜噜噜噜噜在线| 五月婷婷激情| 亚洲午夜AV| 五月婷婷六月丁香在线视频免费在线观看| 婷婷丁香五月天欧美| 人妻丰满精品一区二区A片| 丁香五月婷婷久久久| 欧美精品999| 五月天婷婷色播综合在线| 99久久国产宗和精品1上映| 五月丁香六月婷婷亚洲激情综合| 亚洲综合网 665566| 色婷婷五月天无码视频| 色色99| 色五月色五天免费视频| Av九九| 俺去也在线www色官网| AA片在线观看视频在线播放| 深爱激情丁香五月| 色色色在线免费视频| 日本婷婷五月天| 丁香五月五月婷婷| 色播五月婷婷| 激情综合五月婷婷六月丁香| 人人爽人人射-美女久久久久久久久久-成人AV| 欧美五月婷婷| 日本久久综合| 五月婷婷久久综合| 美日韩成人| 97碰碰电影| 欧美叉叉叉BBB网站| 五月天婷婷深深爱| 就爱射中文字幕资源网| 久久伦乱| 99色色爰| 激情婷婷五月亚洲| 欧美一区二区三区不卡影视| 久久久久久激情| 婷婷五月天在线一区| 伊人婷婷大香蕉| 大香蕉九九操| 九九re精品视频在线观看| 超碰AV在线| 婷婷五月无码| 办公室少妇激情呻吟A片在线观看| 色五月欧美| 丁香五月激情无码视频| 精品一区二区三区四区五区六区介绍| 久久婷婷五月综合激情国产| 九九色影视| 五月久久网| a片在线免费观看一区| 国产激情综合五月久久| 青青草原亚洲天堂| 91碰碰碰| av在线免费播放观看| 99热伊人| 免费视频无码| 久碰久| 久久HD| 97干欧美| 99免费热视频在线| 欧美槡BBBB槡BBB少妇| 99色爱| 色 五月婷婷基地| www狠狠| 欧美激情凹凸丁香网| 久久免费精品小视频| 五月婷婷 自拍| 一级韩国产精品毛| 性爱综合网| 色色精品色| 亚洲精品五十一区| 久久婷婷草| 欧美日韩国产日本精品四虎网网站物| 天天综合五月天| 久久久宗合| 另类在线| 天天日夜夜拍| 嫩BBB槡BBBB搡BBBB| 婷婷五月草| 99久在线观看| 精品成人无码A片观看香草视频| 97色色网| 香蕉AV777XXX色综合一区| www.婷婷.com| 丁香花婷婷五月天| 激情婷婷丁香色五月综合| 在线视频99| 成人色五月天婷婷| 五月婷婷激情中心| 婷婷伊人网| 亚洲日韩乱码一区二区三区四区 | 久久丁香五月| 久香草视频在线观看| 北京熟妇搡BBBB搡BBBB| 五月天丁香成人社| 可以免费观看的AV| 五月丁香花激情综合网| 91黄址| 色97综合婷婷天天色| 婷婷激情肏屄网| 天天草天天日| 九九色色| 无码人妻电影| 九九综合久久| 69超碰在线| 国产婷婷综合| 思思久久青草热| 综合AV在线| 无码人妻少妇色欲AV一区二区| 99成人| 五月天伊人久久| 色久在| 婷婷成人五月天| 色99色| 色色影院黄大片| 天天做天天爽| 亚洲午夜av| 丁香五月婷婷激情中文| 五月天色色色| 欧美久久网| wwwxxx五月婷婷小说| 欧美综合五月丁香六月婷| 99热这里只有精品18| 人人操av| 黄色一极大片| 天天久| 欧亚成人A片一区二区| 色色色色色色综合网| 九色视频入口91| 亚洲人人96@| 爆乳熟妇一区二区三区爆乳| 色色网站毛片| 好好日激情五月天| 婷婷色五月丁香六月欧美啪| 大香蕉视频婷| 天天撸天天干天天插| 色五月激情五月天| 九色综合五月天婷五月| 无码地址| 天天插天天射| 欧美婷婷五月激情| 天天插操| 色色色综合网| 亚洲成人免费在线| 91丨九色丨国产打屁股| 久99热在线观看| 婷婷五月丁香手机在线视频| 五月婷婷性爱| 99精彩视频在线观看| 亚洲五月天另类小说图片| 狠狠色综合网站久久久久| 嫩BBB槡BBBB搡BBBB| 一级性感毛片| 久久东京热婷婷五月| A片试看120分钟做受图片| 九九99热| WWW.婷婷五月天.COM| 天天拍夜夜爽| 天天肏天天肏天天肏| 夜丁香综合| 黑人无码一区| 婷婷在线视频| 天天爽日日爽夜夜爽| 久久精品99| 青青草Avb在线| 免费不卡狠操美女视频网| 五月婷六月| 久久新地此| 婷婷涩五月| 99热老司机| www.zbzhongsen.com| www.99.色| 狠狠色综合网站久久久久| 婷婷狠狠操| 99re免费精品视频| 色综合久久久无码中文字幕999| 99日本视频在线观看专区| 91视频综合网| 99热 在线观看| 五月天婷婷狂暴白浆| 久久ww| 国产这里只有精品| 99热精品中文字幕| 久久婷婷丁香五月一二三| www.五月天婷婷| 五月天社区| 开心五月婷婷| 五月天丁香成人| 综合五月草| 色色色色色色综合网| 秋霞性爱AV| a久久| 婷婷五月天免费视频| 丁香五月Av| www久| 精品综合网在线| 另类A片| 艾小青av| 婷婷五月天激情综合婷婷五月天激情综合| 任你日视频| 亚洲99热| 婷婷的五月天另类视频| 色五月 五月婷婷| 九九精品这里只有| 狠狠色丁香久久久婷| 五月天开心网| 九九五月天| 五月天另类视频| 丁香狠狠| 99er免费在线观看| 欧美交换配乱吟粗大25P| 深爱五月婷婷开心中文字幕| 婷婷亚洲在线| 91麻豆国产三级精品福利在线观看| www.激情五月天| 99热思思在线观看| 狠狠色丁香婷婷基地| 亚洲xx在线| 狠狠综合网| AV操逼网| 丁香色五月 97干| 思思热99热| 五月婷婷综合潮喷| 亚洲激情区| 色综合夜夜| 色婷婷综合成人| 99精品福利视频| www.五月激情.com| 六月婷婷网站| 五月丁香做爱视频| 婷婷五月情| 婷婷视频在线| 婷婷伊人网| 色婷婷激情视频| 另类小说五月天综合网| 丁香六月啪啪啪| 97婷婷在线| 97超碰99热99| 久人操| 探花搜索结果 - 黄上黄| 成人短视频在线观看| 久久午夜理论| 色综合激情| 婷婷激情五月天天天开心| 丁香五月天.com| 色色色色色网| 五月丁香人妻| 五月婷婷综合在线| 日本色婷婷| 激情五月天在线观看色婷婷| 人妻中文在线| 第九色区AV在线| 色99视| 久久激情五月| 97色久| 亚洲婷婷激情综合激情999精品| 日本97在线视频| 色色色在线观看| 婷婷欧美综合| 五月五丁香婷婷| 99热99热不卡| 久久久激情视频| 色香欲综合| 色99视频| 久久99免费视屏| g00d人体西西| 激情q青青草在线婷婷| www夜夜操com| 婷婷99狠狠躁天天| 久久精品国产一区二区三区四区| 色香欲综合| 影音先锋女人AA鲁色资源| 九九AV在线| 色播五月网| 国产欧美熟妇另类久久久| 五月婷婷偷拍| 色婷婷综合视频| 色欲婷婷夜夜| 婷婷五月天综合久久| 青青福利网| 日本色视| 婷婷综合五月天激情| 婷婷六月啪啪| 色五月天在线观看| 亚洲婷婷五月天| 狠狠色婷婷丁香五月| 日韩在线看AV| 99久久精| 99久久99久久| 99久免费视频| 思思热再线视频| 久久98热re| 婷婷九月| WWW久久久| 久久亚洲婷婷| 国产毛片精品一区二区色欲黄A片| 99热免费在线| 黄色激情久久| 婷婷基地成人五月天| 丁香五月停停av| 99,色| 亚洲六月色| 99九九久久| 综合久久综合综合| 久久久久人妻中文| 男妓跪趴把舌头伸进我的嘴巴| 伊人啪啪网| 大香蕉综合在线| 免费操超碰| 色五月丁香婷婷综合| 激情五月天色爱| 五月婷婷综合激情网| 99成人| 天天干电影| 人妻体体内射精一区二区| 久婷婷视平| 五月色情婷婷| 五月婷婷AV| 色婷婷色和| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 婷婷五月综合网| 97操操网| 婷婷丁香五月六月激情| 五月天激情久久| 在线色婷婷| 天天 日综合| 丁香五月婷婷啪啪| 久久久婷婷婷| 天天天天天天操| 最新色色五月天| 亚洲综合激情五月久久| 性一交一乱一交A片久| 色婷婷久久7777| 婷婷色五月色妇| 99热这里只有精品8| 精品热青草| 99久久思思| WWW.桔色成人.COM| 少妇口诉沐足视频播放器网址| 色播五月网| 婷婷五月激情丁香| 麻豆精品| 九九热re99re6在线精品| www.97视频| 五月丁香六月婷婷中文版| 亚洲中文乱字字幕在线永久| 影音先锋男人女人| 亚洲aV写真天天综合网久久| 国产亚洲精品久久久久久豆腐| 中文在线视频久9| 色婷婷五月天小说| 激情久久网 | 99热精品在线播放观看| 精品人人操| 色五月婷婷综合| 激情婷婷色色| 五月丁香综合精品| 五月天.com| 五月婷婷狠狠久久| 丁香九月激情| 色五月天成人在线| 婷五月天六| 五月精品| 五月熟妇婷婷久久| 五月婷婷先锋| 亚洲综合视频网| 九九黄色网| 婷婷五月花| 开心五月婷婷在线| 97色在线观看视频| 无码人妻AV久久久一区二区三区 | 高清资源站日A美A欧亚…| 99精品久久久久久久婷婷| 久久机热/这里只有精品 | 久久久999精品| 日本天天色| 天天影视色综合网| 伊人五月婷婷| av免费在线看不卡无毒| 五月婷婷六月奇米网丁香| 91色久| 永久天堂日本| 天天色色天天| 色噜噜狠狠插综合| 婷婷丁香77777| 午夜AV网| www.婷婷| w婷婷五月婷婷w| 五月婷免费视频久久久| 无码日本精品XXXXXXXXX | 六月色婷婷欧美| 婷婷五月综合社区在线| 99爱视频在线观看| 成人色情五月天婷婷丁香| 久久色情| 六月久久婷婷| 99热日韩| 久久亚洲网| 成人丁香五月婷| 国产亚洲成AV人片在线观黄桃 | 久婷自拍视频| 亚洲亚洲人成综合网络| 激情五婷网| 97亚洲色 torrent magnet| 91天天操天天干天天射| 丁香五月综合色婷婷| 97亚洲婷婷| 91艹人| 超碰网站在线观看| 亚洲成人av中文| 亚洲操B| 久久婷婷五月| 精品国产va久久久| 激情五月网站| 亚洲中文无码成人| 丁香久久| 婷婷五月天色色| 丁香婷婷在线| 操逼福利视频| 99高级会所久久| 久久伊人婷婷| 色婷婷超碰| 变态另类色图| 九九色插| 久久44| 欧美性猛交99久久久久99按摩| 久久精品66| 亚洲第一色色色色| 亚洲性爱99| 91中文在线| 狠狠99| 久久婷婷六月综合综合| 婷婷性爱| 国产午夜精品一区二区三区嫩草| 97色啪| 午夜成人av在线| 亚洲V国产V欧美V久久久久久| 婷婷丁香五月天激情| 久久这里只精品66| 丁香五月天欧洲在线| av网站免费在线| 91丁香色| 久久五月婷综合网| 亚洲AV另类| 激情综合婷婷久久| 先锋资源91| 2020日日干| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 91蝌蚪窝视频在线| 淫视馆av三区| 色丁香五月婷婷综合久久| 欧美色五月| 综合色久| 五月四色激情| 五月天激情图片网| 午夜爱插插| 五月丁香无码| 激情婷婷五六月天| 久久网思思| 人人做天天爱| 99精品网| 天天日夜夜爽| www色五月天| 丁香六月激情网C0W| 九九久久综合| 很操日本7| 婷婷五月六月丁香综合| 九九草热在线观看| 六月丁香五月天| 在线成人视频免费| 激情小说五月天| 五月婷婷综合激情| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | tingting五月天亚洲| 日韩精品一品二区三区的使用体验| 熟女少妇内射日韩亚洲| 五月丁香综合激情| 婷婷丁香五月天激情四射| 色五月 五月婷婷| 性生生活大片又黄又| 丁香五月在线播放| 亚洲综合碰| 精品久久9| 再次出发二| 人人人操97| 婷婷五月天情色| 激情五月丁香五月| 天天久久九九| 韩日在线熟女| 五月婷婷六月丁香综合在线| 日韩1区2区| 9久热| 影音 五月 婷婷 久久| 亚洲乱码日产精品BD| 国产一区二区三区影院| 九九色色| 97人妻碰碰碰久久香蕉| 亚洲成人免费在线| 久久这里只有精品视频15| 成人无码精品1区2区3区免费看| 在线另类| 日本色99| 噜噜久| 这里只有精品视频在线| 熟妇内谢69XXXXXA片| 性生生活大片又黄又| 亚州在线中文字幕| 色色色色色色色色五月先| 日韩综合网络男女香蕉a片| 91超级碰人人操| 久久五月丁香伊人青草| 色五月婷婷天天操夜夜操| 999热在线视频| 久久538| 天天综合91入口| 六月丁香婷婷网| 婷婷综合网站| 色色五月婷婷久久| 色爱五月天| 深爱五月亚洲| 成人无码髙潮喷水A片| 免费视频WWW在线观看网站| 日韩青青| 日本色婷婷久久99精品91| 天天爽曰日爽| 国外亚洲成AV人片在线观看| 色五月激情图片| 五月激情婷婷六月丁香| 五月天婷婷视频小说| 久久综合激情| 國語久久婷| 婷婷欧美| 99久久精品国产色欲| 99er这里只有精品视频| 色五月婷婷久久| 最近中文字幕2019视频1| 亚州激情九月| 久久538| 99综合99| 五月天婷婷激情综合| 日日干天天爽| 综合激情啪啪| 国产精品色色| 99在线精品免费视频| 中文字幕丰满乱孑伦无码专区| 激情久久久久久久久久| 天天干天天色天天干| www.91操| 97人人干| 99无码视频| 亚洲俩性性爱图片久久第六页| 五月婷婷在线综合| 激情丁香久久久久久| renrencaoni| 五月天精品| 五月婷婷开心爱| 婷婷五月花| 欧美色播综合在线观看| 色欲色香综合网| 91狠狠综合久久久| 婷婷久久五月天| 五月婷婷开心深| 亚洲精品色| 婷婷玉月丁香五月在线视频| 99色色网| 色婷五月| se99热久久一本| 色综合丁香婷婷| 97热视频| 欧美日本韩国亚洲| 久机视频这只有精品| 大色鬼综合| 天天天操天天天日| 99在线视频色版| 五月婷婷久久综合| 青青草原99热| www色婷婷| 色很很96| 爱iii做iiii日日| 美国十月色婷婷在线观看| 色九九中文字幕| 欧美中文五月天| 精品成人在线观看| 少妇AB又爽又紧无码网站| 五月婷丁香| 成人中文网| 国产精品VA在线| 玖玖色综合| 超碰97在线操| 欧美色久| 国产另类综合| 色播五月丁香| 综合激情九月婷婷,激情综合婷婷中文字| 色婷婷五月天成人网| 欧美色色色色色色| 荫道BBWBBB高潮潮喷| 一本久久亚洲五月婷婷| 三级av在线| 91综合色| 久热网站| 五月丁香拍拍激情综合| 成人做爰高潮A片免费视频| 亚洲天堂爱爱| av超碰在线| 六月婷婷开心| 婷婷五月激情中文字幕| 久Se视频在线观看| 激情婷婷五月丁香啪啪啪| 婷婷射图五月天| 丁香五月天啪啪| 狠狠综合久久综合| 欧美性猛交99久久久久99按摩| www.五月激情红色| 五月花综合| 亚洲热久| 一本到不卡高清DVD| 99精在线| 久久久人人人妻丝丝丝| 成人啪啪色婷婷久| 99碰碰。| 少妇水多A片太爽了| SESE无码AV| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 久久人操| 久久久久久久人妻| 丁香婷婷十月| 综合色五月天| 九月丁香婷婷综合激情| 日本黄色三级片内射| 欧美草久久五月天91| 综合九九中文字幕| 99在线看视频| 日本黄色三级片内射| 深爱开心激情| 人人爱人人摸人人澡| 色婷婷久久天天性爱| 人妻久久久| 久久久大香蕉| 9热在线观看| 国产在这里只有精品| 六月丁香啪啪| 婷婷在线播放av| 一级精品999WWW| 婷婷九九视频| 婷婷操久久| 91精品国产日韩91久久久久久国模| 婷婷色六月| 婷婷亚洲影院| 伊人久久婷婷| 色播五月婷婷| 日日夜夜狠狠| 疯狂做受XXXX高潮A片动画| XX色综合| 99综合网| 婷婷五月色综合| 激情五月色婷婷| 91九色精品女同系列| 精品人妻一区| 亚洲中文字幕在线观看| 我去色色网五雨天| PORNY九色9l自拍视频成人| 五月综合激情综合久| 五月激情婷婷综合| 久久色情| 九月婷婷综合八月丁香在线观看| 久久久久久久久久91| 5月丁香综合图区| 婷婷五月天综合AV| 激情深爱五月天| 亚洲激情综合| 久99在线视频| 婷婷六月丁香五月| 久草热久草在线视频| 亚洲色无码| 色99视频| 97五月天| 久久丁香婷婷色情综合| WWW.桔色成人.COM| 丁香五月婷婷总啪啪| 国精产品一区一区三区免费视频| www.91九色| 五月天另类视频| 六月99天天婷婷激情综合| 停停五月丁香| 五月婷婷天| 中文字幕网伦射乱中文| 91九色网| 99久久高清视频| 久久综合五月天| 婷婷五月天Av| 26uuu成人网| 开心五月激情网| 婷婷丁香大香蕉| 翔田千里 50岁 无码| 久久婷婷五月天蜜桃| 五月停停激情网| www色五月| 最新高清无码专区| 五月丁香花激情综合网| 亚洲色夜| 激情网 五月天| 亚洲成人中心| 国产一区二区av免费| 欧美S码亚洲码精品M码| 三级毛片视频| 91九色首页| 人人噜天天上| 久9热| 九9九9无码| 婷婷综合五月激情| 婷婷五月天综合网| 亚洲国产黄色电影| 狠色狠色狠狠色综合网| 欧美天天综合网站上去吧| 婷婷激情六月综合| 操99| www,超碰| 无月播播激情在线观看视频| 天天玩夜夜操| 激情综合色五月丁香| 丁香五月激情五月色综合| 999九九九久久久99HD| 亚洲成人九九九| 国产精品色色色色| 五月天综合视频| 日本天堂免费99| 婷婷丁香综合成人| 免费无码毛片一区二区A片| 欧美婷婷色| 色婷五月婷婷| 六月婷婷综合| 99久久99视频| 精品无吗va视频免费观看| 激情爱爱网站| 婷婷伊人视婷婷婷| 狠狠五月天激情| 婷婷丁香五月精品| 亚洲婷婷免费| 九九九色综合| 最新久久网址| 激情综合国产| 色婷五月天| 中文字幕不卡视频| 天天爽日日爽夜夜爽| 婷婷五月综合色拍| 影音先锋偷偷色男人站| 色婷婷成人丁香| 激情五月婷婷网| 91热久久| 91操碰| 国产99久久久| 91色综合| www99热| 天天插天天插天天插天天插| 激情综合丁香| www夜夜操com| 日韩情色在线观看| 综合网激情| 色婷婷情片| 九九大香视频| 丁香五月天黄色片| 激情綜合W W W,激情五月天| 99在线看视频| 99热手机在线精品| 色哟哟性爱av| 婷香五月| 亚洲中文丁香| 成人做爰高潮A片免费视频| 玖玖婷婷精品| 91一起操| 久久五月丁香婷婷| 国产99久久久国产精品免费看| 99热天堂| 九九久久综合| A√天堂网在线| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 手机在线视频观看9| 色必久悠悠影院| 99视频这里有精品| 欧美精品熟女一区二区| 九九热精品视频在线观看| 99日本黄站| 婷婷伊人綜合中文字幕| 婷婷天堂综合| 中文成人在线| 久久色五月天激情小说| 国产黄色在线观看| 色五月天成人| 亚欧州精品视频| 97色婷婷| 色婷婷久综合久久一本国产AV| 亚洲乱码日产精品BD| 九色激情网| www.婷婷五月天.com| A在线观看| 99热只有精品在线播放| 大香蕉婷婷丁香天堂AV| 午夜爱插插| 丰满老熟妇BBBBB搡BBB| 五月丁香六月婷婷,婷| 五月天激情亚洲| 操操操操操电影网| 吊色AV男人的天堂| 丁香网站| 超碰国产在线观看| 日日操夜夜操狠狠操| 色色国产| 婷婷色五月天在线观看| 丁香香蕉婷婷| 五月天伊人| 丁香婷婷五月| 欧美又粗又大一区二区在线观看| 另类专区在线观看| 久久机热/这里只有精品| 九一牛视频探花| 操骚货在线| 色综合激情| 婷婷开心深爱五月天| 97色色色| 久热这里只有| 五月天婷婷伊人| 成人婷99最新| 久久ri精品视频| 99色色网| 九九这里是免费的视频5| 婷婷五月丁香六月| 99热免费18| 97色色视频| 国产免费一区二区三州老师F1F1| 五月婷婷激情综合| 色婷婷色和| 国产肥白大熟妇BBBB视频| 四虎婷婷五月天| 色播婷婷五月天| 亚洲欧美日韩另类| 国产AV一区二区三区最新精品| 天天开心AV色综合婷婷五月天| 色六月 婷婷| 六月婷婷五月丁香| 天天搞天天色综合| 99性视频| 五月天电影网| 视色网在线播放| 五月婷婷基地| 99福利导航| 色噜噜狠狠插综合| 亚洲AV激情五月综合网| 午夜在线成人网站免费观看| 五月天婷婷爱| 五月丁香婷婷AV| 婷婷丁香激情五月天色色| 99综合熟女| 色播色丁香五月| 成人免费黄色短视频| 这里只有精品无码| 开心激情网五月| 精品久久久久久久人妻| 色婷婷五月色| 久久久久网站| 123草逼网| 麻豆精品| 亚洲视频久久| OUMEIRIHANCHENGREN| www.色五月| 色婷婷色99国产综合精品| 操射国产日本| 中文字幕色色| www色综合| 日韩在线婷婷五月天综合| 色色日韩网| 欧美一级色| 91丨九色丨熟女高潮| 国产99久9在线+|+传媒| 天天肏夜夜肏| 色五月婷婷五月天| 99这里有精品视频| 专区无日本视频高清8| 七七色色综合| 色婷婷成人网| 五月综合色| 色婷婷亚洲婷婷| 天天日天天舔| 天堂成人A片永久免费网站| 色狠狠综合网| 色亭亭丁香五月天| 久色大香蕉| 99啪在线| 草草操操| 激情综合网之激情五月| 久久艹99| 五月婷婷深深的爱| 天天噜天天爱| 日撸夜撸日操| 996er热| 色综合网址| 五月天成人免费视频| 久色激情| 天天天干夜夜夜操| 无码成人AAAAA毛片AI换脸| 亭亭五月色男人| 天天爽天天| 五月婷婷婷色| 操九色| 婷婷五月天视| 丁香婷婷成人在线播放| 深爱激情网婷婷| 日日夜夜狠狠干| 色综合丁香婷婷| 99久久9| 免费在线观看av网站| 中文字幕有多少字| 丁香婷婷五月人体| 国产欧美日韩性爱| 99视频精品全部免费观看| 色婷婷五月天天天天天天天天天| 超碰人人在线| 五月丁香久久激情综合| 香港九九六区八区99| 丰满少妇猛烈A片免费看观看 | 久草热久草在线视频| 极品人妻VideOssS人妻| 97操碰| 伊人99久久| 久9精品视频| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 伊人在线婷婷草| 午夜婷婷久久 | 免费观看全黄做爰的视频| 无码人妻AV久久久一区二区三区| 97精品人人A片免费看| 啪啪综合网| 激情五月天婷婷色色色色色色色色色色色 | 亚洲综合婷婷五月| 亚洲精| 久久综合影院 | 中文字幕丰满孑伦无码专区| 又大又粗九一在线| 97操碰视频| 免费视频WWW在线观看网站| 极品人妻VIDEOSSS人妻| 丁香伍月婷电影全集| 色情成人五月天| 天天人人综合| 久久性爱视频| 婷婷色色欧美综合网| 丁香五月婷综合| 婷婷五月天激情在线观看| 亚洲男人的天堂婷婷色五月| 五月天久久网站| 丁香五月成人| 五月丁香婷婷中文| AV性爱在线| 久久婷婷午夜| 色之综合网| 9 1超碰九色| 丁香久久九九99| WWW.开心五月天.COM| 天天天操天天天日| 激情综合五月| 婷婷丁香成人| 先锋资源婷婷| 91日综合欧美| 小视频一区| 日本久久99| 丁香成人五月天| 一区二区乱码视频| 色吊丝av中文字幕| 久久这里只有国产视频| 色婷婷五月在线| 五月婷婷官网色| 久久婷婷原创视频| 人妻在线中文字幕久久| 99re6久热只有精品6在线直播| 九九黄色网| 9有码中文| 久热这里只有| 九九超日本| 婷婷五月色情天| 欧美日韩国产一二区| 久草性爱| a久久免费视频| 亚洲岛国电影| 日韩乱玛久久| 久热A片| 99亚洲色| 操碰99在线视频观看| 人人干人人干骚美女| 天天爽,夜夜爽| 超碰京东热av男人的天堂| 亚洲国产色婷婷| 99这里| 五月激情日本在线| 婷婷六月色| 欧美美女国产日韩一区二区久| 亚洲激情综合| 91激情五月开心| 国产精品社区| 中文字幕在线免费观看视频| 久久久久久久久人妻| 免费视频无码| 五月夜丁香| 天天揷综合网| 五月丁香欧美在线| 91久久精品视频| 五月丁香影院| 九九碰九九爱97| 九九伊人网| 久久99色色| 婷婷狠狠狠爱| 久久久久亚洲AV成人无码电影| 色婷婷丁香五月天| www.91AV.com| 国产avapp 网| 五月丁香六月婷婷精品| 天天搞天天色综合| 亚洲小视频免费播放| 91碰超| 久久五月天激情美女| 久久作爱| 99热香港| 色综啪啪| 99riAv1国产在线观看| www.色情五月天.com| 欧美色五月天| 五月丁香激情怕怕| 97久久久| 99国产这里只有精品| 日韩黄色影院| 99视频在线观看网址| 日韩成人无码片| 五月婷婷中文字幕| 五月婷婷久久开心网| 日本天天色| 五月丁香无码| 日本精品99| 婷婷99视频在线| 亚洲色频| 98毛片| 99在线播放| 这里只有精品1| AV天堂婷婷五月天| 大香蕉五月婷婷| 97亚洲视频在线| 久久婷婷五月综合色丁香| 亚洲人妻电影| 97色色视频| 婷婷六月天激情| 婷婷五月天av网| 日本久久9| 欧美成人精品A片免费一区99| 色97综合婷婷天天色| 成 人片 黄 色 大 片| 色五月视频无码播放| ..真实国产乱子伦毛片| 婷婷五月骚厕所| 九九热精品| 九九热99久久99| 久久久天堂国产精品女人| 秋霞电影理论| 丁香五月婷婷亚洲综合精品| 五月天综合| 久热这里| 五月天在线视频尤物视频在线看| 99在线看片| 99热国产| 99男人的天堂| 色五月综合激情| 丁香六月天AV| 91人操| 99热人人操人人操| 国产乱人偷精品人妻A片| 狠狠操狠狠干综合| 狠狠五月激情在线| 综合一区二区三区| 日韩人人操| 97婷婷丁香五月| 色情综合网| 97热在线精品| Caoub青青超碰 | 99re热免费观看视频精品| 激情丁香五月AV| 激情网 久久| 五月婷婷丁香| 91se在线视频| 丁香综合婷婷五月天| 99热网站| 日韩久久色| 9久久精品视频| www...com黄在线观看| 9月色婷婷| 五月天狠狠网| 久热精品视频| 精品99*| 国产成人AV不卡| 欧美韩国日本| 天天色亚洲| 色九区| 精品婷婷| 操人91| 99无码超碰| 9久久婷婷国产综合精品性色| 成人婷婷桔色| 大香线蕉伊人| 日本人人干| 五月天激情网址| 五月婷婷六月丁香玖玖玫瑰91| 国产精品色色| 99色色网| 欧美精品99久久久| 婷婷丁香六月| 国产激情久久久| 九九热超碰| 搡BBBB搡BBB搡18| 五月丁香六月| 嫩草AV久久伊人妇女超级A| 色婷久九| 欧美在线97| 激情五月综合网| 丁香蜜臀黄色婷婷五月天| 欧美va在线| 五月丁香激情啪啪| 九九热在线观看视频| 韩国激情五月天综合网| 另类小说五月天| 亚洲中文字幕AV| 国产无套精品一区二区| 思思热在线视频精品| 丁香五月激情视频在线| 九月色婷婷| 久久久久久草黄色片AV在线观看| 色私五月婷婷| 免费黄色视频网址| 电影爱拉战争免费观看| 国产 亚洲 在线| 激情五月深爱五月| 婷婷五月AA五月在线| 五月天综合激情网| 亚洲思思热久| 狠狠色丁香婷婷基地| 色婷婷影院| 天天射综合网天天插| 五月丁香婷婷综合在线| 亚洲无码另类| 免费99情趣网视频| 色情免费视频播放| 996er热| 婷婷激情五月| 99热99艹在线观看| CAOBIBI| 色婷五月| 开心五月丁香啪| 五月天久久综合婷婷| 色噜噜狠狠插综合| 色婷婷97| 强辱丰满人妻HD中文字幕| 五月天婷婷综合| 色五月激情图片| 六月99天天婷婷激情综合| 91人人澡人人爽人人看| 99ri精品在线| 丁香 婷婷五月| 强伦轩人妻一区二区电影| 第五色色色婷婷| 久久六月综合| 丁香五月桃花在线激情综合| 大香蕉在线99热| 亚洲啪啪视频| 五月天电影网| 五月丁香婷婷基地| 人妻第九页| www.五月婷婷久久.com| 色色吧综合| 久99热| 99热这里只有精品66| 久久久com| 激情五月天99色| 色综合播放| 九九热re99re6在线精品| 碰超99| 性色九九| 色婷婷丁香网| 亚洲丁香五月天视频| 亚欧州精品视频| 新激情五月天| www.激情.com.| 噜噜吧天天爱| 强辱丰满人妻HD中文字幕| 91九色超碰| 五月丁香婷婷爱激情综合网| 99热99思午夜精品| 在线天堂9| 性爱111111| 99热6这里之有精品| 五月婷婷婷婷婷| 激情五月综合网| 98永久精品| 26uuuuuuuu国产| 免费无码毛片一区二区A片| 狠狠草狠狠草| 99热这里只有精| 青青草原伊人网| 99er精品视频| 日韩av手机在线观看| 国产探花一片区| a在线观看| 超碰爱爱爱| 九九综合五月欧美| 插插五月天| 综合色播| 91操人视频| 丁香五月婷婷av| 超级97碰碰| 丁香五月激情综合啪啪| caop在线视频| 香蕉大综综综合久久| 日日干日日色| 深爱激情六月天| 久9热视频在线观看| 极品 少妇 内射| 色99色| 五月丁香亚洲校园欧美| 色五月六月| 九九Y精品热播| 亚洲AV成人无码久久精品老人法拉利| 91狠狠色丁香婷婷综合久久精品| 五月天婷婷激情四射综合| 久热这里只有精品3| 婷婷五月激情丁香| 激情国产五月| 色婷婷五月综合网| 8050一级网| 五月婷婷丁香av| 91在线97视频| 激情五月www| 色五月噜噜| 噜噜色com| 日韩操啪| 囯产精品久久欠久久久久久九大| 九九热视频在线观看| 色五月超碰| 婷婷五月天丁香花| 久久66er久久| 99国产精品久久久久久久久久久|