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

分布式鎖實戰-基于Etcd的實現很優雅

開發 后端
雖然Kubernetes 給云原生時代帶來了顛覆性的新氣象,但卻很少人了解被欽定作為其后端存儲的 etcd ,本篇從分布式鎖視角梳理etcd的各種機制,探索基于etcd的鎖實現是怎樣。

一、etcd 簡介

1. etcd 的背景

雖然Kubernetes 給云原生時代帶來了顛覆性的新氣象,但卻很少人了解被欽定作為其后端存儲的 etcd ,本篇從分布式鎖視角梳理etcd的各種機制,探索基于etcd的鎖實現是怎樣。

etcd 能被Kubernetes 如此青睞,是因為它一直在聆聽社區的聲音并快速改進,積極配合 Kubernetes 項目向前推進,解決社區反饋的痛點;發起 V2 到 V3 的重大版本更新,尤其是 19 年由 Google、Alibaba 等公司聯合打造的 3.4 版本,滿足了 Kubernetes 在超大型公司大規模使用中嚴苛的可用性、擴展性和性能等要求。

圖片

上圖描述了 etcd 名字的由來,其寓意是為大規模分布式系統提供存儲配置信息;華為 Kubernetes 專家杜軍老師專門為 etcd 著書《云原生分布式存儲基石-etcd》,稱它基石足見何等重要,另一位大咖etcd 的作者李響老師曾講:“etcd 就是用來存儲云上最重要的數據的”;相信隨著云原生架構的演進,etcd 會擔任越來越多重要的角色;技術人員在云原生時代,除了擁抱 Kubernetes,也要擁抱 etcd。

2.etcd vs ZooKeeper

很長一段時間 ZooKeeper(后文簡稱 ZK) 被作為默認首選項,用于解決分布式系統的協同和元數據存儲,但其太復雜、迭代慢、難維護、性能缺陷等問題逐漸成為槽點;而 etcd 吸取了 ZK 的教訓,從設計和實現上具有后見之明,提供了更好的工程和運維體驗,其主要改進在于如下幾個方面:

  • 動態的集群節點關系重配置
  • 高負載條件下的穩定讀寫
  • 多版本并發控制的數據模型
  • 持久、穩定的監聽機制
  • 租約 (lease) 原語實現了連接與會話的解耦
  • 安全的分布式共享鎖 API
  • 普適的 HTTP 、GRPC 通信協議

據說在一個由 3 臺 8 核節點組成的云服務器上, etcd v3 版本可以做到每秒數萬次的寫操作和數十萬次的讀操作(ZK:圖片);后續會有其他篇章結合QA的測試結果來探討etcd服務端的設計和性能情況。

3.etcd 特性介紹

為滿足本篇目標所需,也考慮到對 etcd 熟悉的讀者不多,這里著重介紹以下幾個關鍵特性:

  • 數據組織:etcd 在 V2 版本時跟 ZK 一樣以樹形目錄結構來組織數據,V3 版本則通過半開區間( Key range)取代 V2 中的目錄結構,優化成扁平的 Key-Value 結構,Key 仍采用之前的格式如/lock/lock1/uuid1、/lock/lock1/uuid2?,感官跟樹形目錄形式保持一致,但實際是一個完整獨立的 key;可以基于 前綴(Prefix)機制通過/lock/lock1/?查詢一批擁有相同前綴的數據,但其語義是前綴匹配查詢而非目錄子節點查詢;這個改造也是為了支撐更多的特性和達到更好的性能。

圖片

  • 集群模式:通常是由 3、5 個基數實例組成集群,當超過半數服務實例正常工作就能對外提供服務,既能避免單點故障,又盡量高可用,每個服務實例都有一個數據備份,通過 raft 協議實現數據全局一致。

圖片

  • 順序更新:每個 etcd 節點都可接收讀寫請求,但變更類(增刪改)請求會在集群內轉給 leader 執行,來所有客戶端的變更請求將按照 leader 接收的順序被處理,在 ZK 中插入同名節點,ZK 會自動為同名節點名后添加遞增序號,即避免沖突又具有順序管控的意義;但 etcd 中不能插入同名 Key,它是采用 revision 機制來管控更新類請求的順序,使用一個全局計數器,單調遞增,每當有數據變更,revision 就會加一(具有全局唯一性),而每個 revision 都關聯對應修改的數據,可以通過 revision 的大小推斷數據變更的順序,利用這個特性可以實現高級協調服務。

