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

讓Elasticsearch飛起來!百億級實時查詢優化實戰

原創
開發 架構 開發工具
最近的一個項目是風控過程數據實時統計分析和聚合的一個 OLAP 分析監控平臺,日流量峰值在 10 到 12 億上下,每年數據約 4000 億條,占用空間大概 200T。

【51CTO.com原創稿件】最近的一個項目是風控過程數據實時統計分析和聚合的一個 OLAP 分析監控平臺,日流量峰值在 10 到 12 億上下,每年數據約 4000 億條,占用空間大概 200T。

面對這樣一個數據量級的需求,我們的數據如何存儲和實現實時查詢將是一個嚴峻的挑戰。

經過對 Elasticsearch 多方調研和超過幾百億條數據的插入和聚合查詢的驗證之后,我們總結出以下幾種能夠有效提升性能和解決這一問題的方案:

  • 集群規劃
  • 存儲策略
  • 索引拆分
  • 壓縮
  • 冷熱分區等

本文所使用的 Elasticsearch 版本為 5.3.3。

 

什么是時序索引?其主要特點體現在如下兩個方面:

  • 存,以時間為軸,數據只有增加,沒有變更,并且必須包含 timestamp(日期時間,名稱隨意)字段。

其作用和意義要大于數據的 id 字段,常見的數據比如我們通常要記錄的操作日志、用戶行為日志、或股市行情數據、服務器 CPU、內存、網絡的使用率等。

  • 取,一定是以時間范圍為***過濾條件,然后是其他查詢條件,比如近一天、一周、本月等等,然后在這個范圍內進行二次過濾。

比如性別或地域等,查詢結果中比較關注的是每條數據和 timestamp 字段具體發生的時間點,而非 id。

此類數據一般用于 OLAP、監控分析等場景。

集群部署規劃

 

我們都知道在 Elasticsearch(下稱 ES)集群中有兩個主要角色:Master Node 和 Data Node,其他如 Tribe Node 等節點可根據業務需要另行設立。

為了讓集群有更好的性能表現,我們應該對這兩個角色有一個更好的規劃,在 Nodes 之間做讀取分離,保證集群的穩定性和快速響應,在大規模的數據存儲和查詢的壓力之下能夠坦然面對,各自愉快的協作。

Master Nodes

Master Node,整個集群的管理者,負有對 index 的管理、shards 的分配,以及整個集群拓撲信息的管理等功能。

眾所周知,Master Node 可以通過 Data Node 兼任,但是,如果對群集規模和穩定要求很高的話,就要職責分離,Master Node 推薦獨立,它的狀態關乎整個集群的存活。

Master 的配置:

  1. node.master: true  
  2. node.data: false  
  3. node.ingest: false 

這樣 Master 不參與 I、O,從數據的搜索和索引操作中解脫出來,專門負責集群的管理工作,因此 Master Node 的節點配置可以相對低一些。

另外防止 ES 集群 split brain(腦裂),合理配置 discovery.zen.minimum_master_nodes 參數,官方推薦 master-eligible nodes / 2 + 1 向下取整的個數。

這個參數決定選舉 Master 的 Node 個數,太小容易發生“腦裂”,可能會出現多個 Master,太大 Master 將無法選舉。

更多 Master 選舉相關內容請參考:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-discovery-zen.html#master-election 

Data Nodes

Data Node 是數據的承載者,對索引的數據存儲、查詢、聚合等操作提供支持。

這些操作嚴重消耗系統的 CPU、內存、IO 等資源,因此,應該把***的資源分配給 Data Node,因為它們是真正干累活的角色,同樣 Data Node 也不兼任 Master 的功能。

Data 的配置:

  1. node.master: false  
  2. node.data: true  
  3. node.ingest: false 

Coordinating Only Nodes

 

ES 本身是一個分布式的計算集群,每個 Node 都可以響應用戶的請求,包括 Master Node、Data Node,它們都有完整的 Cluster State 信息。

正如我們知道的一樣,在某個 Node 收到用戶請求的時候,會將請求轉發到集群中所有索引相關的 Node 上,之后將每個 Node 的計算結果合并后返回給請求方。

我們暫且將這個 Node 稱為查詢節點,整個過程跟分布式數據庫原理類似。那問題來了,這個查詢節點如果在并發和數據量比較大的情況下,由于數據的聚合可能會讓內存和網絡出現瓶頸。

因此,在職責分離指導思想的前提下,這些操作我們也應該從這些角色中剝離出來,官方稱它是 Coordinating Nodes,只負責路由用戶的請求,包括讀、寫等操作,對內存、網絡和 CPU 要求比較高。

本質上,Coordinating Only Nodes 可以籠統的理解為是一個負載均衡器,或者反向代理,只負責讀,本身不寫數據,它的配置是:

  1. node.master: false  
  2. node.data: false  
  3. node.ingest: false  
  4. search.remote.connectfalse 

