精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis作者和分布式大神打架,最大的贏家竟然是吃瓜網(wǎng)友

新聞 數(shù)據(jù)庫運維 分布式 Redis
Redis 作者提出的 Redlock 的解決方案,另一位分布式系統(tǒng)的大神覺得它不靠譜,于是他們之間開始了 battle。

背景鋪墊

面試的時候,不管你的簡歷寫沒寫 Redis,它基本上是一個繞不過的話題。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

為了引出本文要討論的關于 Redlock 的神仙打架的問題,我們就得先通過一個面試連環(huán)炮:

1.Redis 做分布式鎖的時候有需要注意的問題?

2.如果是 Redis 是單點部署的,會帶來什么問題?

3.那你準備怎么解決單點問題呢?

4.集群模式下,比如主從模式,有沒有什么問題呢?

5.你知道 Redis 是怎么解決集群模式也不靠譜的問題的嗎?

6.那你簡單的介紹一下 Redlock 吧?

7.你覺得 Redlock 有什么問題呢?

很明顯,上面是一個常規(guī)的面試連環(huán)套路題。中間還可以插入很多其他的 Redis 的考察點,我這里就不做擴展了。

單點的 Redis 做分布式鎖不靠譜,導致了基于 Redis 集群模式的分布式鎖解決方案的出現(xiàn)。

基于 Redis 集群模式的分布式鎖解決方案還是不靠譜,Redis 的作者提出了 Redlock 的解決方案。

Redis 作者提出的 Redlock 的解決方案,另一位分布式系統(tǒng)的大神覺得它不靠譜,于是他們之間開始了 battle。

基于這場 battle,又引發(fā)了更多的討論。

這場 battle 難分伯仲,沒有最后的贏家。如果一定要選出誰是最大的贏家的話,那一定是吃瓜網(wǎng)友。因為對于吃瓜網(wǎng)友來說(比如我),可以從兩位大神的交鋒中學習到很多東西。

讓你深刻的體會到:看起來那么無懈可擊的想法,細細推敲之下,并不是那么天衣無縫。

[[318901]]最大的贏家竟然是吃瓜網(wǎng)友">

所以本文就按照下面的五個模塊展開講述。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

先來一波勸退:本文近1.2w字,謹慎觀看。看不下去不要緊,點個贊就是對于我最大的鼓勵。奧利給!

[[318903]]最大的贏家竟然是吃瓜網(wǎng)友">

單點Redis

按照我的經(jīng)驗,當面試聊到 Redis 的時候,百分之 90 的朋友都會說**:Redis在我們的項目中是用來做熱點數(shù)據(jù)緩存的**。

然后百分之百的面試官都會問:

Redis除了拿來做緩存,你還見過基于Redis的什么用法?

接下來百分之 80 的朋友都會說到:我們還用 Redis 做過分布式鎖。

(當然, Redis 除了緩存、分布式鎖之外還有非常非常多的奇技淫巧,不是本文重點,大家有興趣的可以自己去了解一下。)

那么面試官就會接著說:

那你給我描述(或者寫一下偽代碼)基于Redis的加鎖和釋放鎖的細節(jié)吧。

注意面試官這里說的是加鎖和釋放鎖的細節(jié),魔鬼都在細節(jié)里。

問這個問題面試官無非是想要聽到下面幾個關鍵點:

關鍵點一:原子命令加鎖。因為有的“年久失修”的文章中對于 Redis 的加鎖操作是先set key,再設置 key 的過期時間。這樣寫的根本原因是在早期的 Redis 版本中并不支持原子命令加鎖的操作。不是原子操作會帶來什么問題,就不用我說了吧?如果你不知道,你先回去等通知吧。

而在 2.6.12 版本后,可以通過向 Redis 發(fā)送下面的命令,實現(xiàn)原子性的加鎖操作:

SET key random_value NX PX 30000

關鍵點二:設置值的時候,放的是random_value。而不是你隨便扔個“OK”進去。

先解釋一下上面的命令中的幾個參數(shù)的含義:

random_value:是由客戶端生成的一個隨機字符串,它要保證在足夠長的一段時間內(nèi)在所有客戶端的所有獲取鎖的請求中都是唯一的。

NX:表示只有當要設置的 key 值不存在的時候才能 set 成功。這保證了只有第一個請求的客戶端才能獲得鎖,而其它客戶端在鎖被釋放之前都無法獲得鎖。

PX 30000:表示這個鎖有一個 30 秒的自動過期時間。當然,這里 30 秒只是一個例子,客戶端可以選擇合適的過期時間。

再解釋一下為什么 value 需要設置為一個隨機字符串。這也是第三個關鍵點。

關鍵點三:value 的值設置為隨機數(shù)主要是為了更安全的釋放鎖,釋放鎖的時候需要檢查 key 是否存在,且 key 對應的值是否和我指定的值一樣,是一樣的才能釋放鎖。所以可以看到這里有獲取、判斷、刪除三個操作,為了保障原子性,我們需要用 lua 腳本。

(基本上能答到這幾個關鍵點,面試官也就會進入下一個問題了。常規(guī)熱身送分題呀,朋友們,得記住了。)

[[318904]]最大的贏家竟然是吃瓜網(wǎng)友">

集群模式

面試官就會接著問了:

經(jīng)過剛剛的討論,我們已經(jīng)有較好的方法獲取鎖和釋放鎖。基于Redis單實例,假設這個單實例總是可用,這種方法已經(jīng)足夠安全。如果這個Redis節(jié)點掛掉了呢?

到這個問題其實可以直接聊到 Redlock 了。但是你別慌啊,為了展示你豐富的知識儲備(瘋狂的刷題準備),你得先自己聊一聊 Redis 的集群,你可以這樣去說:

[[318905]]最大的贏家竟然是吃瓜網(wǎng)友">

為了避免節(jié)點掛掉導致的問題,我們可以采用Redis集群的方法來實現(xiàn)Redis的高可用。

Redis集群方式共有三種:主從模式,哨兵模式,cluster(集群)模式

