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

火山引擎 ByteHouse:ClickHouse 如何保證海量數據一致性

開發 開源
本篇文章提出針對這一問題的解決思路:在火山引擎ByteHouse中構建輕量級流程引擎,來解決數據一致性問題。

背景

ClickHouse是一個開源的OLAP引擎,不僅被全球開發者廣泛使用,在字節各個應用場景中也可以看到它的身影。基于高性能、分布式特點,ClickHouse可以滿足大規模數據的分析和查詢需求,因此字節研發團隊以開源ClickHouse為基礎,推出火山引擎云原生數據倉庫ByteHouse。

在日常工作中,研發人員經常會遇到業務鏈路過長,導致流程穩定性和數據一致性難保障的問題,這在分布式、跨服務的場景中更為明顯。本篇文章提出針對這一問題的解決思路:在火山引擎ByteHouse中構建輕量級流程引擎,來解決數據一致性問題。

使用輕量級流程引擎可以幫我們使用統一的標準來解決復雜業務鏈路的編排問題,不僅提高業務代碼的可讀性和復用性,還能更專注業務核心邏輯的開發,讓整體流程更加標準化、規范化。

總結來說,使用流程引擎有以下優勢:

  • 輕量級,接入方便,內存操作,性能有保障
  • 易維護,流程配置與業務分離,支持熱更新
  • 易擴展,豐富的執行策略及算子支持

大體思路

圖片圖片

上圖為ByteHouse企業版管理平臺功能架構圖。從該功能架構圖可以看出,ByteHouse核心能力都是依賴ClickHouse集群,對于集群節點多、數據計算量大的業務場景,容易出現節點狀態不一致的問題,因此保證ClickHouse集群間的狀態一致性是我們的核心訴求。

圖片圖片

為了保證數據一致性,ByteHouse提供了以下能力:

  1. event engine: 事件處理中心
  2. workflow engine:輕量級流程引擎
  3. 對賬系統

保障數據一致性最簡單的方式是通過狀態機來監聽流程執行過程:

  • 首先,將所有的任務請求下發到event engine,由event engine將任務分發對應的handler執行,統一管理所有下發任務的生命周期,并提供異步重試、回滾補償等功能。流量匯總到event engine以后,會讓服務后續的業務擴展更加便捷。
  • 其次,對于比較復雜的任務請求,我們可以下發到workflow engine執行,由workflow生成實例,并編排任務隊列,管理流程執行實例的生命周期,統一失敗回滾,失敗重試。
  • 最后,對于服務不可用等特殊場景產生的臟數據,由對賬服務兜底。

圖片圖片

架構設計

在流程監控的架構設計中,主要包含以下:

  • 流程管理層:主要負責流程配置的解析初始化,并完成編排策略的工作
  • 策略behavior層:編排執行節點,并下發執行任務到執行器
  • 執行器:管理執行節點執行
  • 執行節點:負責業務具體實現

圖片圖片

實現方案

執行節點

圖片圖片

流程引擎的核心為“責任鏈”,按照責任鏈上的節點順序依次執行所有任務,所以我們需要的三個基本單元分別為:

  • request:入參
  • processlist:流程執行節點list
  • response:出參

在研發工作中,我們時常會遇到以下問題:

  • 如果同時出現了一個問題,node1、node2、node3之間的數據交互如何實現?
  • 如果node1入參、出參與node2,node3不一樣該如何處理?
  • 參數類型不同的node又該如何統一調度?

最簡單的處理辦法,是讓node使用相同的上下文信息,將整個執行node模版化。我們讓所有的執行節點node實現相同的接口Delegation,統一使用相同的上下文executionContext作為執行方法的入參。

對于流程中的request和response,我們可以放入executionContext中,讓每個執行節點都可以通過上下文操作response。

// Delegation -
type Delegation interface {
   Execute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
   TryExecute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
   ConfirmExecute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
   CancelExecute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
   Code() string
   Type() value.DelegationType
}

執行策略