增加 Coordinating Nodes 的數量可以提高 API 請求響應的性能,我們也可以針對不同量級的 Index 分配獨立的 Coordinating Nodes 來滿足請求性能。

那是不是越多越好呢?在一定范圍內是肯定的,但凡事有個度,過了負作用就會突顯,太多的話會給集群增加負擔。

在做 Master 選舉的時候會先確保所有 Node 的 Cluster State 是一致的,同步的時候會等待每個 Node 的 Acknowledgement 確認,所以適量分配可以讓集群暢快的工作。

search.remote.connect 是禁用跨集群查詢,防止在進行集群之間查詢時發生二次路由:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html 

Routing

類似于分布式數據庫中的分片原則,將符合規則的數據存儲到同一分片。ES 通過哈希算法來決定數據存儲于哪個 Shard:

  1. shard_num = hash(_routing) % num_primary_shards 

其中 hash(_routing) 得出一個數字,然后除以主 Shards 的數量得到一個余數,余數的范圍是 0 到 number_of_primary_shards - 1,這個數字就是文檔所在的 Shard。

Routing 默認是 id 值,當然可以自定義,合理指定 Routing 能夠大幅提升查詢效率,Routing 支持 GET、Delete、Update、Post、Put 等操作。

如:

  1. PUT my_index/my_type/1?routing=user1 
  2.   "title""This is a document" 
  3.  
  4. GET my_index/my_type/1?routing=user1 

不指定 Routing 的查詢過程:

 

簡單的來說,一個查詢請求過來以后會查詢每個 Shard,然后做結果聚合,總的時間大概就是所有 Shard 查詢所消耗的時間之和。

指定 Routing 以后:

 

會根據 Routing 查詢特定的一個或多個 Shard,這樣就大大減少了查詢時間,提高了查詢效率。

當然,如何設置 Routing 是一個難點,需要一點技巧,要根據業務特點合理組合 Routing 的值,來劃分 Shard 的存儲,最終保持數據量相對均衡。

可以組合幾個維度做為 Routing ,有點類似于 Hbase Key,例如不同的業務線加不同的類別,不同的城市和不同的類型等等,如:

  • _search?routing=beijing:按城市。
  • _search?routing=beijing_user123:按城市和用戶。
  • _search?routing=beijing_android,shanghai_android:按城市和手機類型等。

數據不均衡?假如你的業務在北京、上海的數據遠遠大于其他二三線城市的數據。

再例如我們的業務場景,A 業務線的數據量級遠遠大于 B 業務線,有時候很難通過 Routing 指定一個值保證數據在所有 Shards 上均勻分布,會讓部分 Shard 變的越來越大,影響查詢性能,怎么辦?

一種解決辦法是單獨為這些數據量大的渠道創建獨立的 Index,如:

  1. http://localhost:9200/shanghai,beijing,other/_search?routing=android 

這樣可以根據需要在不同 Index 之間查詢,然而每個 Index 中 Shards 的數據可以做到相對均衡。

另一種辦法是指定 Index 參數 index.routing_partition_size,來解決最終可能產生群集不均衡的問題,指定這個參數后新的算法如下:

  1. shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards 

index.routing_partition_size 應具有大于 1 且小于 index.number_of_shards 的值。

最終數據會在 routing_partition_size 幾個 Shard 上均勻存儲,是哪個 Shard 取決于 hash(_id) % routing_partition_size 的計算結果。

指定參數 index.routing_partition_size 后,索引中的 Mappings 必須指定 _routing 為 "required": true,另外 Mappings 不支持 parent-child 父子關系。

很多情況下,指定 Routing 后會大幅提升查詢性能,畢竟查詢的 Shard 只有那么幾個,但是如何設置 Routing 是個難題,可根據業務特性巧妙組合。

索引拆分

Index 通過橫向擴展 Shards 實現分布式存儲,這樣可以解決 Index 大數據存儲的問題。

但在一個 Index 變的越來越大,單個 Shard 也越來越大,查詢和存儲的速度也越來越慢。

更重要的是一個 Index 其實是有存儲上限的(除非你設置足夠多的 Shards 和機器),如官方聲明單個 Shard 的文檔數不能超過 20 億(受限于 Lucene index,每個 Shard 是一個 Lucene index)。

考慮到 I、O,針對 Index 每個 Node 的 Shards 數***不超過 3 個,那面對這樣一個龐大的 Index,我們是采用更多的 Shards,還是更多的 Index,我們如何選擇?

Index 的 Shards 總量也不宜太多,更多的 Shards 會帶來更多的 I、O 開銷,其實答案就已經很明確,除非你能接受長時間的查詢等待。

Index 拆分的思路很簡單,時序索引有一個好處就是只有增加,沒有變更,按時間累積,天然對索引的拆分友好支持,可以按照時間和數據量做任意時間段的拆分。