其中主從模式會保證數(shù)據(jù)在從節(jié)點還有一份,但是主節(jié)點掛了之后,需要手動把從節(jié)點切換為主節(jié)點。它非常簡單,但是在實際的生產(chǎn)環(huán)境中是很少使用的。

哨兵模式就是主從模式的升級版,該模式下會對響應異常的主節(jié)點進行主觀下線或者客觀下線的操作,并進行主從切換。它可以保證高可用。

cluster (集群)模式保證的是高并發(fā),整個集群分擔所有數(shù)據(jù),不同的 key 會放到不同的 Redis 中。每個 Redis 對應一部分的槽。

(上面三種模式也是面試重點,可以說很多道道出來,由于不是本文重點就不詳細描述了。主要表達的意思是你得在面試的時候遇到相關問題,需要展示自己是知道這些東西的,都是面試的套路。)

在上面描述的集群模式下還是會出現(xiàn)一個問題,由于節(jié)點之間是采用異步通信的方式。如果剛剛在 Master 節(jié)點上加了鎖,但是數(shù)據(jù)還沒被同步到 Salve。這時 Master 節(jié)點掛了,它上面的鎖就沒了,等新的 Master 出來后(主從模式的手動切換或者哨兵模式的一次 failover 的過程),就可以再次獲取同樣的鎖,出現(xiàn)一把鎖被拿到了兩次的場景。

鎖都被拿了兩次了,也就不滿足安全性了。一個安全的鎖,不管是不是分布式的,在任意一個時刻,都只有一個客戶端持有。

[[318906]]最大的贏家竟然是吃瓜網(wǎng)友">

Redlock簡介

為了解決上面的問題,Redis 的作者提出了名為 Redlock 的算法。

在 Redis 的分布式環(huán)境中,我們假設有 N 個 Redis Master。這些節(jié)點完全互相獨立,不存在主從復制或者其他集群協(xié)調(diào)機制。

前面已經(jīng)描述了在單點 Redis 下,怎么安全地獲取和釋放鎖,我們確保將在 N 個實例上使用此方法獲取和釋放鎖。

在下面的示例中,我們假設有 5 個完全獨立的 Redis Master 節(jié)點,他們分別運行在 5 臺服務器中,可以保證他們不會同時宕機。

從官網(wǎng)上我們可以知道,一個客戶端如果要獲得鎖,必須經(jīng)過下面的五個步驟:

步驟描述來源:http://redis.cn/topics/distlock.html

1.獲取當前 Unix 時間,以毫秒為單位。

2.依次嘗試從 N 個實例,使用相同的 key 和隨機值獲取鎖。在步驟 2,當向 Redis 設置鎖時,客戶端應該設置一個網(wǎng)絡連接和響應超時時間,這個超時時間應該小于鎖的失效時間。例如你的鎖自動失效時間為 10 秒,則超時時間應該在 5-50 毫秒之間。這樣可以避免服務器端 Redis 已經(jīng)掛掉的情況下,客戶端還在死死地等待響應結(jié)果。如果服務器端沒有在規(guī)定時間內(nèi)響應,客戶端應該盡快嘗試另外一個 Redis 實例。

3.客戶端使用當前時間減去開始獲取鎖時間(步驟 1 記錄的時間)就得到獲取鎖使用的時間。當且僅當從大多數(shù)(這里是 3 個節(jié)點)的 Redis 節(jié)點都取到鎖,并且使用的時間小于鎖失效時間時,鎖才算獲取成功。

4.如果取到了鎖,key 的真正有效時間等于有效時間減去獲取鎖所使用的時間(步驟 3 計算的結(jié)果)。

5.如果因為某些原因,獲取鎖失敗(沒有在至少 N/2+1 個Redis實例取到鎖或者取鎖時間已經(jīng)超過了有效時間),客戶端應該在所有的 Redis 實例上進行解鎖(即便某些 Redis 實例根本就沒有加鎖成功)。

通過上面的步驟我們可以知道,只要大多數(shù)的節(jié)點可以正常工作,就可以保證 Redlock 的正常工作。這樣就可以解決前面單點 Redis 的情況下我們討論的節(jié)點掛掉,由于異步通信,導致鎖失效的問題。

但是,還是不能解決故障重啟后帶來的鎖的安全性的問題。你想一下下面這個場景:

我們一共有 A、B、C 這三個節(jié)點。

1.客戶端 1 在 A,B 上加鎖成功。C 上加鎖失敗。

2.這時節(jié)點 B 崩潰重啟了,但是由于持久化策略導致客戶端 1 在 B 上的鎖沒有持久化下來。 客戶端 2 發(fā)起申請同一把鎖的操作,在 B,C 上加鎖成功。

3.這個時候就又出現(xiàn)同一把鎖,同時被客戶端 1 和客戶端 2 所持有了。

(接下來又得說一說Redis的持久化策略了,全是知識點啊,朋友們)

[[318907]]最大的贏家竟然是吃瓜網(wǎng)友">

比如,Redis 的 AOF 持久化方式默認情況下是每秒寫一次磁盤,即 fsync 操作,因此最壞的情況下可能丟失 1 秒的數(shù)據(jù)。

當然,你也可以設置成每次修改數(shù)據(jù)都進行 fsync 操作(fsync=always),但這會嚴重降低 Redis 的性能,違反了它的設計理念。(我也沒見過這樣用的,可能還是見的太少了吧。)

而且,你以為執(zhí)行了 fsync 就不會丟失數(shù)據(jù)了?天真,真實的系統(tǒng)環(huán)境是復雜的,這都已經(jīng)脫離 Redis 的范疇了。上升到服務器、系統(tǒng)問題了。

[[318908]]最大的贏家竟然是吃瓜網(wǎng)友">

所以,根據(jù)墨菲定律,上面舉的例子:由于節(jié)點重啟引發(fā)的鎖失效問題,總是有可能出現(xiàn)的。

為了解決這一問題,Redis 的作者又提出了延遲重啟(delayed restarts)的概念

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

意思就是說,一個節(jié)點崩潰后,不要立即重啟它,而是等待一定的時間后再重啟。等待的時間應該大于鎖的過期時間(TTL)。這樣做的目的是保證這個節(jié)點在重啟前所參與的鎖都過期。相當于把以前的帳勾銷之后才能參與后面的加鎖操作。

