Think twice before using Helm
本文作者的一家之言是使用 Helm 之前需要三思,列举了几样 Helm 的缺点,想使用 Helm 的同学一定要想清楚怎么克服这些困难。
- 它貌似没带来什么价值。
- 需要额外在 k8s 的 auth/access control 外再加一层 tiller 的 auth/access control, 负担大。
- 模板工具其实可以用
k apply --dry-run
来做类似的事情 - Kubernetes Secrets 的管理没有变的更简单。
- Helm 无法做 Infrastructure 级别的组件管理,例如 kibe-dns, cni provider, cluster autoscaler.
- Helm state 存在 ConfigMap 里面,有 1MB 的限制 …
Microservice Architecture at Medium
本文介绍了 Medium 的 Microservices 架构。Medium 跟进的比较晚,在不伤害开发的生产力的前提下,他们总结出了几点策略:
- 新服务需要有价值,要么是产品上的,要么是工程上的。
- 服务之间不要共享存储。具体来说,可以抽象一个服务专门处理一类数据,或者 grpc/http pubsub, 或者用 ETL 管线同步数据。
- 区分 building a service & running a service。
- 服务需要很容易被观测
- 不是每个服务都需要从头撸
- 仔细处理服务失效
- 防止 microservice syndromes 粗线:用 微服务会引入更多问题。例如需要仔细建模,衡量引入的语言和技术栈,服务耦合,observability,倾向于开发新服务而不是修bug。
Medium 目前的技术栈是:一个大 Node 应用为主,一些小服务为辅 …
read moreWhat is the SSL Certificate Subject Alternative Name
SSL SAN 是一个 SSL 证书的扩展,允许在证书里面声明额外的域名。
一般的证书只能适配一个域名,例如 一个 enqueuezero.com 的证书是不可以用在 donate.enqueuezero.com 网站上的(Technically,你可以,但是浏览器会标记网站不安全,可能会被窃听)。
SAN 可以让你在给 enqueuezero.com 签发的证书里面再塞入一个 Subject Alternative Name,例如 *.enqueuezero.com。这样这个证书可以同时使用在 enqueuezero.com, donate.enqueuezero.com 上。
衍生思考:为什么要有这么个东西? 估计是最开始设计证书这一套的人没有想到大家会有这样的需求吧。。。
read moreGitHub October 21 事故分析
本文总结了为什么 GitHub 挂了一天多。
简单来说,有那么 43 秒的时间,东海岸的网络hub跟机房网络不通,导致 MySQL Raft Orchestrator 把 master 从东海岸切到了西海岸。就是一次脑裂,东西两边都有数据写进了数据库。工程师们决定保障数据一致性,所以就给服务降级,再慢慢迁移数据。
思考:
- 应急响应的博客服务怎么可以用自家服务呢,还是尽量用第三方服务/或者完全在别的地方托管比较好。
- 是否可以增加一份预算,当备份传输太慢的时候,直接让工程师带上硬盘,用几小时直飞到另外一个机房去作为 Plan B?
- 公有云的 blob 服务是否合适用于备份 TB 级别的数据?解压出来进新的 MysQL 服务器也需要很久时间。最能治本的方案可以在 Raft 集群外再做一个热备的 master,也即是文末提到的 multiple data centers in an active …
Dropbox Traffic Infrastructure Edge Network
本文介绍了 Dropbox 的 Edge 网络层的设计,涉及 GSLB,RUM DNS,L4 负载均衡,Nginx 配置,以及一些 gRPC 代理。
- Dropbox 的数据量级不小,注册用户数大约五亿: 这意味着网络流量和请求数量也非常大。
- Edge 是 Dropbox 构建的 points of presence (PoP)。如下图,Edge 可以在离用户更近的地方处理连接,然后再连到服务器处理,虽然增加了一个 RTT,但是响应时间减半。
- PoP 的地点选取很讲究,有人为选定,也有算法辅助。
- GSLB 是 Edge 负责负载均衡的算法。BGP anycast 是最简单的 BGP 负载均衡方法,但有时候性能不太好 …
SQLite Database Authorization and ACL
SQLite 数据库也可以使用简单的 ACL,方法是通过 sqlite 内建的 authorizer
. SQLite 连接对象可以设置 authorizer 控制 sql 的操作是否可以通过: https://www.sqlite.org/c3ref/set_authorizer.html
简单来说,这个 authorizer 方法可以接受几个设定的参数,你自己需要写哪些操作可以通过,哪些不可以。例如:
import sqlite3
db = sqlite3.connect('/tmp/auth-demo.db')
def authorizer(action, arg1, arg2, db_name, trigger_name):
if action == SQLITE_DELETE and arg1 == 'users':
return …