以上,看起来不可能出现竞争条件了,但实际上这个实现依然是有问题的。DDIA 的作者在跟 antirez 有关 redlock 的争论中,举了这么一种情况:A获得了锁,在租期内发生了 GC stop the world,然后时间超过了租期,但是 A 并不知道。这时候 B 获得了锁去更新了资源,然后 A 过了暂停之后也去更新了资源。
使用 CircleCI 官方 MySQL 这个 image 需要设置验证方式,不然的话会遇到以下这个错误:
1
EMySQLdb._exceptions.OperationalError:(2059,"Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory")
所有的 timestamp 都是 server local timestamp:获得了 slot 更新的消息,将 slot 的更新时间设定为当前 local timestamp;进程更新 key 了,进程将 key 的更新时间设定为 local timestamp。实际上,timestamp 已经当成一个相对于本地 server 的偏移量来用了,无论是不同进程之间的时间如何偏移不准,都没有影响;
必须先更新 Redis,Redis 更新完成之后再发布更新消息(再次强调,Redis 作为 Source of the Truth);
从上面我们可以看到,创建一个 Hard Link 之后,实际上就有两个 filename 指向了同一个 inode。即新创建的 Hard Link 和原来的在本质上没有什么区别,也分不出来谁是 Hard Link 谁是原来的文件。删除文件这个操作其实是 unlink,就是删除了一个 filename -> inode 的 mapping 而已,当一个 inode 的 Link Counts 为0,inode 才会被删除。
有没有感觉像 GC 中的引用计数?那么新的问题就来了:怎么解决循环引用的问题呢?比如像下面这个情况,子文件夹里面建立了一个指向父文件夹的 Hard Link.
可能的循环指向问题
这样在整个父文件夹删除的时候,这些 Hard Link 指向的 inode 的 Link Counts 依然不会下降,导致释放就有问题。文件系统是怎么解决的呢?禁止对文件夹建立 Hard Link,只允许对文件建立 Hard Link.
另外,你有没有想过为什么我们可以使用 cd .. 跳转到父文件夹呢?其实就是在文件夹创建的时候,会自动创建一个叫做 .. 的 mapping,指向父文件夹的 inode。即一个新文件夹创建之后,它的 Link Count 就是2了,一个是 .,一个是 .. 。
相对而言,Symbolic Link 更常用一些,因为 Hard Link 的管理成本太高了。你删文件的时候,得把所有的 Hard Link 都删掉才行。
Symbolic Link 可以理解成一个特殊的文件,文件的内容指向的是真正的文件。这样一来,如果删除了源文件,Symblic Link 还是存在的(用过 Windows 的朋友可以理解成 Windows 的快捷方式)。
在Web平台上点点点,是比较难自动化和复用的,但是如果是 Code 就不一样了。你可以用你最喜欢的Vim编辑器快速处理大量的配置文本,也可以用脚本批处理,可定制化很高。但是这依赖于 Infra as Code,监控代码化,configuration-as-code、database-as-code、infrastructure-as-code 等。
Problem: “I can manage all my K8s config in git, except Secrets.”
Solution: Encrypt your Secret into a SealedSecret, which is safe to store – even to a public repository. The SealedSecret can be decrypted only by the controller running in the target cluster and nobody else (not even the original author) is able to obtain the original Secret from the SealedSecret.
— sealed-secrets
推荐的几种形式有:
用类似 sealed-secrests 的 Operator,已加密形式将 Secrets 存到仓库,Secrets 到达集群的时候进行解密。(同类产品还有 Mozilla 的 SOPS)