Japin

登高必自卑,行远必自迩

默认情况下,LaTeX 会在每个页面的底部生成一个页码编号,即使是标题页也是如此。通常情况下,我们不需要在标题页输出页码编号,而且目录页一般也会采用罗马数字的形式给出页码,而正文内容则以阿拉伯数字的形式给出页码编号。本文接下来介绍了 LaTeX 中基本的页码设置。

阅读全文 »

Linux I/O 调度器控制着内核读写磁盘的工作方式。系统管理员可以通过更改调度器来自定义磁盘调度算法,从而优化系统性能。有三种调度程序可供选择,每种调度程序都有其优点。这些调度器是:

  • Noop - 电梯调度算法,最简单的调度算法,该算法基于先进先出队列 (FIFO) 实现,所有的 I/O 请求都符合先进先出规则,适合于 SSD 设备。

  • Deadline - 绝对保障算法,它为读和写分别创建了 FIFO 队列,当内核收到请时,先尝试合并,不能合并则尝试排序或放入队列中,并且尽量保证在请求到达最终期限时进行调度,避免有一些请求长时间不能得到处理。该调度器适合虚拟机所在宿主机器或 I/O 压力比较重的场景,例如数据库服务器。

  • Completely Fair Queuing, CFQ - 绝对公平调度算法,它为每个进程和线程单独创建一个队列来管理该进程的 I/O 请求,然后为每个队列分配访问磁盘的时间片。时间片的长度以及允许队列提交的请求数取决于给定进程的 I/O 优先级。该调度器比较适合于通用服务器。

阅读全文 »

本文将介绍 PostgreSQL 中的 Common Table Expressions, CTE,也叫做公用表表达式。在介绍 CTE 之前,我们需要先了解 WITH 查询。WITH 查询是 PostgreSQL 针对复杂查询,允许用户在该查询内容编写辅助语句的功能,其中用户编写的辅助语句就是今天介绍的 CTE,你可以将 CTE 视为在当前查询中的一个临时表。CTE 的一大优点就是我们可将查询中的较为耗时且多次重复使用的部分通过 CTE 缓存起来,从而避免多次执行。

阅读全文 »

现在越来越多的网站采用 HTTPS 协议,今天就遇到一个关于 HTTPS 证书的问题,服务器端采用 HTTPS 加密传输,而证书是使用的自签名证书,因此客户端开发时需要将其导入到 Eclipse 中才能通过验证(客户端采用 Java 开发)。Eclipse 采用 keystore 来管理证书,可以利用工具 keytool 来管理证书文件,本文主要记录 Eclipse 证书管理的基本使用,以及使用自签名证书的格式问题。

阅读全文 »

今天遇到一个 git 远程仓库分支同步的问题,主要的诉求是将两个远程仓库的分支同步到一致状态。起初,项目只是在 GitHub 上进行维护,后期又在 GitLab 上创建了该项目,并且两个仓库之间的分支情况有所不同。我们可以使用如下命令同步两个远程仓库之间的分支信息。

1
2
3
$ git fetch --all -p
$ git push github "refs/remotes/gitlab/*:refs/heads/*"
$ git push gitlab "refs/remotes/github/*:refs/heads/*"

备注: github 指向远端的 GitHub 项目地址,同理,gitlab 指向远端的 GitLab 项目地址。

PostgreSQL 标榜自己为最先进 (Most Advance) 的开源关系数据库,它支持大部分 SQL 标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如,通过增加新的数据类型、函数、操作符、聚集函数、索引。PostgreSQL 被设计为易于扩展,因此通过插件我们可以很容易的扩展 PostgreSQL 数据库。本文就从编写一个简单的斐波那契的数据库扩展来介绍 PostgreSQL 插件的编写。

阅读全文 »

本文主要收集日常工作中经常使用的 PostgreSQL 相关的命令;其中,主要包含相关的系统函数、使用技巧等。本文将持续更新!!!

备注: 主要基于 PostgreSQL 10 及其后续版本。

阅读全文 »

Python 的 gettext 模块为应用程序提供了国际化 (Internationalization, I18N) 和本地化 (Localization, L10N) 的服务。该模块提供了两类 APIs:(a) 支持 GNU gettext 的基本 API;(b) 适合 Python 的并且基于类的 API。本文主要针对第二类 API 进行介绍。

