Phalanx

Phalanx 是一个用 Swift 编写的 Cassandra 迁移工具,其人体工程学设计灵感来源于 flyway。

动机

目前已经有一些用 Java 和 Python 编写的 Cassandra 迁移工具。

Phalanx 专为已经编写 Swift 后端/微服务的开发者设计,他们可能希望留在熟悉的工具链/生态系统的范围内。

Phalanx 基于 Apple 的开源 Cassandra 客户端库

安装

Swift 包管理器 (Swift Package Manager)

将 Phalanx 添加到您自己的 Package.swift 文件中

.package(url: "https://github.com/jmfieldman/phalanx.git", from: "1.0.0")

Swift PM 将自动检测可执行目标,因此您现在可以通过您自己的包运行 phalanx 可执行文件

$ swift run phalanx ...

独立安装 (Mint)

如果 Phalanx 与您的项目存在依赖冲突,或者您只是想要更精简的执行体验,请尝试使用非常出色的 Mint 包管理器安装 Phalanx。

Mint 在其自己的环境中构建每个 Swift 可执行文件,跟踪版本,并通过 Mintfile 支持本地化的版本锁定。 这避免了在您自己的项目的 Package.swift 更改时,持续不断的、不必要的重新构建检查。

# Install mint on your system, e.g.
$ brew install mint

# Install Phalanx
$ mint install jmfieldman/phalanx

# Run Phalanx using Mint. This is the recommended method if you plan
# on using a Mintfile for version-pegging
$ mint run phalanx <..>

# Or run it directly if you have the Mint bin directory in your path
$ phalanx <..>

用法

Phalanx 提供两个基本功能:cleanmigrate

# Phalanx will use the keyspace associated
# with the command to `DROP KEYSPACE <keyspace>`
$ phalanx clean

# Phalanx will use the detected migration files to bring your
# keyspace up to the most recent version.
$ phalanx migrate

配置

Phalanx 通常使用配置文件进行配置。 可用配置选项的详细信息,包括所有命令行覆盖选项,请参见 示例配置

# Phalanx looks for phalanx.yml by default, but you can override
# that with the --config parameter, e.g.
$ phalanx --config conf/phalanx.yml migrate

所有配置也可以使用命令行选项设置;使用 help 命令参考。

$ phalanx --help

迁移文件

迁移文件应全部分组到一个目录中。 Phalanx 将在迁移目录的内容中查找与迁移文件模式匹配的任何文件。

您可以配置定义迁移文件名称结构的文件前缀、扩展名和版本描述符分隔符。

一个示例文件列表可能如下所示

# Prefix = null
# Separatpr = "-"
# Extension = "cql"

$ ls
000-create_keyspace.cql
001-create_user_table.cql
002-add_password_column_to_users.cql
003-create_device_table.cql
README.md # This file will be ignored as it does not match migration patterns

迁移文件可以包含其自己唯一的元数据,这些元数据仅影响其特定的调用。 此元数据必须包含在迁移文件的顶部。 它被格式化为 CQL 注释的 YAML。

-- metadata:
--   description: This overrides the filename-based description
--   invocationDelay: <int> # Overrides the global invocation delay
--   consistency: <string> # Overrides the global consistency config

CREATE TABLE ...

确保在元数据后有一个空行,以结束 YAML 解析。

重要概念

每次调用一个 Keyspace

任何单个 Phalanx 调用都将仅在配置或命令行中定义的一个 keyspace 上运行。 如果您想为多个 keyspace 设置迁移,它们需要位于隔离的目录中,并且您需要为每个 keyspace 单独调用 Phalanx。

迁移 0 保留用于 Keyspace 创建

Phalanx 期望初始迁移从一个空白状态开始,并且在迁移 0 之前没有 keyspace 准备就绪。 由于 keyspace 创建可能涉及复杂的自定义参数,因此 Phalanx 保留迁移 0 用于 keyspace 创建。

这意味着标记为版本 0 的迁移(例如000-create_keyspace.cql只能包含以 CREATE KEYSPACE 开头的命令

如果您不希望 Phalanx 负责 keyspace 创建,您可以自己创建 keyspace,然后从版本 1 开始迁移文件。

如果 keyspace 不存在并且您缺少版本 0,Phalanx 将抛出错误。

为镜像 Keyspace 使用 Keyspace 占位符

在某些情况下,您可能希望相同的迁移链存在于多个 keyspace 中。 例如,您可以使用单个本地 Cassandra 节点进行本地开发、单元测试和本地 CI 代理。

为了使这些范围中的数据得到正确的隔离,您将为每个范围使用不同的 keyspace(例如,project_local、project_tests、project_ci 等)。

在这种情况下,您可以在迁移文件中使用占位符 $${{KEYSPACE}}$$,迁移引擎会自动将其替换为当前正在执行的 keyspace。 这对于创建 keyspace 的零版本迁移尤其有用。

迁移文件只能包含一个命令

由于 Cassandra 没有传统的多命令事务,因此将多个命令放在单个迁移版本中是不安全的。 例如,如果一个迁移文件包含 10 个命令,而第 5 个命令失败,则无法清楚地记录某个迁移文件“完成了一半”。

通过将迁移文件限制为每个文件一个命令,我们可以确保各个命令成功并锁定到状态表中。

单元测试

Phalanx 有一套可以从命令行运行的单元测试

$ swift test

这些测试期望 Cassandra 节点在 127.0.0.1:9042 上可用,并且将在 phalanx_test_keyspace keyspace 上运行(多次删除和创建它)。