缓存系统中面临的雪崩/穿透/一致性问题

There are only two hard things in Computer Science: cache invalidation and naming things.
计算机科学中有两件难事:缓存失效和命名
– Phil Karlton

From Martin Fowler : TwoHardThings

缓存系统一定程度上极大提升系统并发能力,但同样也增加额外技术考虑因素,下面针对缓存系统设计与使用中面临的常见问题展开。

  • 缓存应用的典型场景
  • 缓存雪崩
  • 缓存穿透
  • 缓存更新与数据一致性

不同网络拓扑下如何正确获取客户端ip?

先说结论:

  • 说明:一切抛开网络拓扑提准确获取用户ip的通用方案都是耍流氓。
  • 根据网络拓扑当服务器架构中的设备IP加入可信IP列表,成本:持续维护可信IP区、与拓扑相关、增加防火墙WAF调整可信IP
  • 剔除可信IP列表
  • 从XFF头部倒序获取首个非可信IP作为客户端真实IP,防伪造XFF、防代理、保正常请求
  • Laravel/Nginx-realip均按上述逻辑来处理的

网络拓扑模型


MySQL InnoDB在线调整表结构(online DDL)-新增字段篇

线上服务的表结构调整是业务需求扩展和系统设计拓宽的常见方式,但对线上服务而言,线上库表调整可能对线上服务产生影响。
本文以MySQL 5.6.16-log为例,结合InnoDB引擎特性,给出综合分析,几个核心问题:

  1. 线上库修改表结构操作是否会导致锁表、锁行?
  2. 线上改表结构可用的方案有哪些?各自成本和适用场景?
  3. 5.6+ InnoDB引擎的online DDL特性性能表现如何?

Linux内存之Slab

Linux内存管理模式,页式管理适合于大块内存的情形,而对于内核对象级别的较小内存情形下,不足以占用1个页。

在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。这么这些对象如果每次构建的时候就向内存要一个页,而其实际大小可能只有几个字节,这样就非常浪费,为了解决这个问题就引入了一种新的机制来处理在同一页框中如何分配小存储器区。这就是我们要讨论的slab层。在讲述slab前,我想先铺垫一下有关内存页的概念,我们都知道在linux中内存都是以页为单位来进行管理的(通常为4KB),当内核需要内存就调用如:kmem_getpages这样的接口(底层调用__alloc_pages())。那么内核是如何管理页的分配的,这里linux使用了伙伴算法。slab也是向内核申请一个个页,然后再对这些页框做管理来达到分配小存储区的目的的。