ES 提供的 Rollover Api + Index Template 可以非常便捷和友好的實現 Index 的拆分工作,把單個 index docs 數量控制在百億內,也就是一個 Index 默認 5 個 Shards 左右即可,保證查詢的即時響應。

簡單介紹一下 Rollover API 和 Index Template 這兩個東西,如何實現 index 的拆分。

Index Template

我們知道 ES 可以為同一目的或同一類索引創建一個 Index Template,之后創建的索引只要符合匹配規則就會套用這個 Template,不必每次指定 Settings 和 Mappings 等屬性。

一個 Index 可以被多個 Template 匹配,那 Settings 和 Mappings 就是多個 Template 合并后的結果。

有沖突通過 Template 的屬性"order" : 0 從低到高覆蓋(這部分據說會在 ES6 中會做調整,更好的解決 Template 匹配沖突問題)。

示例:

  1. PUT _template/template_1 
  2.     "index_patterns" : ["log-*"], 
  3.     "order" : 0, 
  4.     "settings" : { 
  5.         "number_of_shards" : 5 
  6.     }, 
  7.     "aliases" : { 
  8.         "alias1" : {} 
  9.     } 

Rollover Index

 Rollover Index 可以將現有的索引通過一定的規則,如數據量和時間,索引的命名必須是 logs-000001 這種格式,并指定 aliases,示例:

  1. PUT /logs-000001  
  2.   "aliases": { 
  3.     "logs_write": {} 
  4.   } 
  5.  
  6. Add > 1000 documents to logs-000001 
  7.  
  8. POST /logs_write/_rollover  
  9.   "conditions": { 
  10.     "max_age":   "7d"
  11.     "max_docs":  1000 
  12.   } 

先創建索引并指定別名 logs_write,插入 1000 條數據,然后請求 _rollover api 并指定拆分規則。

如果索引中的數據大于規則中指定的數據量或者時間過時,新的索引將被創建,索引名稱為 logs-000002,并根據規則套用 Index Template,同時別名 logs_write 也將被變更到 logs-000002。

注意事項:

  • 索引命名規則必須如同:logs-000001。
  • 索引必須指定 aliases。
  • Rollover Index API 調用時才去檢查索引是否超出指定規則,不會自動觸發,需要手動調用,可以通過 Curator 實現自動化。
  • 如果符合條件會創建新的索引,老索引的數據不會發生變化,如果你已經插入 2000 條,拆分后還是 2000 條。
  • 插入數據時一定要用別名,否則你可能一直在往一個索引里追加數據。

技巧是按日期滾動索引:

  1. PUT /<logs-{now/d}-1> 
  2.   "aliases": { 
  3.     "logs_write": {} 
  4.   } 

假如生成的索引名為 logs-2017.04.13-1,如果你在當天執行 Rollover 會生成 logs-2017.04.13-000001,次日的話是 logs-2017.04.14-000001。

這樣就會按日期進行切割索引,那如果你想查詢 3 天內的數據可以通過日期規則來匹配索引名,如:

  1. GET /<logs-{now/d}-*>,<logs-{now/d-1d}-*>,<logs-{now/d-2d}-*>/_search 

到此,我們就可以通過 Index Template 和 Rollover API 實現對 Index 的任意拆分,并按照需要進行任意時間段的合并查詢,這樣只要你的時間跨度不是很大,查詢速度一般可以控制在毫秒級,存儲性能也不會遇到瓶頸。

Hot-Warm 架構

 

冷熱架構,為了保證大規模時序索引實時數據分析的時效性,可以根據資源配置不同將 Data Nodes 進行分類形成分層或分組架構。

一部分支持新數據的讀寫,另一部分僅支持歷史數據的存儲,存放一些查詢發生機率較低的數據。

即 Hot-Warm 架構,對 CPU,磁盤、內存等硬件資源合理的規劃和利用,達到性能和效率的***化。

我們可以通過 ES 的 Shard Allocation Filtering 來實現 Hot-Warm 的架構。

實現思路如下:

  • 將 Data Node 根據不同的資源配比打上標簽,如:Host、Warm。
  • 定義 2 個時序索引的 Index Template,包括 Hot Template 和 Warm Template,Hot Template 可以多分配一些 Shard 和擁有更好資源的 Hot Node。
  • 用 Hot Template 創建一個 Active Index 名為 active-logs-1,別名 active-logs,支持索引切割。
  • 插入一定數據后,通過 roller over api 將 active-logs 切割,并將切割前的 Index 移動到 Warm Nodes 上,如 active-logs-1,并阻止寫入。
  • 通過 Shrinking API 收縮索引 active-logs-1 為 inactive-logs-1,原 Shard 為 5,適當收縮到 2 或 3,可以在 Warm Template 中指定,減少檢索的 Shard,使查詢更快。
  • 通過 force-merging api 合并 inactive-logs-1 索引每個 Shard 的 Segment,節省存儲空間。
  • 刪除 active-logs-1。

