行業(yè)動態(tài)
數(shù)據(jù)庫是個監(jiān)獄,Expensify是如何“越獄”的?
費用管理公司Expensify第一次設(shè)計數(shù)據(jù)庫結(jié)構(gòu),是為了建立自己的公司信用卡系統(tǒng)。與金融機構(gòu)合作有著嚴格的要求:響應(yīng)時間在毫秒內(nèi)、多臺服務(wù)器實時復制、每一個交易都必須記錄,并進行身份驗證等。當時,這些要求對于一個想要建立一個高層次、企業(yè)級架構(gòu)的創(chuàng)業(yè)公司來說無疑是矯枉過正的。當公司把精力耗費在昂貴的報告上時,強大的技術(shù)處理也是必不可少的。創(chuàng)業(yè)公司往往不知道,他們的早期決策是多么得有價值。Expensify的創(chuàng)始人兼CEO David Barrett(大衛(wèi)·巴雷特)也是在后來才意識到早期限制Expensify的數(shù)據(jù)庫架構(gòu)關(guān)系著企業(yè)的許多關(guān)鍵性競爭優(yōu)勢。
在超過八年的時間里,巴雷特見證了數(shù)據(jù)庫設(shè)計早期的大量投資所帶來的優(yōu)勢。這種優(yōu)勢不僅體現(xiàn)在產(chǎn)品的功能,也創(chuàng)新了一個激進的商業(yè)模式,以此來贏得不同于競爭對手的客戶青睞??蛻袅吭?015增長了超過120%,超過同行業(yè)競爭對手近70%。費用管理公司現(xiàn)在服務(wù)著超過20000家公司。巴雷特認為,公司的成功,很大一部分應(yīng)該歸功于技術(shù)決策,特別是得以依靠非常強大的數(shù)據(jù)庫體系。
First Round Review對巴雷特進行了獨家專訪,談到了數(shù)據(jù)庫系統(tǒng)和一個創(chuàng)業(yè)公司是怎樣因此陷入危機的。并且就一些應(yīng)該要避免的錯誤進行了解釋性說明。他分享了創(chuàng)業(yè)公司技術(shù)和商業(yè)模式的規(guī)模化和實現(xiàn)成功的三個關(guān)鍵步驟。最后,他還分享了校正數(shù)據(jù)庫體系結(jié)構(gòu)的方法。
許多初創(chuàng)公司在數(shù)據(jù)庫體系的建立一事上會存在動搖
初創(chuàng)公司都知道,他們應(yīng)該是“數(shù)據(jù)驅(qū)動”型的公司,但很少能在做出關(guān)鍵技術(shù)決策時知道這究竟意味著什么。“當您剛開始創(chuàng)業(yè)時,您沒有數(shù)據(jù),也沒有客戶。您所做的一切都可以簡單地用一個由單一的Web服務(wù)器支持的單一數(shù)據(jù)庫搞定。你會選擇使用舊式機器,或者是目前流行的那款,然后還會覺得這是最好的選擇了。“巴雷特說。“隨著公司的發(fā)展,慢慢地,單個服務(wù)器的性能或可靠性不再適用,您開始需要多臺服務(wù)器。接著,你會把一臺臺的服務(wù)器增加到你曾經(jīng)單一的數(shù)據(jù)中心,公司的產(chǎn)能也會隨著規(guī)模的逐漸擴大而增加。”
這就是為什么一些方法會讓許多創(chuàng)業(yè)者落入陷阱:
到處都是松鼠。在皮克斯的一個電影《飛屋環(huán)游記》中,主人公在聊金毛獵犬道格時,話說到一半,突然停下來,大叫“松鼠!很多時候想到的不一定就是看到的。“大多數(shù)公司都會在他們最熟悉的領(lǐng)域來創(chuàng)業(yè)。這是一個安全的選擇,它有效地在最開始讓風險最小化。不幸的是,人們對過去熟悉,但是世界屬于未來,“巴雷特說。“有膽識的公司總是退后一步,看看有什么新鮮的或者比熟悉的更好的東西。這當然是好的。但是,很多公司把“時髦”誤認為是“好”,然后在他們猶豫用什么時,選擇一些恰好流行但卻未經(jīng)檢驗的技術(shù)。事實上。這種做法會慢慢地將你的創(chuàng)業(yè)公司置于死地的。
幾年前,巴雷特曾就職于一個公司。這個公司試圖建立一個早期版本的Dropbox。“所有的技術(shù)是當時有的,但他們堅持不用簡單的集中式系列服務(wù)器而要用那個名叫JXTA的糟糕透頂?shù)腜2P技術(shù)。我們那時候沒有客戶,也沒有多少數(shù)據(jù)需要來存儲,但我們的首席技術(shù)官偏要把整個公司賭上來用這個分布式系統(tǒng),并且聲稱這是得以擴展到PB級數(shù)據(jù)的唯一途徑,”巴雷特說。“跟很多看上去不錯,綜合性很強的解決方法一樣,它根本不可能實現(xiàn)預期目標。這種技術(shù)簡直是一個噩夢,之后也再沒有在生產(chǎn)環(huán)境中使用過。公司幾次調(diào)整戰(zhàn)略,最終,在四年后一個融合新舊,新一代Dropbox的解決方案問世了。”
任何初創(chuàng)公司的關(guān)鍵挑戰(zhàn)是新舊結(jié)合,保證最新科技不會被扼殺在搖籃里。
你不是Google。這并不是說你將來不能或者不會成為像Google那樣。但不要一開始就做這個假設(shè)。“當下流行的技術(shù)是給那些已經(jīng)出現(xiàn)規(guī)模效應(yīng)、有著復雜需求的成熟公司的。那些都是理想中的新技術(shù)。你作為一個新創(chuàng)的品牌公司,需求跟像Google這樣的大公司相同的可能性是微乎其微的,”巴雷特說,“像Postgres的數(shù)據(jù)庫也不錯,但是它們都不夠酷炫。Google用的那種有特色的數(shù)據(jù)庫技術(shù)聽上去更有意思。我想要像Google,所有我就要選擇那種技術(shù)。”
但人們往往忽略了,Google以他那種方式發(fā)展技術(shù)基礎(chǔ)是因為它要運行世界上最大的搜索引擎。“搜索引擎的驅(qū)動技術(shù)是跟其他商業(yè)網(wǎng)站的驅(qū)動不一樣的。Google每天需要吸收大量的數(shù)據(jù),而其中只有一小部分是變化或有趣的。也就是說,Google基本上每天都會拷貝一份互聯(lián)網(wǎng)數(shù)據(jù)。這意味著它能夠使用數(shù)據(jù)索引的方法,非??焖俚厮阉骱吞砑訑?shù)據(jù),但數(shù)據(jù)一旦添加,選擇性地刪除或更改就會非常緩慢。這對Google來說沒有太大影響,因為這種事情他們每天都會做一遍。”巴雷特說,“絕大多數(shù)企業(yè)都不能這么做。相反,他們需要慢慢積累更密集的數(shù)據(jù)集,包括帳戶、密碼和可編輯的文件,這些原始的數(shù)據(jù)你都不能只是扔掉,然后重新開始收集,它是需要時間,不斷更新積累的。”
你的創(chuàng)業(yè)公司每天都在做網(wǎng)上的一份拷貝嗎?如果不是,停止試圖模仿Google的數(shù)據(jù)庫架構(gòu)。
如何明智地選擇數(shù)據(jù)庫體系結(jié)構(gòu)
復制許多流行的或你喜歡的公司的技術(shù)基礎(chǔ)的危險之處就在于,這些公司很可能與你的公司非常不同。他們的決定對于你來說可能是種約束。但對于他們來說需要小心翼翼的限制因素,可能成為你的亮點。這里列舉幾項設(shè)計數(shù)據(jù)庫架構(gòu)時能夠減輕這種風險的方法。
拒絕被引誘,做好你的打算。人們很容易驚異于數(shù)據(jù)庫的強大性能,而不考慮自己的實際需要。“當你聽到一個數(shù)據(jù)庫可以控制一千多臺電腦和處理PB級數(shù)據(jù)的時候,不要昏頭了。首先,問自己:“我可能會有多少數(shù)據(jù)需要處理?”,你是不大可能需要那么大的處理量的,”巴雷特說,“即使在今天,如果我們不關(guān)心的可靠性和可維護性,我們公司可能現(xiàn)在用的還是建立公司五年時的那套數(shù)據(jù)庫服務(wù)器。人們忘記了,今天的電腦功能是如此強大卻又如此廉價。你的手機處理的數(shù)據(jù)量是美國宇航局去月球上帶的電腦的10000倍,甚至一個簡單的服務(wù)器處理的數(shù)據(jù)量也是它的1000倍。對于一般的創(chuàng)業(yè)公司,幾年內(nèi),單一的服務(wù)器難以處理所需數(shù)據(jù)的可能性是微乎其微的。
優(yōu)先維護生產(chǎn)能力。“今天,最便宜的戴爾服務(wù)器有一個雙核2.8ghz處理器和500gb磁盤陣列存儲,價格剛剛超過700美元。升級到一個有著64GB的RAM和10TB存儲的8核3.7ghz處理器版本,只需要約3200美元,花銷遠小于Expensify每個月在咖啡上的花費。大多數(shù)創(chuàng)業(yè)公司在提高自己市場上最便宜的服務(wù)器前就倒閉或者被收購了。特別是現(xiàn)在存儲成本下降的速度遠遠快于大多數(shù)創(chuàng)業(yè)公司成長速度。即使使用EC2付費云托管,它仍然需要支付兩倍的違約金。無論你的硬件是租的還是買的,機器容量永遠不會成為絕大多數(shù)創(chuàng)業(yè)公司的一個真正的問題。維修保養(yǎng)才是最難的部分。如果你的單個服務(wù)器出問題了-或者你只是需要升級一下-當你重新啟動它之后又會發(fā)生什么?你的整個服務(wù)就癱瘓了??偠灾?,現(xiàn)在的電腦這么地便宜,多備幾臺,不是在提高生產(chǎn)能力,而是純屬多余。”
為安全問題鉆牛角尖兒。“大多數(shù)數(shù)據(jù)庫可以以兩種方式訪問。第一個是在數(shù)據(jù)庫上做一個通用查詢。另一種方法是通過存儲過程來訪問。誠然,所有的數(shù)據(jù)庫都有安全措施,但他們也存在區(qū)別,“巴雷特說。“最流行的新數(shù)據(jù)庫依賴于內(nèi)置到Web服務(wù)器的代碼。它的問題是,你的Web服務(wù)器十分有可能被攻破,因為他們直接連在互聯(lián)網(wǎng)上。不懷好意者可以繞過安全措施,并不受限制地訪問數(shù)據(jù)庫。但如果一個存儲過程在數(shù)據(jù)庫內(nèi)執(zhí)行,網(wǎng)絡(luò)黑客難以觸及,這樣能夠保證在數(shù)據(jù)庫層面的安全性。然而,絕大多數(shù)的創(chuàng)業(yè)公司-尤其是消費類公司-卻選擇使用不夠安全的技術(shù)。這樣一旦他們有了客戶,在不停機的前提下進行安全改造的成本遠比從一開始就做好安全工作高得多。”
初創(chuàng)公司在數(shù)據(jù)庫安全方面還是應(yīng)該保證,如果有閑置資金,最好買一個更安全的服務(wù)器。下面是應(yīng)該怎么做。
早期,成長期。消費者,企業(yè)。每一家創(chuàng)業(yè)公司都有自己的情況,但巴雷特認為,有一個經(jīng)驗法則的方法,可以服務(wù)于一系列正在尋求智能化和實現(xiàn)目的性數(shù)據(jù)庫架構(gòu)的技術(shù)公司。下面是如何做:
從三個數(shù)據(jù)庫開始。巴雷特認為,今天的技術(shù)讓這成為可能,每一個初創(chuàng)公司應(yīng)該在創(chuàng)業(yè)第一天就有三個數(shù)據(jù)中心。“三是一個神奇的數(shù)字,”他說。“一個還不夠,因為它壞掉只是時間問題??赡苓B不上網(wǎng)或者主機癱瘓。不管是哪種情況出現(xiàn),都是問題,一個單一的數(shù)據(jù)庫是無法解決這個問題的。兩個數(shù)據(jù)中心存在的問題是,你很容易受到所謂的“分裂大腦綜合癥”的影響,如果兩個數(shù)據(jù)中心的服務(wù)器之間失去了聯(lián)系,一旦兩者之一完全或暫時無法訪問,一切就都陷入了混亂。如果,在同一時間,他們都認為對方死機了,那么他們都認為他們是在充當主機,然后一直做著備份。在我們看來,就是他們都在消耗著相同的費用,成本會翻倍。顯然這是不劃算的。”
用一個時鐘,你總是能夠知道時間。但是如果有兩個不同的時鐘,你永遠不會知道確切的時間,因為你不知道哪一個才是正確的。
由于一個數(shù)據(jù)中心是脆弱的,兩個容易出現(xiàn)責任不明的問題,那就選擇使用三個數(shù)據(jù)中心的服務(wù)器。“如果你有三個數(shù)據(jù)中心,這意味著在任何一時間點上,你可以失去一個完整的數(shù)據(jù)中心,還有兩個剩余的。兩個數(shù)據(jù)中心是足以正常運行的,“巴雷特說。“這聽起來已經(jīng)挺多了,但它同樣可能出現(xiàn)問題。但是,即使問題出現(xiàn)了,在沒有人催促逼迫的時候,正面解決問題會更有效一些。這種情況下,投資者不至于對你失望,客戶也不用擔心。因為前期規(guī)模已經(jīng)奠定了基礎(chǔ)。所以準備三個不同的數(shù)據(jù)中心或在AWS內(nèi)準備三個不同的可用性區(qū)域吧。這一點都不貴,而且還簡單,只是需要不凡的遠見。”
查找和使用復制技術(shù)。為什么更多的創(chuàng)業(yè)公司創(chuàng)業(yè)時不用三個數(shù)據(jù)中心?公司創(chuàng)立初期建立三個數(shù)據(jù)中心意味著,在你有數(shù)據(jù)需要處理之前,-你得要先復制。每個數(shù)據(jù)中心中的每個服務(wù)器都需要不斷地互相之間共享數(shù)據(jù),這樣每個服務(wù)器才能共享同一級別的信息。
“但備用或備份服務(wù)器可以很大程度上優(yōu)化原始的復制技術(shù)。主機癱瘓的時候,整體都喪失了工作能力。這種故障轉(zhuǎn)移過程要不是通過手動,要不就是隨著請求沿途自定義腳本的過程一起被攻擊。無論以哪種方式,都是全局性的問題,最終將會影響到客戶,“巴雷特說。“更現(xiàn)代的解決方案充分考慮到復制和故障轉(zhuǎn)移問題,這樣,一個服務(wù)器死機也不會產(chǎn)生太大影響,無需手動操作,也不影響客戶。此外,不同于原始的解決方案被設(shè)計在一個單一的數(shù)據(jù)中心,依賴快速而可靠的網(wǎng)絡(luò),新的解決方案能使優(yōu)化工作在相對緩慢和不可靠的互聯(lián)網(wǎng)連接情況下也能實現(xiàn)。”
問題的一部分來自,過時的關(guān)系數(shù)據(jù)庫管理系統(tǒng)仍然處于主導地位。“想要使用MySQL,是非常困難的。因為這是一個舊的數(shù)據(jù)庫,它最初是為小容量、運行速度慢的磁盤設(shè)計的。文件系統(tǒng)不能大于4GB。而現(xiàn)在,情況與那時大不相同了,“巴雷特說。“今天,所有的一切都是在固態(tài)硬盤或緩存在內(nèi)存中,因此超快速。這是MySQL的難題。它還在不斷優(yōu)化,現(xiàn)在仍在被使用。所以它有所有的舊世界的包袱,但它著實不具備新世界的優(yōu)勢。”
有一些工具可以幫助在不同的數(shù)據(jù)中心同步服務(wù)器,但開放源代碼,易于安裝的工具才剛剛出現(xiàn)。“一些舊的解決方案與三個數(shù)據(jù)中心同步啟動仍然是艱難的,這些在沒有預言機那么強大的機器之前的2007年是不可能實現(xiàn)的。公平地說,Percona可能會奏效,但那時它剛被開發(fā),我都沒聽說過,”巴雷特說。“因為我有做PtoP網(wǎng)絡(luò)軟件的背景,所以決定建立一個我們自己的解決方案。由此,產(chǎn)生了calledbedrock,它易于操作,并能實時復制,也不像Oracle或MySQL那么復雜。就每一個服務(wù)器而言,只是在它的本地有一個單一的數(shù)據(jù)庫,該技術(shù)將它們連接起來,并實現(xiàn)所有的復制功能。為了好玩,我們也會讓它運行MySQL協(xié)議,它幾乎可以作為一種簡易替換器件。”
“如果還有其他的解決方案可供選擇,Expensify計劃無償放棄這項技術(shù)。“最初,它只是一個專有的解決方案,因為我們找不到現(xiàn)成的。但隨著時間的推移,我們意識到他強大的功能,任何人都可以用它。由于自動無縫聚類的思想,那些關(guān)心性能和可用性的人十分在意無損故障轉(zhuǎn)移”巴雷特說,“但很少有人會因此來自行建立。因為其核心技術(shù)-Paxos的分布式一致性算法,很難得到正解。也正是它使得一組同等服務(wù)器能夠可靠地選出一個主機,來協(xié)調(diào)分布式事務(wù)和平衡流量,并在故障發(fā)生的0毫秒之內(nèi)做出反應(yīng)。但我們已經(jīng)花了八年的時間來讓它跨過幾個數(shù)量級,所以它還并不適用于很多現(xiàn)實世界的情況,因此,我們還在不斷做出改進和準備,讓它被更廣泛的使用。”
決定你的數(shù)據(jù)是否需要分區(qū)。在從不同的數(shù)據(jù)中心選擇三個服務(wù)器并選擇一個復制技術(shù)后,還要決定是否將數(shù)據(jù)分區(qū)。分區(qū)涉及將一個數(shù)據(jù)庫分解成完整的獨立部分。這種選擇會影響很多未來的決定。
提到分區(qū),需要問一個問題:我想讓每一位用戶與其他用戶共享數(shù)據(jù)還是將用戶群互相分割開?
“幾乎每個人開始都是“脫節(jié)的群體”,這是最簡單的概念。無論你是為個人提供消費品還是為企業(yè)提供商品,用戶之間的關(guān)系在開始時就已經(jīng)很明顯,“巴雷特說。“例如,如果你正在做企業(yè)文檔存儲,事情一開始就很明朗,你只需要在公司內(nèi)部的員工之間共享文檔。你甚至可能與企業(yè)客戶簽訂合同,這也要求數(shù)據(jù)被物理隔離-不管如何,這樣做總沒壞處。”
風險是有一天你可能遇到一個意外情況,需要將以前你覺得不會有聯(lián)系的幾方聯(lián)系起來。“想象一個法律公司為兩個不同的客戶工作,每一個都托管在兩個不同的數(shù)據(jù)庫上。突然分托的模型不適用了,因為正在使用一個數(shù)據(jù)庫的公司不能調(diào)閱另一個數(shù)據(jù)庫中的文件。你的技術(shù)現(xiàn)在阻礙了這一關(guān)鍵用例來提供產(chǎn)品支持-糟糕的是,你可能已經(jīng)在此前提下通過簽署企業(yè)協(xié)議鞏固了這項技術(shù)。
另一種方法是提前設(shè)計一個通道,以備用戶之間有朝一日共享數(shù)據(jù),也就是從一開始就設(shè)計一個共享的數(shù)據(jù)庫。“這需要你采用完全不同的技術(shù)路徑,因為你不能再從硬件層面解決問題。如果你的數(shù)據(jù)庫滿了,你不能再為你的下一批客戶買一個,你需要找到一種方法來升級整個系統(tǒng)-而不是單純只為某個客戶,“巴雷特說。“為所有用戶保持一個單一的連續(xù)數(shù)據(jù)庫的好處是,你可以消除客戶之間資源分享的約束,無論是立刻還是在未來的任何時間。缺點是一個單一的巨大的數(shù)據(jù)庫,比一堆小的數(shù)據(jù)庫更難維護-尤其是如果你正在使用一個舊的數(shù)據(jù)庫解決方案的時候。”
正確的入門課程
不是每一次的創(chuàng)業(yè)都能華麗地從頭開始。如果你已經(jīng)做了一些其他的選擇-故意或不知情的-還有方法來走回正道。撞擊道岔,轉(zhuǎn)換方向可能不那么輕松,但火車其實還沒有駛離車站。
· 選擇在多個可用性區(qū)域中復制的數(shù)據(jù)庫。“很多公司會說,“我已經(jīng)有了一個EC2,立馬就能運行我的web服務(wù)器,一個單一的RDS就是我的數(shù)據(jù)庫,或者我把一些數(shù)據(jù)存儲在S3里。這都是一個單一的可用性區(qū)域。“不要一開始就讓自己陷入困境:與亞馬遜一起構(gòu)建能支持多個可用性區(qū)域或完全不同的數(shù)據(jù)中心。”
· 嘗試Expensify的復制技術(shù)。“從MySQL換到Bedrock很簡單:如果數(shù)據(jù)量小,你可以在深夜關(guān)掉你的服務(wù)器,把數(shù)據(jù)導出,再導入到Bedrock。您的Web服務(wù)器不會受到任何影響。因為Bedrock執(zhí)行的也是MySQL協(xié)議。”
· 從存儲過程開始。“問問你自己:“如果黑客襲擊我的服務(wù)器,后果會有多嚴重?如果答案是“特別糟糕”,那么將您的驗證邏輯移到數(shù)據(jù)庫中的存儲過程中。它會更安全,能保持更好的分層,并為最終用戶提供更好的服務(wù)。”
結(jié)合
大多數(shù)人不會覺得數(shù)據(jù)庫結(jié)構(gòu)很酷。但在擁有客戶和他們的數(shù)據(jù)之前,充分了解也是很重要的。你如何組織,規(guī)劃和保證這些數(shù)據(jù)的安全不僅會對你的技術(shù)產(chǎn)生作用,而且還會影響你的商業(yè)模式的可擴展性。保證在每三個不同的數(shù)據(jù)中心或可用性區(qū)域中至少有一個服務(wù)器。選擇一個允許它們精確、可靠地相互通信的復制技術(shù)。檢查您的用戶之間的關(guān)系,以決定是否應(yīng)分區(qū)您的數(shù)據(jù)。充分考慮存儲的程序來保護您的數(shù)據(jù)。最大的挑戰(zhàn)不是決定去采取這種做法,而是怎樣順利地從MySQL一類的流行數(shù)據(jù)庫管理系統(tǒng)中轉(zhuǎn)變過來。
“不要把自己的角色設(shè)定為Google,以此來圍繞數(shù)據(jù)庫架構(gòu)做決定。但也不要把在創(chuàng)業(yè)時有太多拘束,這會阻礙公司發(fā)展成為像 Google一樣成熟的公司。事實上,許多初創(chuàng)公司在這些問題出現(xiàn)前,就已經(jīng)失敗了。你需要問問自己:你是在變得更好還是更壞?”巴雷特說。“嚴格的要求和機會,其實早就迫使我們做出更多關(guān)于數(shù)據(jù)庫架構(gòu)的思考。我們現(xiàn)在知道,堅實的基礎(chǔ)不僅幫助我們按著預期的目標擴大規(guī)模,也為我們從未想過的深數(shù)據(jù)和人工智能技術(shù)提供支持。這些可能在我們第一次作出數(shù)據(jù)庫架構(gòu)的決定的時候就確定好了。這個系統(tǒng)架構(gòu)像一個大桶,收納了以任何你能想象的方式存在的數(shù)據(jù)。而另一個選擇則是糟糕的。如果你沒有意識到你在第一天就建立了一個監(jiān)獄,將來遇到的困難可能是無法解決的。”