如果確定好了最小的執行節點,我們需要考慮到,業務場景并不會永遠順序執行node,再返回結果,流程執行過程中跳轉、循環、并發執行都是比較常見的操作。考慮不同業務場景復用性,我們在執行節點之上加了一層執行策略,用策略behaivor來重新編排觸發執行節點的任務。

  • 下圖將流程分成了behavior1和behavior2,分別對應不同的策略。
  • 簡單的策略舉例:按順序執行、并發執行、循環執行、條件跳轉執行等。
  • 我們可以根據自身業務實際需要定制,后續會有實例介紹。

圖片圖片

// ActivityBehavior -
type ActivityBehavior interface {
   Enter(ctx context.Context, executionContext ExecutionContextInterface, pvmActivity PvmActivity) apperror.AppError
   Execute(ctx context.Context, executionContext ExecutionContextInterface, pvmActivity PvmActivity) apperror.AppError
   Leave(ctx context.Context, executionContext ExecutionContextInterface, pvmActivity PvmActivity) apperror.AppError
   Code() value.ActivityBehaviorCode
}

策略behavior提供有Enter,Execute,Leave三個接口,Enter負責生成執行節點任務instance,Execute負責編排并觸發執行任務instance操作,Leave負責跳轉到下一個behavior。

可以看出來策略behaivor的跳轉方式類似于鏈表,不斷執行next方法,所以編碼過程中需要注意不要出現死循環,小心stackoverflow。

Executor

執行器Executor的主要作用是串聯執行策略和執行節點,策略behavior將執行的命令下發給Executor,由Executor對執行節點的觸發操作。這里會根據執行節點的type,映射到三種執行節點的執行方式,包含tcc,執行一次,重試多次。

// DelegationExecutor -
type DelegationExecutor interface {
   execute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
   postExecute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError
}
func (de *DefaultDelegationExecutor) execute(ctx context.Context, executionContext ExecutionContextInterface) apperror.AppError {
   delegationCode := executionContext.GetExecutionInstance().GetDelegationCode()
   if len(delegationCode) == 0 || de.DelegationMap[delegationCode] == nil {
      logger.Info(ctx, "DefaultDelegationExecutor delegation code not found,use default delegation", zap.String("delegationCode", delegationCode))

      delegationCode = string(value.DefaultDelegation)
      executionContext.GetExecutionInstance().SetDelegationCode(delegationCode)
   }
   return de.dumpExecute(ctx, executionContext, delegationCode)
}
func (de *DefaultDelegationExecutor) dumpExecute(ctx context.Context, executionContext ExecutionContextInterface, delegationCode string) apperror.AppError {
   FireEvent(ctx, executionContext, value.ExecutionStart)
   var err apperror.AppError
   delegation := de.DelegationMap[delegationCode]
   switch delegation.Type() {
   case value.TccDelegation:
      err = tccExecute(ctx, executionContext, delegation)
   case value.SingleDelegation:
      err = singleExecute(ctx, executionContext, delegation)
   case value.RetryDelegation:
      err = retryExecute(ctx, executionContext, delegation)
   }
   if err != nil {
      logger.Error(ctx, "delegation.Execute_err", zap.Error(err))
      return apperror.Trace(err)
   }
   FireEvent(ctx, executionContext, value.ExecutionEnd)

   return nil
}

ExecutionContext

ExecutionContext上下文是用來記錄了流程執行的所有細節,包含以下:

  • ProcessEngineConfigurationInterface: 流程定義信息
  • ExecutionInstanceInterface: 執行節點實例
  • ActivityInstanceInterface: 執行策略實例
  • ProcessInstanceInterface: 流程實例
  • request:入參
  • response:返回值

為了保證整個流程執行的穩定性,這里除了response之外,所以其他的實例參數都不建議開放寫接口,response可以用來存儲流程實例執行過程中會產生的變量信息。

對于整個流程的定義ProcessEngineConfiguration,我們可以選擇最簡單的方式,即在數據庫里,將配置信息映射成json字符串。當然也可以選擇讀取配置文件,只要能滿足讀取方便,數據不丟即可。

