主頁 > 資料庫 > Doris開發手記1:解決蛋疼的MySQL 8.0連接問題

Doris開發手記1:解決蛋疼的MySQL 8.0連接問題

2021-02-16 12:02:01 資料庫

筆者作為Apache Doris的開發者,平時感覺相關Doris的文章寫的很少,主要是很多時候不知道應該去記錄一些怎么樣的問題,感覺寫的不好就會很慌張,新的一年,希望記錄自己在Doris開發程序之中所遇到一些有意思的事情,(只希望能堅持下來,別打臉~~
言歸正傳,回到本篇想聊的問一個問題,筆者在開發ODBC of Doris的作業之中,發現通過MySQL 8.0的Driver連接Doris總是提示密碼驗證失敗,但是由于開發作業繁忙,一直沒有騰出手解決這個問題,最近重新抽時間梳理了一下這個問題,這個問題本身不難解決,但是解決問題的思路我覺得值得與大家分享,獻丑了啊,各位~~

1.老革命遇到新問題

使用MySQL 8.0的客戶端連接Doris時,如果不添加如下引數--default-auth=mysql_native_password的話,總會出現如下提示的密碼認證錯誤:

ERROR 1045 (28000): Access denied for user 'default_cluster:test' (using password: YES)

同樣的密碼認證問題也會同時出現在了使用ODBC的MySQL 8.0以上的Driver連接Doris時,更令人蛋疼的是,使用ODBC鏈接時并沒法呼叫上面的引數進行問題的規避,這會帶來兩個問題:

    1. Doris本身的ODBC外表無法通過MySQL 8.0以上的Driver連接Doris
  • 2.許多流行的BI分析工具如Tableau等:也無法通過ODBC的方式連接Doris

之前通過5.x的客戶端和Driver可以順利的連接Doris,而現在真是老革命遇上新問題了,

默認的密碼認證插件的變更

其實新問題的引入很簡單,就是MySQL的客戶端從8.0的版本開始,將原先客戶端的默認的密碼認證插件由mysql_native_password改為了caching_sha2_password,兩種密碼認證方式不同,而Doris當前只支持mysql_native_password的密碼認證插件,所以就導致了連接時密碼認證失敗了,而關于密碼認證插件的變更,更為詳細的內容,可以參考MySQL的官方檔案,

2.問題的分析與梳理

好的,確認了問題,就開始研究解決方案,從直覺上說,Doris支持新的caching_sha2_password密碼認證插件肯定是最直接的解決思路,這種做法肯定是一勞永逸的解決問題的,但是這就得重構整個Doris的密碼管理系統,開發和支持起來的代價實在是有些太大了,

那既然我們否定了這種方式,就得另外想辦法解決了,首先,使用MySQL 8.0的客戶端連接Doris時,添加如下引數--default-auth=mysql_native_password便可以認證成功, 所以問題就回到了如何讓ODBC的連接能夠支持上述引數,筆者經歷了下面的分析歷程:

2.1 ODBC連接檔案

ODBC是通過連接串的方式傳參給MySQL的連接Driver的,如果能夠像使用MySQL客戶端的方式添加引數便可以解決,那么自然無代碼的Coding是成本最低的解決方案,

筆者首先嘗試查看了MySQL官方的ODBC連接引數檔案,遺憾的是,并沒有找到ODBC關于認證方式的任何內容,這也就意為著:此路不通

2.2 新舊版本的兼容性

既然MySQL從8.0開始切換了默認的密碼認證插件,那么新的客戶端是否可以連接老的MySQL服務器呢?MySQL本身是如何解決新老客戶端的兼容問題的呢?

于是筆者嘗試使用MySQL 8.0的客戶端連接了MySQL的5.x的服務器,發現了下面的線索:新客戶端并不需要像連接Doris一樣,修改默認的密碼認證插件,那也就意味著,MySQL的客戶端和服務器可以在連接程序之中通過某種方式交換確認一種服務器支持的密碼認證方式,

既然如此,筆者開始了Google之旅,但是并沒有搜索到什么有價值的資訊,沒辦法,原始碼面前,了無秘密,于是筆者決定嘗試閱讀一下MySQL Client端的代碼,看看是否能發現上述的互動邏輯,

經過一番"痛苦"的原始碼搜索和閱讀,筆者在找到了如下的注釋,完整的闡述了MySQL的客戶端與服務器的連接程序:

  1. The client connects to the server
  2. The server sends @ref page_protocol_connection_phase_packets_protocol_handshake
  3. The client respons with
  @ref page_protocol_connection_phase_packets_protocol_handshake_response
  4. The server sends the
  @ref page_protocol_connection_phase_packets_protocol_auth_switch_request to tell
  the client that it needs to switch to a new authentication method.
  5. Client and server possibly exchange further packets as required by the server
  authentication method for the user account the client is trying to authenticate
  against.
  6. The server responds with an @ref page_protocol_basic_ok_packet or rejects
    with @ref page_protocol_basic_err_packet

把上述的注釋讀懂之后,筆者又回頭查閱了一下Doris之中處理MySQL客戶端連接的代碼,總算是整明白了為啥新的客戶端連接Doris會失敗了,這個是新客戶端連接Doris的流程:

Drois  ->: Authentication Plugin: mysql_native_password
Client <-: Client Auth Plugin: caching_sha2_password
Doris  ->: MySQL Error 2012 (HY000): Password check failed.

而新客戶端連接老的MySQL的流程如下:

Mysql  ->: Authentication Plugin: mysql_native_password
Client <-: Client Auth Plugin: caching_sha2_password
Mysql  ->: Auth Switch Request: Auth Method Name: mysql_native_password
Client <-: Auth Switch Response
Mysql  ->: OK

MySQL的服務器支持了Auth Switch Request的網路請求來告知客戶端自己支持的認證的密碼插件,而客戶端會進行密碼插件的支持檢查,而客戶端則將密碼插件加密的結果回傳,

3.開發起來,解決問題

通過上一小節的分析,問題已經水落石出了,接下來就是如何在Doris上支持Auth Switch Request的網路請求,

3.1 確認二進制結構

所以這里就需要研究這兩個Auth Switch RequestAuth Switch Response的二進制包是如何組成的,這里再次借助官方檔案,確認了兩個包的組成:

AuthSwitchRequest

AuthSwitchResponse

3.2 代碼開發

其實到這里的作業已經很簡單了,直接上筆者修改Doris的代碼吧:

if (!handshakePacket.checkAuthPluginSameAsDoris(authPacket.getPluginName())) {
            // 1. clear the serializer
            serializer.reset();
            // 2. build the auth switch request and send to the client
            handshakePacket.buildAuthSwitchRequest(serializer);
            channel.sendAndFlush(serializer.toByteBuffer());
            // Server receive auth switch response packet from client.
            ByteBuffer authSwitchResponse = channel.fetchOnePacket();
            if (authSwitchResponse == null) {
                // receive response failed.
                return false;
            }
            // 3. the client use default password plugin of Doris to dispose
            // password
            authPacket.setAuthResponse(readEofString(authSwitchResponse));
        }

就是進行了密碼認證插件的校驗,如果不Match Doris默認的密碼認證插件的話,則構造AuthSwitchRequest發送給客戶端,(筆者這里只列出了部分代碼,完整的代碼修改請參考如下的pr .

Coding完成之后,編譯部署,進行測驗,問題解決,提出issue,把解決問題的代碼貢獻給Doris的官方代碼倉庫提pr,完結撒花~~~~

4.小結

Bingo! 到此為止,問題順利解決了,希望通過和大家分享一個問題的解決流程,幫助大家梳理資料庫開發之中的解決問題的思路,我們有著最大的三個幫手

  • 搜索引擎
  • 官方檔案
  • 源代碼

而如果你遇到的是Doris的問題,那你就有第四個幫手了:百度Doris團隊,(加星重點)

當然,這里也留下一個TODO的問題:支持MySQL 8.0默認的caching_sha2_password的認證方式,相較原先的mysql_native_password的認證方式,它有一定的安全性優勢,但是這樣可能需要重構整個Doris的密碼體系了,

最后,也希望大家多多支持Apache Doris,多多給Doris貢獻代碼,感恩~~

5.參考資料

MySQL官方檔案
MySQL源代碼
Apache Doris源代碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/259957.html

標籤:大數據

上一篇:虧掉一套房換來的抖音直播經驗!

下一篇:MySQL存盤程序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more