但是有個問題就是:在等待的時間內(nèi),這個節(jié)點是不對外工作的。那么如果大多數(shù)節(jié)點都掛了,進入了等待。就會導致系統(tǒng)的不可用,因為系統(tǒng)在TTL時間內(nèi)任何鎖都將無法加鎖成功。

Redlock 算法還有一個需要注意的點是它的釋放鎖操作。

釋放鎖的時候是要向所有節(jié)點發(fā)起釋放鎖的操作的。這樣做的目的是為了解決有可能在加鎖階段,這個節(jié)點收到加鎖請求了,也set成功了,但是由于返回給客戶端的響應包丟了,導致客戶端以為沒有加鎖成功。所以,釋放鎖的時候要向所有節(jié)點發(fā)起釋放鎖的操作。

你可能覺得這不是常規(guī)操作嗎?

有的細節(jié)就是這樣,說出來后覺得不過如此,但是有可能自己就是想不到這個點,導致問題的出現(xiàn),所以我們才會說:細節(jié),魔鬼都在細節(jié)里。

好了,簡介大概就說到這里,有興趣的朋友可以再去看看官網(wǎng),補充一下。

中文:http://redis.cn/topics/distlock.html英文:https://redis.io/topics/distlock

好了,經(jīng)過這么長,這么長的鋪墊,我們終于可以進入到神仙打架環(huán)節(jié)。

神仙打架

神仙一:Redis 的作者 antirez 。有的朋友對英文名字不太敏感,所以后面我就叫他卷發(fā)哥吧。

[[318909]]最大的贏家竟然是吃瓜網(wǎng)友">

神仙二:分布式領域?qū)<?Martin Kleppmann,我們叫他長發(fā)哥吧。

[[318910]]最大的贏家竟然是吃瓜網(wǎng)友">

看完上面兩位神仙的照片,再看看我為了寫這篇文章又日漸稀少的頭發(fā),我忍不住哭出聲來。可能只有給我點贊,才能平復我的心情吧。

卷發(fā)哥在官網(wǎng)介紹 Redlock 頁面的最后寫到:如果你也是使用分布式系統(tǒng)的人員,你的觀點和意見非常重要,歡迎和我們討論。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

于是,“求錘得錘”!這一錘,錘出了眾多的吃瓜網(wǎng)友,其中不乏在相關領域的專業(yè)人士。

[[318911]]最大的贏家竟然是吃瓜網(wǎng)友">

長發(fā)哥出錘

故事得從 2016年2月8號 長發(fā)哥發(fā)布的一篇文章《How to do distributed locking》說起:

文章地址:http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html

這一部分直接翻譯過來就是:

作為本書(《數(shù)據(jù)密集型應用系統(tǒng)設計》)研究的一部分,我在Redis網(wǎng)站上 看到了一種稱為Redlock的算法。該算法聲稱在Redis實現(xiàn)容錯的分布式鎖(或更確切地說, 租約),并且該頁面要求來自分布式系統(tǒng)人員的反饋。這個算法讓我產(chǎn)生了一些思考,因此我花了一些時間寫了我的這篇文章。由于Redlock已經(jīng)有10多個獨立的實現(xiàn),而且我們不知道誰已經(jīng)在依賴此算法,因此我認為值得公開分享我的筆記。我不會討論Redis的其他方面,其中一些已經(jīng)在其他地方受到了批評 。

你看這個文章,開頭就是火藥味十足:你說要反饋,那我就給你反饋。而且你這個東西有其他問題,我也就不說了。(其實作者在這篇文章中也說了,他很喜歡并且也在使用 Redis,只是他覺得這個 Redlock 算法是不嚴謹?shù)模?/p>

長發(fā)哥主要圍繞了下面的這張圖進行了展開:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

要是一眼沒看明白,我再給你一個中文版的,來自長發(fā)哥于2017年出版的書《數(shù)據(jù)密集型應用系統(tǒng)設計》:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

可以看到上面的圖片中提到了申請租約、租約到期的關鍵詞,租約其實就是可以理解為帶超時時間的鎖。

而在書中,這張圖片的下面寫的描述這樣的,你咂摸咂摸:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

拿 HBase 舉例,其設計的目標是確保存儲系統(tǒng)的文件一次只能由一個客戶端訪問,如果多個客戶端試圖同時寫入該文件,文件就會被破壞。那么上面的圖片解釋起來就是:

1.客戶端 1 先去申請鎖,并且成功獲取到鎖。之后客戶端進行了長時間的 GC 導致了 STW 的情況。

2.在 STW 期間,客戶端 1 獲取的鎖的超時時間到了,鎖也就失效了。

3.由于客戶端 1 的鎖已經(jīng)過期失效了,所以客戶端 2 去申請鎖就可以成功獲得鎖。

4.客戶端 2 開始寫文件,并完成文件的寫入。

5.客戶端 1 從 STW 中恢復過來,他并不知道自己的鎖過期了,還是會繼續(xù)執(zhí)行文件寫入操作,導致客戶端 2 寫入的文件被破壞。而且可以看到,它沒有滿足鎖在任意時刻只有一個客戶端持有的原則,即沒有滿足互斥性。

書里面沒有明說,但是你品一品,這里的鎖服務難道不是在說 Redis?

有的朋友就會說了,那客戶端 1 寫入文件的時候,再判斷一下自己的鎖有沒有過期不就可以了嗎?

你可真是個小機靈鬼呢,那我問你,GC 可能是發(fā)生在任何時間的,萬一 GC 發(fā)生在判斷之后呢?

你繼續(xù)懟我,如果客戶端使用的是沒有 GC 的語言呢?

[[318913]]最大的贏家竟然是吃瓜網(wǎng)友">

**GC 不是導致線程暫停的唯一原因啊,朋友們。**發(fā)生這種情況的原因有很多的,你看看長發(fā)哥書里舉的例子:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

上面的內(nèi)容總結(jié)起來,就是就算鎖服務是正常的,但是由于鎖是有持有時間的,由于客戶端阻塞、長時間的 GC 或者網(wǎng)絡原因,導致共享資源被一個以上的客戶端同時訪問了。

