我們很高興地向大家宣布,D1 Alpha版用戶(包括任何Workers用戶)可以通過以下命令立即使用全新存儲(chǔ)后端創(chuàng)建新數(shù)據(jù)庫:
$wrangler d1 create your-database--experimental-backend
在接下來的幾周內(nèi),它將成為每個(gè)人的默認(rèn)體驗(yàn),但我們希望邀請(qǐng)開發(fā)人員立即開始嘗試新版本的D1。我們也將進(jìn)一步分享如何構(gòu)建D1新存儲(chǔ)子系統(tǒng)以及它如何從Cloudflare的分布式網(wǎng)絡(luò)中受益。
我們來快速回顧一下:什么是D1?
D1是Cloudflare的原生無服務(wù)器數(shù)據(jù)庫,在去年11月發(fā)布Alpha版。開發(fā)人員一直在使用Workers、KV、Durable Objects等構(gòu)建復(fù)雜的應(yīng)用程序,但是他們一致要求我們做一件事情:一個(gè)可以查詢的數(shù)據(jù)庫。
我們還收到一致的反饋:這個(gè)數(shù)據(jù)庫應(yīng)該基于SQL,自動(dòng)縮放,并且(和Workers本身一樣),采用全球(“Region:Earth”)復(fù)制方式。因此,我們接受了這些反饋并開始構(gòu)建D1,SQLite為我們提供了一種熟悉的SQL方言、強(qiáng)大的查詢引擎和經(jīng)過最充分實(shí)戰(zhàn)考驗(yàn)的代碼庫之一。
我們將D1的第一個(gè)版本以Alpha版進(jìn)行了發(fā)布:這是我們公開開發(fā)的一種方式,可以直接從開發(fā)人員那里收集反饋,并更好地優(yōu)先考慮重要的事情。名副其實(shí),這個(gè)alpha版存在bug和性能問題,而且“理想路徑”相當(dāng)狹窄。
盡管如此,我們已經(jīng)看到開發(fā)人員啟動(dòng)了數(shù)千個(gè)數(shù)據(jù)庫,進(jìn)行了數(shù)十億次查詢,流行的ORM(例如Drizzle和Kysely)增加對(duì)D1的支持,且Remix和Nuxt模板直接圍繞它構(gòu)建。
不斷完善
如果您已經(jīng)使用過Alpha版的D1:經(jīng)過完善的版本將進(jìn)一步刷新您對(duì)D1的已有認(rèn)知。D1現(xiàn)已顯著提速,我們剛將著名的Northwind Traders演示數(shù)據(jù)庫遷移到使用我們的全新存儲(chǔ)后端,速度提高了20倍:
我們的新架構(gòu)還提高了寫入性能:一個(gè)插入1000行(每行約200字節(jié)寬)的簡(jiǎn)單基準(zhǔn)測(cè)試比先前版本的D1快大約6.8倍。
更大的批次(每批1萬行,每行約200字節(jié)寬)看到更大的改進(jìn):達(dá)到10-11倍,而且新存儲(chǔ)后端的延遲也明顯更加一致。我們還沒有開始優(yōu)化總體寫吞吐量,因此D1只會(huì)變得更快。
通過我們的新存儲(chǔ)后端,我們不斷將其性能與其他無服務(wù)器數(shù)據(jù)庫進(jìn)行基準(zhǔn)測(cè)試。對(duì)一個(gè)50萬行的鍵值對(duì)表進(jìn)行查詢(認(rèn)識(shí)到基準(zhǔn)測(cè)試本質(zhì)上是合成的),D1的性能比流行的無服務(wù)器數(shù)據(jù)庫Postgres快大約3.2倍:
我們運(yùn)行了多次Postgres查詢來預(yù)熱頁面緩存,然后采用服務(wù)器測(cè)量的中位數(shù)查詢時(shí)間。后續(xù)開發(fā)中,我們將繼續(xù)提高性能優(yōu)勢(shì)。
已有數(shù)據(jù)庫的開發(fā)人員可以按照文檔中的步驟將數(shù)據(jù)導(dǎo)入到由該存儲(chǔ)引擎支持的新數(shù)據(jù)庫中,方法是先將數(shù)據(jù)庫導(dǎo)出,然后將其導(dǎo)入。
逐步優(yōu)化D1的開發(fā)人員體驗(yàn)
我們還一直在努力改進(jìn)D1的開發(fā)人員體驗(yàn):
新增控制臺(tái)界面,可直接從儀表板發(fā)出查詢,更易開始使用和/或發(fā)出一次性查詢。
正式支持JSON函數(shù),通過JSON在數(shù)據(jù)庫中直接查詢。
Location Hints,允許影響leader(負(fù)責(zé)寫入)在全球范圍內(nèi)的位置。
盡管D1是專為在Cloudflare Workers內(nèi)原生運(yùn)行而設(shè)計(jì)的,但我們意識(shí)到,在進(jìn)行原型設(shè)計(jì)或僅探索一個(gè)數(shù)據(jù)庫時(shí),通常需要快速通過CLI或Web編輯器發(fā)出一次性查詢。除了支持在wrangler內(nèi)支持執(zhí)行查詢(和文件)外,我們還引入了控制臺(tái)編輯器,用于發(fā)出查詢、檢查表格,甚至可以實(shí)時(shí)編輯數(shù)據(jù):
JSON函數(shù)讓您可以查詢D1數(shù)據(jù)庫TEXT列存儲(chǔ)的JSON:這使您可以靈活地確定哪些數(shù)據(jù)與您的關(guān)系數(shù)據(jù)庫模式嚴(yán)格相關(guān),哪些不相關(guān),同時(shí)仍然能夠通過SQL查詢所有數(shù)據(jù)(在數(shù)據(jù)到達(dá)您的應(yīng)用程序之前)。
例如,假設(shè)您將最后登錄時(shí)間戳以JSON數(shù)組格式存儲(chǔ)在login_history TEXT列:我可以通過提供到其鍵的路徑直接查詢(和提取)子對(duì)象或數(shù)組項(xiàng):
SELECT user_id,json_extract(login_history,'$.【0】')as latest_login FROM users
D1對(duì)JSON函數(shù)的支持非常靈活,并利用了構(gòu)建D1的SQLite核心。
當(dāng)您首次使用D1創(chuàng)建數(shù)據(jù)庫時(shí),我們會(huì)根據(jù)您當(dāng)前連接的位置自動(dòng)推斷位置。然而,某些情況下,您可能希望影響數(shù)據(jù)庫的位置——也許您正在旅行,或者您的分布式團(tuán)隊(duì)不同于您預(yù)期大多數(shù)寫入來自的地區(qū)。
D1對(duì)Location Hints的支持
#Automatically inferred based your location
$wrangler d1 create user-prod-db--experimental-backend
#Indicate a preferred location to create your database
$wrangler d1 create eu-users-db--location=weur--experimental-backend
Location Hints也可通過Cloudflare儀表板使用:
我們還發(fā)布了更多文檔,不僅能幫助開發(fā)人員入門,還能利用D1的高級(jí)特性。未來幾個(gè)月內(nèi),預(yù)計(jì)D1的文檔將繼續(xù)大幅增加。
合理的定價(jià)策略
自從宣布alpha版以來,已經(jīng)有許多開發(fā)人員問到D1價(jià)格的問題,現(xiàn)在我們準(zhǔn)備介紹一下定價(jià)。我們知道,在開始使用某個(gè)產(chǎn)品進(jìn)行構(gòu)建之前了解其定價(jià)很重要,這樣您就不會(huì)在6個(gè)月后感到吃驚了。
簡(jiǎn)而言之:
我們準(zhǔn)備宣布定價(jià),以便您可以提前預(yù)估D1將為您的用例帶來多少成本。最終定價(jià)可能會(huì)有所變化,但我們預(yù)計(jì)變化幅度會(huì)比較小。
我們將在今年晚些時(shí)候才開始計(jì)費(fèi),而且我們將提前通過電子郵件通知現(xiàn)有客戶。在那之前,D1將依然免費(fèi)使用。
D1將包括一個(gè)永遠(yuǎn)免費(fèi)的級(jí)別,包括作為5美元/月Workers訂閱的一部分使用,并根據(jù)讀、寫和存儲(chǔ)量收費(fèi)。
如果您已經(jīng)訂閱了Workers,那么您不會(huì)受到任何影響:在我們未來啟用計(jì)費(fèi)時(shí),您的現(xiàn)有訂閱將包括D1使用。
總結(jié)如下:
重要的是,當(dāng)我們啟用全球讀取復(fù)制時(shí),您將不需要支付額外費(fèi)用,復(fù)制也不會(huì)使您的存儲(chǔ)消耗倍增。我們認(rèn)為內(nèi)置、自動(dòng)的復(fù)制很重要,開發(fā)人員不應(yīng)該支付倍乘費(fèi)用(副本x存儲(chǔ)費(fèi)),以使其數(shù)據(jù)庫在每一個(gè)地方都能快速運(yùn)行。
除此之外,我們希望確保D1具有無服務(wù)器產(chǎn)品定價(jià)的優(yōu)點(diǎn)——可以根據(jù)需求進(jìn)行自動(dòng)縮放和按使用量付費(fèi),這樣您就不需要嘗試確定工作負(fù)載所需的CPU和/或內(nèi)存數(shù)量,也不需要編寫腳本在負(fù)載較低的時(shí)間段縮小基礎(chǔ)架構(gòu)規(guī)模。
D1的讀取定價(jià)基于“讀取單位”(每4KB讀取)和“寫入單位”(每1KB寫入)的熟悉概念。查詢(掃描)大約10000行,每行64個(gè)字節(jié),將消耗160個(gè)讀取單位。在“blog_posts”表中寫入一個(gè)大的3KB行,其中包含大量Markdown,這將消耗3個(gè)寫入單位。如果您為最常用的查詢創(chuàng)建索引以提高性能并減少這些查詢需要掃描的數(shù)據(jù)量,您還可以進(jìn)一步減少計(jì)費(fèi)。我們認(rèn)為通過默認(rèn)使快速路徑更具成本效益是正確的方法。
在此需要強(qiáng)調(diào)的是:在開始收費(fèi)前,我們將繼續(xù)接受有關(guān)定價(jià)的反饋。
Time Travel
我們還引入了新的備份功能:時(shí)間點(diǎn)恢復(fù),并將其稱為“Time Travel(時(shí)間旅行)”,因?yàn)檫@就是它給人的感覺。Time Travel允許您將D1數(shù)據(jù)庫恢復(fù)到過去30天內(nèi)的任何一分鐘,并且將內(nèi)置于使用我們新存儲(chǔ)系統(tǒng)的D1數(shù)據(jù)庫中。我們預(yù)計(jì)在不久的將來為新的D1數(shù)據(jù)庫開啟Time Travel功能。
使Time Travel真正強(qiáng)大的地方在于,您不再需要驚慌地想“噢,等等,我在做這個(gè)重大更改之前是否備份了數(shù)據(jù)庫?”——因?yàn)槲覀円呀?jīng)為您做了這件事。我們保留了對(duì)您的數(shù)據(jù)庫所有更改的流(Write-Ahead Log),允許您通過按順序重放這些更改,從而將您的數(shù)據(jù)庫恢復(fù)到某個(gè)時(shí)間點(diǎn)。
這里是一個(gè)示例(API可能會(huì)有一些小的變化):
#Using a precise Unix timestamp(in UTC):
$wrangler d1 time-travel my-database--before-timestamp=1683570504
#Alternatively,restore prior to a specific transaction ID:
$wrangler d1 time-travel my-database--before-tx-id=01H0FM2XHKACETEFQK2P5T6BWD
盡管時(shí)間點(diǎn)恢復(fù)并非新的想法,但它通常是一個(gè)付費(fèi)的附加功能,甚至根本不提供。在進(jìn)行了刪除或犯了錯(cuò)誤之后才意識(shí)到應(yīng)該打開它,通常為時(shí)已晚。
例如,想象一下我犯了這個(gè)經(jīng)典錯(cuò)誤:在一條UPDATE語句中忘記了WHERE:
--Don't do this at home
UPDATE users SET email='matt example.com'--missing:WHERE id="abc123"
如果沒有Time Travel,我只能祈禱最近運(yùn)行了計(jì)劃備份,或者記得在之前進(jìn)行了手動(dòng)備份。有了Time Travel,我可以將數(shù)據(jù)庫恢復(fù)到在犯錯(cuò)誤前一分鐘左右的某個(gè)時(shí)間點(diǎn)(并希望下次能吸取教訓(xùn))。
我們還在探索一些功能,以顯示數(shù)據(jù)庫狀態(tài)的更大變化,包括使識(shí)別模式更改、表數(shù)、存儲(chǔ)數(shù)據(jù)的重大變化,甚至特定查詢(通過事務(wù)ID),以幫助您更好地了解恢復(fù)數(shù)據(jù)庫的確切時(shí)間點(diǎn)。
路線圖
那么D1的下一步?
·開放beta:我們正在確保,在將新的存儲(chǔ)子系統(tǒng)作為所有“d1 create”命令的默認(rèn)設(shè)置之前,在負(fù)載(和實(shí)際使用)下觀察它的表現(xiàn)。即使是“beta”,我們對(duì)耐久性和可用性也有很高的要求,并且我們還意識(shí)到備份功能(Time Travel)對(duì)于人們信任一個(gè)新數(shù)據(jù)庫是很重要的。接下來的幾周內(nèi),歡迎關(guān)注Cloudflare博客以獲取更多相關(guān)消息!
·更大的數(shù)據(jù)庫:這是很多人的重要需求,我們已經(jīng)非常接近實(shí)現(xiàn)了。使用Workers Paid計(jì)劃的開發(fā)人員將在不久的將來獲得1 GB數(shù)據(jù)庫的使用權(quán)限,我們也將繼續(xù)提升每個(gè)數(shù)據(jù)庫的最大容量。
·運(yùn)行參數(shù)及數(shù)據(jù)可視性:您將能夠通過D1儀表板和我們的GraphQL API檢查每個(gè)數(shù)據(jù)庫的總體查詢量、失敗查詢、消耗的存儲(chǔ)空間以及讀/寫單位數(shù),從而可以更高效便捷地調(diào)試問題和跟蹤支出。
·自動(dòng)讀取復(fù)制:我們的新存儲(chǔ)子系統(tǒng)在構(gòu)建時(shí)就考慮到了復(fù)制,并且我們正在努力確保復(fù)制層足夠快速和可靠,然后才提供給開發(fā)人員使用。讀取復(fù)制不僅旨在通過在接近用戶的多個(gè)地點(diǎn)存儲(chǔ)副本來改善查詢延遲,還將允許我們橫向擴(kuò)展具有更大工作負(fù)載的D1數(shù)據(jù)庫。
與此同時(shí),您可以立即開始使用D1構(gòu)建原型和進(jìn)行試驗(yàn),探索我們的D1+Drizzle+Remix示例項(xiàng)目,或加入Cloudflare Developers Discord服務(wù)器上的#d1頻道,與D1團(tuán)隊(duì)和其他正在利用D1構(gòu)建的人進(jìn)行直接交流。