ETCD 的运维
本文是 Kubernetes 关于如何运维 etcd 的文档。
- 生产环境建议使用五个节点,需要启动 etcd, 可以在外面套一层 load balancer
- 由于访问 etcd 数据相当于得到了 k8s 集群的所有核心数据,所以通讯层需要做 tls 加密:使用
peer.key
/peer.cert
在节点成员通讯时加密,使用client.key
/client.cert
在与客户端通讯时加密。- 可以通过
--trusted-ca-file
/--client-cert-auth=true
限制只有 k8s api server 允许访问 etcd 数据。
- 可以通过
- 节点失效可以通过
etcdctl member remove
/etcdctl add memberN …
TimescaleDB vs InfluxDB
本文比较了 TimescaleDB 和 InfluxDB 这两款 TSDB,结论是各有千秋。利益相关方:TimescaleDB 的人写的。
- TimescaleDB 基于 Postgres 做扩展,天生自带了这些好处:成熟的运维工具,完整的 SQL 语法和 ORM 库支持。
- InfluxDB 从头撸起,需要自己做运维工具,搞了一套类 SQL - InfluxQL, 以及下一代 Flux,但都需要一些学习曲线。
- InfluxDB 相应的好处:高度优化的数据存储模型,更高效的简单时间序列数据查询和插入效率。
简单结论:如果对存储有高要求,用 InfluxDB;如果对运维和客户端使用有高要求,用 TimescaleDB。
read moreA Basic Just-In-Time Compiler
本文介绍如何写一个最基本的 JIT 编译器。
- 第一个挑战是内存分配。在进程内存模型,只有页中有设置 execution bit, 页中的代码才能执行。为了运行时安全,我们要把 write bit 关掉,execution bit 打开,否则攻击者可以发动攻击,篡改代码。
- 第二个挑战是指令缓存。Malloc 返回的内存只能读写不能运行,所以我们只能用 mmap。获得内存后,使用 mprotect 将内存数据设为
PROT_READ | PROT_EXEC
. 销掉内存这用 munmap. - 第三个挑战是调用编译好的代码。基本思路是使用
rdi, rax, and rdx
这三个寄存器,设置它们三个的指令序列就能调函数了。记得在设置完rax
后再编译个ret
返回寄存器里的值。
GraphML - 一种画图结构的 XML 扩展
本文是 GraphML 的 Getting Started 文档,其手册可以在 Specification 页查看。这个工具可以让我们使用 XML 定义 Graph, Node, Edge。如果说要跟 SVG 这样的通用画图格式相比,GraphML 的优势应该是它更高一级的抽象。
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
http …
Python 代码打包 Overview
本文是 PyPA 打包系列的 Overview 文章,讲述了打包代码的很多知识。
- 打包是给部署用的,所以其实要先搞懂你打算如何部署。
- 打包单个 module 比较少见,但也有这样的需求, 参考 bottle.py 这类库。
- 更多见的需求可能会是 把 module 装进 package, 然后使用 sdist 分发(其实就是 .tar.gz)。后者比较适合纯 Python 代码的发布。
- 也有一些库有 C 的以来,那就要推荐发二进制包, 发布的时候给出 wheel 包给预编译好的平台,sdist 包给那些没预编译的平台。
- 有些平台例如 Heroku,GAE 等等有自己的打包流程。
- 桌面端或者手机端发布目前不是 Python 的强项,但也有 Kivy, Beeware …