KeyDB 简介
KeyDB 是一个开源的内存**数据结构存储**系统,可用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希、列表、集合、带范围查询的有序集合、位图、HyperLogLog、带半径查询的地理空间索引和流。KeyDB 内置了复制、Lua 脚本、LRU 淘汰、事务和不同级别的磁盘持久化功能,并通过主动复制或 Sentinel 提供高可用性,以及通过 KeyDB 集群实现自动分区。
您可以对这些类型执行**原子操作**,例如追加到字符串、递增哈希中的值、向列表中推送元素、计算集合的交集、并集和差集,或者获取有序集合中排名最高的成员。
为了实现其卓越的性能,KeyDB 使用**内存数据集**。根据您的用例,您可以通过定期将数据集转储到磁盘或通过将每个命令追加到日志中来持久化数据。如果您只需要一个功能丰富、基于网络的内存缓存,也可以选择禁用持久化。
KeyDB 还支持设置简单的主从异步复制,具有非常快速的非阻塞首次同步、网络分区后的自动重连和部分重同步功能。
其他功能包括:
- 事务
- 发布/订阅 (Pub/Sub)
- Lua 脚本
- 具有有限生存时间的键
- 键的 LRU 淘汰
- 自动故障转移
您可以在大多数编程语言中使用 KeyDB。
KeyDB 使用 **ANSI C** 编写,可在大多数 POSIX 系统(如 Linux、*BSD、OS X)上运行,无需外部依赖。Linux 和 OS X 是 KeyDB 开发和测试最多的两个操作系统,我们**推荐使用 Linux 进行部署**。KeyDB 可以在 Solaris 衍生系统(如 SmartOS)上运行,但支持是“尽力而为”的。虽然没有对 Windows 构建的官方支持,但微软开发并维护了一个 Win-64 版本的 KeyDB。
#
KeyDB 管理本页包含与 KeyDB 实例管理相关的主题。每个主题都以常见问题解答(FAQ)的形式独立存在。将来会创建更多新主题。
#
KeyDB 设置提示- 我们建议使用 **Linux 操作系统**部署 KeyDB。KeyDB 也在 OS X 上进行了大量测试,并偶尔在 FreeBSD 和 OpenBSD 系统上进行测试。然而,Linux 是我们进行所有主要压力测试的地方,也是大多数生产部署运行的环境。
- 请确保将 Linux 内核的**内存过量使用(overcommit memory)设置设为 1**。将 `vm.overcommit_memory = 1` 添加到 `/etc/sysctl.conf` 中,然后重启或运行命令 `sysctl vm.overcommit_memory=1` 使其立即生效。
- 请确保禁用 Linux 内核的“透明大页”(transparent huge pages)功能,它会对内存使用和延迟产生严重的负面影响。这可以通过以下命令完成:`echo never > /sys/kernel/mm/transparent_hugepage/enabled`。
- 请确保在您的系统中**设置一些交换空间(swap)**(我们建议交换空间的大小与内存相当)。如果 Linux 没有交换空间,而您的 KeyDB 实例意外消耗了过多内存,KeyDB 可能会因内存不足而崩溃,或者 Linux 内核的 OOM killer 将会杀死 KeyDB 进程。启用交换空间后,KeyDB 的性能会变差,但您可能会注意到延迟峰值并在为时已晚之前采取措施。
- 在您的实例中设置一个明确的 `maxmemory` 选项限制,以确保当系统内存即将耗尽时,实例会报告错误而不是崩溃。请注意,设置 `maxmemory` 时应计算 KeyDB 除数据外的开销以及碎片开销。因此,如果您认为有 10 GB 的可用内存,请将其设置为 8 或 9。
- 如果您在写密集型应用中使用 KeyDB,当在磁盘上保存 RDB 文件或重写 AOF 日志时,**KeyDB 可能使用高达正常使用内存的 2 倍**。额外使用的内存与保存过程中因写入而被修改的内存页数成正比,因此通常与在此期间被触及的键(或聚合类型项)的数量成正比。请确保相应地调整您的内存大小。请注意,这不适用于使用无 fork 后台保存的 KeyDB Pro。
- 在 daemontools 下运行时,请使用 `daemonize no`。
- 确保设置一个不小的复制积压缓冲区(replication backlog),其大小必须与 KeyDB 使用的内存量成比例。在一个 20 GB 的实例中,仅有 1 MB 的积压缓冲区是没有意义的。积压缓冲区将使副本能更容易地与主实例重新同步。
- 即使您禁用了持久化,如果您使用复制功能,KeyDB 仍需要执行 RDB 保存,除非您使用新的无盘复制(diskless replication)功能。如果您的主节点上没有磁盘使用,请确保启用无盘复制。
- 如果您正在使用复制,请确保您的主节点要么启用了持久化,要么在崩溃时不会自动重启:副本会尝试成为主节点的确切副本,所以如果一个主节点以空数据集重启,副本也会被清空。
- 默认情况下,KeyDB **不要求任何身份验证,并监听所有网络接口**。如果您将 KeyDB 暴露在互联网或其他攻击者可以访问的地方,这是一个严重的安全问题。
- `LATENCY DOCTOR` 和 `MEMORY DOCTOR` 是您的好帮手。
#
在 EC2 上运行 KeyDB- 使用基于 HVM 的实例,而不是基于 PV 的实例。
- 不要使用旧的实例系列,例如:使用 m3.medium (HVM) 而不是 m1.medium (PV)。
- 使用 KeyDB 持久化功能配合 **EC2 EBS 卷**需要小心处理,因为有时 EBS 卷具有高延迟特性。
- 如果副本与主节点同步时遇到问题,您可能想尝试新的**无盘复制**功能。
#
备份到 AWS S3:将此行添加到您的配置文件中:`db-s3-object /path/to/bucket`
如果您希望 KeyDB 直接将数据转储和加载到 AWS S3,此选项指定了存储桶。将此选项与传统的 RDB 选项一起使用,将导致 KeyDB 同时备份到两个位置。如果两者都指定了,KeyDB 将首先尝试从本地转储文件加载,如果失败则从 S3 加载。这需要安装和配置 AWS CLI 工具,因为数据传输是在后台使用这些工具完成的。
#
无停机升级或重启 KeyDB 实例KeyDB 被设计为在您的服务器上长期运行的进程。例如,许多配置选项可以使用 CONFIG SET 命令进行修改,而无需任何形式的重启。
甚至可以从 AOF 切换到 RDB 快照持久化,反之亦然,而无需重启 KeyDB。请查看 `CONFIG GET *` 命令的输出来获取更多信息。
然而,有时重启是必须的,例如为了将 KeyDB 进程升级到新版本,或者当您需要修改当前 CONFIG 命令不支持的某些配置参数时。
以下步骤提供了一种非常常用的方法,以避免任何停机时间。
- 将您的新 KeyDB 实例设置为当前 KeyDB 实例的副本。为此,您需要另一台服务器,或者一台有足够 RAM 同时运行两个 KeyDB 实例的服务器。
- 如果您使用单台服务器,请确保副本在与主实例不同的端口上启动,否则副本将根本无法启动。
- 等待复制的初始同步完成(检查副本的日志文件)。
- 使用 INFO 命令确保主实例和副本中的键数量相同。使用 keydb-cli 检查副本是否按预期工作并响应您的命令。
- 使用 **CONFIG SET replica-read-only no** 允许对副本进行写入。
- 配置您的所有客户端以使用新实例(即副本)。请注意,您可能希望使用 `CLIENT PAUSE` 命令来确保在切换期间没有客户端可以写入旧的主节点。
- 一旦您确定主节点不再接收任何查询(您可以使用 MONITOR 命令进行检查),使用 **REPLICAOF NO ONE** 命令将副本提升为主节点,然后关闭您的旧主节点。