精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费欧美在线| 精品中文字幕一区二区三区av| 亚洲免费在线播放| 国产精品香蕉视屏| 无码人妻熟妇av又粗又大| 久久在线视频免费观看| 欧美mv和日韩mv的网站| 91传媒久久久| 黄色片网站在线观看| jizz一区二区| 国产欧美日韩最新| 九九九国产视频| 欧美日韩黑人| 亚洲а∨天堂久久精品9966| 国产又大又黄又粗又爽| 国产蜜臀av在线播放| 欧美国产日韩亚洲一区| 成人黄色在线免费观看| 亚洲午夜在线播放| 91久久亚洲| y97精品国产97久久久久久| 伦理片一区二区| 99视频有精品高清视频| 色综合久久中文综合久久牛| 91网站在线观看免费| 高清中文字幕一区二区三区| 处破女av一区二区| 国产一区在线播放| 四虎成人在线观看| 激情欧美一区二区三区| 久久这里有精品| 久久婷婷五月综合| 欧美亚洲色图校园春色| 日韩免费看网站| 怡红院亚洲色图| 午夜日韩成人影院| 亚洲第一福利一区| 成人黄色片免费| 色网站免费在线观看| 久久久久久久久伊人| 91中文在线观看| 伊人网站在线观看| 国产日韩精品视频一区二区三区 | 免费国产羞羞网站视频| 激情五月婷婷综合| 国产精品稀缺呦系列在线| 日韩黄色在线播放| 在线亚洲观看| 高清欧美性猛交xxxx黑人猛交| 999精品在线视频| 成人国产精品一级毛片视频| 亚洲日韩中文字幕| 亚洲精品理论片| 久久精品66| 日韩av在线看| 国产又粗又长又爽| 亚洲警察之高压线| 亚洲摸下面视频| av在线网站观看| 日韩在线你懂的| 日韩精品免费在线观看| 久久偷拍免费视频| 午夜先锋成人动漫在线| 亚洲欧美一区二区三区情侣bbw| 国产精品久久不卡| av一区二区在线观看| 夜夜嗨av一区二区三区免费区| 色婷婷av777| 精品少妇av| 久久精品国产亚洲精品2020| 粉嫩av性色av蜜臀av网站| 成人高清电影网站| 久久精品亚洲94久久精品| 欧美大片xxxx| 国产在线成人| 欧美一级电影久久| 国产91av在线播放| 狠狠色综合色综合网络| 成人免费观看网站| 国产又爽又黄网站亚洲视频123| eeuss国产一区二区三区| 久久久影院一区二区三区| 国产人成在线视频| 亚洲精品国久久99热| 五月丁香综合缴情六月小说| www.精品| 91精品久久久久久久91蜜桃| 精品一区二区三区四区五区六区| 综合干狼人综合首页| 色妞久久福利网| 免费在线观看日韩| 欧美亚洲免费| 成人乱人伦精品视频在线观看| www.xxx国产| 久久久久久久久岛国免费| 亚洲一区二区三区欧美| 黑人玩欧美人三根一起进| 91福利在线免费观看| 欧美熟妇另类久久久久久多毛| 欧美jizz19性欧美| 97精品一区二区| 91精品中文字幕一区二区三区| 91视频免费入口| 日韩精品丝袜美腿| 日韩中文综合网| 日韩伦理在线视频| 另类小说视频一区二区| 国产日韩欧美亚洲一区| 在线激情网站| 午夜影院久久久| 成年人三级黄色片| 性人久久久久| 欧美成人久久久| 二区视频在线观看| 久久精品国产一区二区三| 精品国产一区二区三| 麻豆网站在线观看| 在线免费观看日本欧美| 在线免费看黄色片| 欧美精品网站| 成人午夜一级二级三级| 国产精品四虎| 欧美日韩美女在线观看| 青娱乐国产精品视频| 成人羞羞视频在线看网址| 97超级碰碰人国产在线观看| 国产精品无码白浆高潮| 欧美国产精品久久| 日韩毛片在线免费看| 久久动漫网址| 久久久久久一区二区三区| 国产精品高潮呻吟AV无码| 国产亚洲人成网站| 免费高清在线观看免费| 国产色噜噜噜91在线精品| 另类少妇人与禽zozz0性伦| 中文字幕一区二区三区四区免费看 | 高清精品久久| 中文字幕精品一区久久久久| 中文字幕国产在线观看| 久久先锋资源网| 欧美成人三级在线视频| 国产精品欧美大片| 欧美激情伊人电影| 性生活三级视频| 亚洲女同女同女同女同女同69| 另类小说第一页| 欧洲grand老妇人| 国产精品久久一| 婷婷在线视频观看| 欧美日韩一区二区三区在线看| 国产成人一区二区在线观看| 久久久久久黄| 日韩欧美视频一区二区| av一区在线播放| 伊人青青综合网站| 久草视频在线免费| 国产精品人妖ts系列视频| 一级黄色录像在线观看| 国产精品精品| 51国偷自产一区二区三区的来源| 韩国中文字幕在线| 日韩午夜小视频| 欧美日韩综合视频| 日韩有码在线播放| 在线观看免费小视频| 日韩av不卡在线观看| 欧美激情导航| 日韩漫画puputoon| 俺去亚洲欧洲欧美日韩| 国产成人精品视频免费看| 天堂久久午夜av| 久久国产一区二区三区| 国产激情视频在线播放| 亚洲大尺度视频在线观看| 黄色在线观看av| 视频一区二区三区中文字幕| 亚洲精品高清视频| 综合激情网...| 青草青草久热精品视频在线网站| 国产对白叫床清晰在线播放| 正在播放一区二区| 亚欧洲精品在线视频| 国产亚洲精品bt天堂精选| 国产免费中文字幕| 99pao成人国产永久免费视频| 欧美精品一区二区三区在线看午夜 | 国产视频在线一区| 亚洲成人免费在线观看| 国产精品av在线| www日韩av| 污污视频在线观看网站| 色播五月激情综合网| 久草福利资源在线| 99久久99久久精品免费看蜜桃| 北条麻妃在线视频| 欧美不卡在线| 欧美资源一区| 试看120秒一区二区三区| 欧美自拍视频在线| 成人免费看片| 亚洲欧美国产精品va在线观看| 在线免费观看日韩视频| 亚洲18色成人| 777777国产7777777| 26uuu亚洲综合色| 杨幂一区二区国产精品| 久久亚洲影院| www.日本少妇| 五月激情综合| 日本福利一区二区三区| 日韩欧美一级| 国产免费久久av| 亚洲精品mv| 久久久久成人精品| 国产一二区在线观看| 亚洲视频在线免费看| 日本人妻丰满熟妇久久久久久| 欧美久久久久免费| 自拍偷拍校园春色| 欧美日韩亚洲一区二区三区| a级片在线观看免费| 国产精品视频一二| 亚洲一级中文字幕| 成人18精品视频| 欧美污在线观看| 老司机午夜精品| 玩弄japan白嫩少妇hd| 亚洲人人精品| www.日本在线视频| 欧美成人嫩草网站| 路边理发店露脸熟妇泻火| 日韩精品水蜜桃| 日韩高清国产精品| 国产亚洲电影| 欧美亚洲一级二级| 亚洲香蕉视频| 免费成人在线观看av| 青青一区二区| 精品在线观看一区二区| 精品欧美午夜寂寞影院| 国产精品一区二区三区精品| 欧美区一区二区| 亚洲字幕一区二区| 日韩精品成人| 国产福利久久| 国产精品zjzjzj在线观看| 国产精品福利视频| jizzjizzjizz欧美| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 黑人巨大精品欧美一区二区三区 | 欧美四级电影在线观看| 一级黄色在线视频| 在线观看视频一区二区| 天天爱天天做天天爽| 在线观看精品一区| 在线观看国产精品视频| 欧美日韩黄色一区二区| 国产精品久久久久久久久久久久久久久久久久 | 秋霞影院一区二区三区| 欧美lavv| 欧美一级精品片在线看| 亚洲一区3d动漫同人无遮挡 | 成人自拍视频| 99久久99久久精品国产片| 成午夜精品一区二区三区软件| 成人欧美一区二区三区视频 | 国产丝袜一区二区| 久久精品蜜桃| 最近2019中文字幕第三页视频 | www.久久精品.com| 亚洲国产精品成人av| 欧美成人片在线| 伊人久久久久久久久久| a免费在线观看| 国产做受69高潮| 性高爱久久久久久久久| 成人观看高清在线观看免费| 97se亚洲| 日韩av一区二区三区美女毛片| 欧美丰满日韩| 日本wwwcom| 日本欧美在线看| 特黄特黄一级片| 久久青草欧美一区二区三区| 国产又粗又猛又爽又黄的视频小说| 亚洲色图欧美激情| 久久久久久久黄色片| 欧美日韩一区二区在线观看| 午夜精品久久久久久久96蜜桃| 亚洲欧美国产一区二区三区| 麻豆影视国产在线观看| 91精品国产高清久久久久久| 国产成人久久精品麻豆二区| 国产日韩欧美精品| 欧美独立站高清久久| 精品久久久久久久久久中文字幕| 蜜臀av性久久久久av蜜臀妖精 | 国产曰肥老太婆无遮挡| 日韩精品一二区| 夜夜夜夜夜夜操| 99久久99久久精品国产片果冻| 91无套直看片红桃在线观看| 亚洲成a人片在线观看中文| 在线观看毛片网站| 亚洲精品久久久久中文字幕欢迎你| 色影视在线观看| 欧美专区第一页| 欧美高清一级片| 亚洲欧洲一区二区在线观看| 一区二区日韩免费看| 91视频福利网| 欧美国产亚洲另类动漫| 国产精品suv一区二区三区| 欧美一区二区三区免费视频| 福利视频在线导航| 91精品国产高清自在线看超| 中文字幕日韩在线| 伊人久久大香线蕉av一区| 国产精品婷婷| 美女久久久久久久久| 中文字幕一区二区三区不卡| 日日骚av一区二区| 日韩av一卡二卡| 国产网红在线观看| 91在线网站视频| 日韩www.| 激情综合网俺也去| 91美女视频网站| 国产一级精品aaaaa看| 国产精品综合激情| 91亚洲精品一区二区乱码| 极品魔鬼身材女神啪啪精品| 在线观看成人免费视频| 四虎影视在线播放| 精品一区二区三区电影| 国产原创视频在线| 日韩女优av电影在线观看| 成人在线播放| 91久久在线观看| 99欧美视频| 国产原创精品在线| 中文字幕一区二区三区色视频| 国产污片在线观看| 免费看av成人| 99国产精品久久久久老师| 欧美超碰在线| 中文字幕久久av| 自拍偷拍国产精品| 国产青青草视频| 色综合色综合网色综合| 亚洲精品一区二区三区中文字幕| 日韩一级免费看| 国内精品国产成人国产三级粉色| 欧美亚洲一区二区在线观看| 亚洲天堂狠狠干| 中文字幕v亚洲ⅴv天堂| 色综合.com| 小说区视频区图片区| 精彩视频一区二区三区| 国产精品成人69xxx免费视频| 91精品一区二区三区在线观看| 久cao在线| 91久久国产自产拍夜夜嗨| 亚洲婷婷免费| 中文字幕 亚洲一区| 日韩人在线观看| 国产在线电影| 成人免费视频97| 欧美福利专区| 波多野结衣先锋影音| 欧美午夜片在线看| www.在线视频| 久久久久久久久四区三区| 日本一不卡视频| 国产三级国产精品国产国在线观看| 日韩视频国产视频| 欧美一级鲁丝片| 日本精品视频一区| 国产一区二区三区在线观看免费 | 国产精品久久久久9999小说| 国产欧美视频在线观看| 国产喷水吹潮视频www| 国内精品视频一区| 国内黄色精品| 色综合久久久无码中文字幕波多| 激情成人中文字幕| 日本暖暖在线视频| 国内一区在线| 毛片av中文字幕一区二区| 免费在线一级片| 亚洲最新在线视频| 4438全国亚洲精品观看视频| 日韩有码免费视频| 一区二区三区四区在线播放 | 一级毛片精品毛片| 日韩中文字幕免费在线| 一区二区三区中文字幕| 韩日在线视频| 成人av片网址|