文/王佳新 黃曉光 張蜜蜜
關系型數據庫是現代企業信息化不可或缺的基礎性軟件。當前很多大型信息系統使用的是Oracle、DB2、SQL Server等大型商用數據庫,這些商業數據庫存在成本高、安全隱患突出、核心技術無法自主可控等問題。開源關系型數據庫技術和產品經過幾十年的發展,功能完善、性能優越、應用范圍越來越廣,正在逐步取代商業數據庫,成為關系型數據庫領域的主流。研究開源關系型數據庫技術和產品以及應用對企業信息化具有重要的戰略意義。
近年來,開源關系型數據庫產品可以用“百花齊放”來形容,例如最為著名要屬PostgreSQL和MySQL,相對小眾的如MariaDB、Firebird、SQLite、Derby。其 中,MySQL和PostgreSQL是最具代表性的產品,流行度連續多年占據開源關系型數據庫排名的前兩位,在所有數據庫排名中分別位居第2位和第4位。
PostgreSQL是功能強大的開源數據庫,可運行在所有主流操作系統上。PostgreSQL作為一種企業級數據庫,具有事務安全、兼容眾多SQL標準、高度可定制性、支持云計算平臺等特點。PostgreSQL數據庫采用基于進程的體系結構,由連接管理系統(系統控制器)、編譯執行系統、存儲管理系統、事務系統、系統表五部分組成。
MySQL是世界上最流行的開源數據庫,目前MySQL可以運行在所有主流操作系統上。MySQL的版本一直在不斷變更,無論在從功能還是性能上,都有了持續的提升。MySQL功能和特點主要有:插件式的存儲引擎、MySQL Cluster技術、嵌入式支持、編程接口支持、多種管理工具、支持云計算平臺。MySQL數據庫的核心包括系統管理和控制工具、連接池、SQL接口、解析器、優化器、緩存、存儲引擎。從邏輯上講,MySQL可以被認為由雙層架構組成,第一層是SQL層,負責處理底層數據之前的所有工作,包括SQL解析、權限判斷、執行計劃優化等;第二層是存儲引擎層,負責底層數據存取操作實現部分,多種存儲引擎位于此層。
可選擇的存儲引擎是MySQL的一個最重要特性,根據不通的業務應用場景,可以選擇相應的存儲引擎。例如:以讀為主的數據庫采用MyISAM引擎,臨時表可使用 MEMORY存儲引擎。MySQL 5.6 原生支持9個引擎,最常使用的是InnoDB,MyISAM和NDB Cluster。
關于MySQL和PostgreSQL的性能對比,有很多種比較的方法和角度。例如TPCH測試、Sysbench標準測。以國網某省公司營銷系統為例為例,對比數據庫的事務tps以及95%事務的響應時間。模擬業務場景測試的數據量大于1億行的表35張,千萬行的表73張,最大表33億行,數據大小1T。表1和表2分別記錄各線程下,各數據庫每秒事務數和95%事務響應時間。

表1:業務系統Sysbench測試結果(每秒執行事務數)

表2:業務系統Sysbench測試結果(95%事務響應時間)

