阿里巴巴開源專案 Druid 負責人溫少訪談

2021-07-15 23:54:30 字數 4741 閱讀 1316

druid是阿里巴巴開源平台上的乙個專案,整個專案由資料庫連線池、外掛程式框架和sql解析器組成。該專案主要是為了擴充套件jdbc的一些限制,可以讓程式設計師實現一些特殊的需求,比如向金鑰服務請求憑證、統計sql資訊、sql效能收集、sql注入檢查、sql翻譯等,程式設計師可以通過定製來實現自己需要的功能。 

該專案在阿里巴巴內部得到了廣泛的部署,在外部也有大量的使用者群。為了使大家更好地了解和使用druid,我們採訪了druid專案的主要負責人——溫少(

部落格)。

溫少是iteye的名人了,為了照顧新會員,先來個自我介紹吧!

我2023年畢業於深圳大學,畢業後到金蝶軟體研發中心工作9年,工作內容包括工作流引擎、多資料庫支援引擎、簡訊網閘道器等。 

2023年3月加入阿里巴巴至今,主要的工作是設計和實現阿里巴巴應用監控系統dragoon,druid和fastjson都是監控系統實現的副產品。

druid首先是乙個資料庫連線池,但它不僅僅是乙個資料庫連線池,它還包含乙個proxydriver,一系列內建的jdbc元件庫,乙個sql parser。

2023年開始,我負責設計乙個叫做dragoon的監控系統,需要一些監控元件,監控應用程式的運**況,包括web uri、spring、jdbc等。為了監控sql執**況,我做了乙個filter-chain模式的proxydriver,預設提供statfilter。當時我還做了乙個sql parser。老闆說,不如我們來乙個更大的計畫,把連線池、sql parser、proxy driver合起來做乙個專案,命名為druid,於是druid就誕生了。 

2023年2月春節期間,我完成了連線池(druiddatasource)的第乙個版本,4月開始在生產環境測試,2023年第一季度開始大規模實施。 

提交過**的開發者有5個人,主要**是我維護,有一人專門負責內部實施。 

通過開源,希望有更多使用場景,更多的反饋,更多人參與其中,共同打造最好的資料庫連線池。

druid支援所有jdbc相容的資料庫,包括oracle、mysql、derby、postgresql、sql server、h2等等。 

druid針對oracle和mysql做了特別優化,比如oracle的ps cache記憶體占用優化,mysql的ping檢測優化。

druid在druiddatasourc和proxydriver上提供了filter-chain模式的擴充套件api,類似serlvet的filter,配置filter攔截jdbc的方法呼叫。

阿里巴巴是乙個重度使用關聯式資料庫的公司,我們在生產環境中大量的使用druid,通過長期在極高負載的生產環境中實際使用、修改和完善,讓druid逐步發展成最好的資料庫連線池。druid在監控、可擴充套件性、穩定性和效能方面都有明顯的優勢。 

首先,強大的監控特性,通過druid提供的監控功能,可以清楚知道連線池和sql的工作情況。 

其次,方便擴充套件。druid提供了filter-chain模式的擴充套件api,可以自己編寫filter攔截jdbc中的任何方法,可以在上面做任何事情,比如說效能監控、sql審計、使用者名稱密碼加密、日誌等等。 

druid內建提供了用於監控的statfilter、日誌輸出的log系列filter、防禦sql注入攻擊的wallfilter。 

阿里巴巴內部實現了用於資料庫密碼加密的circefilter,以及和web、spring關聯監控的dragoonstatfilter。 

第三,druid集合了開源和商業資料庫連線池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。 

效能不是druid的設計目標,但是測試資料表明,druid效能比dbcp、c3p0、proxool、jboss都好。 

這裡有一些測試資料:

druid提供了mysql、oracle、postgresql、sql-92的sql的完整支援,這是乙個手寫的高效能sql parser,支援visitor模式,使得分析sql的抽象語法樹很方便。 

簡單sql語句用時10微秒以內,複雜sql用時30微秒。 

通過druid提供的sql parser可以在jdbc層攔截sql做相應處理,比如說分庫分表、審計等。druid防禦sql注入攻擊的wallfilter就是通過druid的sql parser分析語義實現的。

