第7章 Memcached 第7章:内置代理详解
功能特性内置代理内置代理本页对 Memcached 内置代理进行概念性介绍。如需安装和运行代理的快速上手指南,请参阅内置代理快速入门。概述 从 1.6.23 版本开始,Memcached 包含了内置代理。你可以让一个 Memcached 服务器充当前端代理,连接任意数量的后端 Memcached 服务器。这些后端可以部署在任何代理能够通过 TCP/IP 访问的位置。使用代理化的 Memcached 架构后,客户端始终连接代理,而不是直接连接后端 Memcached 服务器。代理将缓存请求转发到你定义的后端池。这种架构可以为高负载缓存需求的应用提供更好的负载均衡和容错能力。核心概念 代理(Proxy)Memcached 内置代理作为前端接口,运行在需要读写缓存数据的客户端应用与底层后端 Memcached 服务器之间。代理支持 Memcached 的基础命令和 meta 命令协议,因此客户端可以像连接普通 Memcached 服务器一样连接代理并与之交互。后端(Backend)在代理化的 Memcached 架构中,后端指代理所使用的底层缓存存储 Memcached 服务器。设置后端不需要任何特殊的 Memcached 配置——它就是一台代理可以通过 TCP/IP 连接的普通 Memcached 服务器。池(Pool)代理配置会将后端组织成一个或多个命名组,称为池。每个池包含一个或多个后端。当代理收到针对某个键的读写缓存请求时,会根据多种条件选择一个池,然后将缓存请求转发到该池中的某个后端。更多信息请参阅路由条件。选定了路由目标池之后,代理会基于请求键的一致性哈希在池内选择单个后端。这样一来,只要某个后端仍存在于池中,同一个键就始终由池内同一个后端处理。在配置池时,你可以微调这种哈希行为的具体参数以及其他池级别设置。Set(集合)更复杂的路由拓扑可能需要再增加一层分组。你可以把池进一步组织成集合。更多信息请参阅将相关池归组为集合。集合可用于把池归类为命名区域,以便设置故障转移优先级。更多信息请参阅使用本地区域为路由设置优先级。路由(Route)代理配置的核心元素是池和路由。每条路由定义以下内容:某种上下文条件与后端池之间的映射关系。例如,一条路由可以将所有以 cust/ 为前缀的键映射到名为 customer_pool 的池。一个路由处理器,从路由库定义的多个处理器中选取。路由处理器告诉代理将请求转发到哪些后端池,以及以何种方式或顺序转发。例如,给定一组后端池,不同的路由处理器可以并行或串行地转发请求,还可以选择先对列表做随机排序。有关定义池和路由的更多信息,请参阅配置内置代理。路由库(Route library)Memcached 项目提供了一个可单独下载的路由库文件。路由库是一个 Lua 源文件,提供了定义池、路由和路由处理器所需的基础路由功能。通常情况下,你让代理原样加载路由库文件即可,无需改动。在更复杂的场景下,你可以用自己的 Lua 代码自由修改或替换该库文件。路由条件 Memcached 代理会根据多种条件决定将数据存储或读取请求转发给哪个已知后端。这些条件包括:键前缀。例如,你可以配置路由器将键 data/12345 的请求发送到一个后端池,而将键 cust/12345 的请求发送到另一个池。没有前缀或前缀无法识别的请求则由指定的默认池处理。你可以配置代理识别各种形态的前缀,前缀与主键名之间可以使用不同的引导字符或分隔符。例如,即使你应用的缓存键更像 --cust//12345 而非 cust/12345,也可以让代理把前者识别为带有 cust 前缀。TCP 端口。例如,你可以让代理同时监听 TCP 端口 11211 和 11212,并根据客户端连接的端口采用不同的路由方式。路由处理器参数。例如,假设你配置代理:每当收到前缀为 cust 的键的缓存请求时,就调用路由处理器 route_allsync{},并传入三个池的列表。那么,向 cust/12345-abcd 存储数据的请求会被并行发送到代理配置文件中 cust 路由定义里 route_allsync{} 调用所列出的全部三个池。有关配置代理池和路由的更多信息,请参阅配置内置代理。代理安装 只有编译 Memcached 二进制文件时启用代理功能,才能使用内置代理。该功能默认不开启。因此,使用代理需要从源码编译 Memcached,而不能通过包管理器安装。更多信息请参阅安装内置代理。代理配置 如果使用 Memcached 内置代理搭配标准路由库,你需要创建一个额外的配置文件,定义代理可用的池,以及代理应如何根据各种条件将请求映射到池。该配置文件同样使用 Lua 语法,但大多数情况下你可以把它当作 Memcached 代理配置专用的有限词汇集来使用。更多信息请参阅配置内置代理。在高级用例中,你可以修改路由库文件,甚至完全用自己的 Lua 代码替换它。这需要深入了解代理配置 API。更多信息请参阅配置 API。代理部署示例 有关代理基础设施的典型用例,请参阅基础设施示例。有关示例代理配置文件,请参阅示例配置文件。内置代理快速入门