看tag知内容

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 {
private:
    template <typename U,
        typename = decltype(std::declval<U>().GetMany(std::declval<U>().Size(),
            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 memcached`

另外还有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。加了是不是会快很多