blog review 第十七期
準備把blog閱讀和paper閱讀都歸一,而不是看一篇翻譯一篇,效率太低了
後面寫部落格按照 paper review,blog review,cppcon review之類的集合形式來寫,不一篇一片寫了。太水了
The Slotted Counter Pattern
資料庫記錄page view可能用一個counter,但是多個更新會卡,所以可以一個客戶端更新一個slot對應的counter,然後做彙總
這不就是threadlocalcounter的技巧麼。資料庫上也適用
Segmented LRU替換演算法
如果我們仔細對比了LRU和SLRU的程式碼,可以發現區別並不像之前我們說的這麼多。如果我們將保護段和試用段連到一起,你就會發現,SLRU和LRU唯一的區別就是當一個不在快取中的行進入快取時,LRU演算法將它放在了第0號位置,即Most Recently Used的位置,而SLRU演算法將它放在了不那麼高的一個位置,即保護段和試用段連線處的位置。這樣SLRU演算法就不會擔心某一些特定程式碼段(比如短時間塞入了大量無用快取行)會完全破壞快取的有效性了。
區別就這
TinyLFU: A Highly Efficient Cache Admission Policy
這人部落格不錯
這玩意就是多一個記錄統計,來判定誰更應該淘汰。由於時效性原因,還引入視窗機制。有點意思
mongodb陣列更新運算子($、$[]、$[ <identifier>
])
線上有個業務表,非常猥瑣的更新一個數組中某個檔案記錄的checksum,一層套一層
db.task.update({"request.taskid":"idxx","request.subtaskid":"sidxx", "files.backup.cosfiles.filepath":"/filexx"},{$set:{"files.backup.cosfiles.$.checksum":"checksumxx"}})
更改陣列中filexx的checksum為checksumxx
太噁心了
小紅書KV儲存架構:萬億級資料與跨雲多活不在話下
Proxy層由一個無狀態CorvusPlus程序組成。它相容老的Redis Client,擴縮容、升級對無Client和後端叢集無感,支援多執行緒、IO多路複用和埠複用特性。對比開源版本,CorvusPlus增強了自我防護和可觀測特性,實現了可線上配置的功能特性: Proxy限流 基於令牌桶的流控演算法支援了對連線數、頻寬和QPS多維度限流。在高QPS下,我們的Proxy限流防止了雪崩,如圖2;在大頻寬場景下,我們優化了時延 資料線上壓縮 Proxy層本身只做路由轉發,對CPU的消耗非常低。在大頻寬的場景下,我們可以充分利用Proxy的CPU資源優化頻寬和毛刺。在解析Redis協議時,使用LZ4演算法對寫入資料進行線上壓縮,讀取時線上解壓。在推薦快取的使用場景中網路頻寬和儲存空間壓縮40%以上(如圖4),總體時延並沒有明顯的下降。因為網路頻寬和寫入讀取資料的減少,時延毛刺也變小了 執行緒模型優化 proxy的收發包有類似negle模式的優化,沒有必要 backup-read優化長尾 大key檢測
文章還有很多其他的點。proxy的我覺得有意思,單獨說下
各種HashMap的效能對比
這個壓測從基數(key重複程度)的角度比較,很有意思
比Bloom Filter節省25%空間!Ribbon Filter在Lindorm中的應用
這玩意rocksdb釋出的,但是沒見別人用過。lindorm可能是第一個落地的?
diskexploer
scylladb用的硬碟測試工具
https://github.com/microsoft/wil/pull/244/files
這個pr 看到個檢測成員函式的猥瑣用法
template<typename T> struct is_winrt_vector_like { template<typename Q> struct is_vector<winrt::Windows::Foundation::Collections::IVector<Q>> : std::bool_constant<true> {}; private: template<typename Q> struct is_vector<winrt::Windows::Foundation::Collections::IVectorView<Q>> : std::bool_constant<true> {}; template <typename U, template<typename T> struct is_iterator : std::bool_constant<false> {}; typename = decltype(std::declval<U>().GetMany(std::declval<U>().Size(), template<typename Q> struct is_iterator<winrt::Windows::Foundation::Collections::IIterator<Q>> : std::bool_constant<true> {}; winrt::array_view<decltype(std::declval<U>().GetAt(0))>{}))> static constexpr bool get_value(int) { return true; } template <typename> static constexpr bool get_value(...) { return false; } public: static constexpr bool value = get_value<T>(0); };
https://github.com/leanstore/leanstore
https://www.cidrdb.org/cidr2021/papers/cidr2021_paper21.pdf
CockroachDB's Consistency Model
Strict-serializability, but at what cost, for what purpose?
嚴格一致性要求事務序列,實現也很複雜,業務很少用到,代價很大。spanner為啥會用到這個?因為schema變更需要保證?
spanner做法,True-Time,時間片
或者提供一箇中心時間服務,這個服務同步時間,各個節點都同步一下,多數派同意之類的(Calvin)
還有什麼業務需求需要這種級別的一致性?
A read-only transaction anomaly under snapshot isolation
Snapshot isolation SI保證事務看到的是當前db的一個快照版本
MemQ: An efficient, scalable cloud native PubSub system
It uses a decoupled storage and serving architecture similar to Apache Pulsar and Facebook Logdevice;
logdevice都沒了 https://github.com/facebookarchive/LogDevice,據說是整了個新的
格式
Improving Distributed Caching Performance and Efficiency at Pinterest
設定SCHEDULE_FIFO達到這個效果 ` sudo chrt — — fifo
另外還有TCP Fast Open配置
RocksDB原始碼 - Cuckoo Hashing
最近有個點子,把fasterkv那套東西挪到rocksdb上。就類似blobdb,寫的是index,追加的檔案是HLOG檔案。其實是很有搞頭的,又能保證穩定性。
看程式碼看到cuckoo hash table 突然發現可能rocksdb已經做過。蒐集了相關資料,發現做的比較粗糙,沒人用。所以我這個點子還是非常可行的。
這個cuckoo hashtable實現講真,感覺不是很靠譜啊
用blobdb,複用這個框架。可以吧無關的程式碼都去掉。已有的程式碼比較複雜
inuring介紹 https://kernel.dk/axboe-kr2022.pdf
Correctness Anomalies Under Serializable Isolation
System Guarantee | 髒讀 | 不可重複讀 | 幻讀 | Write Skew | Immortal write | Stale read | Causal reverse |
---|---|---|---|---|---|---|---|
RU | P | P | P | P | P | P | P |
RC | N | P | P | P | P | P | P |
RR | N | N | P | P | P | P | P |
SI | N | N | N | P | P | P | P |
SERIALIZABLE / ONE COPY SERIALIZABLE / STRONG SESSION SERIALIZABLE |
N | N | N | N | P | P | P |
STRONG WRITE SERIALIZABLE | N | N | N | N | N | P | N |
STRONG PARTITION SERIALIZABLE | N | N | N | N | N | N | P |
STRICT SERIALIZABLE | N | N | N | N | N | N | N |
How the SQLite Virtual Machine Works
還算通俗易懂
Socrates: The New SQL Server in the Cloud (Sigmod 2019)
四層臥槽
第一層就是cache 無狀態。掛了就掛了,預熱過程怎麼搞??擊穿豈不是很恐怖?直接從page server查。本身cache也可dump。來規避這種場景
第二層xlog,log複製。這個要保證資料不丟。這個是重點
第三層page server,xlog刷到page server, pageserver 非同步拷貝到cache裡。
要是頻繁改動這能受得了????Shared-disk,底層應該是分散式資料庫,有快速路徑訪問的。所以無狀態。應該有scheduler來規劃路徑吧。沒說 這種掛了就掛了。再拉起來就好了。沒啥影響。問題在於路徑分片管理,擴容分裂。沒說????
第四層是Azure Storage Service 硬碟。定時備份到這層。也偶爾從這個拉資料。也作為遠端冷存使用
xlog
整體架構
xlog處理資料,寫到Leading zone(LZ),寫三分,用的是 Azure Premium Storage service (XIO) LZ你可以理解成一堆小塊(說不定是PMEM)。LZ組成一個circle buffer,挨個寫
同時也同步給副本和page server。page server / 副本拉取資料。所以要有個LogBroker。pageserver可能數量非常多
挺複雜 互動很多。這裡有個講的比我好的 https://zhuanlan.zhihu.com/p/401929134
看下來,元件複用程度比較高。複雜。精煉但是複雜。上面那個哥們說singlestore(memsql)類似。我不太清楚
Hekaton: SQL Server’s Memory-Optimized OLTP Engine
不如看這個 https://fuzhe1989.github.io/2021/05/18/hekaton-sql-servers-memory-optimized-oltp-engine/
一種通過 skip cache 加速重複查詢的方法
AP能優化上
我在想,rocksdb的blobdb模式,為啥不加個hash index。加了是不是會快很多
看到這裡或許你有建議或者疑問或者指出我的錯誤,請留言評論或者郵件mailto:[email protected], 多謝! 你的評論非常重要!

- system design interview
- blog review 第十七期
- pelikan程式碼走讀
- sstdump出的資料和sstreader的資料不同 簡單定位
- blog review 第十六期
- blog review 第十五期
- 重在參與的資料庫調優競賽
- blog review 第十三期
- 一個奇怪的崩潰堆疊
- blog review 第十二期
- blog review 第十一期
- webdis簡單走讀
- blog review 第十期
- 資料庫壓縮到底怎麼做?
- HyperDex程式碼走讀
- tellstore fast scan
- blog review 第九期
- clickhouse 簡單走讀
- compaction到底怎麼做?
- 壓縮能不能更快?