// ExecutionContextInterface -
type ExecutionContextInterface interface {
   GetProcessEngineConfiguration() ProcessEngineConfigurationInterface
   SetProcessEngineConfiguration(processEngineConfiguration ProcessEngineConfigurationInterface)
   GetExecutionInstance() instance.ExecutionInstanceInterface
   SetExecutionInstance(executionInstance instance.ExecutionInstanceInterface)
   GetActivityInstance() instance.ActivityInstanceInterface
   SetActivityInstance(activityInstance instance.ActivityInstanceInterface)
   GetProcessInstance() instance.ProcessInstanceInterface
   SetProcessInstance(processInstance instance.ProcessInstanceInterface)
   SetNeedPause(needPause bool)
   IsNeedPause() bool
   SetActivityIndex(activityIndex int)
   GetActivityIndex() int
   SetActivityBehaviorCode(activityBehaviorCode value.ActivityBehaviorCode)
   GetActivityBehaviorCode() value.ActivityBehaviorCode
   SetBizUniqueKey(bizUniqueKey string)
   GetBizUniqueKey() string
   GetRequest() map[string]interface{}
   SetRequest(request map[string]interface{})
   GetResponse() map[string]string
   SetResponse(response map[string]string)
   AtomicAddResponse(key string, value string)
}

Listener

監聽器的主要作用是用來監聽流程執行中的重要參數信息。從上述executor接口可以看到fireEvent,它的作用是發送消息event,讓listener監聽到對應的event類型,完成一些定制化的行為。

類似于面向切面編程,我們可以在執行節點的前后增加定制化的邏輯,如打日志、監聽節點執行時間,持久化流程中產生的response信息、增加鏈路追蹤等。

API

圖片圖片

最后,我們將上述的內容拼接串聯起來,主要提供三個接口:

  • Start: 啟動流程
  • Signal: 暫停或是異常退出后,繼續執行流程
  • Abort: 強制中斷流程
process start(){
    //1.get and create ProcessEngineConfigurationInterface 解析流程定義
    //2.create processInstance 創建流程實例
    //3.create ExecutionContext 創建執行上下文    
    //4. lockstrategy trylock     
    //5. invoke process start 
    processinstance.start()
    //6. persist processInstance and return
    //7. lockstrategy unlock 
}
processinstance start(){
    // get behavior    
    // behavior enter
    behavior.Enter(ctx, executionContext)
    //behavior execute
    behavior.Execute(ctx, executionContext)
    //behavior leave
    behavior.Leave(ctx, executionContext)
}

相比于start,signal需要讀取執行的細節信息,找到之前失敗的執行節點位置,并加載到上下文中,再繼續執行。

對于失敗節點信息的持久化有兩種方式:第一,可以選擇在流程執行結束持久化;第二,可以通過listener在每個執行節點結束持久化。具體根據實際業務場景對于性能、數據一致性的要求做出抉擇。

并發場景考慮

  1. behavior策略中肯定會出現定制、并發、處理多個執行節點到場景的問題,如果同時修改必定會造成數據錯亂。簡單的方法推薦使用帶鎖的容器存儲,可以被修改的信息(response),此處使用的是github.com/bytedance/gopkg包里面封裝的skipmap。
  2. lockstrategy可以自己定義最適配業務場景的,最簡單的方案是redis鎖,同時也考慮到系統異常退出后的恢復問題。可以參考redis官網解決特殊情況下的鎖異常解決方案:https://redis.io/commands/setnx/

后續的工作

輕量級流程引擎的基本功能到此已經實現,后續的擴展優化可以圍繞以下方向進行:

  1. 界面化展示,可以將鏈路執行情況展示出來
  2. 策略behavior維度擴展,適配各種業務場景
  3. 增加子流程的維度,可以復用原先的執行邏輯

Demo示例

以下為簡單的processconfiguration的配置信息,此處使用DefaultBehavior,即同步順序執行策略。

{
    "ProcessContentList":[
        {
            "Behavior":"DefaultBehavior",
            "DelegationList":[
                {
                    "Code":"sample1"
                },
                {
                    "Code":"sample2"
                },
                {
                    "Code":"sample3"
                }
            ]
        },
        {
            "Behavior":"DefaultBehavior",
            "DelegationList":[
                {
                    "Code":"sample4"
                },
                {
                    "Code":"sample5"
                }
            ]
        }
    ]
}

圖片圖片