圖1:PostGIS結構圖
從兩款數據庫的發展路線不同,MySQL從一開始就著重性能,而PostgreSQL的發展注重功能和標準的兼容以及復雜操作中的穩定性和可靠性。因此,在常見的測試中,MySQL往往優于PostgreSQL。性能也和調優密切相關,同時MySQL和PostgreSQL的調優也都很復雜,總體來講,數據庫的性能的發揮取決于操作系統環境、數據庫的配置、優化、應用場景、系統架構等多方面因素。
集群(Cluster)是指由兩臺或多臺節點機(服務器)構成的一種松散耦合的計算節點集合。功能上提供了容錯、故障恢復、解決單點故障,增加系統高可用性,增加計算能力等功能。不同的集群方案的側重點不同。
2.2.1 MySQL Cluster
MySQL Cluster是一種在無共享架構(SNA,Share Nothing Architecture)系統里應用內存數據庫集群的技術。使用NDB引擎,可實現讀寫分離,主從復制,實現故障切換和負載均衡。MySQL Cluster采用分布式設計,避免單點故障點。MySQL聲稱其具99.999%高可用性。目前社區版和商業版都支持。
2.2.2 PostgreSQL-XL
PostgreSQL-XL是一種提供寫可靠性,多主節點數據同步,數據傳輸的開源集群方案。其特點是可以跨多個節點或者分區表,或復制它們,分區(或分布)表允許跨多個節點的寫入可擴展性,以及大規模并行處理(MPP)大數據類型的工作負荷,完全ACID。適用場景為:OLTP 寫頻繁的業務、需要MPP并行性商業智能、操作數據存儲;Key-value 存儲、GIS的地理空間、混合業務工作環境、多租戶服務提供商托管環境。
地理信息系統(GIS)是一種具有信息系統空間專業形式的數據管理系統。GIS數據庫是某區域內關于一定地理要素特征的數據集合,主要涉及對圖形和屬性數據的管理和組織。MySQL和PostgreSQL都在不斷地完善對GIS的支持。
MySQL 可以通過spatial extensions in MySQL可以應對功能簡單的GIS或LBS應用,而對于功能復雜的應用,PostGIS無疑更加適合。PostGIS是PotgreSQL在GIS方面的擴展,為PostgreSQL提供了存儲空間地理數據的支持,使PostgreSQL成為了一個空間數據庫,能夠進行空間數據管理、數量測量與幾何拓撲分析。PostGIS是一個重要的GIS基礎軟件,目前它是為數不多的開源空間數據庫存儲方案之一,同時也廣泛的應用在開源GIS中,有許多著名的GIS軟件都使用PostGIS作為數據庫后端。PostGIS是著名開源地理信息系統OpenStreetMap的基礎,OpenStreetMap的數據庫后臺就是PostgreSQL+PostGIS,使用OpenStreetMap的企業和應用包括Apple、Microsoft、Wikipedia。
圖1為PostGIS的概念圖,其中GEOS(Geometry Engine Open Source)為開源幾何引擎,PROJ.4是開源GIS最著名的地圖投影庫,許多GIS開源軟件的投影都直接使用Proj.4的庫文件,LibXML2是用做解析XML文件的函數庫,提供了C語言解析和構造xml文檔的接口。
2.4.1 文檔支持
MySQL的優勢在于,市場上MySQL參考資料很多,而且大多數人在學校就開始接觸MySQL,因此在文檔支持性方面,MySQL在開源數據庫領域中排行第一。
PostgreSQL源代碼清晰,易讀性比MySQL好,官方文檔也非常出色,很多人都是直接通過閱讀官方文檔開始學習PostgreSQL。但PostgreSQL的第三方參考資料相對較少,特別是中文資料,國內分析PostgreSQL內核的書籍相比MySQL較少。
2.4.2 商業支持
MySQL和PostgreSQL都有商業版本及提供企業級服務的渠道商。Oracle公司收購MySQL后,對版本進行了整合。商業客戶可靈活的選擇多個版本,以滿足特殊的商業和技術需求,主要分為社區版和商業版,商業版又包括:標準版,企業版本,集群版,以年度訂閱的方式提供服務,MySQL的渠道商眾多。PostgreSQL的企業級產品與服務廠商相對較少。
2.4.3 流行度
流行度對于一個商業軟件來說,是一個很重要的指標,流行意味著更多的用戶、更多的考驗、更好的商業支持、更完善的文檔資料。圖2是2019年7月DB-Engines全球數據庫排行榜前四位排名,其實MySQL常年位居第二位,PostgreSQL常年位居第四位,但與最流行的MySQL相比,在得分上相差一個量級,技術支持度低是其中一個重要的原因。
眾多工具可幫助數據庫從Oracle等商用數據庫遷移到MySQL和PostgreSQL,下面簡述了MySQL與PostgreSQL遷移的工具及方法。
2.5.1 MySQL
將數據庫遷移到MySQL可通過多種工具,例如:官方的MySQL Workbench migration wizzard、Converto mysql、Mysqlgui tools、Oracletomysql等,也可以通過編寫遷移腳本。數據庫從oracle遷移到MySQL時,表結構與數據基本上可以平移過去的,但要考慮字段類型不兼容情況,Oracle的數值類型更加簡單,MySQL具有多粒度的數值類型。可以利用工具,也可以自己編寫腳本;視圖在遷移過程中,存在部分不兼容情況(有的View要做一些中間表);觸發器,存儲過程不能遷移,需要重寫代碼。
2.5.2 PostgreSQL
從Oracle數據庫遷移到PostgreSQL時,有幾款常用工具:
ESF Database Migration Toolkit:通過此工具箱,可以通過向導將數據庫從Oracle遷移到PostgreSQL,幫助遷移表結構,數據,索引,主鍵,外鍵,評論等。
Orafce:實現函數的遷移,例如日期函數(next_day,last_day,trunc,round等)、字符串函數和模塊等(DBMS_ALERT,DBMS_OUTPUT,UTL_FILE,DBMS_PIPE等)。
Ora2pg:用Perl編寫,ora2pg自動掃描并抽出表結構和數據庫,然后生成SQL腳本。
Oracle to Postgres:可自動將表結構,數據,索引,主鍵和外鍵進行轉換。
在實際進行數據遷移時通常是綜合使用多種工具。
MySQL遵守雙重協議:GPL授權協議和商用授權協議。GPL的精髓在于開源,和是否商用沒有直接關系,如果GPL不能滿足要求,可選擇購買商業授權。

