最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從云數(shù)據(jù)遷移服務看MySQL大表抽取模式的原理解析

 更新時間:2021年02月07日 09:56:17   作者:SegmentFault博客  
這篇文章主要介紹了從云數(shù)據(jù)遷移服務看MySQL大表抽取模式的原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

摘要:MySQL JDBC抽取到底應該采用什么樣的方式,且聽小編給你娓娓道來。

小編最近在云上的一個遷移項目中被MySQL抽取模式折磨的很慘。一開始爆內(nèi)存被客戶懟,再后來遷移效率低下再被懟。MySQL JDBC抽取到底應該采用什么樣的方式,且聽小編給你娓娓道來。

1.1 Java-JDBC通信原理

JDBC與數(shù)據(jù)庫之間的通信是通過socket完,大致流程如下圖所示。Mysql Server ->內(nèi)核Socket Buffer -> 客戶端Socket Buffer ->JDBC所在的JVM

1.2 JDBC讀取數(shù)據(jù)的三種模式

1.2.1 方式1:使用JDBC默認參數(shù)讀取數(shù)據(jù)

主要分為以下幾步:

1)Mysql Server通過OuputStream 向 Socket Server 本地Kennel Buffer 寫入數(shù)據(jù),這里是一次內(nèi)存拷貝。

2)當Socket Server 本地Kennel Buffer 有數(shù)據(jù),就會通過TCP鏈路把數(shù)據(jù)傳輸?shù)絊ocket Client 所在機器的Kennel Buffer。

3)JDBC 所在JVM利用InputSream讀取本地Kennel Buffer 數(shù)據(jù)到JVM內(nèi)存,沒有數(shù)據(jù)時,則讀取被阻塞。

接下來就是不斷重復1,2,3的過程。 問題 是,Socket Client 端的JVM在默認模式下讀取Kennel Buffer是沒有考慮本機內(nèi)存大小的,有多少讀多少。如果數(shù)據(jù)太大,就會造成FULL GC,緊接著內(nèi)存溢出。

參考 JDBC API docs,默認模式 Java demo 代碼如下

1.2.2 方式2:游標查詢

為了解決方式1爆內(nèi)存的問題,JDBC提供了一個游標參數(shù),在建立jdbc連接時加上useCursorFetch=true。設置游標后,JDBC 每次會告訴Server端每次抽取的數(shù)據(jù)量,避免爆內(nèi)存。通信過程如下圖所示。

​ 方式2游標查詢雖然解決了內(nèi)存溢出的問題,方式2極大的依賴網(wǎng)絡質(zhì)量。當網(wǎng)絡時延增大,假設每次通信增加10ms,10萬次通信就會多出1000s。這里僅僅是每次發(fā)請求的RT,TCP每次發(fā)送報文,都要求反饋ACK保證數(shù)據(jù)可靠性。client每取100行(請求行數(shù)可配置),就會有多次通信,進一步放大時延增加導致的效率問題。此外,游標查詢下,Mysql無法預知查詢的結束時延,為了應對自身的DML操作會在本地建立一個臨時空間存放要抽取的數(shù)據(jù)。因此,游標查詢時會有以下幾個現(xiàn)象發(fā)生

a. IOPS飆升,Mysql將數(shù)據(jù)寫入到臨時空間,數(shù)據(jù)傳輸時從臨時空間讀取數(shù)據(jù),這都會引發(fā)大量IO操作。

b. 磁盤空間飆升,臨時空間生命周期存在于整個JDBC讀取階段,直到客戶端發(fā)起Result.close()時才會被Mysql回收。

c. CPU和內(nèi)存有一定比例上升。

有關游標查詢的原理可參考博客MySQL JDBC StreamResult通信原理淺析以及JDBC源碼,本文不在贅述。

參考 JDBC API docs,游標模式 Java demo 代碼如下

1.2.3 方式3: Stream讀取數(shù)據(jù)

