现在您已准备好上线一个 Aerospike 集群,您需要了解如何保持系统在线并应对变化。理解与服务器交互的流程至关重要,这样才能将其作为生产环境的一部分进行管理。您需要了解如何集群服务器、调整参数以及管理用户访问。本章聚焦于这些 Aerospike 管理的核心方面,探讨管理 Aerospike 集群所需的工具和配置。
配置
在安装 Aerospike 时,会在 /etc/aerospike/aerospike.conf 位置创建一个配置文件。该文件是主要的配置文件,仅在 Aerospike 守护进程启动时读取。此文件的格式并不遵循 YAML、JSON 或 INI 等标准格式,而是采用 Aerospike 专用的格式,尽管在外观上类似于 JSON。
配置文件结构
Aerospike 配置文件分为多个部分,称为“上下文”和“子上下文”。可以通过在行前添加 # 符号来在配置文件中添加注释。Aerospike 配置参考文档可以帮助您了解每个参数的功能、附加说明以及配置参数的属性,稍后将讨论这些内容。
注意
强烈建议您将 Aerospike 配置参考文档添加为书签。这是理解本书内容的宝贵资源,也对日常使用 Aerospike 以及偶尔需要参考配置时非常有用。配置参考指南将成为您有效浏览和理解 Aerospike 配置的首选工具。
让我们先查看一个未填写任何值的配置文件骨架(示例 7-1)。此骨架直接来自 Aerospike 的配置文档,简要解释了每个上下文部分。不要复制此文件,因为它并非实际工作示例。
示例 7-1:Aerospike 服务器配置文件骨架
service {} # 调整参数、进程所有者、功能密钥文件
network { # 配置集群内和应用节点间的通信
service {} # 工具/应用通信协议
fabric {} # 集群内通信协议
info {} # 管理员 telnet 控制台协议
heartbeat {} # 集群组建协议
}
security { # (可选,仅限企业版)启用集群上的访问控制
}
logging {} # 日志配置
xdr { # (可选,仅限企业版)配置跨数据中心复制
}
namespace { # 定义命名空间记录策略和存储引擎
storage-engine {} # 配置持久性或非持久性存储
set {} # (可选)设置特定记录策略
}
mod-lua { # UDF 模块的位置
}
此骨架展示了配置文件的整体结构,但由于它不是实际的配置文件,因此很难直观地理解这些空白部分应该填写什么内容。
让我们来看看随 Aerospike 安装包提供的一个实际功能配置文件。本例中,Aerospike v6.3 企业版服务器包下载后,适用于 Ubuntu 操作系统(见示例 7-2)。配置文件在不同版本和 Linux 发行版之间的变化很小,因此此示例在各操作系统和版本中几乎相同。
示例 7-2:默认 Aerospike 配置文件
# 适用于 systemd 的 Aerospike 数据库配置文件。
service {
proto-fd-max 15000
}
logging {
console {
context any info
}
}
network {
service {
address any
port 3000
}
heartbeat {
mode multicast
multicast-group 239.1.99.222
port 9918
# 要使用单播心跳,移除以上 3 行,参考 aerospike_mesh.conf 进行替代。
interval 150
timeout 10
}
fabric {
port 3001
}
info {
port 3003
}
}
namespace test {
replication-factor 2
memory-size 4G
storage-engine memory
}
namespace bar {
replication-factor 2
memory-size 4G
storage-engine memory
# 若使用文件存储备份,注释掉上述行,并使用以下行代替。
# storage-engine device {
# file /opt/aerospike/data/bar.dat
# filesize 16G
# data-in-memory true # 在文件之外也将数据存储于内存。
# }
}
Service 上下文
配置文件的第一个上下文是 service 上下文。此上下文用于指定高层级守护进程相关的运行时参数配置,可以在配置参考文档中找到这些设置。文件中的默认值通常适用于大多数初始部署,之后可以根据需要进行更改:
service {
proto-fd-max 15000
}
您首先会看到一个名为 proto-fd-max 的配置参数,值为 15000。proto-fd-max 控制为客户端连接打开的最大文件描述符数量。更多信息可参考配置参考文档。
日志上下文
第二个设置是至关重要的日志上下文,控制 Aerospike 的日志存储位置:
logging {
console {
context any info
}
}
默认情况下,日志信息存储在控制台(stdout)。如果使用 Docker 运行 Aerospike,可以通过 docker logs 命令获取控制台日志;否则可以使用以下命令:
journalctl -u aerospike.service
在日志上下文中可以进行的主要自定义包括:
- 将日志输出到文件中(可以替代控制台或同时输出)
- 使用
syslog进行日志记录 - 将特定的消息拆分到独立的日志位置
小贴士
有时重新启动守护进程但无法启动或产生日志,通常是因为配置文件无效,导致日志未按预期位置输出。如果在指定位置找不到日志,可以尝试直接运行/usr/bin/asd(位置可能有所不同),此操作会将错误直接输出到控制台。
网络上下文
接下来是网络上下文,包含 service、heartbeat、fabric 和 info 子上下文:
network {
service {
address any
port 3000
}
heartbeat {
mode multicast
multicast-group 239.1.99.222
port 9918
interval 150
timeout 10
}
fabric {
port 3001
}
info {
port 3003
}
}
在 network 上下文中,service 子上下文显示 Aerospike 会监听机器上的所有 IP 地址,并且客户端将通过端口 3000 进行连接。
在 heartbeat 子上下文中可以配置 Aerospike 的集群策略。在本示例中,使用的是多播模式,其中每台服务器通过广播加入多播组以形成集群。广播配置发送到 239.1.99.222 组的端口 9918。interval 和 timeout 参数控制 Aerospike 认为服务器不可达的阈值。timeout 值为 10,意味着在服务器被认为不再是集群的一部分之前,需连续 10 次心跳失败。interval 设置为 150 毫秒的间隔发送心跳。如果一台服务器变得不可达,集群中的其余节点将在约 1.5 秒内(150 ms × 10)识别到这一情况。
在某些环境(尤其是云环境)中,多播不可用。这时可以在不支持或不需要多播的情况下使用 mesh 模式进行集群配置。可以参考 Aerospike 文档中的心跳配置指南。
如果使用 mesh 模式,heartbeat 部分配置如下,设置 mode 为 mesh 并提供集群 IP 列表:
heartbeat {
mode mesh
mesh-seed-address-port 10.0.0.123 3002
mesh-seed-address-port 10.0.0.124 3002
mesh-seed-address-port 10.0.0.125 3002
port 3002
interval 150
timeout 10
}
每个 mesh-seed-address-port 条目告诉 Aerospike 尝试与该地址上的节点集群。因此该配置文件中,机器将尝试与位于 10.0.0.123、10.0.0.124 和 10.0.0.125 的机器形成集群。
小贴士
不必从列表中省略节点自身的 IP 地址。例如,如果部署在 IP 为10.0.0.124的机器上,不需要在配置文件中省略mesh-seed-address-port 10.0.0.124 3002。这样有助于集群中所有节点的配置文件保持一致。
继续查看示例 7-2,fabric 子上下文控制集群中 Aerospike 服务器之间的通信,用于复制和数据再分布,端口为 3001:
fabric {
port 3001
}
接着是 info 子上下文,用于控制 info 协议:
info {
port 3003
}
管理工具使用 info 协议与正在运行的服务器通信,以进行动态配置和获取运行时统计信息。此配置将 info 协议通信端口设为 3003。在 fabric 或 info 上下文中通常不需要修改其他参数,但可在配置参考中找到更多可用选项。
命名空间上下文
命名空间(namespace)是 Aerospike 配置文件中的另一重要配置区域,用于定义服务器将提供的命名空间及其属性:
namespace test {
replication-factor 2
memory-size 4G
storage-engine memory
}
第一个定义的命名空间名为 test,其 replication-factor(副本因子)为 2,这意味着 Aerospike 将为每条记录存储一个副本。可以看到 memory-size 参数被指定为 4G,限制了索引和数据组合的大小不超过 4 GiB。
警告
除非另有说明,Aerospike 中的所有与空间相关的参数都使用二进制单位表示。1G 表示 1 gibibyte,而不是 1 gigabyte。1 GiB 等于 1,024 MiB 或 2^30 字节。这可能会让操作员感到困惑,因为一些硬件信息的资源单位显示为 GB。例如,如果资源显示可用内存为 500 GB,在 Aerospike 中则相当于 465 G(即 465 GiB 的内存)。多数大小相关的参数支持这种简化单位表示,请查阅配置参考文档以了解详细信息。
在示例 7-2 的最后一个上下文中,storage-engine 参数将 memory 作为第一个命名空间的存储引擎。默认配置中还包含了另一个命名空间 bar 的定义:
namespace bar {
replication-factor 2
memory-size 4G
storage-engine memory
# 要使用文件存储支持,可注释掉上面一行并使用以下行。
# storage-engine device {
# file /opt/aerospike/data/bar.dat
# filesize 16G
# data-in-memory true # 将数据存储在内存和文件中。
# }
}
小贴士
replication-factor(副本因子)可能会在语义上让人困惑。可以将其理解为“存储数据的副本数量”,而不是“主数据、副本”等术语。副本因子为 2 表示 Aerospike 将存储一份主记录和一份副本。副本因子为 1 表示只存储主记录。副本因子为 3 表示存储一份主记录和两份副本。在大多数情况下,推荐的值是 2,这样即使在某个节点或机架失效时,数据也不会丢失。
bar 命名空间使用 memory 作为其存储引擎,但可以看到有一种注释掉的其他存储引擎配置。以下将简要介绍三种可用的存储引擎选项,因为这是另一个关键的配置参数。
Aerospike 提供三种存储引擎:memory、device 和 Intel 的持久内存(PMem)。最常用的是 device 存储引擎,它使 Aerospike 在存储设备中存储数据,而将索引保存在内存中。这种混合配置的优点是,索引保存在内存中而数据在设备上存储,通常在各种权衡中最具吸引力。表 7-1 总结了选择存储引擎时的一些高层次权衡。
| 存储引擎类型 | 混合/设备(数据不在内存中) | 全闪存 | 设备(数据在内存中) | 仅内存(无持久化) | 持久内存(PMem) |
|---|---|---|---|---|---|
| 索引在内存中 | ✓ | ✓ | ✓ | ✓ | |
| 快速重启 | ✓ | ✓ | ✓ | ✓ | |
| 电源中断时数据存活 | ✓ | ✓ | ✓ | ✓ |
如表 7-1 所示,索引还可以从内存移到 PMem 或闪存中。“全闪存”配置将索引存储在 SSD 上,通过将主索引移至闪存设备而非内存,从而最大化键空间,但会牺牲一些性能。
注意
截至 2023 年 1 月 31 日,英特尔已取消并停止了对 Optane 产品(如 Optane PMem 和 Optane SSD)的开发。
表 7-1 中提到的快速重启是 Aerospike 企业版的专有功能。快速重启允许使用设备支持的命名空间的 Aerospike 守护进程在重新启动时不必重建主索引。如果索引丢失,Aerospike 必须扫描存储设备以从持久化数据中重建主索引。
小贴士
Aerospike 服务器附带的默认配置设计为兼容大多数系统,但为实现这种兼容性牺牲了某些性能:它使用了file存储引擎子上下文。Aerospike 的一大优势在于它可以直接利用无文件系统的原始设备,这对首次使用者的配置会有些挑战。如果计划用于生产环境,建议使用设备代替文件来配置 Aerospike 的存储引擎。
动态配置
参考指南中的许多参数可以在不中断服务的情况下动态更改,但有些参数有特定要求。配置参考指南包含一个图例(如图 7-1 所示),标明该参数是否需要在重启时设置,或者是否可以动态设置等,这称为配置参数的属性。例如,context 参数具有动态属性,如果将鼠标悬停在该图例上,可以看到它说明了该参数可以动态设置。
通过了解配置参数的作用以及在什么情况下可以更改,您可以更有效地管理配置。表 7-2 总结了配置参数的各种属性。
表 7-2. 配置参数属性说明
| 配置属性 | 含义 |
|---|---|
| dynamic | 该配置参数可以在服务器运行时更改,而无需重启。 |
| static | 静态配置参数只能通过服务器重启来更改。您必须更新配置文件并重启 Aerospike 守护进程。 |
| unanimous | 该参数在整个集群中必须具有相同的值。更改这些值可能需要整个集群停机或特殊的更改流程。启动时,集群中不同意此参数的节点将无法加入集群。 |
| enterprise | 这些参数需要 Aerospike 企业版许可。 |
| required | 如果未指定必需参数,Aerospike 将无法启动,并且会生成日志条目。 |
警告
动态配置虽然强大,但有一个潜在的缺点:更改无法直接写回到配置文件中。如果在运行时对 Aerospike 服务器进行了动态更改,这些更改将在服务器重启时丢失,除非也手动写入配置文件。配置文件是启动时唯一的配置来源。目前,Aerospike 没有打印运行时配置与静态配置文件之间差异的方法,也没有将运行时配置复制到文件的方法。因此,每次进行动态更改时,若希望更改在更新中持续生效,需手动添加到配置文件中。asadm 工具中的 show config diff 命令可能有助于识别这些更改。
现在您已经了解了如何通过参考手册配置 Aerospike,那么如何进行和查看这些动态更改呢?在动态调整参数或检查当前运行时值之前,您需要熟悉工具包以及如何与 Aerospike 交互。
工具
您的 Aerospike 安装包应包含工具包,如果没有,请按照第 2 章中的步骤进行设置。工具包提供了管理 Aerospike 安装的可执行程序。我们先简要介绍一下所有工具及其功能说明,如表 7-3 所示,之后再详细讲解。
表 7-3. 管理 Aerospike 的工具
| 工具 | 描述 |
|---|---|
asinfo | 用于对单个 Aerospike 实例执行 info 命令,可以获取延迟、统计信息和使用情况等信息,也可以用来设置参数。 |
asadm | 用于对多个 Aerospike 实例执行 info 命令,管理访问权限、二级索引和用户定义函数 (UDF)。 |
aql | Aerospike Quick Look (AQL),用于执行基本的 CRUD 操作,无需编写完整的程序即可访问服务器。 |
asbackup 和 asrestore | 用于对正在运行的集群进行完整、增量或部分备份和恢复。 |
asloglatency | 用于通过读取日志文件检查各种直方图的延迟情况。 |
asbench | 用于模拟对 Aerospike 的不同负载进行测试。 |
这些工具将帮助您在 Aerospike 上线后更轻松地管理集群和配置。
asinfo 工具
asinfo 工具用于在不中断集群运行的情况下更改在线集群配置、获取服务器运行状态的统计信息,并协助进行故障排查。工具的基本用法是 asinfo -v <command to run>。此外,还有其他选项可以使用,例如 -l 将结果按行分隔,-U 和 -P 指定用户和密码等。您可以通过运行 asinfo --help 查看 asinfo 的参数帮助。
动态配置
asinfo 最有用的功能之一是能够轻松修改配置参考中列出的动态配置参数,而不会影响整个集群的运行。如果您认为某个可调参数的修改可能对您的用例有帮助,或者不确定更改参数的影响,asinfo 可以帮助您限制更改的范围,只需在单个主机上指定更改即可,而无需重启服务器。
我们来看一个更改动态配置的示例。如果您在配置参考指南中找到带有“dynamic”标签的参数,您应该可以使用 asinfo 进行修改。memory-size 是一个常见的需要频繁调整的参数,我们就从它开始。如果在配置参考中没有找到所需的参数,请尝试在搜索框中选择“所有版本”或“所有字段”。
在配置参考中查找 memory-size 时,您会看到它被标记为动态的,并且属于 namespace 上下文,如图 7-2 所示。您可以通过 asinfo 进行更改,并需要将更改语句限定在 namespace 上下文。
提示 在配置参考中可以展开“附加信息”,显示针对特定 namespace 修改参数的命令。附加信息通常非常有帮助,有时还能加快操作进程,充分利用这一点!
获取配置参数的命令以 get-config 开头。默认情况下,该命令返回 service 上下文的配置。但由于配置参考显示 memory-size 是 namespace 配置的一部分,因此需要指定上下文为 namespace,如下所示:
$ asinfo -v 'get-config:context=namespace'
Error::invalid id
出现错误是因为集群中可能有多个 namespace,因此需要在 namespace 后附加特定的 namespace 名称。在此集群中,namespace 是 test,因此您可以附加 id=test:
$ asinfo -v 'get-config:context=namespace;id=test'
allow-ttl-without-nsup=false;background-query-max-rps=10000;
conflict-resolution-policy=generation;conflict-resolve-writes=false;data-i....
结果信息量较大!您可以使用 -l 选项将结果按行分隔,再通过 grep 进行过滤:
$ asinfo -lv 'get-config:context=namespace;id=test'|grep memory
high-water-memory-pct=0
memory-size=1073741824
stop-writes-sys-memory-pct=90
storage-engine.data-in-memory=false
注意 如果可以编写一个简洁的命令来准确获取某个参数,那么设置该参数就只需进行小调整了。构建用于获取配置的命令,将动词从 get 改为 set,并添加特定配置参数及其更改值,即可完成设置。这样,您不仅可以验证命令的构建,还能立即检查其效果。
例如,这里显示的内存大小为字节单位的 1073741824(1 GiB),因此当前 namespace 的 memory-size 设置为 1G。可以使用类似的命令 set-config 将其更改为 2G:
$ asinfo -v 'set-config:context=namespace;id=test;memory-size=2G'
ok
$ asinfo -lv 'get-config:context=namespace;id=test'|grep memory-size
memory-size=2147483648
同样,您也可以读取并更改 service 上下文中的配置参数:
$ asinfo -lv 'get-config:context=service'|head
advertise-ipv6=false
auto-pin=none
batch-index-threads=12
batch-max-buffers-per-queue=255
batch-max-requests=5000
batch-max-unused-buffers=256
cluster-name=null
debug-allocations=none
disable-udf-execution=false
downgrading=false
尝试更改第一个配置参数 advertise-ipv6:
$ asinfo -lv 'set-config:context=service;advertise-ipv6=true'
ok
$ asinfo -lv 'get-config:context=service'|head -n1
advertise-ipv6=true
可以使用这一模式更改配置文件中的许多上下文配置。如果需要在多个服务器上进行更改,应使用 asadm 工具(稍后将在本章中介绍)来执行此操作。
统计信息、特殊设置与延迟
除了我们之前重点介绍的配置参考,Aerospike 还提供了一个 info 命令参考,用于展示 asinfo 可执行的其他实用功能。其中尤其值得关注的命令包括 latencies 和 logs。latencies 命令可以将最近 10 秒内的事务以直方图的形式报告,方便监控系统状态;logs 命令则可用于更改消息的详细级别,例如关闭特定警告或增加某些代码路径的详细程度,以便排查问题。其他 asinfo 命令则适用于高级用户,主要用于本书范围之外的复杂问题和情况。
提示 请注意,info 命令参考指南是 info 协议的通用参考。如果需要从应用程序执行这些命令,您可以使用客户端驱动程序执行这些操作。虽然 Aerospike 提供了所有这些工具,但它们并非必需。您可以在自定义应用程序中重新创建所有这些工具或其中的某些功能,例如:
$ asinfo -v 'get-config:context=namespace;id=test'
这相当于一个 Java 的 info 调用:
Info.request(node, 'get-config:context=namespace;id=test');
asadm
asadm 工具主要用于整个集群的 info 协议操作。查看集群的整体健康状况时,asadm 能从所有集群节点中获取信息并以易读的格式总结。此外,若需要对整个集群进行设置更改,asadm 是执行此类更改的首选工具。同时,asadm 还支持管理访问控制列表 (ACL)、配额、二级索引以及用户定义的函数 (UDF)。
在命令行执行 asadm --help 可以查看使用帮助,说明如何连接到集群:
$ asadm --help
执行 asadm 命令后,将进入交互式 asadm 会话,会话中光标前会显示 Admin>。在此环境下,输入 help 命令可查看可用命令,输入 exit 可退出会话:
$ asadm
...
Found 1 nodes
Online: 127.0.0.1:3000
Admin>
信息命令
进入 asadm 的交互式会话后,info 是一个很好的起始命令:
Admin> info
该命令可以显示集群的当前状态,包括是否有待迁移的任务、集群中服务器数量、记录和副本数量、空间使用情况等信息。通过执行 help info 可以查看不同的参数,并显示诸如 dc、network、set、sindex、xdr、namespace 等统计信息。示例:
Admin> info set
显示延迟和其他统计
show 命令用于查看延迟统计信息,例如:
Admin> show latencies
show latencies 命令提供过去 10 秒内的读取、写入、UDF 和批量事务的延迟情况,按各种延迟桶展示百分比。show 命令的 like 关键字允许按特定模式筛选,例如:
Admin> show lat like write
提示
可以通过缩短命令来快速操作。例如,键入 s 然后按两次 Tab 键,会看到命令 s 有歧义。键入 su 则足够执行最近的匹配命令 summary。例如,输入 i <TAB> 将自动完成为 info。
配置和统计信息
show config 命令可以搜索集群所有节点的配置,与 asinfo 中的 get-config 命令不同。通过 like 关键字缩小搜索范围:
Admin> sh config like thread
找到确切参数名可能具有挑战性,like 关键字可以根据特定模式筛选内容:
Admin> sh stat like client.*err
总结命令
summary 命令是概括集群使用情况的好方法,不需深入 Aerospike 特定术语:
Admin> summary
summary 提供集群的内存使用、集群大小、集群名称等信息。
修改配置
使用 asadm shell,可以动态修改整个集群的配置。由于此操作会影响整个集群,因此在不确定所更改的设置时,建议在单节点上使用 asinfo 或通过 --single-node 参数进入单节点模式进行操作:
$ asadm --single-node
在 asadm 交互式终端中,有两种主要方法更改配置参数:可以直接在 shell 中执行 asinfo 命令,或使用 asadm 提供的 manage 命令。
为防止意外更改,asadm 中设有安全机制,需先使用 enable 命令进入特权模式。在非特权模式下运行更改命令时会报错。例如,尝试在 asadm 中执行 asinfo 命令将出现类似以下错误:
Admin> asinfo -v 'get-config:context=service'
ERROR: User must be in privileged mode to issue "asinfo" commands.
Type "enable" to enter privileged mode.
输入 enable 命令进入特权模式,提示符将显示 Admin+>,表示可以执行更改。退出特权模式可以输入 disable,或重新打开 asadm 会话。
在特权模式下,可以执行 asinfo 命令。例如,尝试更改内存大小:
Admin> sh config like memory-size
~test Namespace Configuration (2023-08-07 00:27:17 UTC)~
Memory-size|2147483648
Admin> enable
Admin+> asinfo -v 'set-config:context=namespace;id=test;memory-size=3G'
在多节点集群中,将看到每个服务器的响应。按方向键上的向上箭头,返回 show 命令来验证更改是否生效:
Admin+> sh config like memory-size
~test Namespace Configuration (2023-08-07 00:28:53 UTC)~
Node |1.0.0.127.in-addr.arpa:3000
memory-size|3221225472
也可以使用 asadm 的 manage 命令进行更改,输入 help manage config 可以获得帮助。例如,要更改 namespace 配置参数,可执行以下命令:
Admin+> manage config namespace test param memory-size to 2G
~Set Namespace Param memory-size to 2G~
Node|Response
1.0.0.127.in-addr.arpa:3000|ok
管理索引、ACL、UDF
Aerospike 企业版支持安全功能,可以通过 manage acl 命令对用户 ACL 进行细粒度或基本控制,使用 manage sindex 命令创建数据的二级索引,以及使用 manage udfs 命令注册自定义的 UDF。UDF 用途非常有限,不在本书的讨论范围内。
Aerospike Quick Look (AQL)
如第2章所述,Aerospike Quick Look(AQL)工具用于与Aerospike集群中的数据交互。借助AQL,可以读取、写入和查询数据,这在检查记录是否存在或查看特定记录的bins内容时非常节省时间。
需要注意的是,AQL不具备客户端驱动程序的全部功能,因此要获取数据的完整可见性,可能仍需使用IDE。此外,AQL无法显示例如任意序列化字节或protobuf二进制数据等内容。
除了单个键的读写操作外,AQL对运维人员的另一大用处在于查看键的元数据,或查找该记录的主节点和副本节点。让我们进入AQL交互式shell并探索一些功能。
与 asadm 不同,使用 --help 命令可以查看AQL中可运行的命令:
$ aql --help
执行命令末尾添加 -? 可以打开连接帮助页面并进入aql shell:
$ aql -?
一些特定命令可以查看记录的元数据及其来源。首先,在AQL中创建一条测试记录,以下是帮助菜单中的示例:
aql> INSERT INTO test.demo (PK, foo, bar, baz) VALUES ('key1', 123, 'abc', true)
该命令在 test 命名空间的 demo 集合中创建了一条记录,主键(PK)为 key1,并包含三个bins:foo、bar 和 baz,其值分别为123、"abc" 和 true。
现在可以检索并显示此记录:
aql> select * from test.demo where pk = "key1"
+--------+-----+-------+------+
| PK | foo | bar | baz |
+--------+-----+-------+------+
| "key1" | 123 | "abc" | true |
+--------+-----+-------+------+
1 row in set (0.001 secs)
OK
小贴士
对于某些数据类型,特别是较长的字符串,AQL可能无法显示数据或显示不完全。在这种情况下,可以使用 RAW 输出格式,通过 SET OUTPUT RAW 命令切换输出类型。其他选项可在帮助页面查看,或在AQL会话中执行 help SET 命令查看。
可以看到记录已存在,并以表格的形式显示内容。作为负责故障排查的管理员,还可以查看元数据:
aql> SET RECORD_PRINT_METADATA true
RECORD_PRINT_METADATA = true
aql> select * from test.demo where pk = "key1"
+--------+-----+-------+------+---------+-------+
| PK | foo | bar | baz | {ttl} | {gen} |
+--------+-----+-------+------+---------+-------+
| "key1" | 123 | "abc" | true | 2591764 | 1 |
+--------+-----+-------+------+---------+-------+
1 row in set (0.001 secs)
OK
在AQL中更改设置以显示元数据后,再次运行 select 命令,这次可以看到 TTL(表示记录的剩余秒数)和 gen(记录的生成次数)。
asbackup 和 asrestore
Aerospike 工具包还提供了备份和恢复的工具。备份工具通过对整个命名空间进行扫描,为每个找到的记录生成文件,保存在文件系统、其他机器或云存储中。恢复工具读取 asbackup 存储的数据,为每条记录执行客户端写操作来恢复数据。
这些工具并非执行块级快照、预写日志或其他高级技术,而是通过扫描、读取和写入等基本操作完成备份和恢复,类似于客户端驱动程序的调用方式。
asbackup 使用扫描来检索数据,就像客户端读取记录一样并存储到指定位置。然而,这种方式可能带来问题,因为在扫描过程中数据可能会发生变化。由于没有命名空间级别或集合级别的锁定,某些记录可能在上午10:00备份,而其他记录在上午11:00才备份。如果这些记录之间存在依赖关系,可能会导致问题。唯一的锁定机制是在读取时短暂锁定记录,以确保记录的一致性。
同时,这种方式也有好处,因为在进行数据库备份时不需要暂停所有客户端流量。
asbackup 和 asrestore 命令各有帮助页面,以下是使用默认选项进行备份和恢复的示例:
$ asbackup -n test -o testfile
...
2023-08-13 18:39:37 UTC [INF] [29199] Backed up 84765 record(s), 0 secondary
index(es), 0 UDF file(s), 8037390 byte(s) in total (~94 B/rec)
$ ls -lhd testfile
-rw-r--r--@ 1 albert nosql 7.7M Jul 23 20:25 testfile
asbackup 至少需要指定一个命名空间(如 -n test)和输出数据的路径(如 -o testfile)。asrestore 的要求更少,因为备份文件中已包含命名空间元数据。
使用 asrestore 恢复数据,只需将文件作为输入:
$ asrestore -i testfile
...
2023-08-13 18:40:49 UTC [INF] [30088] Opened backup file testfile
2023-08-13 18:40:49 UTC [INF] [30088] Restoring records
...
2023-08-13 18:41:02 UTC [INF] [30142] 0 UDF file(s), 0 secondary index(es),
84765 record(s) (145644 rec/s, 13486 KiB/s, 94 B/rec, retries: 0)
2023-08-13 18:41:02 UTC [INF] [30142] Expired 0 : skipped 0 : err_ignored 0 :
inserted 0: failed 84765 (existed 0 , fresher 84765)
2023-08-13 18:41:02 UTC [INF] [30142] 100% complete, ~0s remaining
$ echo $?
0
警告
asrestore 无法恢复记录的原始生成版本。若服务器上已存在备份文件中的记录,可能会覆盖某个版本。记录的 bins 没有合并策略,asrestore 的写入操作是“更新插入”模式。您可以使用帮助页面中描述的 --unique 参数,表示“跳过命名空间中已存在的记录,不触动它们。”或者使用 --replace 选项,执行相反操作。
此外,可以通过网络传输此备份数据,将其写入已挂载的文件系统,甚至直接写入 s3 路径,利用 asbackup 输出的 stdout 标志或 asrestore 输出:
$ asbackup -o - | <do something with streaming stdout>
这在流式传输到特定存储解决方案或压缩软件(如 zstd)时很有帮助:
$ asbackup -o - | pzstd -9 | cat > mybackup.zst
同样,asrestore 的 -i - 从 stdout 读取:
$ do something | asrestore -i -
继续恢复压缩备份文件的示例:
$ cat mybackup.zst | pzstd -d | asrestore -i -
这使得 asrestore 和 asbackup 成为 Linux GNU 工具生态系统中的有用工具。Aerospike 最近增加了内置的 -z 压缩标志,因此这些示例可能不再实用,但展示了如何将其与 GNU 工具结合使用的方法。
asbackup 的另一个显著功能是支持增量备份,通过 --modified-after 或 --modified-before 参数,而无需每次执行完整备份。增量备份可以大大减少备份数据库的时间,代价是增加了恢复时的复杂性,增量备份时间间隔越长,恢复过程就越复杂。
asloglatency 和 asbench
虽然 asinfo 和 asadm 工具可以展示不同直方图的延迟百分比分布,但还有一个更高级的工具称为 asloglatency。asloglatency 是一个 Python 工具,用于解释 Aerospike 日志文件中的直方图。这个工具可以查看其他工具未报告的直方图、检查历史记录的直方图,或按需更精细地查看延迟数据。asloglatency 特别有用,可用于查看特定的直方图,尤其在启用并检查微基准(microbenchmarks)时,这样可以更细粒度地跟踪延迟并找出可能的问题来源。
例如,如果您在测试命名空间的读取延迟中遇到问题,可以通过启用读取基准获取额外的日志信息:
$ asinfo -v 'set-config:context=namespace;id=test;enable-benchmarks-read=true'
警告 启用微基准会增加额外的延迟并显著增加日志量。建议仅在非生产系统中测试,如果可能,限制为一个节点,排查完问题后记得关闭。
这会在日志文件中生成额外的直方图,可以通过以下方式在日志中找到:
$ docker logs aerospike | grep hist | grep read
Aug 13 2023 19:14:42 GMT: INFO (info): (hist.c:320) histogram dump: {test}-read
(753 total) msec
Aug 13 2023 19:14:42 GMT: INFO (info): (hist.c:320) histogram dump: {test}-read-start (753 total) msec
...
如果使用 Docker,可以将这些日志导出到 asloglatency 可解析的文件中:
$ docker logs aerospike > histogram.logs
$ grep "hist.c" histogram.logs | tail
Aug 13 2023 19:15:32 GMT: INFO (info): (hist.c:320) histogram dump: {test}-read-local (753 total) msec
Aug 13 2023 19:15:32 GMT: INFO (info): (hist.c:331) (00: 0000000724) (01: 0000000006) (02: 0000000015) (03: 0000000007)
...
找到日志文件后,可以对日志文件运行 asloglatency。例如,查看默认启用的读取直方图:
$ asloglatency -l histogram.logs -h "{test}-read" -f head
还可以深入查看启用微基准后生成的特定直方图片段:
$ asloglatency -l histogram.logs -h "{test}-read-local" -f head
asbench
在本章中,我们已在运行的容器上检查了延迟,而无需编写生成工作负载的应用程序。为了测试新硬件、容量规划或灾难场景,您可能需要生成模拟工作负载。asbench 工具提供了这项功能。下面是生成前述直方图的命令:
$ asbench -n test -o 'B1000000' -w RU,50 -k 100 -t 120
此 asbench 命令默认目标为 localhost,指定命名空间为 test,使用 1,000,000 字节的二进制数据作为 bin,工作负载为 50% 读取和 50% 更新,使用的 key 数限制为 100 条记录,运行时间限定为 120 秒。运行时,您将看到读取、写入和失败的实时统计。
使用该工具可以模拟特定工作负载,帮助您评估 Aerospike 和硬件在不同条件下的性能表现。
安全性
Aerospike 提供了多种安全功能,使您可以以负责任且合规的方式运行集群:
- TLS:加密客户端到服务器之间或服务器之间的网络通信。
- ACL(访问控制列表) :控制特定用户对特定命名空间和集合的访问权限及配额。
- Aerospike Secret Agent:用于安全检索功能密钥和证书文件的密钥代理。
- LDAP(轻量级目录访问协议) :管理服务器身份验证。
- 静态加密(Encryption-at-Rest) :确保刷新到存储设备的数据被加密。
- FIPS 140-2 认证:一种符合美国联邦政府要求的专业认证。
以上所有安全功能都在 Aerospike 企业版服务器许可下提供,因此如果您需要这些功能,可以联系支持团队协助完成安装。Aerospike 网站的安全概览部分提供了所有必要的设置信息。由于这些安全功能需要企业版许可,您可以利用企业支持解决相关设置问题,因此本书不会深入讲解每个功能的细节。
总结
本章讨论了配置文件格式和配置参考在设置与日常操作中的重要性。您还了解了随 Aerospike 提供的各种工具——asinfo、asadm、aql、asbackup、asrestore、asloglatency 和 asbench——及其在日常工作、故障排除和基准测试中的使用方法。最后,我们简要概述了 Aerospike 企业版中提供的安全功能。在第 8 章中,我们将继续讨论如何使用这些工具进行升级并监控集群的运行状况。