圖2:2019年7月數據庫流行度排行榜
PostgreSQL的授權是在非常自由的開源授權BSD下,這種授權允許用戶在各種開源或是閉源項目中使用、修改和發布PostgreSQL的源代碼。PostgreSQL不僅是一個強大的企業級數據庫系統,也是一個用戶可以開發私用、網絡和商業軟件產品的數據庫開發平臺。
從發展歷程來看,MySQL的許多關系數據庫功能是在其發展演變過程中不斷添加進來的,而PostgreSQL從誕生之初就以關系型數據庫作為發展目標,具備完善的關系數據庫功能。從功能來看,MySQL和PostgreSQL都具備了企業級關系數據庫的功能,基本可以實現互相替換,MySQL的優勢在于其靈活的存儲引擎機制,通過替換不同的存儲引擎實現相應的功能需求。從性能來看,MySQL在很多情況下比PostgreSQL性能稍好,但相差不大,都需要根據應用場景和具體需求進行調優。從許可證來看,PostgreSQL采用了更加寬松的BSD許可證,對定制改造及商業化更加友好,而MySQL商業化要受到商用授權協議的限制,并且存在閉源風險。
根據數據庫在業務系統中其扮演的角色和存儲數據的類型,可分為以下幾種類型。
(1)業務關鍵型:存儲系統運行數據,具有數據量大、增長迅速、包含業務邏輯等特點。此類數據庫的性能直接關系到業務系統的穩定運行和用戶體驗,因此對數據庫的性能、并發支持、可靠性具有較高要求。
(2)業務輔助型:存儲設備臺賬等基礎數據,此類數據庫具有數據變動不頻繁的特點。
(3)配置數據型:此類數據庫僅僅作為配置項的存儲手段,具有訪問頻度低、數據更新不頻繁、性能要求低、并發度低的特點。
大型企業在信息化過程中,離不開數據庫,根據企業對數據庫的應用、開發和維護能力,可將企業對數據庫的使用劃分為三個層次。
(1)使用數據庫:該方式是最低級的利用方式,其實質是作為開源數據庫產品的集成商,通過采購相關商業公司提供的解決方案和技術支持,將開源數據庫產品整合進公司業務系統,逐步替換Oracle等商業數據庫產品。該方式的優點是進入門檻低,投入成本低,見效快;缺點是處于開源數據庫產業鏈的底端,嚴重依賴商業公司提供的服務,缺乏技術和人才儲備。
(2)二次開發:具備一定技術實力的企業,一般會選擇對開源數據庫進行二次開發和深度定制改造,以滿足自身的需求和特殊的應用場景。該模式對企業的技術能力具有較高要求,同時需要明確的需求和應用場景;此模式能較好地積累技術儲備和應用經驗,并形成具有自主知識產權的產品。
(3)成為服務提供商:在對開源數據庫進行改造定制的基礎上,組建運維、營銷團隊,打造具有自主知識產權的數據庫產品,并能夠提供可靠持續的服務和推廣。此應用模式對企業的人才、技術、管理等具有較高要求,需要企業持續投入,見效慢,具有一定的市場風險;優點是處于產業鏈的頂端,具有較高的自主知識產權和經營能力。
對于業務輔助型和配置數據型的數據庫應用,MySQL、PostgreSQL基本可以滿足功能和性能需求,如有替換商業數據庫的需求,可在業務系統中逐步替換;對于業務關鍵型的應用,需在驗證測試的基礎上綜合考慮,通過調優技術、定制改造等手段滿足性能需求,通過購買商業支持、組建運維團隊等方式實現商業數據庫服務的替換。
如果企業對數據庫有二次開發需求,由于許可協議的差異,建議選用PostgreSQL產品進行二次開發;
如果企業想成為服務提供商,研發帶有特色的關系型數據庫產品,建議選用PostgreSQL產品,組建運維團隊,使之成為公司新一代的核心產品。