在listener里面加入日志,這樣可以追溯出整個流程的執行流程,以便更好的監控整個流程的運行狀態。

實際使用

以ClickHouse集群縮容為例:

圖片圖片

{
    "ProcessContentList":[
        // 查詢所有需要重分布的table
        {
            "Behavior":"DefaultBehavior",// 順序執行
            "DelegationList":[
                {
                    "Code":"hor_reshard_table_loop" 
                }
            ]
        },
        // 遍歷所有table進行數據的重分布 
        {
            "LoopKey":"reshard_table_loop_key",
            "Behavior":"NonBlockLoopBehavior",// 非阻塞循環處理
            "DelegationList":[
                {
                    "Code":"hor_reshard_table"
                }
            ]
        },
        // 進行刪除節點操作
        {
            "Behavior":"DefaultBehavior",
            "DelegationList":[
                {
                    "Code":"hor_start_remove_node"
                },
                {
                    "Code":"hor_prepare_node_vcloud",
                    "PostCode":"hor_rollback_remove_node_vcloud"http:// 統一失敗回滾處理
                },
                {
                    "Code":"hor_update_config_vcloud",
                    "PostCode":"hor_rollback_remove_node_vcloud"
                },
                {
                    "Code":"hor_set_cluster_running",
                    "PostCode":"hor_rollback_remove_node_vcloud"
                },
                {
                    "Code":"hor_release_node"
                },
                {
                    "Code":"hor_callback_bill"
                }
            ]
        }
    ]
}

總結

一個流程引擎適配所有的業務場景幾乎是不可能,除非接受復雜的方案設計,而第三方流程引擎對于日常的業務開發顯得太笨重。輕量級流程引擎則會簡化接入方式,減少了過多http請求帶來的性能損耗,更加靈活多變,追述問題也變得簡單。

在ByteHouse中加入流程引擎的能力,能以較小的代價給業務更多重試的可能性,而不需要反復回滾,特別對于耗時很長的任務,能帶來更好用戶使用體驗。除此之外,流程引擎還能將業務流程模版化,增加接口服務的復用性,使得業務代碼的可讀性、擴展性得到提升,方便后期維護。

火山引擎云原生數據倉庫ByteHouse是火山引擎旗下的一款云原生數據倉庫,為用戶提供極速分析體驗,能夠支撐實時數據分析和海量數據離線分析,同時還具備便捷的彈性擴縮容能力,極致分析性能和豐富的企業級特性,助力客戶數字化轉型。

責任編輯:龐桂玉 來源: 字節跳動技術團隊
相關推薦

2024-12-26 15:01:29

2025-03-27 08:20:54

2023-09-07 08:11:24

Redis管道機制

2024-08-20 16:13:52

2023-05-26 07:34:50

RedisMySQL緩存

2021-12-14 07:15:57

MySQLRedis數據

2024-01-22 08:52:00

AQS雙異步數據一致性

2024-07-04 12:36:50

2021-10-18 10:30:59

流計算阿里云

2021-10-13 09:55:11

流計算引擎數據

2022-08-23 07:46:45

數據一致性數據庫

2022-12-05 08:24:32

mongodb數據庫數據

2022-10-19 12:22:53

并發扣款一致性

2023-12-11 12:27:31

并發Zookeeper數據

2019-08-30 12:46:10

并發扣款查詢SQL

2022-02-17 21:04:27

數據庫MysqlRedis

2018-08-14 10:39:04

數據錯誤DIX

2025-04-27 08:52:21

Redis數據庫緩存

2021-03-04 06:49:53

RocketMQ事務

2022-09-15 10:37:46

MySQLRedis數據一致性
點贊
收藏

51CTO技術棧公眾號

