InfluxDB 如何做 Clustering,当然,只是曾经这样做

查看原文

InfluxDB 在 1.4 以后 Clustering 变为商业版才能用,但我们可以在之前的版本中看到它原本的设计意图:使用 3 个节点加入 raft cluster 成为 raft peers 选举领导,剩下的节点只做为数据节点不参与领导选举。

  • 在理解了这样的设计之后,要想启动 Clustering,就需要按顺序启动前三个节点。前三个节点在三台主机上运行,各自有不同的 conf,最重要的配置是设置 bind 的地址。
    • 第一个节点正常启动: service influxdb start
    • 第二个节点需要设置环境变量:INFLUXD_OPTS="-join hostname_1:port_1" service influxdb start
    • 第三个节点类似:启动节点的时候设置环境变量 INFLUXD_OPTS="-join hostname_1:port_1,hostname_2:port_2"
  • 可以使用 …
read more

使用 Python 做 Linux System 编程

查看原文

本文介绍了使用 Python 获取很多 Linux 系统参数的方法。

  • platform 模块就提供了很多信息。
    • platform.uname() 获取 uname 信息,得到一个 tuple 的数据:包括操作系统,node name, release, version 等信息。
    • platform.architecture() 获取系统架构,看支持 32 位还是 64 位。
  • open('/proc/cpuinfo').readlines() 可以获取 CPU 信息
  • open('/proc/meminfo').readlines() 可以获取 内存 信息
  • open('/proc/net/dev').readlines() 可以获取 …
read more

UnQLite - 一款进程内的 NoSQL 数据库

查看原文

UnQLite 项目在 2018 年 1 月份重新进入活跃开发,它是一款自包含的,无服务,完全无配置的,有事务的进程内 NoSQL 数据库引擎。这个项目和 MongoDB, Redis 类似可以提供文档存储,也和BerkeleyDB, LevelDB 类似可以提供 kv 存储。你可以理解为它是一个嵌入到应用进程内部的 NoSQL,这意味着它自己完全没有进程运行着,它运行在进程里面。它的数据就直接存储在磁盘的单个文件上。

read more

Simplicity by Distributing Complexity

查看原文

本文讲了一个常见的需求:客户端需要一份数据,而这份数据需要从各个子系统里抓来聚合。

  • 一种解决方案是:在各个子系统前端放置一个聚合器。聚合器的实现就是从各个系统灌数据进来,然后处理完丢给客户端。
  • 另一种解决方案是:在各个子系统中间穿插放置小聚合器。尽管全局服务依赖变复杂了,但每个单个小聚合器的逻辑也变简单了(事实上如果分析下数据流会发现这种解决方案的数据流也更简单)
read more

如何使用 Git 将某个分支的文件复制到另外一个分支去?

查看原文

如果有需求在一个分支工作调试,另一个分支提交PR,那将工作分支的代码复制到提交PR分支的场景就出现了。git cherry-pick?慢了一些,一个文件可能提交了很多个,那要 cherry-pick 好多次才能完整得到文件。

正解是只需要通过 checkout 即可:git checkout dev /path/to/file

这里很好理解这个命令,checkout 字面意义就是签出,上面的命令就是将 dev 分支的某个代码文件整个签出到目前的工作目录中。

read more

学习 Grafana 的基本概念

查看原文

这是一篇自底向上学习 Grafana 中所有核心概念的 Getting Started 级别的文章,Grafana 中的基础概念有:数据源(Data Source),组织(Organization),用户(User),行(Row),面板(Panel),查询编辑器(Query Editor),仪表盘(Dashboard)。

  • Data Source: 提供数据的服务就是 Data Source。每种 Data Source 都有自己定制过的 Query Editor。
  • Organization:需求:一个 Grafana 示例可以给多个组织提供服务。
  • User:用户属于 Organization,可以被授予角色,一般用于验证身份。
  • Row:一行 12 个单位 …
read more

温习 父进程/僵尸进程/孤儿进程 的概念

查看原文

在 Unix-like 的操作系统中,除了 process 0, 其它所有进程都是 fork 产生的。调用了 fork 的进程就是父进程,被新建的进程就是子进程。Process 0 是在启动的时候创建的,fork 出了 process 1,自己变成 swapper。Process 1 是系统中所有其它进程的祖先。

在 Linux 中,还有 Parent 和 Real Parent 这两种概念。Parent 是子进程死后接收 SIGCHLD 的进程,real parent 是在多线程环境中创建了子进程的那个线程。

僵尸进程:当进程退出,操作系统释放了大部分资源,但关于资源消耗和退出码这些数据仍然保留,因为父进程可能需要子进程是否成功运行以及系统资源消耗量这些信息。默认情况下,操作系统像父亲发送 SIGCHLD …

read more

Man 文档阅读 - environ.7

查看原文

在 C 程序中,environ 是用户的环境变量。它是一个指向 char** 的指针,指向的数组的最后一个元素是 NULL。当 exec 启动一个进程的时候,进程会被塞入一个字符串数组作为环境变量。当 fork 出一个子进程的时候,子进程会拿到父进程的环境变量的拷贝。当进程运行的时候,可以通过 getenv, putenv, setenv 和 unsetenv 来操作环境变量。

Shell 环境中可以用 export (sh), setenv (csh) 设置环境变量。Shell 的初始环境变量在 /etc/environment 中配置,所有用户登录时会读取。另外,系统全局的配置 /etc/profile 和用户个人的配置也会被加进来。Bourne-style 的风格是用 name=value 这样的格式 …

read more

温习 PID (Process identifier) 的概念

查看原文

大多数操作系统都有 PID 这个概念,用于给一个进程到唯一标识位,我们用它操作进程,例如发送信号,杀掉,调优先级等。

在 Unix 系统中,有 2 个 PID 是特殊的:0, 1

  • PID=0: 也叫 swapper 或 sched, 翻译大概叫交换进程。它专门用于处理分页,其实更多是内核的一部分。
  • PID=1: 通常是 init 进程,用于开关机和托管孤儿进程。历史上倒是没有标准说 1 号一定是 init,只是 kernel 最开始搞出来的进程就自然而然分配到了 1。
  • PID=N: 递增到上限后,不同的系统从诸如 100, 300 之类的低端数字重新开始递增,寻找可用的 …
read more

对字符串应用 `strlen()` 和 `sizeof()` 的不同点

查看原文

sizeof 是编译时的一元运算符,用于计算操作量的 size;strlen() 则是运行时的函数,定义于 string.h 中,虽然都有计算大小这种功能,但他们概念不同,使用场景也不同。

  • sizeof 返回 size_t 类型,可以应用在任何类型上,int 可以,struct 也可以。
  • strlen() 返回 size_t 类型,应用在一个指向数组的指针,运行的时候它会数内存地址,直到遇到了 NULL。这个函数的主要任务是算字符串长度(不包括 \0)
  • 上面提到的编译时和运行时是个很大的区别,这意味着 sizeof 不关心具体值,它只关心 type 的 size, 而 strlen 关心的是运行时的 C-style NULL-terminated string 具体值的长度。

课后习题 …

read more

« Page 40 / 54 »