圖片

  • 租約(Lease)機制:常見的 TTL(Time To Live)機制是給單個 Key-Value 設置存活時間,超過時間后自動刪除這個 Key-Value,V3 中加入的租約機制更高級一些,針對每個 Lease 設置了一個 TTL 時間,存儲 Key-Value 時可指定一個 Lease,多個擁有相同 TTL 的 key 綁定到同一個 Lease,實現 Lease 的復用。同時也支持續約,可以通過客戶端在 Lease 到期之前續約,以避免 Key-Value 過期后失效,也可以通過客戶端主動解約,這比 ZK 中基于 session 的狀態保持更靈活。

圖片

  • 監聽機制:客戶端可以注冊對某一個 Key 或一批相同前綴(前綴機制,似 ZK 中的父節點)Key 的監聽,當被監聽的這些 Key 發生變更,客戶端將收到通知,感知到變更。

圖片

etcd 的分布式鎖正是基于以上特性來實現的,簡單來說是:

  • 租約機制:用于支撐異常情況下的鎖自動釋放能力
  • 前綴和 Revision 機制:用于支撐公平獲取鎖和排隊等待的能力
  • 監聽機制:用于支撐搶鎖能力
  • 集群模式:用于支撐鎖服務的高可用

二、加解鎖的流程描述

圖片

1.準備客戶端和 Key

  • 客戶端連接 Etcd,獲取 LockClient,獲取 LeaseClient
  • 以/lock/lock1? 為前綴 + / + uuid 創建全局唯一的 key,如:

client-a 線程 1 的 key 為"/lock/lock1/uuid1",申請 lock1

client-a 線程 2 的 key 為"/lock/lock1/uuid2",申請 lock1

client-c 線程 1 的 key 為"/lock/lock2/uuid3",申請 lock2

client-b 線程 1 的 key 為"/lock/lock2/uuid4",申請 lock2

  • 客戶端 a、b、c 分別創建租約,租約的時長由業務輸入確定

2.創建租約并保持續租

  • 方案 1-創建定時任務定時續租,無論客戶端是持鎖狀態還是等待鎖狀態 Key 都必須存在,而 Key 是否釋放由租約管控,所以都需要保持租約的活性

持鎖狀態:當業務未完成時,不能讓租約到期,需定時續租;當業務完成時可主動解除租約,持鎖 Key 會被刪除;若客戶端異常,租約到期后持鎖 Key 也會被刪除;等鎖的客戶端監聽到持鎖 Key 被刪除后,可開始搶鎖。

等鎖狀態:等鎖超時會主動解除租約,或客戶端異常時等鎖 key 被刪除,后邊排隊的就前進一步,嘗試搶鎖。

  • 方案 2-使用自動續約

3.綁定租約寫 key

  • 每個客戶端在執行 put 操作時,將第 1 步中準備的具有唯一性的 Key 綁定租約寫入 etcd

4.獲取競爭鎖的 key-Value 列表

  • 以 lock1 為例,客戶端以前綴"/lock/lock1" 讀取所有匹配此前綴的的 key-Value 列表(key-Value 中帶有 key 對應的 Revision)

5.對所獲取的 Key-Value 列表按 revision 從小到大排序

6.判斷自己是不是第一個(revision 最小),若是,則成功獲取鎖

7.若不是,則監聽自己的前一個 Key-Value 的刪除事件

  • 刪除事件由主動釋放租約或者因租約過期失效而觸發
  • 這種只監聽前一個 Key-Value 的方式避免了驚群效應問題

8.若是阻塞申請鎖,則申請鎖的操作可增加阻塞等待

9.若監聽事件生效,則回到第 4 步重新進行判斷,直到獲取到鎖

10解鎖時,將第一個 Key-Value 的租約釋放

三、etcd 分布式鎖的能力