方式1會導致JVM內(nèi)存溢出,方式2雖然不會FULL GC但是通信效率較低,而且也會導致Mysql服務端IOPS飆升,消耗磁盤空間等問題。因此,我們介紹Stream讀取數(shù)據(jù) ,流式需要在讀取Result前設置

方式3在通信前不會做任何Server-Cient的交互操作,避免通信效率低下。服務端準備好數(shù)據(jù)寫入Server的Kennel Buffer中,這些數(shù)據(jù)通過TCP鏈路傳輸?shù)紺lient的Kennel Buffer中,緊接著client端inputStream.read()方法被喚醒去讀取數(shù)據(jù),與方式1不同,client每次只會讀取一個package大小的數(shù)據(jù),如果一個package不滿一行則會再讀取一個package。當client消費數(shù)據(jù)的速度不及數(shù)據(jù)傳輸速率時,client端kennel區(qū)的數(shù)據(jù)就會被堆滿,緊接著Server端的kennel數(shù)據(jù)也會堆滿進而阻塞了OuputStream。這樣,JDBC在Stream模式下就像一個水管連接兩個蓄水池,Client和Server達到一個平衡。

​對于JDBC客戶端,由于每次都是從kennel讀取數(shù)據(jù),效率會比方式2高很多,每次讀取一小部分數(shù)據(jù)也不會導致JVM內(nèi)存溢出。對于服務端,Mysql每次都是往kennel寫數(shù)據(jù),無需建立臨時空間,不涉及IO讀取,服務端壓力也變小了。當然,方式3也有自己的問題,例如Stream流式時無法cancel,cancel不阻塞等等。

參考 JDBC API docs,網(wǎng)上很多教程需要設置useCursorFetch=trueResultSet.FETCH_REVERSE等,其實小編研究完JDBC驅動源碼后發(fā)現(xiàn),只需要設fetchSize=Integer. MIN_VALUE,其他配置均和默認配置保持一致即可。游標模式 Java demo 代碼如下

1.3 云數(shù)據(jù)遷移服務在三種模式下的調(diào)優(yōu)

云數(shù)據(jù)遷移服務(Cloud Data Migration, CDM)是華為云上一個遷移工具,詳見 CDM官網(wǎng) ,小編則通過CDM介紹如何切換三種模式抽取數(shù)據(jù)。CDM默認使用的是方式3,流式抽取數(shù)據(jù),如果需要切換方式1,方式2需額外配置。

1.3.1 配置方式1:默認讀取

新建Mysql連接器,建立方法詳見官網(wǎng),在高級屬性中增加useCursorFetch=false和adopt.stream=false

1.3.2 配置方式2:游標查詢

編輯Mysql連接器,在高級屬性中增加useCursorFetch=true和adopt.stream=false。游標查詢的大小可通過界面上的Fetch Size調(diào)整,默認1000。

1.3.3 配置方式3:流式

CDM默認走的流式,無需額外配置。注意Stream模式下,界面上的 Fetch Size 是不起作用的,原因參考上一節(jié)。

1.3.4 性能對比

新建Mysql2Hive的CDM遷移作業(yè),源表101個字段,100萬行數(shù)據(jù),配置如下

方式1:寫入100萬行數(shù)據(jù)耗時1m22s

方式2:同樣寫入100萬行,調(diào)整fetchSzie分別為1,10,100,100,最低耗時2m1s

方式3:同樣寫入100萬行,耗時1m5s

小編還測試了100萬的小表,明顯方式1和方式3的速率要遠遠高于方式2,另外小編還測試了1000萬的大表,方式1爆內(nèi)存,方式2正常遷移但耗時20分鐘以上,而方式3仍然可以在15分鐘內(nèi)跑完。

