Memcached 是一种通用的内存缓存系统。这意味着它旨在保存(或缓存)计算或检索时间较长且可能再次被询问的问题的答案。一个常见的用例是加速数据库的使用:例如,如果我们期望重复需要“X 团队所有人员的姓名”列表,我们可能会将此数据放入 Memcached 中,而不是每次都运行 SQL 查询。(注意:Memcached 有时被称为“memcache”。在本文中,我们将坚持使用全名。)
缓存对于构建可扩展的应用程序和基础设施非常有用,而这正是成为站点可靠性工程师 (SRE) 的核心。本文着眼于有效运行 Memcached 所需的条件。
内存建议和 Memcached 后台进程化
当 Memcached 限制在系统可用内存量内时,效果最佳:当它占用的空间超过内存限制时,它将逐出数据。一些内存空间将用于我们称之为“开销”的内容——Memcached 的管理操作、操作系统和辅助进程所需的内存。
这是通过 -m 命令行标志设置的,这可能是您运行 Memcached 唯一需要的标志。 -d (daemonize) 标志通常没有用:在现代基于 systemd 的操作系统上,Memcached 不应自行后台进程化。同样,如果您在 Docker 下运行它,它也不应自行后台进程化。
在容器中运行 Memcached 很好,但重要的是要考虑主机上还在运行什么,并仔细调整内存需求。
使用 stats 查看 Memcached 数据
当您运行 Memcached 时,直接连接并进行尝试以查看发生了什么通常是一个好主意。即使对于生产实例,这也是相当安全的,只要您稍加注意。
最安全的命令是 stats。它将使 Memcached 输出大量通常有用的统计信息和详细信息
$ echo stats | nc localhost 11211
...
STAT uptime 1346
...
STAT max_connections 1024
STAT curr_connections 2
STAT total_connections 6
STAT rejected_connections 4
...
STAT get_hits 0
STAT get_misses 0
STAT get_expired 0
...
END
最有趣的统计数据通常是“hits”(命中)、“misses”(未命中)和“expired”(过期)。这些通常可以讲述一个关于缓存有效性的有趣故事。如果有效性降低,这是一个值得关注的原因,因为它可能会降低应用程序性能。
一个稍微不太安全的事情是尝试存储和检索。这是“试水”并了解其工作原理的好方法
$ echo stats | nc localhost 11211
set my_key 0 0 8
my_value^M
STORED
get my_key
VALUE my_key 0 8
my_value
END
在键入 my_value 后,您需要发送 DOS 样式的行尾:回车和换行。这在 Linux 控制台中使用 Ctrl+V 然后按 Enter 完成,这将输出 return 字符 (ASCII 13),然后像往常一样按 Enter 以输出 newline 字符 (ASCII 10)。
第一个 0 用于“元数据”,传入 0 意味着没有有趣的元数据。它被视为位掩码,因此 0 关闭了所有位。第二个 0 用于过期时间。它表示“永不过期”。一般来说,这对于测试来说很好。在生产环境中,最好为键设置过期时间。
如果这是一个重要的实例,则必须小心不要覆盖重要的键。但是,通过命令行快速存储和检索的能力可以确保 Memcached 正在正确运行。
将 Memcached 作为服务共享
请注意,在现代微服务设置中,许多服务都希望将数据保存在 Memcache 中,因此制定管理策略是值得的。一种选择是为每个服务运行一个 Memcache 或集群。但是,这通常很复杂且维护成本高。通常,正确的方法是让服务共享一个 Memcache。在这种情况下,实施一些合理的策略是一个好主意;例如,强制要求在键上添加服务名称前缀。这允许通过使用 cachedump 命令来检查哪些服务使用了多少空间
$ echo 'stats items' | nc -w 1 localhost 11211|grep ':number '
STAT items:1:number 2
此命令将显示所有“slab”ID。Memcache 将大小相似的键存储在 slab 中;此示例只有一个 slab
$ echo 'stats cachedump 1 1000' | nc -w 1 localhost 11211
ITEM my_key [8 b; 0 s]
ITEM foo [5 b; 0 s]
END
这里,有两个键:一个具有 8 字节的值,另一个具有 5 字节的值。
在具有许多键的更实际的场景中,您可能希望使用 awk 或脚本来处理此数据,并通过使用本地约定,弄清楚每个服务正在使用多少空间。
这可以集成到监控系统中,例如 Prometheus,以跟踪一段时间内的行为。
此外,由于许多团队共享同一服务,因此建议服务加密和验证它们正在缓存的数据是一个有用的指南。现代 CPU 上的对称加密性能良好,这使得安全模型更加简单。支持此功能的库的一个示例是 cryptography 的 Fernet。(如果您想阅读更多关于这方面的内容,请在评论中告诉我。)
结论
Memcached 是 SRE 支持的常见 开源技术。在本文中,我研究了如何查询关于它的常见统计信息,提供了一些配置建议,并展示了如何帮助多个团队以易于监控和安全的方式共享单个 Memcached 集群。您对如何管理 Memcached 还有其他问题吗?请在评论中提问,我很乐意分享更多技巧。
评论已关闭。