德哥:从Oracle DBA到PostgreSQL布道者
云棲社區(qū)明星專家德哥日前在IT168的盛會(huì)——2016 第七屆中國(guó)數(shù)據(jù)庫(kù)技術(shù)大會(huì)做了分享。整理文章見(jiàn)《從Oracle DBA到PostgreSQL布道者》 ,很有價(jià)值,轉(zhuǎn)載到社區(qū),分享給更多朋友。
嘉賓介紹:
PostgreSQL 中國(guó)社區(qū)發(fā)起人 周正中
周正中,網(wǎng)名德哥 ( digoal ),PostgreSQL 中國(guó)社區(qū)發(fā)起人之一,PostgreSQL 象牙塔發(fā)起人之一,DBA+社群聯(lián)合發(fā)起人之一,10余項(xiàng)數(shù)據(jù)庫(kù)相關(guān)專利,曾就職于斯凱網(wǎng)絡(luò),負(fù)責(zé)數(shù)據(jù)庫(kù)部門(mén)。主導(dǎo)了集團(tuán)數(shù)據(jù)庫(kù)系統(tǒng)、存儲(chǔ)、主機(jī)、操作系統(tǒng)、多IDC的架構(gòu)設(shè)計(jì)和建設(shè);完成了對(duì)數(shù)據(jù)庫(kù)HA、容災(zāi)、備份、恢復(fù)、分布式、數(shù)據(jù)倉(cāng)庫(kù)架構(gòu)設(shè)計(jì)和建設(shè);數(shù)據(jù)庫(kù)管理和開(kāi)發(fā)的標(biāo)準(zhǔn)化體系建立。于納斯達(dá)克上市前成功使用PostgreSQL完成去O,并順利通過(guò)SOX審計(jì)。現(xiàn)就職于阿里云數(shù)據(jù)庫(kù)內(nèi)核技術(shù)組。
正文:
大家好,今天我要給大家分享的話題是從Oracle DBA 到PostgreSQL布道者,首先先做一下自我介紹。
我是在2006、2007年開(kāi)始接觸數(shù)據(jù)庫(kù),09年的時(shí)候成為Oracle DBA,2010年,接觸到了PostergreSQL,之后就一直在做PostergreSQL的布道工作。目前,我已經(jīng)分享技術(shù)類文章2000余篇,我的目標(biāo)是寫(xiě)到1萬(wàn)篇。
2005年,我從學(xué)校畢業(yè)拿到了我的第一份工作,是一份技術(shù)支持類的文章。為什么會(huì)去學(xué)Oracle呢?其實(shí)是有一個(gè)契機(jī)的,當(dāng)時(shí)我們公司是乙方,甲方把數(shù)據(jù)庫(kù)的一些東西刪除了,數(shù)據(jù)庫(kù)就起不來(lái)了,然后Oracle的技術(shù)人員過(guò)來(lái)把數(shù)據(jù)庫(kù)恢復(fù)了。當(dāng)時(shí)我就感覺(jué)真是太牛了,所以就開(kāi)始接觸Oracle。
我的第一份DBA工作是在2008年,我在那家公司第一次聽(tīng)到了PostgreSQL。PostgreSQL數(shù)據(jù)庫(kù)掛了之后業(yè)務(wù)還能繼續(xù)跑,它只會(huì)丟掉一部分?jǐn)?shù)據(jù),其它的數(shù)據(jù)庫(kù)還活著,可以繼續(xù)服務(wù)。Sharding是一個(gè)基于PostgreSQL的一個(gè)插件,最早是在國(guó)外流行起來(lái)的。
這家公司在之后大量使用PostgreSQL有原因的。因?yàn)樵?8年到09年的時(shí)候,PostergreSQL有了一定的發(fā)展,產(chǎn)品推陳出新,公司的業(yè)務(wù)也有了飛速的增長(zhǎng)。下面就簡(jiǎn)單介紹一下我們當(dāng)時(shí)的應(yīng)用系統(tǒng)。
當(dāng)時(shí)我們的應(yīng)用有基于地理位置的位置交友應(yīng)用、社區(qū),網(wǎng)游,虛擬的貨幣系統(tǒng)交易、游戲平臺(tái)。我們當(dāng)時(shí)的數(shù)據(jù)量是普通的企業(yè)數(shù)據(jù)量,單庫(kù)的數(shù)據(jù)量是200GB到500GB,當(dāng)時(shí)的服務(wù)器全是X86的機(jī)器。
在這使用的一年中,不管是從穩(wěn)定性還是從性能、功能、可靠性的方面來(lái)講,PostergreSQL都滿足了我們的需求,另外我們還使用了其他數(shù)據(jù)庫(kù)所沒(méi)有的特性。
我們基于位置的交友應(yīng)用,現(xiàn)在是有MongoDB支撐的,之前是由基于地理位置應(yīng)用的插件支撐。我們的社交系統(tǒng)里面有比較復(fù)雜的關(guān)系,所以會(huì)有比較多的遞歸。如果當(dāng)時(shí)我們沒(méi)有采用PostergreSQL,而是選用其它開(kāi)源數(shù)據(jù)庫(kù),恐怕是不能達(dá)到這個(gè)效果的。
當(dāng)時(shí)PostergreSQL支撐了我們所有的業(yè)務(wù)應(yīng)用,性能完全滿足要求,從未因數(shù)據(jù)庫(kù)問(wèn)題crash,從未丟失數(shù)據(jù),也沒(méi)有遇到bug。這也給我們之后全面應(yīng)用PostergreSQL提供了信心。
2009年到2010年,我們公司準(zhǔn)備在納斯達(dá)克上市,當(dāng)時(shí)我們的商業(yè)數(shù)據(jù)庫(kù)在成本核算方面是無(wú)法滿足上市的需求,所以當(dāng)時(shí)我們CFO決定要用PostgreSQL替代商業(yè)數(shù)據(jù)庫(kù)。
如果公司上市的話,要替換原來(lái)的數(shù)據(jù)庫(kù),就要評(píng)估這個(gè)數(shù)據(jù)庫(kù)能不能滿足上市的需求,尤其是在審計(jì)方面。
帳戶安全必須有一個(gè)密碼復(fù)雜度的詳細(xì)策略,包括用戶管理和認(rèn)證管理,比如密碼的更改周期,賬戶鎖定等等。
鏈路安全,這是數(shù)據(jù)庫(kù)一定要滿足的,一般是通過(guò)鏈路加密來(lái)進(jìn)行的。
數(shù)據(jù)安全,尤其是敏感數(shù)據(jù)一定要加密,加密的收到有很多,比如可以通過(guò)PostgreSQL加密的數(shù)據(jù)類型來(lái)存儲(chǔ)你的數(shù)據(jù),或者是使用業(yè)務(wù)加密,把加密的階段放在業(yè)務(wù)存儲(chǔ)。
數(shù)據(jù)庫(kù)用戶操作審計(jì),需要制訂內(nèi)容策略,可以支持具體的業(yè)務(wù)。
開(kāi)源數(shù)據(jù)庫(kù)有很多,支持的數(shù)據(jù)類型也很多。很多企業(yè)都是有特殊的業(yè)務(wù)場(chǎng)景的需求,不能簡(jiǎn)單用普通數(shù)據(jù)來(lái)描述,比如基因序列或者是化學(xué)方程式這類的數(shù)據(jù)常用數(shù)據(jù)庫(kù)是沒(méi)有辦法來(lái)編碼的。這時(shí)候就需要一個(gè)擴(kuò)展能力強(qiáng)的數(shù)據(jù)庫(kù)PostgreSQL提供了非常豐富的接口,可以自己編寫(xiě)數(shù)據(jù)類型,也可以基于開(kāi)放的索引接口定義數(shù)據(jù)類型。
雖然分?jǐn)?shù)據(jù)庫(kù)發(fā)展了這么多年,性能的差別不是特別大,但是還是有些微差距的,所以還是需要根據(jù)業(yè)務(wù)場(chǎng)景建模測(cè)試、工業(yè)標(biāo)準(zhǔn)測(cè)試。
代碼成熟度對(duì)于一般的用戶來(lái)說(shuō)難度是很高的,這里有一個(gè)小技巧,你去看社區(qū)發(fā)布的代碼數(shù)量,就可以推測(cè)你的產(chǎn)品代碼成熟度。
平臺(tái)的兼容性,目前PostergreSQL是可以兼容各個(gè)平臺(tái)的。
除了以上的能力,PostergreSQL還有兩個(gè)重要的能力,一個(gè)是scale up,另一個(gè)是scale out。scale up能力主要考量的是是否能夠充分利用計(jì)算機(jī)資源。scale out能力主要是指是否支持讀寫(xiě)分離,sharding。
社區(qū)的活躍度和生態(tài)也是要考慮的因素。很多公司都會(huì)忽略掉生態(tài),其實(shí)生態(tài)是很重要的,傳統(tǒng)企業(yè)和互聯(lián)網(wǎng)企業(yè)的需求是不一樣的。社區(qū)的軟件開(kāi)發(fā)商、數(shù)據(jù)庫(kù)的廠商以及服務(wù)的提供商,人才儲(chǔ)備,國(guó)家整體的軟件研發(fā)能力都要納入考量的范圍。
很多企業(yè)也是很關(guān)注案例的,他們會(huì)關(guān)注同行業(yè)的競(jìng)爭(zhēng)對(duì)手在使用哪款數(shù)據(jù)庫(kù)產(chǎn)品。
學(xué)習(xí)成本和開(kāi)發(fā)成本,如果你要獨(dú)立研究的話,這方面的支出就會(huì)很大,所以很多企業(yè)都選擇投身參與到社區(qū)中。
我為什么要做PostgreSQL布道,其實(shí)和傳教士為什么跑到偏遠(yuǎn)的地方傳道是有一定的相互性,PostgreSQL確實(shí)是非常好的產(chǎn)品,我們企業(yè)也從中獲益很多,它的代碼優(yōu)雅,穩(wěn)定性好、性能佳、擴(kuò)展性強(qiáng)、接口豐富等等,這么多的優(yōu)點(diǎn)都值得我們宣揚(yáng)。最主要的是當(dāng)時(shí)我們成立中國(guó)用戶會(huì)的時(shí)候,中國(guó)對(duì)PostgreSQL數(shù)據(jù)庫(kù)認(rèn)知非常少,酒香巷子深,從現(xiàn)在看,也證明了我們當(dāng)時(shí)的選擇是沒(méi)有錯(cuò)的。
PG在國(guó)內(nèi)關(guān)注的增長(zhǎng)趨勢(shì)是在往上走的。
百度的搜索指數(shù)代表中國(guó)市場(chǎng),谷歌的搜索指數(shù)代表國(guó)際市場(chǎng),從全球的角度來(lái)看,中國(guó)市場(chǎng)對(duì)PostgreSQL的認(rèn)知和國(guó)外市場(chǎng)還有一定的差距。
國(guó)內(nèi)的用戶沒(méi)有聽(tīng)說(shuō)過(guò)PostgreSQL,那么就會(huì)對(duì)PostgreSQL充滿疑問(wèn)。例如它的性能怎么樣,它能管理多大的數(shù)據(jù)量,它能不能用好硬件資源,使用哪些方式來(lái)提升我的性能,以及和其它的數(shù)據(jù)庫(kù)相比有哪些優(yōu)缺點(diǎn)。以上疑問(wèn)都是我們布道者要做的工作。
接下來(lái)給大家來(lái)普及幾個(gè)PostgreSQL的案例,可能會(huì)顛覆大家對(duì)數(shù)據(jù)庫(kù)產(chǎn)品的認(rèn)知。
第一個(gè)例子,我們看這個(gè)圖,從左邊到右邊是一個(gè)數(shù)據(jù)聚集的過(guò)程,這個(gè)在數(shù)據(jù)分析或者數(shù)據(jù)挖掘領(lǐng)域是非常常見(jiàn)的案例。比如說(shuō)我對(duì)一些用戶的行為做分類,在PG里面可以通過(guò)kmeans做到。
實(shí)時(shí)計(jì)算某WEB站點(diǎn)的請(qǐng)求延遲, 90%的請(qǐng)求低于多少毫秒, 95%的請(qǐng)求低于多少毫秒,99%的請(qǐng)求低于多少毫秒。這個(gè)的處理方法也是很簡(jiǎn)單,數(shù)據(jù)采集到性能數(shù)據(jù),我只要建一個(gè)模式統(tǒng)計(jì)就可以了。除此之外,在加一個(gè)窗口查詢,就能得到我們想要的結(jié)果。
第三個(gè)例子,我在數(shù)據(jù)庫(kù)里面能不能做多元的信息反饋,這個(gè)在數(shù)據(jù)倉(cāng)庫(kù)或者是一些BI系統(tǒng)里面也是非常常見(jiàn)的,但是在關(guān)系型數(shù)據(jù)庫(kù)里是不常見(jiàn)的。P元線性回歸,通過(guò)圖上的公式求得截距和斜率,然后就可以預(yù)測(cè)yn。
這里用到linregr訓(xùn)練方法,訓(xùn)練source_table然后放到out_table里,通過(guò)這樣的一個(gè)函數(shù)就可以解決這樣的應(yīng)用需求。
除了剛剛舉的例子之外,madlib庫(kù)還有很多作用,它將很多東西封裝成了函數(shù),通過(guò)這些函數(shù)就能夠?qū)崿F(xiàn)深度學(xué)習(xí)的某些東西。
第四個(gè)例子顛覆了大家對(duì)數(shù)據(jù)類型的理解,大家可能認(rèn)為數(shù)據(jù)庫(kù)只能存儲(chǔ)long、int、text這類的數(shù)據(jù),實(shí)際上數(shù)據(jù)庫(kù)還可以存儲(chǔ)更多的數(shù)據(jù)類型。比如范圍搜索的數(shù)據(jù),可能在傳統(tǒng)數(shù)據(jù)庫(kù)里面是兩個(gè)字段,startvalue和endvalue,但是在PostgreSQL只需存儲(chǔ)一個(gè)字段,就可以表示一個(gè)數(shù)據(jù)范圍,甚至就可以建索引。這個(gè)索引是基于range建立的,在做范圍搜索的時(shí)候查詢效益非常高。
下面是一個(gè)查詢效益差別的對(duì)比。
第五個(gè)例子是一個(gè)流式數(shù)據(jù)的應(yīng)用場(chǎng)景。這個(gè)應(yīng)用場(chǎng)景在物聯(lián)網(wǎng)的大背景下的用戶需求也是非常大的。這種場(chǎng)景有兩個(gè)特點(diǎn),第一個(gè)特點(diǎn)是大量的數(shù)據(jù)積累,第二個(gè)是要基于時(shí)間分析。
我們以往是使用Btree索引來(lái)實(shí)現(xiàn)的,我們發(fā)現(xiàn)數(shù)據(jù)量是非常龐大的,執(zhí)行效率并不是很高。后來(lái)我們采用了BRIN的索引。
下圖是兩種索引性能差異的對(duì)比。
第六個(gè)例子是排他約束,排他約束和唯一約束也是相關(guān)的,唯一約束是根據(jù)排他約束來(lái)建立的。
第七個(gè)例子是外部表,PostgreSQL通過(guò)接口連接到后端的數(shù)據(jù)源,數(shù)據(jù)源的類型十分多樣化。
第八個(gè)例子是秒殺,這里講的是PostgreSQL自帶的一個(gè)類似于自選鎖的功能,這個(gè)鎖是非常短暫,用于秒殺的網(wǎng)站的話,能夠提升近百倍的性能。
所謂布道不僅僅只是分享案例,還包括貢獻(xiàn)核心代碼、review代碼、報(bào)告BUG、開(kāi)發(fā)插件、開(kāi)發(fā)驅(qū)動(dòng)、維護(hù)打包程序(bin,rpm,deb....)、port流行的軟件到PostgreSQL、開(kāi)發(fā)支持PostgreSQL的程序、翻譯文檔、維護(hù)官網(wǎng)手冊(cè)和插件手冊(cè)、維護(hù)HOWTO、維護(hù)遷移guide(mysql,oracle,infomix,sqlserver,....to PostgreSQL)、分享文檔、寫(xiě)書(shū)、寫(xiě)博客、組織用戶會(huì)議、幫助其他用戶、測(cè)試patch、測(cè)試性能等等。
PostgreSQL是從伯克利寫(xiě)的 POSTGRES 軟件包發(fā)展而來(lái),在1995年的時(shí)候有了社區(qū)管理的概念,目前PostgreSQL的大版本更新幾乎是一年一迭代。
PostgreSQL的代碼活躍度做的也是比較好,比如我提交一個(gè)代碼,里面會(huì)有代碼審核,告訴你哪有問(wèn)題,然后針對(duì)性的修改代碼。
上圖是PostgreSQL近幾年的里程碑,我們可以看到每一年新版本的發(fā)布都有不同的東西。很多功能的實(shí)現(xiàn)都是一次次迭代出來(lái)的。
本次測(cè)試模型選用的PostgreSQL的8.4到9.5版本,數(shù)據(jù)量為305GB,測(cè)試結(jié)果發(fā)現(xiàn)各個(gè)版本的性能差異不是特別大,原因是IO的瓶頸。
第二次測(cè)試我們采用的是一億的數(shù)據(jù)量,數(shù)據(jù)全部在內(nèi)存中,考量的是數(shù)據(jù)庫(kù)的代碼效率,我們看到從8.4到9.5,性能幾乎翻了一倍。
這是另外一個(gè)場(chǎng)景,一共有64張表,每張表有1000萬(wàn)的數(shù)據(jù),64個(gè)并發(fā)連續(xù)壓測(cè)2個(gè)小時(shí),壓測(cè)結(jié)果大家可以參考上圖。
自從我們成立中國(guó)用戶會(huì)以后,我們中國(guó)的用戶發(fā)生了非常巨大的變化。之前我了解到幾乎沒(méi)有公司在使用PostgreSQL,但是我們現(xiàn)在看,已經(jīng)有這么多的公司都在用PostgreSQL,而且很多是國(guó)字頭的。我們可以看到PostgreSQL在中國(guó)發(fā)展勢(shì)頭非常好。
整個(gè)PostgreSQL社區(qū)的核心成員是六個(gè),主要貢獻(xiàn)者有40多個(gè)。PostgreSQL在中國(guó)的發(fā)張最早可以追溯到1999年,那時(shí)我們只是在做一些文檔的推廣,直到2011年P(guān)ostgreSQL社區(qū)成立,這期間是完全沒(méi)有社區(qū)的概念。現(xiàn)在,我們每年會(huì)在各地舉辦會(huì)議、會(huì)有免費(fèi)的DBA培訓(xùn),也會(huì)和高效合作項(xiàng)目。用戶會(huì)把整個(gè)生態(tài)的用戶、企業(yè)集合起來(lái),大家一起把這個(gè)產(chǎn)品做好。
我們看一下截止到現(xiàn)在,社區(qū)發(fā)生什么變化。目前整個(gè)社區(qū)在中國(guó)大概有超過(guò)一萬(wàn)的人員,研發(fā)人員超過(guò)三百個(gè)。為什么說(shuō)研發(fā)人員的占比這么少呢?因?yàn)镻ostgreSQL數(shù)據(jù)庫(kù)的開(kāi)源協(xié)議是BSD,你把PostgreSQL數(shù)據(jù)庫(kù)拿過(guò)來(lái)一行代碼不改,可以直接包裝成自己的產(chǎn)品拿去售賣(mài),但如果你把MySQL數(shù)據(jù)拿過(guò)來(lái)一行代碼不改直接使用是要追究你的法律責(zé)任的。
用戶會(huì)的主要工作是維持生態(tài),當(dāng)然也會(huì)有很多文檔翻譯,案例分享,主持會(huì)議,聯(lián)合其它的社區(qū)一起來(lái)推動(dòng)PostgreSQL等等的工作來(lái)做。從用戶會(huì)參會(huì)來(lái)看,基本上已經(jīng)接近十倍的增長(zhǎng)。
學(xué)習(xí)任何一個(gè)產(chǎn)品都是多實(shí)踐、多分享、有問(wèn)題多翻手冊(cè)和源碼、多和社區(qū)小伙伴交流,開(kāi)源的產(chǎn)品可以參與到社區(qū)中,這時(shí)你會(huì)發(fā)現(xiàn)你要成為一個(gè)PostgreSQL DBA花費(fèi)的時(shí)間成本不是很多,比如說(shuō)你是一個(gè)有一定數(shù)據(jù)庫(kù)基礎(chǔ)的DBA,你花一個(gè)月時(shí)間去學(xué),肯定沒(méi)問(wèn)題。如果你是有Linux管理基礎(chǔ)的SA或者是有服務(wù)端開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員,那么差不多需要三個(gè)月。如果你是完全沒(méi)有基礎(chǔ),半年的時(shí)間你基本也可以上手了。
最后是給大家分享一下我對(duì)PostgreSQL市場(chǎng)的判斷。商業(yè)數(shù)據(jù)庫(kù)這塊主要憑借PostgreSQL BSD許可,其實(shí)有很多國(guó)產(chǎn)數(shù)據(jù)庫(kù)是基于PostgreSQL,另一塊是MPP DB市場(chǎng),有超過(guò)一半的MPP數(shù)據(jù)庫(kù)是基于PostgreSQL,比如Greenplum、Deepgreen、redshift、PG-XL、ASTERDATA、ParStream、ParAccel等等,如果大家有興趣或者是有很好的渠道,可以考慮一下MPP PostgreSQL。高校方向主要是科研。公有云市場(chǎng)也大有可為,比如上云、中間件、培訓(xùn)等等。其實(shí)現(xiàn)在在國(guó)內(nèi)還沒(méi)有一家做PostgreSQL的培訓(xùn),這是空白的市場(chǎng),發(fā)展空間巨大,大家可以去嘗試。
阿里云的ApsaraDB PostgreSQL團(tuán)隊(duì)擁有很多PG源碼專家,我們基于PostgreSQL做了很多優(yōu)化,另外還提供一個(gè)高度兼容Oracle的產(chǎn)品PPAS。
總結(jié)
以上是生活随笔為你收集整理的德哥:从Oracle DBA到PostgreSQL布道者的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python socket Ftp ge
- 下一篇: 工作迷思