可能讀者是單篇閱讀,這里引入第一篇《分布式鎖上-初探》中的一些內容,一個分布式鎖應具備這樣一些功能特點:

  • 互斥性:在同一時刻,只有一個客戶端能持有鎖
  • 安全性:避免死鎖,如果某個客戶端獲得鎖之后處理時間超過最大約定時間,或者持鎖期間發生了故障導致無法主動釋放鎖,其持有的鎖也能夠被其他機制正確釋放,并保證后續其它客戶端也能加鎖,整個處理流程繼續正常執行
  • 可用性:也被稱作容錯性,分布式鎖需要有高可用能力,避免單點故障,當提供鎖的服務節點故障(宕機)時不影響服務運行,這里有兩種模式:一種是分布式鎖服務自身具備集群模式,遇到故障能自動切換恢復工作;另一種是客戶端向多個獨立的鎖服務發起請求,當某個鎖服務故障時仍然可以從其他鎖服務讀取到鎖信息(Redlock)
  • 可重入性:對同一個鎖,加鎖和解鎖必須是同一個線程,即不能把其他線程持有的鎖給釋放了
  • 高效靈活:加鎖、解鎖的速度要快;支持阻塞和非阻塞;支持公平鎖和非公平鎖

基于上邊對 etcd 分布式鎖的介紹,這里簡單總結一下 etcd 的能力矩陣,ZK 的情況請看《分布式鎖中-基于 Zookeeper 的實現》,redis鎖的情況會在后續文章中補充

能力

ZK

etcd

Redis 原生

Redlock

互斥



安全

鏈接異常時,session 丟失自動釋放鎖

基于租約,租約過期后自動釋放鎖,不用像ZK那樣釋放鏈接



可用性

相對可用性還好



可重入

服務端非可重入,本地線程可重入

服務端非可重入,本地線程可重入需自研



加解鎖速度

速度不算快

速度快,如GRPC 協議優勢、服務端性能的優勢



阻塞非阻塞

客戶端兩種能力都提供

jetcd-core 中,阻塞非阻塞由 Future#get 的超時控制能力支撐



公平非公平

公平鎖

公平鎖



可續租

天然支持,基于session

天然支持,基于Lease



四、jetcd 庫實現分布式鎖

etcd 針對 java 語言的客戶端有官方的 jetcd-core 還有 IBM 的 etcd-java,下文使用 jetcd-core 做示例。

jetcd-core 中提供了高階的 Lock API(無需使用者準備唯一 key、前綴查詢 Key-Value 列表、排序判斷自己是否 revision 最小的、監聽前一個 Key-Value 的刪除),使用者只需關注最原始的訴求:申請的鎖是什么名稱、用多久,申請不到就等多久;使用高階 API 實現分布式鎖的流程會比第 2 部分原生的流程要簡單許多,流程如下:

  • 連接 etcd 集群
  • 獲取 LockClient,獲取 LeaseClient,不需要準備 key
  • 創建租約并保持續租, 你覺得哪一種方案會更好呢

方案 1-創建定時任務定時續租

方案 2-使用自動續約

  • 綁定租約搶鎖
  • 若搶到鎖,則返回鎖路徑信息
  • 若沒搶到鎖,則阻塞等待(可設置超時返回)
  • 解鎖時,傳入鎖信息解鎖;根據業務場景決定如何解約

1.pom 依賴

<dependency>
<groupId>io.etcd</groupId>
<artifactId>jetcd-core</artifactId>
<version>0.7.3</version>
</dependency>

2.Lease 相關的 API 介紹

public interface Lease extends CloseableClient {

//創建一個租約,過期時間是ttl,單位秒;沒有請求超時控制
CompletableFuture<LeaseGrantResponse> grant(long ttl);

//創建一個租約,過期時間是ttl,單位秒;后兩個參數是請求超時控制
CompletableFuture<LeaseGrantResponse> grant(long ttl, long timeout, TimeUnit unit);

//解約
CompletableFuture<LeaseRevokeResponse> revoke(long leaseId);

//主動續約1次
CompletableFuture<LeaseKeepAliveResponse> keepAliveOnce(long leaseId);

//查詢租約信息
CompletableFuture<LeaseTimeToLiveResponse> timeToLive(long leaseId, LeaseOption leaseOption);

//自動續約
CloseableClient keepAlive(long leaseId, StreamObserver<LeaseKeepAliveResponse> observer);
}