丝袜美腿中文字幕| 缅甸午夜性猛交xxxx| 国产成人精品免费看视频| 亚洲午夜91| 国产一区二区三区18| 一二三av在线| 免费福利视频一区二区三区| 中文字幕在线一区二区三区| 国产精品三区在线| 国产精品无码粉嫩小泬| 欧美精品一卡| 亚洲日韩中文字幕在线播放| 99九九精品视频| 波多野结衣久久精品| 亚洲人午夜精品天堂一二香蕉| 精品国产乱码久久久久久丨区2区| 免费在线不卡av| 中文日韩欧美| 欧美第一黄网免费网站| 蜜桃av乱码一区二区三区| 福利在线一区| 日韩一区二区免费在线电影| 99久久久无码国产精品6| 最新av在线播放| 日本一区二区综合亚洲| 久久国产精品精品国产色婷婷| a天堂在线视频| 日韩1区2区日韩1区2区| 97香蕉超级碰碰久久免费的优势 | av一区二区三区四区| 国产在线视频91| 在线免费观看av网址| 好看的亚洲午夜视频在线| 久久精品国产96久久久香蕉 | 中文字幕一区二区日韩精品绯色| 蜜桃传媒视频麻豆第一区免费观看| 99久久99久久久精品棕色圆| 青青草原综合久久大伊人精品优势| 午夜免费在线观看精品视频| 在线免费日韩av| 四季av一区二区凹凸精品| 亚洲一级免费视频| 丰满少妇一区二区| 三级小说欧洲区亚洲区| 亚洲成色www8888| 欧美做受高潮中文字幕| 91成人午夜| 日韩欧美一级特黄在线播放| 亚洲图片 自拍偷拍| 在线日韩三级| 日韩一区二区精品在线观看| 无码人妻一区二区三区在线视频| 日韩毛片免费看| 欧美高清视频不卡网| 中文字幕中文在线| 欧美91在线|欧美| 欧美美女一区二区在线观看| 中文字幕日韩综合| 青青国产精品| 91精品国产乱| 日韩高清一二三区| 国产精品白丝av嫩草影院| 精品成人a区在线观看| 一本色道久久hezyo无码| 久久黄色影视| 日韩精品在线看| jizz中文字幕| 久久要要av| 九九久久久久99精品| 国产无遮挡又黄又爽| 99亚洲视频| 国产精品video| 国产精品久久久午夜夜伦鲁鲁| 国产一区久久久| av色综合网| 无码精品在线观看| 日本一区二区不卡视频| 99re99热| 九色porny视频在线观看| 色综合久久中文字幕| mm131亚洲精品| 国产美女视频一区二区| 欧美精品一区二区三区高清aⅴ| 亚洲精品女人久久久| 精品久久影视| 欧美激情xxxxx| 久久夜色精品国产噜噜亚洲av| 久热成人在线视频| 高清av免费一区中文字幕| 六十路在线观看| 亚洲天堂精品在线观看| 国产精品999视频| 亚洲欧美久久精品| 亚洲国产精品一区二区三区| 亚洲а∨天堂久久精品2021| 欧美色综合网| 国产精品一区二区三区免费视频 | 欧美国产视频| 亚洲国产成人精品久久| 91无套直看片红桃在线观看| 你懂的网址国产 欧美| 欧美在线视频观看免费网站| 国产深喉视频一区二区| 久久在线免费观看| 亚洲中文字幕无码一区二区三区| 视频在线日韩| 337p日本欧洲亚洲大胆精品 | 午夜天堂影视香蕉久久| 三上悠亚av一区二区三区| 国产一区二区三区亚洲| 日韩视频―中文字幕| 日本韩国欧美中文字幕| 国产精品一区二区在线看| 欧美日韩在线精品| 6699嫩草久久久精品影院| 欧美日本精品一区二区三区| 中国黄色a级片| 午夜国产精品视频| 国产精品网站入口| 美州a亚洲一视本频v色道| 亚洲综合色噜噜狠狠| 天堂av8在线| 国内精品久久久久久久影视简单| 久久久久免费精品国产| 国产精品久久久久毛片| 国产精品毛片大码女人| 国产超级av在线| 东京久久高清| 久久香蕉频线观| 瑟瑟视频在线免费观看| 久久久精品国产免费观看同学| 成年人午夜免费视频| 色妞ww精品视频7777| 日韩在线观看免费全| 免费看av在线| 国产精品色婷婷| 欧美精品无码一区二区三区| 综合干狼人综合首页| 97在线看福利| 香港一级纯黄大片| 婷婷夜色潮精品综合在线| 图片区偷拍区小说区| 午夜欧美精品| 99久久99久久精品国产片| 中文在线字幕免费观看| 日韩久久久久久| 欧美激情一区二区视频| 国产盗摄视频一区二区三区| 激情五月六月婷婷| xxxxxhd亚洲人hd| 国内精品久久久久久久| 午夜av免费在线观看| 欧美日韩激情小视频| 性色av蜜臀av色欲av| 一区二区三区导航| 免费在线一区二区| 国产麻豆久久| 久久亚洲综合国产精品99麻豆精品福利| 国产欧美日韩成人| 亚洲自拍偷拍麻豆| 天天插天天射天天干| 国产农村妇女精品一二区| 欧美男人的天堂| www.久久| 欧美乱妇40p| 香蕉视频黄色片| 91久久奴性调教| 91精品国产闺蜜国产在线闺蜜| 国产精品自拍在线| 黄色一级视频在线播放| 亚洲最好看的视频| 91久久国产婷婷一区二区| 特级毛片在线| 亚洲免费av网址| 国产精品视频无码| 亚洲国产综合人成综合网站| 性欧美丰满熟妇xxxx性仙踪林| 日韩和欧美的一区| 公共露出暴露狂另类av| 国内自拍欧美| 国产精品爽黄69天堂a| 中文字幕有码在线观看| 亚洲免费中文字幕| 国产老女人乱淫免费| 午夜精品福利一区二区蜜股av| 一道本在线观看| 国产一区二区剧情av在线| 熟女少妇在线视频播放| 欧美三级美国一级| 国产乱人伦精品一区二区| 欧美123区| 欧美精品激情blacked18| 国产综合在线观看| 欧美tk丨vk视频| 久久午夜鲁丝片| 亚洲成av人片在线| 亚洲一二三四五六区| av午夜精品一区二区三区| 鲁一鲁一鲁一鲁一av| 亚洲国产导航| 中文字幕一区二区三区5566| 亚洲动漫在线观看| 亚洲xxxx做受欧美| av久久网站| 欧美亚洲激情视频| 色噜噜狠狠狠综合欧洲色8| 国产一区二区三区精品久久久 | 日本成人中文| 91丨九色丨国产在线| 国产精品亚洲一区二区三区在线观看| 欧美成人精品一区二区| 天堂av在线7| 91精品国产高清一区二区三区 | 最新黄网在线观看| 在线不卡国产精品| 午夜性色福利视频| 欧美哺乳videos| 国产偷人妻精品一区二区在线| 色婷婷精品大在线视频| 91精品国产乱码久久久张津瑜| 亚洲欧美韩国综合色| 国产又黄又粗又猛又爽的| 久久久久久夜精品精品免费| 又黄又爽的网站| 国产91精品露脸国语对白| av在线免费看片| 开心九九激情九九欧美日韩精美视频电影 | 超碰免费在线| 亚洲欧美中文另类| 性xxxx视频| 亚洲精品久久久久久久久久久久久| 国产高清视频免费| 欧美一区二区三区在线| 一级黄色大片免费| 欧美午夜精品一区| 成年人晚上看的视频| 一本大道av伊人久久综合| 久久草视频在线| 午夜精品一区在线观看| 欧美日韩国产精品综合| 一区二区三区欧美久久| 欧美黄色一区二区三区| 亚洲国产精品久久久久婷婷884| 激情五月婷婷在线| 亚洲一区免费观看| 久久午夜无码鲁丝片午夜精品| 亚洲激情一二三区| 青青草偷拍视频| 性做久久久久久免费观看 | 亚洲美女黄色| 欧洲精品一区二区三区久久| 1024精品一区二区三区| 欧美亚洲精品一区二区| 香蕉久久国产| 色综合手机在线| 久久国产剧场电影| 午夜激情影院在线观看| 国产成人在线观看免费网站| 成人做爰69片免费| www.日韩av| 天堂久久精品忘忧草| 中文字幕不卡在线播放| 天天操天天摸天天舔| 亚洲色图在线播放| 免费在线观看h片| 午夜一区二区三区视频| 黄色一级视频免费看| 欧美日韩一区 二区 三区 久久精品| 一级做a爱片性色毛片| 欧美成人在线直播| 四虎影院在线域名免费观看| 伊人伊人伊人久久| 国产精品扒开做爽爽爽的视频| 欧美激情精品久久久久久大尺度| 国产ktv在线视频| 国产精品九九九| 另类视频一区二区三区| 好吊色欧美一区二区三区视频| 国产尤物久久久| 天堂а√在线中文在线| 国产日韩一区二区三区在线| 日本 片 成人 在线| 大美女一区二区三区| 波多野在线播放| 亚洲综合色成人| 久久这里只有精品9| 日韩欧美国产一区二区在线播放| 日本高清中文字幕二区在线| 精品国产一区二区三区久久狼黑人| 欧美亚洲天堂| 国产精品久久久久影院日本| 一区二区中文字幕在线观看| 日韩精品av一区二区三区| 亚洲精品在线观看91| 国产网站免费在线观看| 国模娜娜一区二区三区| 欧美一区二区三区成人精品| 亚洲黄网站在线观看| 欧美日韩一级黄色片| 精品少妇一区二区三区视频免付费| 久久精品蜜桃| 91精品国产高清| 国模大尺度视频一区二区| 日本一区二区三区视频在线观看| 国产精品a久久久久| 激情黄色小视频| 久久亚洲二区三区| 久草成人在线视频| 欧美日韩一区二区三区视频| 天堂91在线| 午夜美女久久久久爽久久| 久久的色偷偷| 亚洲三级一区| 免费在线观看不卡| 精品少妇一区二区三区免费观| 亚洲国产精品精华液网站| 国产免费av观看| 人人妻人人澡人人爽久久av | 瑟瑟视频在线看| 懂色中文一区二区三区在线视频| 91麻豆国产自产在线观看亚洲| 美女福利视频在线| av在线播放一区二区三区| 国产一区二区视频在线观看免费| 欧美日韩视频在线观看一区二区三区 | 天天综合网天天| 精选一区二区三区四区五区| 欧美性久久久| 亚洲精品乱码久久久久久9色| 综合久久久久久| 国产精品国产av| 久久九九国产精品怡红院| 欧洲成人一区| 日韩精品久久久毛片一区二区| 亚洲制服av| 亚洲av综合一区二区| 色诱视频网站一区| 久久久久久久久亚洲精品| 啪一啪鲁一鲁2019在线视频| 日本一道高清一区二区三区| 精品这里只有精品| 99久久精品国产导航| 制服.丝袜.亚洲.中文.综合懂色| 日韩成人久久久| videos性欧美另类高清| 欧美亚洲国产免费| 日本欧美一区二区三区| 91麻豆制片厂| 7777精品伊人久久久大香线蕉经典版下载 | 欧美aaaaaaa| 国产成人精品一区二区三区福利| 在线高清一区| 中文字幕在线免费看线人| 日韩欧美精品网址| 国产一二在线观看| 国产精品欧美久久久| 国产精品99久久| 成年人性生活视频| 亚洲成人资源在线| 精品影院一区| 91免费看国产| 伊人久久亚洲美女图片| 久久丫精品国产亚洲av不卡| 日本高清成人免费播放| 日本最黄一级片免费在线| 91久久偷偷做嫩草影院| 国产欧美日韩一级| 国产一二三四五区| 欧美久久久一区| 福利成人导航| 日韩在线观看电影完整版高清免费| 免费成人你懂的| 欧美日韩三级在线观看| 亚洲丁香久久久| 成人免费视频观看| 天堂а√在线中文在线| 91色porny| 国产一区二区麻豆| 性欧美在线看片a免费观看| 欧美一级淫片| 美女露出粉嫩尿囗让男人桶| 色婷婷久久久综合中文字幕| 大片免费在线观看| 久久精品国产美女| 精品在线一区二区| 久草手机在线观看| 久久九九免费视频| 综合色就爱涩涩涩综合婷婷| 午夜视频在线观| 一本到三区不卡视频| 青青在线视频| 亚洲 国产 欧美一区| 国产成人精品www牛牛影视| 7799精品视频天天看| 欧美成人免费网| 精品一区电影| 天堂www中文在线资源| 欧美精品在线视频| 国产h片在线观看| 91视频 - 88av|