druid提供filter-chain模式的外掛程式框架,通過編寫filter配置到druiddatasource中就可以攔截jdbc的各種api,從而實現擴充套件。druid提供了一系列內建filter。

druid的優勢是在jdbc最低層進行攔截做判斷,不會遺漏。 

druid實現了oracle、mysql、postgresql、sql-92的parser,基於sql語法分析實現,理解其中的sql語義,智慧型、準確、誤報率低。 

druid是阿里巴巴監控系統dragoon的副產品,從dragoon監控系統的資料來看,在阿里巴巴已經部署了600多個應用。在阿里巴巴外部也有很多druid的使用者,外部使用者沒有正式統計資料,但經常有反饋。

可以通過druiddriver把內建的filter用在其他連線池中。在2023年上半年druiddatasource不成熟的時候,我們也是這麼做的。在其他連線池中使用內建的filter,需要修改jdbc-url,使用druiddriver作為乙個proxydriver。

druid是乙個開源專案,基於apache 2.0協議,你可以免費自由使用。druid只支援jdk 6以上版本,不支援jdk 1.4和jdk 5.0。

為了方便大家遷移,druid的配置和dbcp是基本一致的,如果你原來是使用dbcp,遷移是十分方便的,只需要把corg.apache.commons.dbcp.basicdatasource修改為om.alibaba.druid.pool.druiddatasource就好了。 

xml** 

<

bean

id="datasource"

class="com.alibaba.druid.pool.druiddatasource"

init-method="init"

destroy-method="close"

>

<

property

name="url"

value="$"

/>

<

property

name="username"

value="$"

/>

<

property

name="password"

value="$"

/>

<

property

name="filters"

value="stat"

/>

<

property

name="maxactive"

value="20"

/>

<

property

name="initialsize"

value="1"

/>

<

property

name="maxwait"

value="60000"

/>

<

property

name="minidle"

value="1"

/>

<

property

name="timebetweenevictionrunsmillis"

value="60000"

/>

<

property

name="minevictableidletimemillis"

value="300000"

/>

<

property

name="validationquery"

value="select 'x'"

/>

<

property

name="testwhileidle"

value="true"

/>

<

property

name="testonborrow"

value="false"

/>

<

property

name="testonreturn"

value="false"

/>

<

property

name="poolpreparedstatements"

value="true"

/>

<

property

name="maxpoolpreparedstatementperconnectionsize"

value="50"

/>

bean

>

在上面的配置中,通常你需要配置url、username、password、maxactive這幾項。 

在druiddatasource中,你可以不配置driverclass,它根據url自動識別。druid能夠自動識別20多中url,常見的jdbc driver都包括了。

從dbcp遷移最方便,把org.apache.commons.dbcp.basicdatasource修改為om.alibaba.druid.pool.druiddatasource就好了。 

druid**上提供了

druid/dbcp/c3p0/jboss/weblogic的引數對照表,通過這個對照表來遷移你目前的配置。

druid原始碼託管在github.com上,專案位址是

你可以在github上提交patch和issue(包括bug和新特性)。你也可以加入我們的qq群92748305,和開發者以及其他使用者一起交流。

Druid 與 阿里巴巴開源專案Druid

druid 單詞 於西方古羅馬的神話人物,中文常常翻譯成德魯伊。本問介紹的druid 是乙個分布式的支援實時分析的資料儲存系統 data store 美國廣告技術公司metamarkets 於2011 年建立了druid 專案,並且於2012 年晚期開源了druid 專案。druid 設計之初的想法...

阿里巴巴開源平台新增專案Druid

阿里巴巴開源平台新增專案druid druid是什麼?druid是乙個jdbc元件,它包括三部分 druiddriver driver,能夠提供基於filter chain模式的外掛程式體系。druiddatasource 高效可管理的資料庫連線池。sqlparser druid可以做什麼?1 可以...

學習阿里巴巴開源專案dubbo

1.dubbo使用場景 高併發,高訪問量的移動網際網路或物聯網。京東,阿里巴巴等都在使用它。它是乙個分布式服務框架,致力於提供高效能和透明化的rpc遠端服務呼叫方案,以及soa服務治理方案.不適合大檔案的傳輸。2.支援協議 1 dubbo service 穩定,適合小資料量傳輸,大字串和檔案不適合 ...