为了向 Python 程序提供多语言消息,我们需要按以下步骤进行:

  1. 使用包装函数对程序中所有可以翻译的字符串进行标记;
  2. 使用 xgettext 在标记的文件上生成原始消息目录或 POT 文件;
  3. 将 POT 文件复制到特定的区域设置目录并进行翻译(需要使用专用的编辑器);
  4. 导入并使用 gettext 模块,以便正确转换消息字符串。
阅读全文 »

上一篇中我介绍了如何安装和使用列存数据库 cstore_fdw。接着,我将在本篇中介绍 cstore_fdw 是如何实现的。

Cstore_fdw 是基于 PostgreSQL 开发的一款列存数据库,它采用 ORC 作为低层的物理存储格式 (有部分改动),使用 protobuf 进行序列化并采用 PostgreSQL 外部插件的形式集成到数据库中。Cstore_fdw 包含 3 个头文件以及 5 个源文件:

  • cstore_compression.c - 该文件包含 cstore_fdw 使用的压缩和解压缩的算法实现。
  • cstore_fdw.c - 该文件包含列存扫描、分析以及复制数据到 cstore_fdw 外部表的函数的定义。它使用了 cstore_reader 和 cstore_writer 提供的 API 接口来读写 cstore 文件。
  • cstore_fdw.h - 该文件包含 cstore_fdw 使用的类型及函数声明。
  • cstore_metadata_serialization.c - 该文件包含 cstore_fdw 序列化和反序列化元数据的函数的实现。
  • cstore_metadata_serialization.h - 该文件包含 cstore_fdw 序列化和反序列化元数据的函数的声明。
  • cstore_reader.c - 该文件包含读取 cstore 文件的函数定义。它包括读取文件元数据,row stripes 以及跳跃不相关的数据块或列数据。
  • cstore_version_compat.h - 该文件包含用于编写与 PostgreSQL 版本无关的代码宏。
  • cstore_writer.c - 该文件包含写入 cstore 文件的函数定义。它包括写入文件元数据,row stripes 以及计算跳跃块节点信息。
阅读全文 »

无论何时,PostgreSQL 总是在集群的数据目录 pg_wal 下面维护一个 Write Ahead Log 日志记录。该日志记录了数据文件的所有变化。当数据库系统发生崩溃时,数据库系统可以通过重放最新检查点之后的 WAL 日志条目来恢复数据库的一致性。在 PostgreSQL 中,我们通过将文件系统级的备份与 WAL 日志的备份相结合可以实现三种策略的数据库备份。当需要进行数据库恢复时,我们先恢复文件系统的备份,随后通过重放备份的 WAL 日志使得数据库进入到当前状态。尽管该方法过于复杂,但是它拥有以下好处:

  • 我们不需要完全一致的文件系统备份作为起点。备份中的任何内部不一致都将通过日志重放进行更正 (这与崩溃恢复期间发生的情况没有显着差异)。因此,我们不需要文件系统快照功能,只需要 tar 或类似的归档工具。
  • 没有必要一直重放 WAL 条目到最后。我们可以在任何时候停止重放并拥有当时数据库的一致快照。因此,该技术支持时间点恢复 (Point-in-Time Recovery, PITR)。为此,我们可以将数据库还原到自从进行基本备份以后的任何状态。
  • 如果我们持续地将一系列 WAL 日志文件提供给另一台已加载相同基本备份文件的计算机,此时,我们就拥有了一个热备系统:在任何时候我们都可以启动这台机器,它将拥有与原数据库几乎一致的状态。

与普通文件系统备份技术一样,该方法只能支持恢复整个数据库集群,而不能用于恢复其子集。同时,它也需要更多的归档空间:基本的文件系统备份可能很庞大,繁忙的系统将生成许多必须归档的 WAL 流量。尽管如此,在多数情况下,它仍然是需要高可靠性的首选备份技术。

我们需要一系列连续归档 WAL 日志文件,这些文件至少可以延伸到备份的开始时间,从而确保连续归档 (许多数据库供应商也称为“在线备份”) 成功恢复。

阅读全文 »
0%