Hot,Warm Nodes

Hot Nodes

擁有***資源的 Data Nodes,如更高性能的 CPU、SSD 磁盤、內存等資源,這些特殊的 Nodes 支持索引所有的讀、寫操作。

如果你計劃以 100 億為單位來切割 Index,那至少需要三個這樣的 Data Nodes,Index 的 Shard 數為 5,每個 Shard 支持 20 億 Documents 數據的存儲。

為這類 Data Nodes 打上標簽,以便我們在 Template 中識別和指定,啟動參數如下:

  1. ./bin/elasticsearch -Enode.attr.box_type=hot 

或者配置文件:

  1. node.attr.box_type: hot 

Warm Nodes

存儲只讀數據,并且查詢量較少,但用于存儲長多時間歷史數據的 Data Nodes,這類 Nodes 相對 Hot Nodes 較差的硬件配置,根據需求配置稍差的 CPU、機械磁盤和其他硬件資源,至于數量根據需要保留多長時間的數據來配比,同樣需要打上標簽,方法跟 Hot Nodes 一樣,指定為 Warm,box_type: warm。

Hot,Warm Template

Hot Template

我們可以通過指定參數"routing.allocation.include.box_type": "hot",讓所有符合命名規則索引的 Shard 都將被分配到 Hot Nodes 上:

  1. PUT _template/active-logs 
  2.   "template""active-logs-*"
  3.   "settings": { 
  4.     "number_of_shards":   5, 
  5.     "number_of_replicas": 1, 
  6.     "routing.allocation.include.box_type""hot"
  7.     "routing.allocation.total_shards_per_node": 2 
  8.   }, 
  9.   "aliases": { 
  10.     "active-logs":  {} 
  11.   } 

Warm Template

同樣符合命名規則索引的 Shard 會被分配到 Warm Nodes 上,我們指定了更少的 Shards 數量和復本數。

注意,這里的復本數為 0,和 best_compression 級別的壓縮,方便做遷移等操作,以及進行一些數據的壓縮:

  1. PUT _template/inactive-logs 
  2.   "template""inactive-logs-*"
  3.   "settings": { 
  4.     "number_of_shards":   1, 
  5.     "number_of_replicas": 0, 
  6.     "routing.allocation.include.box_type""warm"
  7.     "codec""best_compression" 
  8.   } 

假如我們已經創建了索引 active-logs-1 ,當然你可以通過 _bulk API 快速寫入測試的數據,然后參考上文中介紹的 Rollover API 進行切割。

Shrink Index

Rollover API 切割以后,active-logs-1 將變成一個冷索引,我們將它移動到 Warm Nodes 上。

先將索引置為只讀狀態,拒絕任何寫入操作,然后修改 index.routing.allocation.include.box_type 屬性,ES 會自動移動所有 Shards 到目標 Data Nodes 上:

  1. PUT active-logs-1/_settings 
  2.   "index.blocks.write"true
  3.   "index.routing.allocation.include.box_type""warm" 

Cluster Health API 可以查看遷移狀態,完成后進行收縮操作,其實相當于復制出來一個新的索引,舊的索引還存在。

  1. POST active-logs-1/_shrink/inactive-logs-1 

我們可以通過 Head 插件查看整個集群索引的變化情況。關于 Shard 的分配請參考:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html 

Forcemerge

到目前為止我們已經實現了索引的冷熱分離,和索引的收縮,我們知道每個 Shard 下面由多個 Segment 組成,那 inactive-logs-1 的 Shard 數是 1,但 Segment 還是多個。

這類索引不會在接受寫入操作,為了節約空間和改善查詢性能,通過 Forcemerge API 將 Segment 適量合并:

  1. PUT inactive-logs-1/_settings 
  2. "number_of_replicas": 1 } 

ES 的 Forcemerge 過程是先創建新的 Segment 刪除舊的,所以舊 Segment 的壓縮方式 best_compression 不會在新的 Segment 中生效,新的 Segment 還是默認的壓縮方式。

現在 inactive-logs-1 的復本還是 0,如果有需要的話,可以分配新的復本數:

  1. PUT inactive-logs-1/_settings 
  2. "number_of_replicas": 1 } 

***刪除 active-logs-1,因為我們已經為它做了一個查詢復本 inactive-logs-1。

DELETE active-logs-1

走到這里,我們就已經實現了 Index 的 Hot-Warm 架構,根據業務特點將一段時間的數據放在 Hot Nodes,更多的歷史數據存儲于 Warm Nodes。

其他優化方案

索引隔離

 

