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用的硬盤測試工具
http://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); };
http://github.com/leanstore/leanstore
http://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都沒了 http://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介紹 http://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可能數量非常多
挺複雜 交互很多。這裏有個講的比我好的 http://zhuanlan.zhihu.com/p/401929134
看下來,組件複用程度比較高。複雜。精煉但是複雜。上面那個哥們説singlestore(memsql)類似。我不太清楚
Hekaton: SQL Server’s Memory-Optimized OLTP Engine
不如看這個 http://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到底怎麼做?
- 壓縮能不能更快?