blog review 第十七期

語言: CN / TW / HK

準備把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 memcached`

另外還有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], 多謝! 你的評論非常重要!

覺得寫的不錯可以點開掃碼贊助幾毛