3.lock 相關的 API 介紹

public interface Lock extends CloseableClient {

//綁定租約申請指定名稱的鎖,搶鎖成功返回鎖秘鑰,
CompletableFuture<LockResponse> lock(ByteSequence name, long leaseId);

//持鎖秘鑰解鎖
CompletableFuture<UnlockResponse> unlock(ByteSequence lockKey);
}

4.分布式鎖示例

package com.rock.dlock;

import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;
import io.etcd.jetcd.Lease;
import io.etcd.jetcd.Lock;
import io.etcd.jetcd.lease.LeaseKeepAliveResponse;
import io.etcd.jetcd.lock.LockResponse;
import io.grpc.stub.StreamObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
* @author zs
* @date 2022/11/6 12:23 PM
*/
public class DemoEtcdLock {
private final static Logger log = LoggerFactory.getLogger(DemoEtcdLock.class);
private Client client;
private Lock lockClient;
private Lease leaseClient;

private LockState lockState;

class LockState{
private String lockKey;
private String lockPath;
private String errorMsg;
private long leaseTTL;
private long leaseId;
private boolean lockSuccess;

public LockState(String lockKey, long leaseTTL) {
this.lockKey = lockKey;
this.leaseTTL = leaseTTL;
}

public String getLockKey() {
return lockKey;
}

public void setLockKey(String lockKey) {
this.lockKey = lockKey;
}

public String getLockPath() {
return lockPath;
}

public void setLockPath(String lockPath) {
this.lockPath = lockPath;
}

public String getErrorMsg() {
return errorMsg;
}

public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}

public long getLeaseId() {
return leaseId;
}

public void setLeaseId(long leaseId) {
this.leaseId = leaseId;
}

public boolean isLockSuccess() {
return lockSuccess;
}

public void setLockSuccess(boolean lockSuccess) {
this.lockSuccess = lockSuccess;
}

public long getLeaseTTL() {
return leaseTTL;
}

public void setLeaseTTL(long leaseTTL) {
this.leaseTTL = leaseTTL;
}
}


public DemoEtcdLock(Client client, String lockKey, Long leaseTTL, TimeUnit unit) {
this.client = client;
//1.準備客戶端
this.lockClient = client.getLockClient();
this.leaseClient = client.getLeaseClient();
this.lockState = new LockState(lockKey,unit.toSeconds(leaseTTL));
}


public boolean lock() {
try {
//2.創建租約,并自動續約
createLease();

//3.執行加鎖,并為鎖對應的Key綁定租約
createLock();
}catch (InterruptedException | ExecutionException e) {
//todo:異常處理
}
return lockState.isLockSuccess();
}

public void unlock() {
try {
//正常釋放鎖
if (this.lockState.getLockPath() != null) {
lockClient.unlock(ByteSequence.from(lockState.getLockPath().getBytes())).get();
}
//如果是主動續約,則關閉續約的定時任務

//刪除租約
if (lockState.getLeaseId() != 0L) {
leaseClient.revoke(lockState.getLeaseId());
}
} catch (InterruptedException | ExecutionException e) {
//todo:異常處理
}
log.info("線程:{} 釋放鎖", Thread.currentThread().getName());
}

// 創建一個租約
private void createLease() throws ExecutionException, InterruptedException {
log.debug("[etcd-lock]: start to createLease." + this.lockState.getLockKey() + Thread.currentThread().getName());
try {
long leaseId = leaseClient.grant(this.lockState.getLeaseTTL()).get().getID();
lockState.setLeaseId(leaseId);
//自動續約
StreamObserver<LeaseKeepAliveResponse> observer = new StreamObserver<LeaseKeepAliveResponse>() {
@Override
public void onNext(LeaseKeepAliveResponse value) {
log.trace("cluster node lease remaining ttl: {}, lease id: {}", value.getTTL(), value.getID());
}

@Override
public void onError(Throwable t) {
log.error("cluster node lease keep alive failed. exception info: {}", t);
}

@Override
public void onCompleted() {
log.trace("cluster node lease completed");
}
};
// 設置自動續約
leaseClient.keepAlive(leaseId, observer);
}catch (InterruptedException | ExecutionException e) {
log.error("[etcd-lock] Create lease failed:" + e);
lockState.setErrorMsg("Create lease failed:" + e);
throw e;
}
}

