在軟件領(lǐng)域,數(shù)據(jù)庫(kù)是毫無(wú)疑問(wèn)的中流砥柱。在這片歷史悠久、玩家眾多的沃土上,流傳著著無(wú)數(shù)技術(shù)和商業(yè)交織的故事。如今,老一代商業(yè)數(shù)據(jù)庫(kù)日薄西山,開(kāi)源數(shù)據(jù)庫(kù)步步為營(yíng),處在浪潮之巔的我們已然可以看見(jiàn)其中的暗流涌動(dòng)。在這場(chǎng)群雄逐鹿的戲碼里,MySQL與PostgreSQL之爭(zhēng)漸趨白熱化。MySQL的衰落不再是某個(gè)聳人聽(tīng)聞的預(yù)言,而正在成為不可避免的現(xiàn)實(shí)。
日前,Stack Overflow面向90000名開(kāi)發(fā)人員進(jìn)行的一項(xiàng)調(diào)查顯示,PostgreSQL在數(shù)據(jù)庫(kù)引擎的選擇上領(lǐng)先于MySQL,這與往年的調(diào)查相比有了顯著變化。
其中,45.55%的受訪者使用PostgreSQL,而MySQL和SQLite的比例分別為41.09%和30.9%。而就在三年前,同一項(xiàng)調(diào)查顯示,MySQL和PostgreSQL的使用率分別為55.6%和36.1%,由此可見(jiàn),使用PostgreSQL的用戶(hù)群體的增速有多快。
圖源:Stack Overflow
不過(guò),需要指出的是,由于這是一項(xiàng)開(kāi)發(fā)人員調(diào)查,因此并不反映生產(chǎn)中的使用情況。根據(jù)DB-Engines的數(shù)據(jù)庫(kù)流行度排名,其中Oracle排名第一,其次是MySQL、SQL Server和PostgreSQL。還要注意的是,MySQL或其分支MariaDB通常被非常流行的wordPress/ target=_blank class=infotextkey>WordPress內(nèi)容管理系統(tǒng)使用,占了大量的生產(chǎn)使用。
盡管如此,不能否認(rèn)的事實(shí)是,越來(lái)越多的開(kāi)發(fā)人員傾向于為他們正在開(kāi)發(fā)的應(yīng)用程序選擇PostgreSQL。而且結(jié)合DB-Engines上總結(jié)的歷年來(lái)MySQL和PostgreSQL分?jǐn)?shù)的趨勢(shì)變化來(lái)看,PostgreSQL從2014年開(kāi)始進(jìn)入高速增長(zhǎng)狀態(tài),而MySQL自2016年以來(lái)開(kāi)始緩慢下降。
圖源:DB-Engines
相較于MySQL的日漸式微,PostgreSQL為何能取得高速發(fā)展呢?我們可以從其發(fā)展履跡中一窺端倪。
一、脫胎于Ingres的開(kāi)源數(shù)據(jù)庫(kù)
PostgreSQL擁有很長(zhǎng)的發(fā)展史。
其前身是美國(guó)國(guó)防部與加州大學(xué)伯克利分校合作的一個(gè)名為Ingres研究項(xiàng)目。1985年Ingres項(xiàng)目終止,隨后開(kāi)源,Postgre誕生。后來(lái)為了強(qiáng)調(diào)對(duì)SQL的支持,又更名為PostgreSQL,這一名字延用至今。粗略估算一下,不包括Ingres時(shí)期的開(kāi)發(fā),這一項(xiàng)目的開(kāi)發(fā)歷史也差不多38年了。
作為開(kāi)源數(shù)據(jù)庫(kù)的PostgreSQL有其鮮明的特點(diǎn)。
其一,跨平臺(tái)屬性強(qiáng),支持幾乎所有的操作系統(tǒng)和CPU硬件平臺(tái),如AIX,HPUX,linux,BSD,windows等。
其二,社區(qū)支持強(qiáng)大。項(xiàng)目由全世界超過(guò)1000名貢獻(xiàn)者所維護(hù),社區(qū)成員來(lái)自于全球的商業(yè)公司、高校、研究機(jī)構(gòu)。而且PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復(fù)制、修改和重新分發(fā)代碼,只需要提供一個(gè)版權(quán)聲明即可。目前國(guó)內(nèi)有很多公司基于PostgreSQL數(shù)據(jù)庫(kù)開(kāi)發(fā)自己的商業(yè)產(chǎn)品。
另外,PostgreSQL提供了單個(gè)完整功能的版本,而不像MySQL那樣提供了多個(gè)不同的社區(qū)版、商業(yè)版與企業(yè)版。部分粉絲甚至?xí)f(shuō)PostgreSQL堪與Oracle相媲美,而且沒(méi)有那么昂貴的價(jià)格和傲慢的客服。
相較于MySQL,PostgreSQL還有一些明顯的特點(diǎn),比如,支持更廣泛的高級(jí)數(shù)據(jù)類(lèi)型,更精細(xì)的索引系統(tǒng),支持用各種語(yǔ)言編寫(xiě)的存儲(chǔ)過(guò)程,能夠滿(mǎn)足絕大多數(shù)企業(yè)級(jí)應(yīng)用的需求。
二、MySQL衰退,并不出奇
PostgreSQL和MySQL同為開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù),兩者都經(jīng)歷了幾十年的發(fā)展,并且已被證明高可靠、安全和可擴(kuò)展。但是回顧其發(fā)展歷程,兩者又有著顯著不同。
到2023年,PostgreSQL仍然是完全開(kāi)源和社區(qū)驅(qū)動(dòng)的,而MySQL在許可方面有著更復(fù)雜的歷史。MySQL的開(kāi)發(fā)主體是瑞典MySQLAB公司,最初MySQL是作為公司的商業(yè)產(chǎn)品開(kāi)發(fā)的,同時(shí)提供免費(fèi)版和付費(fèi)版。
2008年1月,MySQLAB被Sun公司以10億美元的價(jià)格收購(gòu)。此后不久,Oracle又以74億美元得價(jià)格收購(gòu)了Sun,這一系列收購(gòu)事件一度讓MySQL數(shù)據(jù)庫(kù)前途未卜,也引起了部分開(kāi)發(fā)人員對(duì)其開(kāi)源未來(lái)的擔(dān)憂(yōu)。后來(lái),包括MariaDB和Percona在內(nèi)的原始MySQL的幾個(gè)開(kāi)源分支幫助緩解了這些問(wèn)題,但這些動(dòng)蕩依舊為MySQL的發(fā)展留下了揮之不去的暗影。
多年前,PostgreSQL創(chuàng)始人之一的Bruce Momjian在接受對(duì)外采訪時(shí)就曾表示:“MySQL衰退,這并不是一件很令人驚奇的事情。”在他看來(lái),MySQL的衰退可以歸因于兩點(diǎn),其一,MySQL目標(biāo)定位不明晰,其二,MySQL不是一個(gè)純粹的開(kāi)源數(shù)據(jù)庫(kù)。
Momjian對(duì)此解釋道:“之所以說(shuō)MySQL目標(biāo)定位不明晰,是因?yàn)槠淠繕?biāo)定位是在網(wǎng)絡(luò)應(yīng)用的用戶(hù)層面上,而互聯(lián)網(wǎng)企業(yè)要求的是一個(gè)快速反應(yīng)時(shí)間和較小的用戶(hù)量,但相對(duì)大用戶(hù)來(lái)說(shuō),MySQL就有點(diǎn)捉襟見(jiàn)肘了,雖然他們非常努力去試圖滿(mǎn)足大客戶(hù)的應(yīng)用,想擴(kuò)展企業(yè)級(jí)大客戶(hù)的應(yīng)用標(biāo)準(zhǔn),但因?yàn)榍捌陂_(kāi)發(fā)的框架不是很明晰,導(dǎo)致不是很成功。”
在關(guān)于開(kāi)源的純粹性上,Momjian認(rèn)為:“MySQL數(shù)據(jù)庫(kù)是一個(gè)公司的一產(chǎn)品,是一個(gè)公司做了絕大部分開(kāi)發(fā)的工作,所以MySQL不是完全意義上的開(kāi)源數(shù)據(jù)庫(kù),這是個(gè)劣勢(shì),不能得到絕大多數(shù)人的支持,或讓社區(qū)更多人參與進(jìn)來(lái)。”
在他看來(lái),與MySQL不同,PostgreSQL一開(kāi)始就是定位在Oracle這些大數(shù)據(jù)庫(kù)能做的事情。所以MySQL勢(shì)力越來(lái)越小,而PostgreSQL卻在變大。盡管誰(shuí)也不知道未來(lái)會(huì)如何發(fā)展,但PostgreSQL的增長(zhǎng)是有目共睹的。
三、在曲折中探索:多進(jìn)程還是多線程
立足當(dāng)下,回顧過(guò)往,PostgreSQL能在開(kāi)發(fā)者調(diào)查中超越MySQL,并非一朝一夕之功。至于未來(lái)如何,及時(shí)了解其最新的發(fā)展動(dòng)向至關(guān)重要。
最近就有一項(xiàng)關(guān)于PostgreSQL的重大提案正在發(fā)生。
眾所周知,和線程架構(gòu)的MySQL不同,PostgreSQL數(shù)據(jù)庫(kù)為進(jìn)程架構(gòu)模型,每一個(gè)連接都會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程為該連接服務(wù)。
一個(gè)PostgreSQL實(shí)例作為一大組協(xié)作進(jìn)程運(yùn)行,包括一個(gè)用于每個(gè)連接的客戶(hù)端的進(jìn)程。這些進(jìn)程使用精心設(shè)計(jì)的庫(kù)通過(guò)多個(gè)共享內(nèi)存區(qū)域進(jìn)行通信,該庫(kù)允許在并非所有進(jìn)程都具有映射到相同地址的相同內(nèi)存的設(shè)置中創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。長(zhǎng)期以來(lái),這個(gè)模型都在如此為這個(gè)項(xiàng)目服務(wù)。
但PostgreSQL開(kāi)發(fā)團(tuán)隊(duì)覺(jué)得到了需要改變的時(shí)候,要重新考慮是否延用這種面向進(jìn)程的模型,還是將其遷移到線程模型。
事實(shí)上,多進(jìn)程的優(yōu)缺點(diǎn)都很分明。
好處在于:可以并行地執(zhí)行多個(gè)任務(wù),提高運(yùn)行效率,數(shù)據(jù)安全,空間獨(dú)立,一個(gè)進(jìn)程崩潰也不會(huì)影響其他進(jìn)程;不足在于:進(jìn)程的創(chuàng)建和銷(xiāo)毀過(guò)程需要消耗較多的計(jì)算機(jī)資源,在需要頻繁創(chuàng)建和刪除較多進(jìn)程的情況下,資源消耗過(guò)多,不適宜使用多進(jìn)程完成任務(wù)。
6月初,PostgreSQL的核心貢獻(xiàn)者之一Heikki Linnakangas跟進(jìn)了一些相關(guān)的討論。從討論走向來(lái)看,支持和反對(duì)的雙方都各有其緣由。
支持方代表Andres Freund提出,開(kāi)發(fā)團(tuán)隊(duì)已經(jīng)遇到了諸多與進(jìn)程模型相關(guān)的限制。比如:
1、跨進(jìn)程上下文切換的開(kāi)銷(xiāo)本來(lái)就比同一進(jìn)程中線程之間的切換要高,合理懷疑這種開(kāi)銷(xiāo)會(huì)繼續(xù)增加;
2、進(jìn)程模型增加了開(kāi)發(fā)成本,迫使項(xiàng)目維護(hù)大量重復(fù)代碼,包括在單個(gè)地址空間中不需要的幾種內(nèi)存管理機(jī)制。
反對(duì)方代表則認(rèn)為不應(yīng)該貿(mào)然進(jìn)行這種根本性變革,“這將是一場(chǎng)災(zāi)難。有太多的代碼會(huì)被破壞”。主要理由集中如下:
1、安全性會(huì)降低,變革成本過(guò)大。可能產(chǎn)生“不止一個(gè)安全級(jí)漏洞”,而且收益無(wú)法抵消成本。
2、可能還有其他工作應(yīng)該具有更高的優(yōu)先級(jí)。
3、失去由單獨(dú)進(jìn)程提供的隔離,可能會(huì)降低系統(tǒng)的整體健壯性。
網(wǎng)友評(píng)論
不過(guò),總體而言,仍有許多PostgreSQL開(kāi)發(fā)人員還是謹(jǐn)慎地贊成至少探索這一變化。Robert Haas表示 ,PostgreSQL在大型系統(tǒng)上的擴(kuò)展性不佳,這主要是因?yàn)樗羞@些進(jìn)程都消耗了資源。“并非所有數(shù)據(jù)庫(kù)都有這個(gè)問(wèn)題,如果不進(jìn)行某種重大的架構(gòu)更改,PostgreSQL將無(wú)法解決這個(gè)問(wèn)題”。在他看來(lái),僅僅切換到線程可能還不夠,但他認(rèn)為,這種探索性的嘗試將帶來(lái)許多其他改進(jìn)。
如果再進(jìn)一步思考,我們會(huì)注意到,無(wú)論是支持基于進(jìn)程還是基于線程的模式,可能都不會(huì)有終極答案。
因?yàn)榫€程可能不會(huì)在所有用例中都表現(xiàn)得更好,或者一些重要的擴(kuò)展可能永遠(yuǎn)不會(huì)獲得在線程中運(yùn)行的支持。移除進(jìn)程支持是一個(gè)只有在線程運(yùn)行良好時(shí)才能真正考慮的問(wèn)題。雖然討論的結(jié)果表明大多數(shù)PostgreSQL開(kāi)發(fā)人員認(rèn)為這種探索式的變化在抽象上是好的,但也明顯擔(dān)心它在實(shí)踐中如何運(yùn)作。在不進(jìn)則退的開(kāi)源世界,不斷迭代更新才能順應(yīng)時(shí)代變化,但變化的方向從來(lái)沒(méi)有確定的航標(biāo),如何在螺旋中上升是開(kāi)源開(kāi)發(fā)者們需要審慎考慮的永恒命題。
>>>>參考資料
- https://devclass.com/2023/06/13/postgresql-now-top-developer-choice-ahead-of-mysql-according-to-massive-new-survey/
- https://lwn.NET/SubscriberLink/934940/3abb2d4086680b78/
- https://www.51cto.com/article/167890.html
- https://zhuanlan.zhihu.com/p/362598819
- http://www.linuxeden.com/html/news/20091203/69348.html
整理丨千山
來(lái)源丨公眾號(hào):51CTO技術(shù)棧(ID:blog51cto)