在多條業務線的索引共用一個 ES 集群時會發生流量被獨吃獨占的情況,因為大家都共用相同的集群資源,流量大的索引會占用大部分計算資源而流量小的也會被拖慢,得不到即時響應,或者說業務流量大的索引可以按天拆分,幾個流量小的索引可以按周或月拆分。

這種情況下我們可以將規模大的索引和其他相對小規模的索引獨立存儲,分開查詢或合并查詢。

除了 Master Nodes 以外,Data Nodes 和 Coordinating Nodes 都可以獨立使用(其實如果每個索引的量都特別大也應該采用這種架構),還有一個好處是對方的某個 Node 掛掉,自己不受影響。

同樣利用 ES 支持 Shard Allocation Filtering 功能來實現索引的資源獨立分配,先將 Nodes 進行打標簽,劃分區域,類似于 Hot-Warm 架構:

  1. node.attr.zone=zone_a、node.attr.zone=zone_b 

或者:

  1. node.attr.zone =zone_hot_a、node.attr.zone=zone_hot_b 

等打標簽的方式來區別對應不同的索引,然后在各自的 Index Template 中指定不同的 node.attr.zone 即可。

如"index.routing.allocation.include.zone" : "zone_a,zone_hot_a",

或者排除法"index.routing.allocation.exclude.size": "zone_hot_b"

分配到 zone_hot_b 以外的所有 Data Nodes 上。

更多用法可以參考 Hot-Warm 架構,或 shard-allocation-filtering:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html 

跨數據中心

 

如果你的業務遍布全國各地,四海八荒,如果你數據要存儲到多個機房,如果你的 Index 有幾萬個甚至更多( Index 特別多,集群龐大會導致 Cluster State 信息量特別大,因為 Cluster State 包含了所有 Shard、Index、Node 等所有相關信息,它存儲在每個 Node 上,這些數據發生變化都會實時同步到所有 Node 上,當這個數據很大的時候會對集群的性能造成影響)。

這些情況下我們會考慮部署多個 ES Cluster,那我們將如何解決跨集群查詢的問題呢?

目前 ES 針對跨集群操作提供了兩種方案 Tribe Node 和 Cross Cluster Search。

Tribe Node

 

需要一個獨立的 Node 節點,加入其他 ES Cluster,用法有點類似于 Coordinating Only Node。

所不同的是 Tribe 是針對多個 ES 集群之間的所有節點,Tribe Node 收到請求廣播到相關集群中所有節點,將結果合并處理后返回。

