作者 | Alex Ghiculescu
策劃 | 云昭
Tanda(一款員工管理軟件)很快就要滿(mǎn) 11 歲了。一位讀者建議,回顧一下我在那段時(shí)間在互聯(lián)網(wǎng)上運(yùn)行該應(yīng)用程序所學(xué)到的東西會(huì)很有趣。
我在這個(gè)職位上呆了很多年??雍芏唷⒑苌羁?,正常運(yùn)行的時(shí)間并不多。因?yàn)椴渴?、托管、基礎(chǔ)設(shè)施管理,這可能是我十余年來(lái)工作中最具挑戰(zhàn)性,也是最令人沮喪的內(nèi)容。
主要是因?yàn)槲医?jīng)常莫名掉進(jìn)坑里,很多時(shí)候都不知道自己在做什么。不幸的是,當(dāng)你有一個(gè)很多人使用的生產(chǎn)應(yīng)用程序時(shí),你并不總是有時(shí)間可以正確地理解它。
這篇文章講述了我們經(jīng)歷的一些階段,希望如果您發(fā)現(xiàn)自己走在同一條道路上,您可以跳過(guò)一些最糟糕的部分。
1、第一階段:Heroku
我們從 Heroku 開(kāi)始,因?yàn)樵?2012 年,如果你完成了任何包含部署應(yīng)用程序的 Ruby on Rails 教程,你最終會(huì)獲得一個(gè) Heroku 帳戶(hù)。
Heroku 的易用性是無(wú)與倫比的。但這對(duì)于以前從未部署過(guò) Web 應(yīng)用程序的人來(lái)說(shuō)意義不大。我知道互聯(lián)網(wǎng)指南的作者們都認(rèn)為這是部署應(yīng)用程序的最簡(jiǎn)單方法,但我不明白它比之前的方法有多大改進(jìn)。
當(dāng)時(shí)我所了解的,全是它的弱點(diǎn):
(1)規(guī)定性:Heroku 工作得很好,只要你完全按照預(yù)期使用它。我們的情況非常接近這個(gè);一個(gè)帶有數(shù)據(jù)庫(kù)、一些后臺(tái)工作者和緩存的網(wǎng)絡(luò)應(yīng)用程序。
但我們有一個(gè)細(xì)微的差別,那就是我們的應(yīng)用程序,需要偶爾處理來(lái)自慢速客戶(hù)端(在信號(hào)不好的地方運(yùn)行的手機(jī)或平板電腦)的長(zhǎng)請(qǐng)求(文件上傳)。我們并沒(méi)有開(kāi)創(chuàng)移動(dòng)文件上傳的先河,但配置UnicornUnicorn以處理它們的正確方法與默認(rèn)設(shè)置完全不同,這讓我很傷心。因?yàn)槲覍?duì)部署 Web 應(yīng)用程序一無(wú)所知,所以我認(rèn)為這是 Heroku 的錯(cuò)。
這些天我知道的多了一點(diǎn),也能理解他們?cè)噲D做的事情的復(fù)雜性,但我懷疑我是唯一一個(gè)把他們的電梯推銷(xiāo)當(dāng)成你部署應(yīng)用程序所需的一切的人,有點(diǎn)太字面意思了。
(2)成本:Heroku 比運(yùn)行自己的 VPS 等替代方案的成本要高得多。當(dāng)然,它做了更多!但是因?yàn)檫@是我第一次自己部署,所以我很不喜歡,并且在將它與替代品進(jìn)行比較時(shí),只看到了“$”符號(hào)。
這不難理解,很多人現(xiàn)在的評(píng)價(jià)會(huì)比過(guò)去對(duì)它的評(píng)價(jià)相差很多。
無(wú)論如何,成本是最終導(dǎo)致我們從 Heroku 遷移的原因。我們最后一張 Heroku 發(fā)票是$104.95。(哈哈,記憶猶新。)
2、第二階段:Digital Ocean
進(jìn)入 Tanda 大約一年后,我有一名大學(xué)實(shí)習(xí)生,他對(duì)基礎(chǔ)設(shè)施和成本優(yōu)化非常感興趣。他基本上說(shuō)服了我,為 Heroku 買(mǎi)單就像放火燒錢(qián)一樣。他是一個(gè)可愛(ài)的人,當(dāng)時(shí)我真的很感謝他的幫助,但 10 年后我可以誠(chéng)實(shí)地說(shuō)這是一個(gè)糟糕的建議(給我背了一個(gè)大鍋)。
放棄 Heroku 意味著替換 Heroku 所做的所有部分。我們沒(méi)有以完全自動(dòng)化的方式來(lái)做,因?yàn)槲覀兪切∫?guī)模的!我們太小了,沒(méi)有意義。相反,我們只是在 Digital Ocean 的 UI 中指向并單擊一個(gè)服務(wù)器。然后我們?cè)O(shè)置一些Capistrano腳本來(lái)部署。在一個(gè)周末,我們將網(wǎng)站離線了一段短得離譜的時(shí)間,從 Heroku 下載數(shù)據(jù)庫(kù),將其上傳到 Digital Ocean “droplet”(又名服務(wù)器),并更改了 DNS 記錄。我們已經(jīng)遷移過(guò)來(lái)了!
我們的第一個(gè) Digital Ocean 發(fā)票是$28.93,第二個(gè)(第一個(gè)完整月)是$39.23。我認(rèn)為我每天節(jié)省 2 美元真是太聰明了。有一段時(shí)間它工作正常;事實(shí)證明,40 美元/月購(gòu)買(mǎi)的服務(wù)器比我們運(yùn)行我們非常小的應(yīng)用程序?qū)嶋H需要的要多得多。
當(dāng)我們開(kāi)始更快地成長(zhǎng)時(shí),裂縫開(kāi)始顯現(xiàn)。我們的客戶(hù)群規(guī)模每 9 個(gè)月翻一番,很快這意味著我們需要更多服務(wù)器。添加它們的過(guò)程是手動(dòng)的、挑剔的,而且容易出錯(cuò)。我想出了怎么做,但在添加額外的“硬件”時(shí),我就犯胃疼。
當(dāng)我們的數(shù)據(jù)庫(kù)服務(wù)器開(kāi)始超載時(shí),問(wèn)題才真正開(kāi)始顯現(xiàn)。如果我們超過(guò)一天不部署站點(diǎn),Postgres 就會(huì)耗盡內(nèi)存并被操作系統(tǒng)殺死。有時(shí)它會(huì)自行修復(fù),但更常見(jiàn)的是需要有人通過(guò) SSH 連接到應(yīng)用服務(wù)器并重新啟動(dòng)它們。這是工作日中令人惱怒的地方,我至今仍能想起好幾次我在酒吧的廁所里,用手機(jī)重啟服務(wù)器的經(jīng)歷。
但我們遇到過(guò)的最糟糕的“Digital Ocean”事件,是他們一下子關(guān)閉了我們所有的水滴。輸入帳戶(hù)的信用卡已過(guò)期,無(wú)法輸入備用卡,帳戶(hù)上的聯(lián)系人電子郵件已轉(zhuǎn)到不受監(jiān)控的共享收件箱。因此,大概有一個(gè)月的時(shí)間,我們收到并忽略了賬單提醒,直到我們真正注意到一切都處于離線狀態(tài)并且沒(méi)有響應(yīng) SSH 時(shí)。這不完全是他們的錯(cuò),但在當(dāng)時(shí)感覺(jué)就像是一個(gè)狡猾、不穩(wěn)定的設(shè)置。
將近 10 年后寫(xiě)下這一切,讓人感到非常后怕,令人震驚的是我們對(duì)其知之甚少,而我們卻僥幸逃脫了它。如果我有時(shí)光機(jī),我會(huì)回去告訴自己在 Digital Ocean 上多花 10 倍(500美元/月真的不會(huì)傾家蕩產(chǎn))并好好睡覺(jué)。
在使用 Digital Ocean 大約 3 年后,我們認(rèn)為該平臺(tái)對(duì)于我們不斷增長(zhǎng)的需求來(lái)說(shuō)太簡(jiǎn)單了。我們開(kāi)始與更大的客戶(hù)簽約,我們認(rèn)為我們需要一種更具企業(yè)精神的方法來(lái)托管我們的應(yīng)用程序。我們想要一個(gè)托管數(shù)據(jù)庫(kù),而不是管理我們自己的 Postgres 我們自己的服務(wù)器。我們希望減少平臺(tái)停機(jī)時(shí)間。我們需要能夠自動(dòng)縮放以響應(yīng)需求的波動(dòng),并且我們需要能夠?qū)Σ煌Y源組(……我們的 monorepo)的不同路由進(jìn)行負(fù)載平衡。我們認(rèn)為我們需要所有這些東西是合規(guī)的。
事后看來(lái),這種邏輯大部分是倒退的。Auto Scaling是一種技術(shù),不是AWS壟斷的產(chǎn)品。我們不應(yīng)該尋求更多的挑戰(zhàn),而應(yīng)該找到一個(gè)足夠簡(jiǎn)單的平臺(tái),我們可以真正掌握它。(盡管托管數(shù)據(jù)庫(kù)是個(gè)好主意。)
放棄 DO 的唯一合理理由,是他們沒(méi)有澳大利亞數(shù)據(jù)中心,而我們有一些真正關(guān)心這一點(diǎn)的客戶(hù)。當(dāng)時(shí)可謂指日可待,它于2022 年底推出了。所以很高興我們沒(méi)有等到那個(gè)。
反正。我們需要升級(jí)。如果您想升級(jí)您的托管服務(wù),您會(huì)打電話給誰(shuí)?
3、第三階段:AWS
我們需要成為一個(gè)真正的企業(yè),而真正的企業(yè)在 AWS 上托管他們的應(yīng)用程序。這就是我們所做的。具體來(lái)說(shuō),我們將確切的 Digital Ocean 基礎(chǔ)設(shè)施移植到了 AWS EC2 上。我們沒(méi)有利用任何其他平臺(tái)功能,我們只是像對(duì)待任何其他 VPS 一樣對(duì)待 AWS。
幾個(gè)月后,我得知我們有權(quán)聘請(qǐng) AWS 客戶(hù)經(jīng)理。我從一位客戶(hù)那里了解到這一點(diǎn),他也做了介紹。我非常興奮——我認(rèn)為客戶(hù)經(jīng)理能夠幫助我們快速成長(zhǎng)并達(dá)到我們不再擔(dān)心擴(kuò)展的必殺技。
在我們的第一次會(huì)議上,我們的客戶(hù)經(jīng)理帶來(lái)了他的解決方案架構(gòu)師。我從未見(jiàn)過(guò)解決方案架構(gòu)師,所以我真的不知道他們做了什么。這家伙所做的就是用“在沒(méi)有服務(wù)器的世界中如何工作?”來(lái)回答我們提出的所有問(wèn)題。我真的不明白 AWS Lambda 會(huì)如何幫助我們(仍然不明白),但他除了提醒我們它的存在之外沒(méi)有任何有用的貢獻(xiàn)。
我對(duì)有一個(gè)客戶(hù)經(jīng)理感到非常興奮,所以有一段時(shí)間我因?yàn)椴涣私?Lambda 和不夠聰明而無(wú)法讓 AWS 工作而感到愚蠢。最終我意識(shí)到我不是問(wèn)題所在。
大約一年后,另一個(gè)有趣的事件是我們耗盡了integers。我們的 Rails 應(yīng)用程序很老,幾乎每個(gè)表都使用整數(shù)作為其主鍵類(lèi)型。較新版本的 Rails 創(chuàng)建了新表作為 bigints ,但我們團(tuán)隊(duì)中沒(méi)有人意識(shí)到這是一個(gè)問(wèn)題,直到一個(gè)星期五(那是 13 號(hào)星期五!)我們無(wú)法將任何新行插入到大多是常用的書(shū)面表格。幸運(yùn)的是,每個(gè)人都還在辦公室喝酒,所以我們能夠很快對(duì)事件做出反應(yīng)。真是個(gè)銘心刻骨的故事!
這一事件促使我們投入更多精力進(jìn)行監(jiān)控,以便在出現(xiàn)問(wèn)題時(shí)能夠更快地做出響應(yīng)(這是一線希望)。這也讓我對(duì) PostgreSQL 中其他隱藏的陷阱產(chǎn)生了終生的偏執(zhí),我從未能夠完全擺脫這些陷阱(我不確定這是否是一線希望)。
最近,AWS 領(lǐng)域的主要項(xiàng)目大多與合規(guī)性相關(guān)。確保我們?cè)谄渌麌?guó)家/地區(qū)勾選 GDRP 和等效項(xiàng)的每個(gè)方框,從而獲得 SOC-2 認(rèn)證。對(duì)于所有這些事情,能夠指向亞馬遜標(biāo)志讓事情變得更容易一些,但并不是說(shuō)我們想做的任何事情都因?yàn)樵谔囟ǖ脑粕隙蔀榭赡芑虿豢赡堋?/p>
進(jìn)入 AWS 幾年后,我們開(kāi)始覺(jué)得它在基礎(chǔ)設(shè)施方面很穩(wěn)定。我們已經(jīng)有一段時(shí)間沒(méi)有構(gòu)建我們的堆棧了,我們也沒(méi)有看到很大的需要——兩項(xiàng)重大成就!我們面臨的下一個(gè)主要挑戰(zhàn)是制度知識(shí),或缺乏制度知識(shí)。在 Tanda 的歷史上,只有不到 10 人從事過(guò)“DevOps”(定義非常廣泛)。但是人來(lái)人往。目前有 2 人,1 人即將結(jié)束,因此團(tuán)隊(duì)中只有一名站點(diǎn)可靠性工程師的想法并不是很吸引人。
并不是說(shuō) SRE 完全獨(dú)立工作。一段時(shí)間以來(lái),我們也對(duì)工程師進(jìn)行了隨叫隨到的輪換,但我們不太擅長(zhǎng)培訓(xùn)人們處理 Rails 應(yīng)用程序之外的棘手部分。因此,隨叫隨到的人花了很多時(shí)間來(lái)確認(rèn)警報(bào)并對(duì)其進(jìn)行監(jiān)控,但只有在少數(shù)情況下,他們才能成功地解決問(wèn)題并解決問(wèn)題或顯著改進(jìn)系統(tǒng)。
基本上,這個(gè)系統(tǒng)是由個(gè)人才華的字符串和隨機(jī)爆發(fā)結(jié)合在一起的。這是一個(gè)糟糕的長(zhǎng)期戰(zhàn)略。我們需要一個(gè)合適的團(tuán)隊(duì)結(jié)構(gòu),這樣我們就永遠(yuǎn)不會(huì)依賴(lài)一個(gè)人來(lái)調(diào)試任何問(wèn)題。
4、第四階段:平臺(tái)基礎(chǔ)架構(gòu)團(tuán)隊(duì) (PIT)
為此,大約一年前,我們創(chuàng)建了一個(gè)平臺(tái)基礎(chǔ)架構(gòu)團(tuán)隊(duì),向 CTO 匯報(bào)。該團(tuán)隊(duì)在每個(gè)時(shí)區(qū)都有幾個(gè)人,因此我們有 24 小時(shí)的 Ops、基礎(chǔ)設(shè)施和相關(guān)工作。
這是一大亮點(diǎn)——我終于不再待命了!
這也是我第一次真正感受到我們擁有一支正在培養(yǎng)專(zhuān)業(yè)知識(shí)的團(tuán)隊(duì)。經(jīng)過(guò)十年的擔(dān)心,我們知道的不夠多,事情以令人尷尬的方式崩潰,并且平臺(tái)不斷變化,擁有一個(gè)穩(wěn)定和專(zhuān)業(yè)的路線圖感覺(jué)很棒。
PIT 做的第一件事就是結(jié)束一堆半成品的正在進(jìn)行的基礎(chǔ)設(shè)施項(xiàng)目,并盡可能多地削減未使用的基礎(chǔ)設(shè)施。在此期間和正確記錄 oncall 流程之間,他們很快擺脫了很多復(fù)雜性。這使團(tuán)隊(duì)中的每個(gè)人都立即變得更有效率,并賦予他們對(duì)系統(tǒng)的所有權(quán)。
平臺(tái)基礎(chǔ)架構(gòu)團(tuán)隊(duì)的官方帽子,戴在我們的首席技術(shù)官 Leon 的頭上。
這項(xiàng)工作仍在進(jìn)行中,因?yàn)樵趶?fù)雜領(lǐng)域積累專(zhuān)業(yè)知識(shí)需要很長(zhǎng)時(shí)間。但這是我有史以來(lái)第一次真正對(duì)團(tuán)隊(duì)充滿(mǎn)信心,并為他們?cè)谝荒曛兴〉玫某删透械阶院馈?/p>
順便說(shuō)一句,我們?nèi)栽?AWS 上,但這并不意味著我們不想再次更改平臺(tái)。探索外面的東西總是好的,我們花了一些時(shí)間來(lái)了解更多關(guān)于從云端遷移到托管數(shù)據(jù)中心的信息。只是,我們感覺(jué)現(xiàn)在還不需要這樣做。
5、如果我有時(shí)光機(jī)
如果我有一臺(tái)時(shí)光機(jī)回到 2012 年并給自己一些指示,我會(huì)說(shuō)什么?
很多小技巧和三個(gè)大技巧。兩者都?xì)w結(jié)為多花一點(diǎn)錢(qián),以避免很多麻煩。
盡可能長(zhǎng)時(shí)間地使用托管服務(wù)。我們?cè)趦H僅幾個(gè)月后就離開(kāi)了 Heroku,這對(duì)我們自己造成了很大的傷害。我們應(yīng)該堅(jiān)持使用它多年 - 管理服務(wù)器浪費(fèi)了太多時(shí)間,而這些時(shí)間本可以在關(guān)鍵的早期階段為我們完成。
盡快設(shè)置 PIT 。我應(yīng)該更早地組建一個(gè)想要在這個(gè)領(lǐng)域工作的專(zhuān)業(yè)團(tuán)隊(duì)。不是在 Heroku 時(shí)代,而是一旦我們達(dá)到真正的規(guī)模,它就變得站不住腳了。
多照顧一下自己。出于某種原因,我總是發(fā)現(xiàn)很難確定可以減少警報(bào)、簡(jiǎn)化 oncall 或幫助我獲得更多睡眠的項(xiàng)目的優(yōu)先級(jí)。直到突然有一天,我突然爆發(fā)并重新分配了大量預(yù)算來(lái)建立 PIT 團(tuán)隊(duì)。獲得體面的睡眠,有很多商業(yè)利益,將其優(yōu)先于團(tuán)隊(duì)可以處理的其他事情,這并不自私。
原文鏈接:
https://ghiculescu.substack.com/p/11-years-of-hosting-a-saas