其實上面長發(fā)哥在書里直接說了:這是不正確的實現(xiàn)。

你多品一品,上面的圖是不是有點像由于 Redis 鎖的過期時間設置的不合理,導致前一個任務還沒執(zhí)行完成,但是鎖的時間到期了,后一個任務也申請到了鎖。

對于這種場景,Redission 其實有自己的看門狗機制。但是不在這次 Redlock 的討論范圍內(nèi),所以這里就不描述了。

長發(fā)哥提出的解決方案是什么呢?

他稱為:fencing token。

長發(fā)哥認為使用鎖和租約機制來保護資源的并發(fā)訪問時,必須確保因為異常原因,導致鎖過期的那個節(jié)點不能影響其他正常的部分,要實現(xiàn)這一目標,可以采用一直相當簡單的 fencing(柵欄)。

[[318914]]最大的贏家竟然是吃瓜網(wǎng)友">

假設每次鎖服務在授予鎖或者租約時,還會同時返回一個 fencing 令牌,該令牌每次授予都會遞增。

然后,要求客戶端每次向存儲系統(tǒng)發(fā)送寫請求時,都必須包含所持有的 fencing 令牌。存儲系統(tǒng)需要對令牌進行校驗,發(fā)現(xiàn)如果已經(jīng)處理過更高令牌的請求,則拒絕執(zhí)行該請求。

比如下面的圖片:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

1.客戶端 1 獲得一個具有超時時間的鎖的同時得到了令牌號 33,但隨后陷入了一個長時間的暫停直到鎖到期。

2.這時客戶端2已經(jīng)獲得了鎖和令牌號 34 ,然后發(fā)送寫請求(以及令牌號 34 )到存儲服務。

3.接下來客戶端 1 恢復過來,并以令牌號 33 來嘗試寫入,存儲服務器由于記錄了最近已經(jīng)完成了更高令牌號(34 ),因此拒絕令牌號 33 的寫請求。

這種版本號的機制,讓我不禁想起了 Zookeeper。當使用 ZK 做鎖服務時,可以用事務標識 zxid 或節(jié)點版本 cversion 來充當 fencing 令牌,這兩個都可以滿足單調(diào)遞增的要求。

在長發(fā)哥的這種機制中,實際上就是要求資源本身必須主動檢查請求所持令牌信息,如果發(fā)現(xiàn)已經(jīng)處理過更高令牌的請求,要拒絕持有低令牌的所有寫請求。

但是,不是所有的資源都是數(shù)據(jù)庫里面的數(shù)據(jù),我們可以通過版本號去支持額外的令牌檢查的,那么對于不支持額外的令牌檢查資源,我們也可以借助這種思想繞過這個限制,比如對于訪問文件存儲服務的情況,我們可以將令牌嵌入到文件名中。

總之,為了避免在鎖保護之外發(fā)生請求處理,需要進行額外的檢查機制。

長發(fā)哥在書中也說到了:在服務端檢查令牌可能看起來有點復雜,但是這其實是推薦的正確的做法:系統(tǒng)服務不能假定所有的客戶端都表現(xiàn)的符合預期。從安全角度講,服務端必須防范這種來自客戶端的濫用。

這個就類似于我們作為后端開發(fā)人員,也不能相信來自前端或者其他接口過來的數(shù)據(jù),必須對其進行校驗。

到這里長發(fā)哥鋪墊完成了,開始轉(zhuǎn)頭指向 RedLock,他認為 Redlock 是一個嚴重依賴系統(tǒng)時鐘的分布式鎖。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

他舉了一個例子:

1.客戶端 1 從 Redis 節(jié)點 A, B, C 成功獲取了鎖。由于網(wǎng)絡問題,無法訪問 D 和 E。

2.節(jié)點 C 上的時鐘發(fā)生了向前跳躍,導致它上面維護的鎖過期了。

3.客戶端 2 從 Redis 節(jié)點 C, D, E 成功獲取了同一個資源的鎖。由于網(wǎng)絡問題,無法訪問 A 和 B。 現(xiàn)在,客戶端 1 和客戶端 2 都認為自己持有了鎖。

這樣的場景是可能出現(xiàn)的,因為 Redlock 嚴重依賴系統(tǒng)時鐘,所以一旦系統(tǒng)的時間變得不準確了,那么該算法的安全性也就得不到保障了。

長發(fā)哥舉這個例子其實是為了輔佐他前面提出的觀點:一個好的分布式算法應該是基于異步模型的,算法的安全性不應該依賴與任何記時假設,就是不能把時間作為安全保障的。在異步模型中,程序暫停、消息在網(wǎng)絡中延遲甚至丟失、系統(tǒng)時間錯誤這些因素都不應該影響它的安全性,只能影響到它的活性。

用大白話說,就是在極其極端的情況下,分布式系統(tǒng)頂天了也就是在有限的時間內(nèi)不能給出結(jié)果而已,而不能給出一個錯誤的結(jié)果。

這樣的算法實際上是存在的,比如 Paxos、Raft。很明顯,按照這個標準, Redlock 的安全級別是不夠的。

而對于卷發(fā)哥提出的延遲啟動方案,長發(fā)哥還是一棒子打死:你延遲啟動咋的?延遲啟動還不是依賴于合理準確的時間度量。

[[318915]]最大的贏家竟然是吃瓜網(wǎng)友">

可能是長發(fā)哥覺得舉這個時鐘跳躍的例子不夠好的,大家都可能認為時鐘跳躍是不現(xiàn)實的,因為對正確配置NTP就能擺正時鐘非常有信心。

在這種情況下,他舉了一個進程暫停可能導致算法失敗的示例:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

1.客戶端 1 向 Redis 節(jié)點 A, B, C, D, E 發(fā)起鎖請求。

2.各個 Redis 節(jié)點已經(jīng)把請求結(jié)果返回給了客戶端 1,但客戶端 1 在收到請求結(jié)果之前進入了長時間的 GC 階段。

3.長時間的 GC,導致在所有的 Redis 節(jié)點上,鎖過期了。