private void createLock() throws ExecutionException, InterruptedException {
String lockKey = this.lockState.getLockKey();
log.debug("[etcd-lock]: start to createLock." + lockKey + Thread.currentThread().getName());
try {
LockResponse lockResponse = lockClient.lock(ByteSequence.from(lockKey.getBytes()), lockState.getLeaseId()).get();
if (lockResponse != null) {
String lockPath = lockResponse.getKey().toString(StandardCharsets.UTF_8);
this.lockState.setLockPath(lockPath);
log.info("線程:{} 加鎖成功,鎖路徑:{}", Thread.currentThread().getName(), lockPath);
this.lockState.setLockSuccess(true);
}
}
catch (InterruptedException | ExecutionException e) {
log.error("[etcd-lock] lock failed:" + e);
lockState.setErrorMsg("[etcd-lock] lock failed:" + e);
leaseClient.revoke(this.lockState.getLeaseId());
throw e;
}
}
}

5.測試鎖

package com.rock.dlock;

import io.etcd.jetcd.Client;

import java.util.concurrent.TimeUnit;

/**
* @author zs
* @date 2022/11/6 12:23 PM
*/
public class TestEtcdLock {
public static void main(String[] args) {
Client client = Client.builder().endpoints("http://localhost:2379").build();

DemoEtcdLock demoEtcdLock1 = new DemoEtcdLock(client,"rock",30L, TimeUnit.SECONDS);
DemoEtcdLock demoEtcdLock2 = new DemoEtcdLock(client,"rock",30L, TimeUnit.SECONDS);

boolean lock1 = demoEtcdLock1.lock();
if(lock1) {
try {
System.out.printf("do something");
} finally {
demoEtcdLock1.unlock();
}
}
demoEtcdLock1.lock();//demoEtcdLock1 持鎖未釋放
demoEtcdLock2.lock();//demoEtcdLock2 客戶端無可重入設計,這里將會阻塞等待demoEtcdLock1釋放鎖
}
}

五、總結

本篇從 etcd V3 版本的 Lease、Prefix 、Watch 等關鍵特性切入,介紹了如何基于這些特性來實現一個分布式鎖,并基于jetcd-core庫提供了一個分布式鎖的示例,呈現了其關鍵API的用法;此示例尚未達到生產級可用,如異常、可重入、可重試、超時控制等功能都未補全,計劃在下一篇介紹完redis之后,再介紹一個健壯的分布式鎖客戶端要如何抽象設計,如何適配 ZK 、Redis 、etcd 。

本文轉載自微信公眾號「架構染色」,可以通過以下二維碼關注。轉載本文請聯系【架構染色】公眾號作者。


責任編輯:武曉燕 來源: 架構染色
相關推薦

2017-04-13 10:51:09

Consul分布式

2022-10-27 10:44:14

分布式Zookeeper

2023-09-04 08:12:16

分布式鎖Springboot

2017-10-24 11:28:23

Zookeeper分布式鎖架構

2023-01-13 07:39:07

2024-11-28 15:11:28

2025-01-07 08:37:35

2019-06-19 15:40:06

分布式鎖RedisJava

2021-02-28 07:49:28

Zookeeper分布式

2017-01-16 14:13:37

分布式數據庫

2018-04-03 16:24:34

分布式方式

2022-04-08 08:27:08

分布式鎖系統

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2021-05-19 08:12:39

etcd分布式鎖分布式系統

2021-11-01 12:25:56

Redis分布式

2023-12-01 10:49:07

Redis分布式鎖

2024-01-26 13:17:00

rollbackMQ訂單系統
點贊
收藏

51CTO技術棧公眾號