表面上看起來 Tribe Node 將多個集群串連成了一個整體,遇到同名 Index 發生沖突,會選擇其中一個 Index,也可以指定:

  1. tribe: 
  2.   on_conflict: prefer_t1 
  3.   t1: 
  4.     cluster.name: us-cluster 
  5.     discovery.zen.ping.multicast.enabled: false 
  6.     discovery.zen.ping.unicast.hosts: ['usm1','usm2','usm3'
  7.   t2: 
  8.     cluster.name: eu-cluster 
  9.     discovery.zen.ping.multicast.enabled: false 
  10.     discovery.zen.ping.unicast.hosts: ['eum1','eum2','eum3'

Cross Cluster Search

 

Cross Cluster Search 可以讓集群中的任意一個節點聯合查詢其他集群中的數據, 通過配置 elasticsearch.yml 或者 API 來啟用這個功能,API 示例:

  1. PUT _cluster/settings 
  2.   "persistent": { 
  3.     "search": { 
  4.       "remote": { 
  5.         "cluster_one": { 
  6.           "seeds": [ 
  7.             "127.0.0.1:9300" 
  8.           ] 
  9.     ... 
  10.         } 
  11.       } 
  12.     } 
  13.   } 

提交以后整個集群所有節點都會生效,都可以做為代理去做跨集群聯合查詢,不過我們***還是通過 Coordinating Only Nodes 去發起請求。

  1. POST /cluster_one:decision,decision/_search 
  2.     "match_all": {} 

對集群 cluster_one 和本集群中名為 Decision 的索引聯合查詢。

目前這個功能還在測試階段,但未來可能會取代 Tribe Node,之間的***的差異是 Tribe Node 需要設置獨立的節點,而 Cross Cluster Search 不需要,集群中的任意一個節點都可以兼任。

比如可以用我們的 Coordinating Only Nodes 做為聯合查詢節點,另一個優點是配置是動態的,不需要重啟節點。

實際上可以理解為是一個 ES 集群之間特定的動態代理工具,支持所有操作,包括 Index 的創建和修改,并且通過 Namespace 對 Index 進行隔離,也解決了 Tribe Node 之 Index 名稱沖突的問題。

小結

我們在文中介紹了幾種方案用來解決時序索引的海量數據存儲和查詢的問題,根據業務特點和使用場景來單獨或組合使用能夠發揮出意想不到的效果。

特別是 Nodes 之間的讀寫分離、索引拆分、Hot-Warm 等方案的組合應用對索引的查詢和存儲性能有顯著的提升。

另外 Routing 在新版本中增加了 routing_partition_size,解決了 Shard 難以均衡的問題。

如果你的索引 Mapping 中沒有 parent-child 關聯關系可以考慮使用,對查詢的性能提升非常有效。

本文參考內容:

  • hot-warm-architecture-in-elasticsearch-5-x
  • managing-time-based-indices-efficiently
  • what-is-evolving-in-elasticsearch

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2025-03-28 03:20:00

MySQL數據庫搜索

2024-11-27 09:46:34

2025-08-15 07:36:48

彈幕系統Spring

2020-09-29 07:54:05

Express 飛起

2011-04-13 10:51:58

MATLAB

2025-06-04 01:35:00

RocketMQ異步消息

2025-06-26 02:15:00

2024-06-12 12:28:23

2021-07-13 07:52:03

SQL面試COUNT(*)

2023-11-10 18:03:04

業務場景SQL

2013-01-07 09:34:43

CodeLoveBAT

2011-02-25 08:39:11

QFabric數據中心Juniper

2025-09-02 01:35:00

JavaAIMIP

2022-10-09 18:14:31

訂單系統分庫分表

2011-05-20 11:12:01

數據庫DB2優化

2025-05-22 08:04:43

2025-07-30 01:22:00

2016-01-19 17:03:59

數據中心網絡華為

2025-04-15 00:00:00

2011-05-11 11:32:35

數據庫DB2優化技巧
點贊
收藏

51CTO技術棧公眾號

亚洲高清不卡| 青青草国产一区二区三区| 3d精品h动漫啪啪一区二区| 午夜av中文字幕| 国产成人l区| 久久国产精品亚洲77777| 亚洲欧美日韩精品久久| 99re精彩视频| 婷婷av在线| 99re成人在线| 国产精品日韩欧美| 亚洲国产成人精品综合99| 红杏aⅴ成人免费视频| 高跟丝袜一区二区三区| 色一情一乱一伦一区二区三欧美| 中文字幕在线观看第二页| 91久久电影| 精品国产一区二区三区久久影院 | 91美女精品福利| 日韩av电影中文字幕| 偷拍女澡堂一区二区三区| 欧美aaa级| 亚洲午夜精品在线| 色女孩综合网| 欧美熟妇另类久久久久久不卡| 久久一日本道色综合久久| 久久精品视频免费播放| 香港三日本8a三级少妇三级99| 欧美日韩在线精品一区二区三区激情综合 | 日本在线观看a| 国产传媒在线播放| 久久久亚洲欧洲日产国码αv| 国产中文字幕91| 欧美日韩一级在线观看| 九九热精品视频在线观看| 日韩一区二区三区电影 | 麻豆av在线免费观看| 国产欧美一区二区精品秋霞影院 | 日韩欧美在线精品| 欧美一区二区三区在线观看| 国产精品69页| 黄色av免费在线| 久久精品人人做人人爽97| 91久久精品一区二区别| 中文字幕一区二区三区人妻四季| 亚洲免费黄色| 欧美黄色三级网站| 欧美做爰啪啪xxxⅹ性| 美女亚洲一区| 日韩电影视频免费| www.com日本| 国产麻豆一区二区三区| 色乱码一区二区三区88| 日韩av中文字幕第一页| 天堂av最新在线| 国产欧美精品一区aⅴ影院 | 国产精品嫩草影院在线看| 亚洲第一男人av| 男男受被啪到高潮自述| 日日狠狠久久| 欧美人与z0zoxxxx视频| 国产乱子伦农村叉叉叉| 黄网在线免费看| 亚洲老司机在线| 国产卡一卡二在线| 麻豆传媒在线免费看| 国产日韩精品一区二区三区| 欧美日本国产精品| 日韩二区三区| 久久亚洲欧美国产精品乐播| 精品视频一区二区| 亚洲成人精品女人久久久| 国产精品一区二区在线观看不卡| 91美女片黄在线观| 国产伦子伦对白视频| 久久99国产乱子伦精品免费| 国产热re99久久6国产精品| 亚洲在线精品视频| 久久精品国产色蜜蜜麻豆| 国产精品无码专区在线观看| 中文字幕理论片| 久久精品国产第一区二区三区| 国产精品免费看久久久香蕉| 中文字幕在线2018| 国产精品综合视频| 91免费看蜜桃| 日本高清视频免费看| av不卡在线观看| 蜜桃狠狠色伊人亚洲综合网站| 日本福利片高清在线观看| 久久蜜桃一区二区| 欧美污视频久久久| 日本三级视频在线播放| 一区二区成人在线观看| 水蜜桃色314在线观看| 一级毛片久久久| 欧美日韩二区三区| 污视频在线观看免费网站| 国产情侣一区在线| 亚洲成人精品视频| 韩国女同性做爰三级| 久久国产中文字幕| 欧美激情精品久久久久久黑人 | 97人人澡人人爽人人模亚洲| 久久在线91| 91中文在线观看| 亚洲欧美日韩动漫| 国产精品久久久久久久久免费丝袜 | 中文字幕欧美国产| 永久免费看av| 二区三区不卡| 91精品国产一区二区| 午夜剧场免费看| av一区二区在线播放| 欧美成人亚洲成人| 精品午夜福利在线观看| 视频一区视频二区中文字幕| 成人亚洲综合色就1024| 污污网站免费在线观看| 国产精品久久久久久久久免费丝袜| 激情五月六月婷婷| 成人自拍av| 日韩精品一区在线| 亚洲色图 激情小说| 国产一区亚洲| 国产精品亚洲美女av网站| 性中国xxx极品hd| 中文字幕不卡在线观看| 17c丨国产丨精品视频| 成人日韩在线| 亚洲福利视频网| 天天操天天操天天操天天操天天操| 一本色道久久综合亚洲精品不卡| 国产精品一区二区久久国产| 日韩在线观看视频一区二区三区| 亚洲欧洲成人精品av97| 性欧美大战久久久久久久| 欧美97人人模人人爽人人喊视频| 亚洲娇小xxxx欧美娇小| www.色小姐com| 久久精品国产一区二区三区免费看| 国产伦精品一区二区| 老司机午夜在线视频| 91久久精品一区二区| 国产精品99精品无码视亚| 第一会所亚洲原创| 久久久久久久一区二区| 99国产在线播放| 欧美国产亚洲另类动漫| www黄色av| 久久夜色精品国产噜噜av小说| 中文字幕精品一区久久久久 | 99久久久久久久| 国产精品美女一区二区三区| 激情六月丁香婷婷| 日韩mv欧美mv国产网站| 高清欧美性猛交| 动漫av一区二区三区| 国产精品国产三级国产三级人妇 | 免费欧美在线| 另类小说综合网| 亚洲优女在线| 亚洲桃花岛网站| 日韩人妻精品中文字幕| 91丨九色丨蝌蚪丨老版| 久久久久久久激情| 精品72久久久久中文字幕| 国产999在线| 青青草免费在线| 欧美性生交xxxxxdddd| 成人手机在线免费视频| 国产精品资源| 日韩黄色影视| 日韩三级成人| 久久国产精品首页| www日本视频| 亚洲高清免费视频| 亚洲最大成人网站| 免费久久99精品国产| 亚洲韩国在线| 成人在线视频www| 欧美激情一区二区三区成人| 色呦呦中文字幕| 亚洲国产精品久久久久婷婷884 | 国产亚洲欧美在线| www.亚洲高清| 国产一区欧美| 欧美一区二区三区四区夜夜大片 | 精品久久久亚洲| 国产精品一区二区三区久久久| 欧美日韩欧美| 欧美一区二区在线免费播放| 特级片在线观看| 久久综合精品国产一区二区三区 | av观看在线| 精品动漫一区二区三区在线观看| 日韩成人毛片视频| 99精品久久免费看蜜臀剧情介绍 | 日本系列欧美系列| 99热都是精品| 欧美一区自拍| 国产精品直播网红| 欧美人与牲禽动交com| 日韩视频在线永久播放| 亚洲第一在线播放| 1000精品久久久久久久久| 无码成人精品区在线观看| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲免费成人网| 色www精品视频在线观看| 三上悠亚在线观看视频| 成人av资源网站| a在线观看免费视频| 黄色综合网站| 亚洲v欧美v另类v综合v日韩v| 涩爱av色老久久精品偷偷鲁 | 欧美色图17p| av不卡免费在线观看| 天天操狠狠操夜夜操| 伊人蜜桃色噜噜激情综合| 日韩国产在线一区| 国内毛片久久| 91人成网站www| 91九色美女在线视频| 最近中文字幕2019免费| 十九岁完整版在线观看好看云免费| 欧美日韩一区二区三区四区五区| 久久免费精彩视频| 国产精品久久久久久久久图文区| 法国伦理少妇愉情| 国产999精品久久| 日韩高清第一页| 丝袜亚洲另类丝袜在线| av在线播放天堂| 日韩精品一区二区三区免费观影| 精品国产免费久久久久久尖叫 | 国产精品无码一区二区三区免费| 国内成人自拍视频| 国产一二三四在线视频| 国产欧美日韩一级| h无码动漫在线观看| 先锋资源久久| 亚洲午夜精品久久久中文影院av | 日韩大片在线观看视频| 亚洲狼人综合网| 日韩一区二区视频在线观看| 伊人免费在线观看| 欧美中文字幕一区| 欧美a视频在线观看| 午夜亚洲国产au精品一区二区| 岛国毛片在线观看| 亚洲精品国产一区二区三区四区在线| 东京热无码av男人的天堂| 久久综合九色综合97_久久久| 国产视频精品视频| 成人小视频在线| 亚洲中文字幕一区| 久久精品人人爽人人爽| 久久久精品成人| 亚洲欧洲日产国码二区| 曰本女人与公拘交酡| 一区二区三区国产豹纹内裤在线| 伊人365影院| 欧美性猛交xxxx黑人| 懂色av蜜臀av粉嫩av喷吹| 欧美精品高清视频| 亚洲成a人片在线| 亚洲美女黄色片| 欧美性天天影视| 久久久久久国产精品| 日韩欧美精品一区二区三区| 国产精品一香蕉国产线看观看| 久久久久久爱| 久久久国产精品一区二区三区| 亚洲综合图色| 免费看av软件| 亚洲看片免费| 日本肉体xxxx裸体xxx免费| 国产美女精品在线| 亚洲精品乱码久久久久久久| 国产亚洲精品资源在线26u| 午夜爽爽爽男女免费观看| 亚洲va欧美va国产va天堂影院| 天天干天天色综合| 制服丝袜亚洲精品中文字幕| 乱精品一区字幕二区| 亚洲图片欧美日产| h片在线免费| 国产激情999| 99re8这里有精品热视频8在线 | 国产精品日韩av| 国产亚洲成av人片在线观黄桃| 欧美午夜精品理论片a级大开眼界| 久久久久美女| 人妻少妇被粗大爽9797pw| 激情综合五月天| 天天躁日日躁aaaxxⅹ| 国产精品美女久久久久高潮| 国产精品二区一区二区aⅴ| 欧美性三三影院| 黄色av免费观看| 精品国产一区二区三区在线观看 | 99精品欧美| 国产亚洲视频一区| 久久久久久久久岛国免费| 麻豆精品一区二区三区视频| 在线观看网站黄不卡| 免费观看国产精品| 北条麻妃在线一区二区| 在线观看涩涩| 999视频在线免费观看| 精品少妇av| 欧美黄网站在线观看| 国产精品99久久久久久有的能看 | 日本女优一区| 成人网站免费观看入口| 国产伦精品一区二区三区免费迷 | 少妇熟女视频一区二区三区 | 国产亚洲激情视频在线| 春色校园综合激情亚洲| 亚洲va欧美va国产综合久久| 欧美色女视频| 91av俱乐部| 99精品桃花视频在线观看| 69av视频在线| 在线不卡免费欧美| 成人av电影观看| 国产z一区二区三区| 亚洲精品国产精品粉嫩| 91九色丨porny丨国产jk| 国产精品系列在线播放| 永久看片925tv| 在线不卡中文字幕播放| 在线免费黄色| 国产精品自产拍在线观| 国产在线观看91一区二区三区| 国产美女网站在线观看| 成人性生交大片免费看视频在线| 久草国产在线观看| 日韩一区二区在线观看视频播放| 99视频免费在线观看| 91久久国产精品| 午夜影院欧美| 亚洲精品久久久久久| 亚洲欧美一区二区三区孕妇| 一起草av在线| 欧美不卡视频一区发布| 久久精品九色| 久草免费福利在线| 91在线免费播放| 欧美性猛交bbbbb精品| 亚洲欧美国产日韩中文字幕| 韩国成人动漫| 日韩精品一线二线三线| 蜜臀久久久久久久| 国产成人久久久久| 日韩精品一区二区在线| 182在线视频观看| 久久天天狠狠| 欧美aaaaaa午夜精品| 日本午夜在线观看| 欧美大片免费久久精品三p| 国产传媒av在线| 欧美日韩电影一区二区三区| 日韩电影在线一区| 国产成人在线网址| 精品乱人伦小说| 女人让男人操自己视频在线观看| 奇米精品在线| 韩国一区二区在线观看| 国产精品成人国产乱| 亚洲欧美在线一区| 福利一区二区免费视频| 小泽玛利亚av在线| 91污片在线观看| 最新国产中文字幕| 欧美激情免费在线| 蜜臀91精品国产高清在线观看| 91亚洲精品久久久蜜桃借种| 樱桃视频在线观看一区| 青青久草在线| 91网站免费看| 亚洲欧美清纯在线制服| 手机毛片在线观看| 欧美草草影院在线视频| 美脚恋feet久草欧美| 91xxx视频| 久久久一区二区三区捆绑**| 国产免费av观看| 青草热久免费精品视频 | 国产婷婷色一区二区三区在线| 国产一区二区在线播放视频| 久久久久久久影院| 国产精品99久久精品| 国模私拍在线观看| 6080国产精品一区二区| 亚洲三级欧美| 国产午夜精品视频一区二区三区| 久久精品人人爽人人爽| 亚洲精品一区二区三区蜜桃|