4.客戶端 2 在 A, B, C, D, E 上申請并獲取到了鎖。

5.客戶端 1 從 GC 階段中恢復,收到了前面第 2 步來自各個 Redis 節(jié)點的請求結(jié)果。客戶端 1 認為自己成功獲取到了鎖。

6.客戶端 1 和客戶端 2 現(xiàn)在都認為自己持有了鎖。

其實只要十分清楚 Redlock 的加鎖過程,我們就知道,這種情況其實對于 Redlock 是沒有影響的,因為在第 5 步,客戶端 1 從 GC 階段中恢復過來以后,在 Redlock 算法中,(我們前面 Redlock 簡介的時候提到的第四步)如果取到了鎖,key 的真正有效時間等于有效時間減去獲取鎖所使用的時間。

所以客戶端1通過這個檢查發(fā)現(xiàn)鎖已經(jīng)過期了,不會再認為自己成功獲取到鎖了。

而隨后卷發(fā)哥的回擊中也提到了這點。

[[318916]]最大的贏家竟然是吃瓜網(wǎng)友">

但是,細細想來,我覺得長發(fā)哥的意圖不在于此。拋開上面的問題來講,他更想突出的是,一個鎖在客戶端拿到后,還沒使用就過期了,這是不好的。從客戶端的角度來看,就是這玩意不靠譜啊,你給我一把鎖,我還沒用呢,你就過期了?

[[318917]]最大的贏家竟然是吃瓜網(wǎng)友">

除了上面說的這些點外,長發(fā)哥還提出了一個算是自己的經(jīng)驗之談吧:

我們獲取鎖的用途是什么?

在他看來不外乎兩個方面,效率和正確性。他分別描述如下:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

如果是為了效率,那么就是要協(xié)調(diào)各個客戶端,避免他們做重復的工作。這種場景下,即使鎖偶爾失效了,只是可能出現(xiàn)兩個客戶端完成了同樣的工作,其結(jié)果是成本略有增加(您最終向 AWS 支付的費用比原本多5美分),或者帶來不便(例如,用戶最終兩次收到相同的電子郵件通知)。

如果是為了正確性,那么在任何情況下都不允許鎖失效的情況發(fā)生,因為一旦發(fā)生,就可能意味著數(shù)據(jù)不一致,數(shù)據(jù)丟失,文件損壞,或者其它嚴重的問題。(比如個患者注射了兩倍的藥劑)

最后,長發(fā)哥得出的結(jié)論是:neither fish nor fowl(不倫不類)

對于提升效率的場景下,使用分布式鎖,允許鎖的偶爾失效,那么使用單 Redis 節(jié)點的鎖方案就足夠了,簡單而且效率高。用 Redlock 太重。

對于正確性要求高的場景下,它是依賴于時間的,不是一個足夠強的算法。Redlock并沒有保住正確性。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

那應該使用什么技術(shù)呢?

長發(fā)哥認為,應該考慮類似 Zookeeper 的方案,或者支持事務的數(shù)據(jù)庫。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

卷發(fā)哥回擊

長發(fā)哥發(fā)出《How to do distributed locking》這篇文章的第二天,卷發(fā)哥就進行了回擊,發(fā)布了名為《Is Redlock safe?》的文章。

文章地址:http://antirez.com/news/101

要說大佬不愧是大佬,卷發(fā)哥的回擊條理清楚,行文流暢。他總結(jié)后認為長發(fā)哥覺得 Redlock 不安全主要分為兩個方面:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

1.帶有自動過期功能的分布式鎖,需要一種方法(fencing機制)來避免客戶端在過期時間后使用鎖時出現(xiàn)問題,從而對共享資源進行真正的互斥保護。長發(fā)哥說Redlock沒有這種機制。

2.長發(fā)哥說,無論問題“1”如何解決,該算法本質(zhì)上都是不安全的,因為它對系統(tǒng)模型進行了記時假設,而這些假設在實際系統(tǒng)中是無法保證的。

對于第一個點,卷發(fā)哥列了5大點來反駁這個問題,其中一個重要的觀點是他認為雖然 Redlock 沒有提供類似于fencing機制那樣的單調(diào)遞增的令牌,但是也有一個隨機串,把這個隨機串當做token,也可以達到同樣的效果啊。當需要和共享資源交互的時候,我們檢查一下這個token是否發(fā)生了變化,如果沒有再執(zhí)行“獲取-修改-寫回”的操作。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

最終得出的結(jié)論是一個靈魂反問:既然在鎖失效的情況下已經(jīng)存在一種fencing機制能繼續(xù)保持資源的互斥訪問了,那為什么還要使用一個分布式鎖并且還要求它提供那么強的安全性保證呢?

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">
[[318918]]最大的贏家竟然是吃瓜網(wǎng)友">

然而第二個問題,對于網(wǎng)絡延遲或者 GC 暫停,我們前面分析過,對 Redlock 的安全性并不會產(chǎn)生影響,說明卷發(fā)哥在設計的時候其實是考慮過時間因素帶來的問題的。

但是如果是長發(fā)哥提出的時鐘發(fā)生跳躍,很明顯,卷發(fā)哥知道如果時鐘發(fā)生跳躍, Redlock 的安全性就得不到保障,這是他的命門。

但是對于長發(fā)哥寫時鐘跳躍的時候提出的兩個例子:

1.運維人員手動修改了系統(tǒng)時鐘。

2.從NTP服務收到了一個大的時鐘更新事件。

卷發(fā)哥進行了回擊:

第一點這個運維人員手動修改時鐘,屬于人為因素,這個我也沒辦法啊,人家就是要搞你,怎么辦?加強管理,不要這樣做。

第二點從NTP服務收到一個大的時鐘更新,對于這個問題,需要通過運維來保證。需要將大的時間更新到服務器的時候,應當采取少量多次的方式。多次修改,每次更新時間盡量小。

關于這個地方的爭論,就看你是信長發(fā)哥的時間一定會跳躍,還是信卷發(fā)哥的時間跳躍我們也是可以處理的。

關于時鐘跳躍,有一篇文章可以看看,也是這次神仙打架導致的產(chǎn)物:

