11 12
通过sed命令对kv方式的配置文件进行修改

sed是unix下的面向字符流的编辑器,即stream editor, 它是面向行的,以行为单位进行处理,同时,sed是非交互式的,一旦执行便要处理完整个文件。

日常后台服务配置文件多以key-value的方式存在,例如ini文件、toml文件或一些自定义配置文件,当我们某些情况下需要编写自动化脚本对配置文件进行更改的时候,我们可以通过shell的sed命令进行正则匹配快速修改,十分简单快捷,减少很多“高级语言”编写的繁琐,下面主要列出两种比较常见的配置变更情况和命令参考例子:

11 9
C语言的位操作常见例子

我们每一种计算机语言最终都会通过编译器转换成机器语言来执行,所以在编程中,位操作是常见且高效的数据处理手段之一,下面列出一些基于C语言的场景实例,便于日常开发中学习和使用

例一,编写函数 getbits(x,p,n) 从数值x的第p位开始返回n位数值

#include <stdio.h>

int getbits(unsigned x, int p, int n);

int main() {
  unsigned x = 0xF994;
  int p = 4;
  int n = 3;
  int z = getbits(x, p, n);

  printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z);
}

// ff94             11111111100.101.00  # original number
// >> p+1-n     [2] 0011111111100.101.  # shift desired bits to right
// & ~(~0 << n) [7] 0000000000000.101.  # clear all the other (left) bits

int getbits(unsigned x, int p, int n) { return x >> (p - n + 1) & ~(~0 << n); }
11 4
tail的c语言简单实现

下面的实现是来自K&R-C的习题实现:

编写程序tail,将输入中的n行打印出来。默认情况下,n的值为10,但可通过一个可选参数改变n的值,因此命令 tail -n 将打印其输入的最后n行。无论输入或n的值是否合理,该程序都应该能正常运行,编写的程序要充分利用存储空间

下面的例子只简单实现一次输入输出,并不实现系统 tail -f 一样的监控文件的实时输出

tail.c

10 14
Postgresql备份与数据恢复

之前,我们在 《Postgresql主从异步流复制方案》 一节中,部署了Postgresql的主从异步流复制环境。主从复制的目的是为了实现数据的备份,实现数据的高可用性和容错行。下面主要简单地介绍下我们运维Postgresql数据库时的场景备份与恢复方案。

增量备份

PostgreSQL在做写入操作时,对数据文件做的任何修改信息,首先会写入WAL日志(预写日志),然后才会对数据文件做物理修改。当数据库服务器掉重启时,PostgreSQL在启动时会首先读取WAL日志,对数据文件进行恢复。因此,从理论上讲,如果我们有一个数据库的基础备份(也称为全备),再配合WAL日志,是可以将数据库恢复到任意时间点的。

上面的知识点很重要,因为我们场景的增量备份说白了就是通过基础备份 + 增量WAL日志 进行重做恢复的。

后一页