到此這篇關于從云數(shù)據(jù)遷移服務看MySQL大表抽取模式的原理解析的文章就介紹到這了,更多相關MySQL大表抽取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql read_buffer_size 設置多少合適

    mysql read_buffer_size 設置多少合適

    很多朋友都會問mysql read_buffer_size 設置多少合適,其實這個都是根據(jù)自己的內(nèi)存大小等來設置的
    2016-05-05
  • MySQL?臨時表使用和創(chuàng)建

    MySQL?臨時表使用和創(chuàng)建

    本文介紹了MySQL臨時表的概念、使用方法以及注意事項,臨時表是一種僅在當前會話中存在的表,適用于存儲臨時數(shù)據(jù)、優(yōu)化查詢性能和簡化數(shù)據(jù)操作,通過創(chuàng)建、插入數(shù)據(jù)、查詢數(shù)據(jù)以及更新和刪除數(shù)據(jù)等操作,可以實現(xiàn)臨時表的使用,感興趣的朋友一起看看吧
    2025-03-03
  • MYSQL 高級文本查詢之regexp_like和REGEXP詳解

    MYSQL 高級文本查詢之regexp_like和REGEXP詳解

    在MySQL中,regexp_like和REGEXP都是用于執(zhí)行正則表達式搜索的函數(shù),這篇文章主要介紹了MYSQL 高級文本查詢之regexp_like和REGEXP,需要的朋友可以參考下
    2023-05-05
  • Mysql賬戶管理原理與實現(xiàn)方法詳解

    Mysql賬戶管理原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Mysql賬戶管理原理與實現(xiàn)方法,結合實例形式詳細分析了mysql賬戶管理的原理、操作技巧、相關問題解決方法與注意事項,需要的朋友可以參考下
    2020-01-01
  • MySQL數(shù)據(jù)庫主從復制與讀寫分離

    MySQL數(shù)據(jù)庫主從復制與讀寫分離

    大家好,本篇文章主要講的是MySQL數(shù)據(jù)庫主從復制與讀寫分離,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Mysql中mvcc各場景理解應用

    Mysql中mvcc各場景理解應用

    這篇文章主要為大家介紹了Mysql中mvcc各場景理解應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • MySQL數(shù)據(jù)庫配置優(yōu)化的方案

    MySQL數(shù)據(jù)庫配置優(yōu)化的方案

    我們總是希望MySQL能夠獲得更高的查詢性能,最好的辦法是弄清楚MySQL是如何優(yōu)化和執(zhí)行查詢的。本文講解MySQL在各個方面的優(yōu)化方向,方便后端開發(fā)人員在調(diào)優(yōu)和問題排查過程中找到切入點
    2023-02-02
  • Mysql中聚簇索引和非聚簇索引的區(qū)別詳解

    Mysql中聚簇索引和非聚簇索引的區(qū)別詳解

    這篇文章主要介紹了Mysql中聚簇索引和非聚簇索引的區(qū)別詳解,聚簇索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節(jié)點中存放的就是整張表的行記錄數(shù)據(jù),也將聚集索引的葉子節(jié)點稱為數(shù)據(jù)頁,需要的朋友可以參考下
    2023-07-07
  • Ubuntu18.0.4下mysql 8.0.20 安裝配置方法圖文教程

    Ubuntu18.0.4下mysql 8.0.20 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了Ubuntu18.0.4下mysql 8.0.19 安裝配置方法圖文教程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Oracle與MySQL的區(qū)別詳解

    Oracle與MySQL的區(qū)別詳解

    MySQL和Oracle Database都是一個關系型數(shù)據(jù)庫管理系統(tǒng),本文主要介紹了MySQL和Oracle Database的區(qū)別及優(yōu)缺點是什么,感興趣的小伙伴歡迎閱讀
    2023-04-04

最新評論

四会市| 和顺县| 葫芦岛市| 九寨沟县| 静宁县| 报价| 都匀市| 江油市| 方正县| 城步| 吴桥县| 鄂伦春自治旗| 东光县| 辽宁省| 理塘县| 全椒县| 宜宾市| 克东县| 雅安市| 连城县| 双辽市| 博客| 华安县| 融水| 晴隆县| 普洱| 井陉县| 常州市| 土默特左旗| 河北省| 新乡县| 彰化县| 峡江县| 阜城县| 麻栗坡县| 卓资县| 安塞县| 陈巴尔虎旗| 鄂州市| 淮安市| 上饶县|