https://jvns.ca/blog/2016/02/09/til-clock-skew-exists/

文章得出的最終結(jié)論是:時鐘跳躍是存在的。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

其實我們大家應該都經(jīng)歷過時鐘跳躍的情況,你還記得2016年的最后一天,當時有個“閏秒”的概念嗎?導致2017年1月1日出現(xiàn)了07:59:60的奇觀。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

打架的焦點

經(jīng)過這樣的一來一回,其實雙方打架的焦點就很明確了,就是大延遲對分布式鎖帶來的影響。

而對于大延遲給Redlock帶來的影響,就是長發(fā)哥分析的那樣,鎖到期了,業(yè)務還沒執(zhí)行完。卷發(fā)哥認為這種影響不單單針對 Redlock ,其他具有自動釋放鎖的分布式鎖也是存在一樣的問題。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

而關于大延遲的問題,我在某社交平臺上找到了兩位神仙的下面的對話:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

卷發(fā)哥問:我想知道,在我發(fā)文回復之后,我們能否在一點上達成一致,就是大的消息延遲不會給Redlock的運行造成損害。

長發(fā)哥答:對于客戶端和鎖服務器之間的消息延遲,我同意你的觀點。但客戶端和被訪問資源之間的延遲還是有問題的。

所以通過卷發(fā)哥的回擊文章和某社交平臺的記錄,他是同意大的系統(tǒng)時鐘跳躍會造成 Redlock 失效的。在這一點上,他與長發(fā)哥的觀點的不同在于,他認為在實際系統(tǒng)中是可以通過好的運維方式避免大的時鐘跳躍的。

[[318919]]最大的贏家竟然是吃瓜網(wǎng)友">

所以到這里,兩位神仙好像又達到了一個平衡,實現(xiàn)了爭論上的求同存異。

打架總結(jié)

作為一個互聯(lián)網(wǎng)行業(yè)的從業(yè)者,也是分布式系統(tǒng)的使用者,讀完他們的文章以及由此文章衍生出來的知識點后,受益良多,于是寫下此文作為學習總結(jié),也與大家分享。本文還有很多不足之處,還請各位海涵。

如同文章開篇說的,這場爭論沒有最后的贏家。很明顯卷發(fā)哥是沒有說服長發(fā)哥的,因為在長發(fā)哥2017年出版的《數(shù)據(jù)密集型應用系統(tǒng)設計》一書中,專門有一小節(jié)的名稱叫做:不可靠的時鐘

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

其實在這場爭論的最后,長發(fā)哥對這場爭論進行了一個非常感性的總結(jié),他說:

下面翻譯來自:https://www.jianshu.com/p/dd66bdd18a56

對我來說最重要的一點在于:我并不在乎在這場辯論中誰對誰錯 —— 我只關心從其他人的工作中學到的東西,以便我們能夠避免重蹈覆轍,并讓未來更加美好。前人已經(jīng)為我們創(chuàng)造出了許多偉大的成果:站在巨人的肩膀上,我們得以構(gòu)建更棒的軟件。

對于任何想法,務必要詳加檢驗,通過論證以及檢查它們是否經(jīng)得住別人的詳細審查。那是學習過程的一部分。但目標應該是為了獲得知識,而不應該是為了說服別人相信你自己是對的。有時候,那只不過意味著停下來,好好地想一想。

[[318921]]最大的贏家竟然是吃瓜網(wǎng)友">

吃瓜網(wǎng)友的收獲

這里的吃瓜網(wǎng)友就是指我啦。

寫這篇文章我的收獲還是挺大的,首先我買了長發(fā)哥的《數(shù)據(jù)密集型應用系統(tǒng)設計》一書,讀了幾節(jié),發(fā)現(xiàn)這書是真的不錯,豆瓣評分9.6,推薦。

其次完成了這周的周更任務,雖然寫的很艱難,從周六中午,寫到周日凌晨3點。。。

然后還吃到了另外的一個瓜,可謂是瓜中瓜。

這周五的時候 Redis 官網(wǎng)不是出現(xiàn)了短暫的宕機嗎,宕機其實也沒啥稀奇的,但是頁面上顯示的是連不上 Redis 。這就有點意思了。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

我在寫這篇文章的時候,在卷發(fā)哥的某社交平臺上發(fā)現(xiàn)了這個:

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

我關心的并不是 OOM,而是卷發(fā)哥居然讓 Redis 官網(wǎng)運行在一臺一個月僅 5 美元,內(nèi)存只有 1G 的虛擬機上。哈哈哈,震驚,這瓜味道不錯。

最后,由于卷發(fā)哥是個意大利人,由于最近疫情,四川專家組馳援意大利的事,big thank 中國人。其實這個網(wǎng)友的回答挺好的:投桃報李。

Redis作者和分布式大神打架,<span><span><span><i style=最大的贏家竟然是吃瓜網(wǎng)友">

疫情早點過去吧,世界和平。

最后說一句

我寫到這里的時候,不知不覺已經(jīng)凌晨3點多了,但是因為一直跟著這兩位大神的激烈討論,我的思維異常的清晰。

寫完之后我也說不出誰對誰錯。我覺得對于系統(tǒng)的設計,每個人的出發(fā)點都不一樣,沒有完美的架構(gòu),沒有普適的架構(gòu),但是在完美和普適能平衡的很好的架構(gòu),就是好的架構(gòu)。

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2018-07-06 00:09:47

2018-11-28 09:14:41

交換機網(wǎng)絡安防

2019-06-19 15:40:06

分布式鎖RedisJava

2015-08-24 10:31:14

Windows 10功能

2022-01-03 18:24:50

密碼單詞摩爾斯

2020-09-29 06:45:49

JDK

2016-09-25 14:34:10

蘋果谷歌亞馬遜

2015-06-18 11:04:58

2020-12-15 08:05:40

路由器服務器網(wǎng)絡層

2021-07-28 06:51:08

Nacos代理模式

2024-08-05 01:28:26

2024-09-27 11:38:49

2021-06-03 00:02:43

RedisRedlock算法

2021-07-30 00:09:21

Redlock算法Redis

2021-09-17 07:51:24

RedissonRedis分布式

