
Let's Encrypt 證書簽發(fā)限速機制的技術優(yōu)化與演進
Let's Encrypt 為 5.5 億個網站提供?TLS 證書,每小時要簽發(fā) 34 萬個證書,為避免濫用簽發(fā)證書,使用了限速功能(rate limiting)。
最近 Let's Encrypt 官方分享了相關的技術演化,非常值得學習,需要說明的是 Let's Encrypt 并沒有幾個專職的開發(fā)工程師,所以整優(yōu)化時間也非常長。
1:2015 年,Let's Encrypt 開始提供免費證書,最初基于域名進行限速,key = label + eTLD 頂級域,比如?http://new.blog.example.co.uk?申請證書,那么 key 就是?http://example.co.uk。
為了實現(xiàn)限速功能,Let's Encrypt 在?MariaDB?授權表中(authorizations table)中存儲證書簽發(fā)信息(包括域名、日期等關鍵字段),限速的時候在特定時間窗口掃描符合條件的行數。
2:2019年,證書簽發(fā)越來越多,Let's Encrypt新增了 6 個限速標準,本意是為了減少證書的請求,減少對系統(tǒng)的保護,但由于對授權表的大量掃描,負載反而標高了。
這種技術方案很快就遇到瓶頸了,是使用現(xiàn)有的方式優(yōu)化索引,還是設計專用的表?需要在性能、復雜性和長期可維護性之間取得平衡。
3:2021年底的時候,MariaDB 使用主從的架構,限速功能的讀取就路由到了從庫,雖然減低了主庫的負載,但高峰時間會出現(xiàn)主從的延遲,導致限速功能會受到影響。
4:最初限速功能設計的比較粗暴,一旦用于觸發(fā)了速率限制,就會好幾天無法申請證書,就算擴大限制串口時間,這一問題還是會存在,這種解決方案非常不靈活而且具有破壞性。
2022年 Let's Encrypt 開始使用令牌桶(token-bucket)的解決方案,就是動態(tài)調整頒發(fā)證書的頻率,而且一旦受限,API會返回 Retry-After 信息,告訴用戶多久再去簽發(fā)證書。
5:2023年,限速帶來的負載會極大影響 MariaDB 可靠性了,授權表比其他表的讀取多出一個數量級,Let's Encrypt 評估了多種技術方案,但大多行不通。
比如雖然授權表的舊記錄可以刪除,但 MariaDB 刪除性能很差,而且刪除數據的時候,InnoDB 存儲引擎需要維護索引、外鍵、事務日志,導致刪除操作開銷非常大,特別在高并發(fā)環(huán)境下刪除更慢了。
Let's Encrypt 在非授權表中通過?PARTITION?命令來清除分區(qū)表舊數據,但對于授權表卻行不通,因為它使用了?ON DUPLICATE KEY UPDATE?機制,而分區(qū)表要求要求主鍵必須包含在分區(qū)鍵中,兩者不兼容。
另外授權表的索引非常大,甚至比數據表本身還大,內存占用非常大,導致數據庫壓力太大,不得不經常刪除舊數據。
2023 年底,Let's Encrypt 決定徹底重構限速系統(tǒng)!
6:Redis?替換 MariaDB
為什么選擇 Redis 呢,結合限速系統(tǒng),它有幾個優(yōu)勢,首先?Redis 支持高并發(fā)、高吞吐、低延遲。
其次限速存儲的數據是暫時的,過一段時間就可以刪除,而 Reids 的 TTL 機制可以主動清除舊數據,從而 Reids 存儲的數據比數據庫少了非常多。
最后?Redis 支持原子性,也不會產生數據競爭,通過?SETNX?命令可以原子且不會重復寫入,再加上 Pipeline 功能,可以一次性讀取和更新多個鍵,可以說限速功能特別適合使用 Redis,簡單、靈活、高效!
7:GCRA
有了 Redis,Let's Encrypt 最后采用GCRA(Generic Cell Rate Algorithm)算法進行限速,它最早用于電信網絡流量控制。
上述提到的令牌桶算法相對來說有幾個缺點,第一它的滑動窗口是固定的,如果某個桶的token沒有消耗完,則后續(xù)也無法使用,顯得不太公平,其次在具體實現(xiàn)上不是特別高效和優(yōu)雅,比如需要考慮桶更新的并發(fā)問題,存儲和計算效率并不高。
而 GCRA 可以優(yōu)雅解決這兩個問題,僅需維護最近請求的 TAT 時間點,并用突發(fā)容忍度(burst tolerance)控制并發(fā),當請求時間 >= TAT,則允許請求,且 TAT 更新為當前時間;如果請求時間 + 突發(fā)容忍度 >=TAT,則也允許請求,TAT 更新為當前時間, 突發(fā)容忍度減一。
好處是什么呢?能夠平滑的控制簽發(fā)證書的時間,而突發(fā)容忍度是為了避免并發(fā)帶來的問題,最后只需要維護一個 TAT ,存儲和計算效率更高。
8:效果
最后效果肯定非常好,比如數據庫的延遲大大減少了,而且即使流量很大的情況,整體負載也很平穩(wěn),下圖就是各個表改造前后的延遲情況對比,值越小越好。
再比如數據庫操作也更加監(jiān)控了,下圖可以看出數據庫操作非常平穩(wěn)。
8:思考
最后說說給我的幾個啟示,很多技術解決方案并不是一蹴而就的,首先不能因為改造影響現(xiàn)有業(yè)務,其次也不能立刻就去改造,必須思考成熟,考慮效率、可維護性、可擴展性,最終就是一個平衡。
具體技術上,Let's Encrypt 選擇了一個很好的存儲和計算系統(tǒng),再加上優(yōu)雅的算法,最終讓核心業(yè)務能夠平穩(wěn)支撐!
[超站]友情鏈接:
四季很好,只要有你,文娛排行榜:https://www.yaopaiming.com/
關注數據與安全,洞悉企業(yè)級服務市場:https://www.ijiandao.com/

隨時掌握互聯(lián)網精彩
- 1 看總書記關心的清潔能源這樣發(fā)電 7904797
- 2 央視曝光直播間“高端四件套”貓膩 7808694
- 3 以總理:絕不會有巴勒斯坦國 等著瞧 7711998
- 4 長春航空展這些“首次”不要錯過 7619343
- 5 租客長租15年不到1年就被勸退 7521975
- 6 浙江大學教授被留置 持股市值31億 7427456
- 7 9月23日晚8點將上演“龍收尾”天象 7330158
- 8 馬斯克特朗普鬧掰后首次同框 7234312
- 9 風王“樺加沙”體型超整個廣東省 7143767
- 10 美國軍工巨頭主動曝光戰(zhàn)機 7048864