亚洲国产综合在线| 亚洲国产欧美国产第一区| 久久美女高清视频| 国产精品主播视频| 国产真实乱人偷精品视频| 日韩av三区| 欧美美女网站色| 国产真人做爰毛片视频直播| 国产在线观看免费网站| 国产福利91精品一区二区三区| 97视频在线观看免费| 国产黄色片在线| 黄色欧美在线| 欧美放荡的少妇| 欧美极品欧美精品欧美| 麻豆av在线导航| 91浏览器在线视频| 99porn视频在线| 波多野结衣一区二区三区四区| 欧美特黄一级| 日韩在线免费观看视频| 国产精品无码电影| 精品视频在线观看网站| 日本韩国精品在线| 草草视频在线免费观看| 久久99精品久久| 久久久精品免费网站| 国产精品10p综合二区| 国产日韩在线免费观看| 国产日韩欧美| 久久久久久亚洲精品| 日韩精品一区二区三区在线视频| 九九在线精品| 欧美第一区第二区| 91高清国产视频| 国产成人精品一区二三区在线观看| 亚洲不卡av一区二区三区| 超碰免费在线公开| 午夜福利理论片在线观看| 裸体一区二区三区| 国产福利成人在线| 国内精品福利视频| 一本色道久久综合| 欧美精品激情blacked18| 黄色录像一级片| 色婷婷热久久| 中文字幕av日韩| 非洲一级黄色片| 国产一区二区欧美| 亚洲午夜精品视频| 无码一区二区三区在线| 国产探花在线精品一区二区| 精品中文字幕久久久久久| 稀缺呦国内精品呦| 老牛国内精品亚洲成av人片| 精品国产123| 黄色在线免费播放| 精品亚洲精品| 精品香蕉一区二区三区| 精品夜夜澡人妻无码av| 网红女主播少妇精品视频| 日韩电视剧在线观看免费网站| 亚洲人精品午夜在线观看| 亚洲欧洲精品在线观看| 国产视频第一区| 欧美国产欧美综合| 亚洲精品一区二区三区四区五区| 夜级特黄日本大片_在线| 国产精品免费久久| 中文字幕精品在线播放 | 亚洲激情自拍图| www.免费av| 亚洲精品动态| 中国人与牲禽动交精品| 欧美aaa级片| 51精产品一区一区三区| 美女黄色丝袜一区| 国产五月天婷婷| 性欧美xxxx大乳国产app| 国产精品免费久久久久影院| 国产又粗又猛又黄| 国产成人午夜电影网| 国外成人在线视频网站| 国产三级在线| 亚洲精品网站在线观看| 国产深夜男女无套内射| 欧美影视资讯| 日韩欧美成人一区| 三级黄色片网站| 久久综合av| 久久久亚洲国产天美传媒修理工| 欧美日韩一级黄色片| 九九精品视频在线看| 国产精品一区二区在线观看| 国产美女视频一区二区三区| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲乱码中文字幕| 日韩免费毛片| 在线你懂的视频| 天涯成人国产亚洲精品一区av| 91视频免费版污| 日韩在线亚洲| 亚洲欧洲日韩国产| 国产av无码专区亚洲av毛网站| 欧美三级午夜理伦三级中文幕| 欧美壮男野外gaytube| 91九色蝌蚪91por成人| www.日韩av| 亚洲午夜精品一区二区| 国产夫妻在线| 91精品麻豆日日躁夜夜躁| aaaa黄色片| 99re6这里只有精品| 97精品一区二区三区| 亚洲最大成人在线视频| 不卡的av在线| 性做爰过程免费播放| a一区二区三区| 日韩精品一区二区三区视频播放 | 精品国产91乱码一区二区三区四区 | 成人动漫在线播放| 亚洲aaa精品| 日韩a一级欧美一级| 精品freesex老太交| 欧美精品18videosex性欧美| 夜夜躁很很躁日日躁麻豆| 91在线免费视频观看| 欧美喷潮久久久xxxxx| 欧美人与动牲交xxxxbbbb| 99久久婷婷国产综合精品首页| 精品精品国产高清一毛片一天堂| 激情无码人妻又粗又大| 日韩极品在线观看| 欧美激情专区| 偷拍自拍在线看| 亚洲福利视频免费观看| 久久亚洲国产成人精品性色| 极品少妇一区二区| 宅男av一区二区三区| 成人午夜一级| 在线播放日韩欧美| 波多野结衣绝顶大高潮| 久久嫩草精品久久久久| 99视频在线免费播放| 精品成人自拍视频| 97免费在线视频| 人人妻人人澡人人爽久久av| 一区二区三区四区中文字幕| 日本中文字幕在线不卡| 一区二区三区国产精华| 亚洲在线第一页| 在线播放免费av| 日韩欧美国产一区在线观看| 国产一区二区播放| 国产麻豆精品一区二区| 超碰97在线看| 超碰在线成人| 久久久之久亚州精品露出| 黄片毛片在线看| 五月激情丁香一区二区三区| 成人免费毛片日本片视频| 国产日韩欧美一区二区三区在线观看| 精品国产一区二区三区日日嗨 | 日韩国产在线| 91精品久久久久久综合乱菊| 国产传媒在线播放| 蜜桃传媒麻豆第一区在线观看| 亚洲成人激情在线| 青青草偷拍视频| 成人综合在线网站| 国产黄视频在线| 欧美亚洲高清| 91免费看片在线| 美足av综合网| 国产丝袜精品第一页| 日韩精品在线一区二区三区| 国产精品人妖ts系列视频| 亚洲男人天堂2021| 亚洲激情偷拍| 日韩欧美在线电影| 亚洲欧洲专区| 91国自产精品中文字幕亚洲| fc2在线中文字幕| 欧美一区二区三区免费在线看 | 亚洲婷婷免费| 欧美日韩中文国产一区发布 | 丝袜美腿亚洲综合| 美女黄色片网站| 欧美大胆视频| 成人精品视频99在线观看免费| 日本高清成人vr专区| 国产视频欧美视频| 国产日韩免费视频| 狠狠爱在线视频一区| 开心激情五月网| 成人18视频在线播放| 男女啪啪网站视频| 欧美色综合网| 亚洲欧美日韩国产yyy| 成人午夜三级| 国产精品专区h在线观看| 538在线视频| 久久在线观看视频| 男女污污视频在线观看| 欧美一二三在线| 国产在线一级片| 五月激情丁香一区二区三区| 亚洲二区在线播放| 久久久国产精品不卡| 深夜视频在线观看| 美国一区二区三区在线播放 | 成人在线一区| 国产精品国色综合久久| 日韩制服一区| 91爱视频在线| 手机在线免费看av| 日韩在线观看免费高清完整版| 日韩毛片在线一区二区毛片| 91精品国产乱| 中文字幕制服诱惑| 欧美午夜性色大片在线观看| 精品99在线观看| 国产精品福利av| 久久亚洲AV无码专区成人国产| 福利一区二区在线| 在线播放av中文字幕| 日本不卡一区二区| 国产男女无遮挡| 亚洲三级国产| 国产精品久久久久久久乖乖| 一区二区在线影院| 手机福利在线视频| 成人黄色小视频| 日韩欧美精品一区二区三区经典| 日本一区福利在线| 久久伦理网站| 美女主播精品视频一二三四| 国产精品xxxx| 黑色丝袜福利片av久久| 国产青春久久久国产毛片| 999久久精品| y111111国产精品久久婷婷| 亚洲伦理一区二区| 91视频8mav| 欧美2区3区4区| 成人av片网址| 亚洲乱码一区| 国产成人精品一区二区三区福利| 亚洲精品在线播放| 国产精品对白刺激久久久| 91精品啪在线观看国产爱臀| 豆国产97在线| 蜜桃一区av| 欧美激情一区二区三区在线视频 | 国产在线一区不卡| 亚洲一区二区中文| 高清一区二区| 99re在线国产| 美女扒开腿让男人桶爽久久动漫| 久久精品国产综合精品| 你懂的一区二区三区| 日本一区二区三区视频在线播放 | 久久91精品国产| 久草在线视频网站| 午夜精品福利电影| 粉嫩一区二区| 国产啪精品视频| 日韩中文字幕| 中国色在线观看另类| 师生出轨h灌满了1v1| av色综合久久天堂av综合| 女同毛片一区二区三区| 国产欧美日产一区| 一级性生活免费视频| 亚洲精品免费在线播放| 国产无套粉嫩白浆内谢| 福利微拍一区二区| 成人免费一区二区三区| 欧美精选在线播放| 开心激情综合网| 亚洲三级av在线| 激情在线小视频| 久久久久久成人| 欧美亚洲韩国| 91色精品视频在线| 亚洲制服一区| 欧美三级午夜理伦三级老人| 亚洲国产免费看| 一区二区成人网| 粉嫩av一区二区三区粉嫩| 丝袜美腿中文字幕| 亚洲品质自拍视频网站| av资源免费观看| 7777精品伊人久久久大香线蕉超级流畅 | 成年人一级黄色片| 精品国产鲁一鲁一区二区张丽 | 成人一级视频在线观看| 国产在线观看h| 亚洲黄一区二区三区| 亚洲天堂男人av| 日韩精品资源二区在线| 男女网站在线观看| 九九热r在线视频精品| 欧美成人资源| 国产高清自拍一区| 欧美大人香蕉在线| 动漫av网站免费观看| 国产精品亚洲一区二区三区妖精| 欧美黄色激情视频| 亚洲国产精品久久人人爱蜜臀| 亚洲天堂手机版| 亚洲美腿欧美激情另类| 黑人玩欧美人三根一起进| 国产精品日韩在线播放| 先锋影音国产精品| 成人在线播放网址| 精品一区二区在线观看| 国产熟妇久久777777| 亚洲一区二区欧美| 国产精品久久久久久免费| 亚洲人成在线观看网站高清| 国产拍在线视频| 国产精品播放| 韩日成人av| 免费黄频在线观看| 国产精品久久午夜| 国产精品自拍第一页| 日韩av在线播放资源| 日本最新在线视频| 国产精品久久久久久网站| 亚洲色图美女| 免费看一级大黄情大片| 波多野结衣中文字幕一区| 久久久香蕉视频| 精品少妇一区二区三区日产乱码 | 欧美 亚欧 日韩视频在线 | 国产午夜精品一区二区三区视频| 日韩伦人妻无码| 精品三级在线看| 黄色精品免费看| 国产亚洲综合在线| 色噜噜日韩精品欧美一区二区| 亚洲mv在线观看| 蜜臀av中文字幕| 国内精久久久久久久久久人| 91在线一区| 日韩av中文字幕第一页| 成人一级片网址| 日韩精品一区二区av| 亚洲娇小xxxx欧美娇小| 精品极品在线| 国产亚洲欧美激情| 久久久国产精华液| 精品国产精品一区二区夜夜嗨| 美女航空一级毛片在线播放| www.久久爱.cn| 日韩视频二区| 国产三级国产精品| 91久久精品一区二区三区| wwwxxx在线观看| 91九色在线视频| 欧美.日韩.国产.一区.二区| 黄色国产在线视频| 偷拍日韩校园综合在线| 青青草在线视频免费观看| 日韩av片永久免费网站| 欧美一区二区三区高清视频| 最新av免费在线观看| 亚洲日本va在线观看| 亚洲国产www| 奇门遁甲1982国语版免费观看高清| 精品一区在线| 黄色片视频在线| 一区二区三区四区不卡在线| 无码国产精品96久久久久| 日本精品视频在线| 偷偷www综合久久久久久久| 激情小说欧美色图| 色综合婷婷久久| 免费观看成人高潮| 国产免费一区| 秋霞电影一区二区| 极品魔鬼身材女神啪啪精品| 欧美va亚洲va在线观看蝴蝶网| 伊人色综合一区二区三区影院视频| 日韩妆和欧美的一区二区| 国内精品在线播放| 国产成人无码精品久久久久| 中文字幕亚洲国产| 91麻豆精品激情在线观看最新| 欧美一级黄色片视频| 亚洲图片欧美激情| 神马亚洲视频| 亚洲综合av影视| 久久久久久一区二区| 麻豆视频在线免费看| 亚洲性生活视频| 91成人在线精品视频| 亚洲视频第二页| 精品免费在线视频|