2021-10-18 13:42:52

加密貨幣金融工具

2023-03-13 08:09:03

Protobuffeature分割

2015-07-07 10:39:02

2022-06-16 08:01:24

redis分布式鎖
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲香蕉伊在人在线观| 国产精品主播直播| 日韩一区av在线| 国产一级二级av| videos性欧美另类高清| 国产精品国产三级国产普通话三级 | 欧美天天视频| 国产午夜精品美女视频明星a级| 四季av一区二区三区| 136福利第一导航国产在线| www国产亚洲精品久久麻豆| 91精品免费看| 99精品人妻国产毛片| 91青青国产在线观看精品| 亚洲电影天堂av| 成人av毛片在线观看| 2022成人影院| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩一区在线播放| 国产黄a三级三级看三级| 老司机精品久久| 久久精品中文字幕电影| 中文字幕 自拍| 麻豆成人入口| 欧美一级xxx| 成人亚洲精品777777大片| 国模精品视频| 中文字幕亚洲区| 欧美日韩精品一区| 人妻偷人精品一区二区三区| 国模娜娜一区二区三区| 日本欧美在线视频| 欧美亚洲精品天堂| 自拍偷拍欧美专区| 久久精品视频99| 国产主播av在线| 国产伦精品一区二区三区视频| 精品999在线播放| 中文字幕永久免费| 欧美日本三级| 欧美一级一区二区| 一级日本黄色片| 国产精品毛片无码| 欧美日韩国产天堂| 中文字幕 91| 激情中国色综合| 欧美日韩一区在线观看| 高清一区二区视频| 不卡亚洲精品| 欧美在线观看你懂的| 免费av网址在线| 乱馆动漫1~6集在线观看| 亚洲r级在线视频| 国产欧美日韩网站| 激情国产在线| 色偷偷一区二区三区| 国产女女做受ⅹxx高潮| 日韩国产激情| 日本久久一区二区三区| 丰满少妇在线观看| 久久久免费人体| 337p亚洲精品色噜噜狠狠| 毛片毛片毛片毛| 欧美a在线观看| 精品国产91九色蝌蚪| 黄色av网址在线观看| 韩国av永久免费| 国产99久久久国产精品潘金网站| 91|九色|视频| 色欲久久久天天天综合网 | 97碰碰视频| www.午夜激情| 不卡一卡二卡三乱码免费网站| 国产精品视频免费一区二区三区| 天天干视频在线观看| 久久久久亚洲综合| 一本色道久久综合亚洲二区三区| 麻豆传媒免费在线观看| 亚洲最新在线观看| 久久久999视频| 99只有精品| 日韩一级片网址| av网站有哪些| 久久伦理在线| 午夜精品久久久久久久99热 | 欧美日韩国产免费| 亚洲最大视频网| 久久不见久久见国语| 色久欧美在线视频观看| 九九热只有精品| 模特精品在线| 亚洲japanese制服美女| 日韩偷拍自拍| 亚洲视频在线观看三级| 熟女少妇在线视频播放| 亚洲精品66| 国产婷婷97碰碰久久人人蜜臀| 成人欧美一区二区三区黑人一| 在线观看视频日韩| 国产噜噜噜噜久久久久久久久| 亚洲精品国产片| 欧美韩国日本不卡| 日本精品久久久久久久久久| 成人在线高清| 亚洲激情中文字幕| 中国毛片直接看| 久久免费国产| 国产精品久久国产精品| 天堂地址在线www| 懂色aⅴ精品一区二区三区蜜月 | 99精品视频一区| 青青草原国产免费| 美女福利一区二区| 欧美xxxxxxxxx| www.99re6| 美女精品在线| 精品综合在线| 日本h片在线观看| 欧美高清性hdvideosex| 国产 欧美 在线| 亚洲激情专区| wwwxx欧美| 精产国品自在线www| 91黄色激情网站| 好吊色视频一区二区三区| 伊人久久大香线蕉综合四虎小说 | 久久久久久久性| 免费无码毛片一区二三区| 91精品国产一区二区在线观看| 亚洲色图17p| 亚洲免费黄色网址| www.99精品| www.日本少妇| 66精品视频在线观看| 久久视频这里只有精品| 夜夜躁狠狠躁日日躁av| 亚洲国产精品ⅴa在线观看| 欧美日韩第二页| 欧美日韩123| 人体精品一二三区| 国产在线视频网| 91传媒视频在线播放| 精品人妻互换一区二区三区| 亚洲欧美日韩国产| 久久精品日产第一区二区三区乱码 | 情侣黄网站免费看| 综合伊思人在钱三区| 欧美中文字幕精品| 九九九伊在人线综合| 色哟哟亚洲精品| 久久午夜福利电影| 免费人成精品欧美精品| 色一情一区二区三区四区| 成人免费网站www网站高清| 亚洲天天在线日亚洲洲精| 日韩在线视频不卡| 国产免费成人在线视频| 亚洲另类第一页| 888久久久| 国产高清一区视频| 忘忧草在线影院两性视频| 日韩成人免费视频| 久久精品视频2| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美日韩五区| 久久亚洲精品视频| 亚洲欧美激情另类| 欧美日韩国产在线播放| 天堂久久精品忘忧草| 蜜桃视频一区二区三区| 亚洲天堂av免费在线观看| 日韩在线观看中文字幕| 97avcom| 电影av在线| 欧美一级日韩免费不卡| 免费毛片一区二区三区| 久久亚洲欧美国产精品乐播 | 国产成人精品影视| 波多野结衣家庭教师在线| 禁断一区二区三区在线| 成人性生交大片免费看视频直播| 免费影视亚洲| 亚洲天堂日韩电影| 国产日韩在线观看一区| 偷拍日韩校园综合在线| 国产极品视频在线观看| 成人性生交大片免费看视频在线| 欧美性大战久久久久xxx | 综合伊人久久| 日本精品视频网站| 亚洲男同gay网站| 日韩精品极品在线观看| 夜夜躁很很躁日日躁麻豆| 五月天网站亚洲| 亚洲AV成人无码网站天堂久久| 国产91色综合久久免费分享| 熟女少妇精品一区二区| 国产综合欧美| 一道精品一区二区三区| 欧美亚洲国产日韩| 91精品视频在线看| 韩国成人动漫| 久久久久久久久爱| 色哟哟免费在线观看| 日韩精品在线免费播放| www.激情五月| 欧美日本一区二区三区四区| 国产又大又黄视频| 亚洲自拍偷拍网站| 91视频免费在观看| 91在线观看污| 日本一区二区免费视频| 国模一区二区三区白浆| 热久久精品免费视频| 日韩午夜电影| 国内少妇毛片视频| 999久久久国产精品| 日本不卡一区| 日韩极品在线| 国产乱码精品一区二区三区卡| 亚洲日本中文| 国产精品永久在线| 成人自拍av| 欧美在线视频免费观看| missav|免费高清av在线看| 九色精品免费永久在线| 黄网站视频在线观看| 丝袜情趣国产精品| a视频网址在线观看| 亚洲片在线资源| 欧美一区二区视频| 亚洲免费av网址| 婷婷婷国产在线视频| 亚洲欧美电影一区二区| 国产又黄又粗的视频| 国产亚洲午夜高清国产拍精品| www.超碰97| 91社区在线播放| 添女人荫蒂视频| 91丝袜美腿高跟国产极品老师| 久久久久成人精品无码中文字幕| 国产不卡视频在线播放| 无码人妻一区二区三区免费n鬼沢| 国产高清不卡一区二区| 亚洲精品成人无码毛片| 成人av在线影院| 久久久久亚洲AV成人无码国产| 成人精品免费网站| 99re久久精品国产| www国产成人免费观看视频 深夜成人网| a级一a一级在线观看| av不卡在线观看| 国产精品1000部啪视频| 久久精品亚洲乱码伦伦中文| japanese中文字幕| 中文文精品字幕一区二区| 萌白酱视频在线| 一区二区三区高清不卡| 日干夜干天天干| 日韩欧美国产骚| 中文字幕有码视频| 欧美一区二区三区在线电影| 亚洲爱爱综合网| 亚洲国产黄色片| 久久久资源网| 日韩专区在线播放| 密臀av在线| 国产成人精品av在线| 91精品国产经典在线观看| 91久久精品美女高潮| 亚洲天堂av资源在线观看| 国产综合精品一区二区三区| 国产影视精品一区二区三区| 亚洲精品一区二区三区樱花| 欧美精品国产一区| 日韩欧美在线播放视频| 久久国产精品色| 午夜不卡久久精品无码免费| 国产日韩欧美高清在线| 国产高清在线免费观看| 欧美日韩激情视频8区| 伊人免费在线观看高清版| 欧美v亚洲v综合ⅴ国产v| 国产精品免费观看| 欧美国产乱视频| 激情开心成人网| 久久精品国产亚洲av香蕉| 内射中出日韩无国产剧情| 国产免费无遮挡| 久久久综合色| 欧美成ee人免费视频| 日韩激情免费| 18禁裸男晨勃露j毛免费观看| 美女精品一区| 男人的天堂免费| 日本一区免费视频| 日本三级黄色大片| 欧美日韩aaaaa| 天堂a中文在线| 久久精品最新地址| 欧美片第1页| 成人羞羞视频免费| 久久精品播放| 成人在线免费在线观看| 国产精品一二三区| 日韩福利在线视频| 欧美日韩性视频在线| 国产成人精品av在线观| 有码中文亚洲精品| 国产欧洲在线| 91精品天堂| 日韩欧美字幕| 国产福利一区视频| 99精品国产一区二区三区不卡| 亚洲AV成人无码精电影在线| 色婷婷精品大视频在线蜜桃视频| 午夜精品久久久久久久爽| 日韩在线免费视频| 澳门av一区二区三区| 久久精品日产第一区二区三区| 影视亚洲一区二区三区| 亚洲欧美偷拍另类| 日本一区二区三区国色天香 | 少妇人妻偷人精品一区二区| 欧美成年人视频| 成人全视频在线观看在线播放高清 | 婷婷久久综合九色国产成人| 国产成人免费看一级大黄| 最新日韩中文字幕| 欧美日韩激情电影| 欧美系列一区| 久久久噜噜噜久久狠狠50岁| 最新在线黄色网址| 亚洲va韩国va欧美va精品| 亚洲免费视频网| 欧美国产一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 国产美女视频免费| 韩国成人在线视频| 99自拍视频在线| 678五月天丁香亚洲综合网| 韩国中文字幕在线| 亚洲xxxx3d| 国产精品99免费看| 午夜福利三级理论电影 | 国产手机免费视频| 波多野结衣在线aⅴ中文字幕不卡| 九九热精品免费视频| 精品久久五月天| √最新版天堂资源网在线| 国产在线一区二| 午夜影院日韩| 舐め犯し波多野结衣在线观看| 在线观看视频91| av二区在线| 成人精品福利视频| 欧美成人午夜| 艳妇乳肉豪妇荡乳xxx| 好吊成人免视频| 大片免费播放在线视频| 国产日韩精品在线播放| 牛夜精品久久久久久久99黑人| 精产国品一二三区| 亚洲高清免费在线| 美州a亚洲一视本频v色道| 国产精品免费观看在线| 天天射天天综合网| 国产又粗又猛又色| 欧美主播一区二区三区| 老司机午夜在线视频| 成人h视频在线观看| 免费精品视频| 美女视频久久久| 亚洲精品在线免费播放| 345成人影院| 超碰在线免费观看97| k8久久久一区二区三区| 97人妻精品视频一区| 欧美成人精品激情在线观看| 久久精品色综合| 国产aaaaa毛片| 亚洲一区在线观看免费| 欧美伦理影视网| 91av免费看| 日本不卡在线视频| 久久精品久久精品久久| 色一情一乱一区二区| 成人av动漫| 中文字幕有码av| 亚洲成人免费观看| av在线收看| 国产在线精品一区| 久久草av在线| 国产精品男女视频| 欧美精品在线免费观看| 国产欧美日韩影院| 国内自拍偷拍视频| 欧美三级电影网| 国产精品25p| 久久视频免费在线|