GLB - GitHub Open Source Load Balancer

查看原文

本文是 GLB 开源的公告,在之前刚出 Introduction 的时候我也有做过介绍,这篇文章给出了更多实现细节上的介绍。它设计的目标是:做负载均衡,使用 ECMA 路由保持 L4 层的连接,使用 Rendezvous Hashing 将连接分配到 L7 层的服务。它跟 LVS 的区别在于,GLB Director 不存储所有的 flow states,而只存储部分(使用哈希分布),这样可以在节点移除时结束 flow。它扩展了 UDP 协议,自己封装了一套 packet。

read more

TLS 1.3 正式发布

查看原文

本文对 RFC 8446 (TLS 1.3) 做了概览。我们知道 HTTPS 中的 S 是 Secure Sockets Layer (SSL)。SSL 是个古老的词汇,现在其实大家都用 TLS 了。TLS 1.1 不安全,TLS 1.2 太慢,TLS 1.3 是未来(也是现在了)。TLS 是混合加密系统,使用非对称加密交换密钥,使用对称加密交换信息;前者慢,后者快。TLS 1.3 的主要目标是解决握手这块,也就是非对称加密交换密钥这块。以前的主流做法是 RSA, 缺点在于不是前向安全(可以被录制 …

read more

如何 Hack WebSockets

查看原文

本文作者使用 Burp 对 WebSockets 应用做渗透测试。第一招是利用 Socket.io 的 HTTP Fallback 机制,让所有 WebSockets 请求降级到 HTTP 来测试,具体做法是拦截 socket.io 的响应,替换一行代码搞定。第二个方法是在 HTTP Upgrade WebSockets 的时候把代表 session 的 sid 录下来。

read more

In Pursuit of Production Minimalism

查看原文

本文讲述了一个观点:生产环境应当尽可能简单,最小化。这可以认为是 KISS 原则的推论。作者列出了 Heroku 系统设计的一些实践:

  • Heroku 管理所有用户数据库元信息的那个数据库,最后也变成了一个 Heroku Postgres -- 也变成了被管理的那个数据库。 // 尽管我觉得加剧了全部死翘翘的风险?
  • 底层技术的革新,可以让我们丢掉整个上层产品,例如因为 SNI 的引入,可以直接丢掉 ssl:ip
  • 所有用 Scala 写的产品都废弃了,用尽可能少的语言写产品,系统更好维护,有更多人力可以维护。
  • 合并一些 microservices,简化运维。

总结起来,有以下这些基本点:

  • 废弃老技术
  • 标准化,标准到一种数据库,一种语言,一种人物队列,一种webserver,一种反向代理。如果做不到,做到尽可能少。
  • 系统中的啥东西都尽可能少。
  • 刚发布的东西再观察观察。用那种发布了很多年的稳定软件。
  • 能用别人写好的技术,尽可能不自己造车 …
read more

Cloudflare 优化 Nginx 性能

查看原文

本文是 Cloudflare 的博客,关于如何让 Nginx 接收更多流量。

  • Nginx 使用 event loops 解决 c10k 问题 (epoll_wait)
  • read(epoll_fd) 如果遇到 EWOULDBLOCK 意味着 local read buffer 已经读完,Nginx 就停止从 socket 中读数据直到来更多数据。
  • 由于 disk I/O 不同于 network I/O, 不存在等数据来这么一回事,直接 read(epoll_fd) 直到读完即可。
    • 如果场景是读取静态文件,完全可以去掉处理 network I/O 的逻辑。配上 SSD 硬盘 …
read more

Kata Containers Paper

查看原文

Kata Containers 是一种区别于 runC, rkt, lxc 的容器技术,它混合了容器和虚拟化。后三种在单个 kernel 分配的 namespace 中启动容器。而 kata-containers 则是先开 lightweight hypervisor,分拆出多个虚拟机,再在每个虚拟机中运行 kernel 和容器。

优点:VM 比其他虚拟机技术更加轻量。使用场景:multi-tenanted applications.

read more

使用工程的方法寻找哈希函数

查看原文

本文作者的任务是找到一个性能最好的 hash function。稍微学过 CS 的人都知道 hash function 接受参数,返回 int 哈希值。我们希望这个返回值尽可能不碰撞,变一点值就会造成大量的 output bits 位翻转。作者不同于学院派,使用的方法是遍历尽可能多的组合,给一个组合打分,找到最优解。这就是他给 uint32_t 参数做哈希找到的最优解

uint32_t
prospector32(uint32_t x)
{
    x ^= x >> 15;
    x *= UINT32_C(0x2c1b3c6d);
    x ^= x >> 12;
    x *= UINT32_C(0x297a2d39);
    x ^= x >> 15;
    return x;
}

他给 uint64_t 找到的解跟目前正在 SplitMix64 …

read more

Container best practices

查看原文

本文对容器技术的实践做了不少总结,给出了一些最佳实践。

  • multi stages: 删掉构建过程的文件
  • clean up: 删掉构建过程的文件
  • chaining method: 减少 image layer
  • cattle v/s pet containers: kill 后启动可以自动恢复健康的容器叫 cattle,否则是 pet。一般来说,数据库这种 container 算 pet containers。
  • 容器配置要注意的一些坑: /etc/localtime /etc/machine-id 可以 mount 进容器。
  • 容器内应用启动有三种方式:直接启动应用,使用脚本包一层,或者使用 systemd 启动程序。直接启动适合非服务类应用。脚本启动适合稍微复杂一点的程序。systemd 比较适合服务类应用,缺点是会让 image …
read more

Grafana Scripted Dashboards

查看原文

Grafana 支持让你自己写 JavaScript 来生成监控面板,它适用的场景是你的面板老有一些动态的变量,这时候默认提供的静态 Json 定义的面板可能就不够用了。能够提供用代码解决的方案基本上可以解决任何问题。这个小功能尽管 API 并没有封装到很强大,但是在解决一些很 tricky 的问题的时候就显得不可或缺。

衍生思考:在框架级别的开发,我们首选根据 schema 提供默认功能,但也推荐提供类似 函数/脚本 等形式的接口,让一些事情可以让用户自己去定制。

read more

Learn how to write a hash table in C

查看原文

这个 Git 仓库教你如何用 C 实现 Open-addressed, double-hashed Hash table。涉及的话题包括:基本数据结构,哈希函数,哈希碰撞处理,增删改查,自动扩容缩容。我觉得从完成度来说,不输给教授数据结构的教材。

衍生思考:前一阵子在午休的时候花一个钟头从头实现了 linkedlist, 从头实现标准数据结构带给人很强烈的满足感。相关的数据结构还有树,集合,图,推荐大家有空的时候去写一写,看看能否做到 bug-free。

read more

« Page 13 / 54 »