ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ioredis Cluster 怎么配置 scaleReads 读写分离把读查询发往副本节点?

ioredis Cluster 怎么配置 scaleReads 读写分离把读查询发往副本节点? ioredis Cluster 怎么配置 scaleReads 读写分离把读查询发往副本节点【免费下载链接】ioredis A robust, performance-focused, and full-featured Redis client for Node.js.项目地址: https://gitcode.com/GitHub_Trending/io/ioredis如果你的 Node.js 应用连接着一个带副本的 Redis Cluster每个 master 后面挂了几台 slave并且希望把读查询分散到副本节点上、只把写留在 masterioredis 的Cluster客户端提供了scaleReads选项来完成这件事。在构造Redis.Cluster时把scaleReads设置为slave或一个自定义选节点函数ioredis 就会按角色路由命令写命令发往 master读命令发往 slave或你指定的节点。前提条件一个可访问的 Redis Cluster且至少一个 master 带有副本。README 中 Cluster 连接的典型形态是“三个或更多 master每个 master 带若干 slave”已安装 ioredis当前主版本 6.x 要求 Node.js 20npm install ioredisioredis 的Cluster构造函数接收两个参数第一个是集群启动节点列表第二个是集群选项。节点列表不需要列全所有节点客户端连上任意一个节点后会通过CLUSTER SLOTS自动发现其余节点const Redis require(ioredis); const cluster new Redis.Cluster( [ { port: 6380, host: 127.0.0.1 }, { port: 6381, host: 127.0.0.1 }, ], { // 集群选项scaleReads 配置在这里 } );配置 scaleReadsscaleReads的默认值是master即 ioredis 永远不会把任何查询发往 slave。README 的 “Read-Write Splitting” 一节列出了另外三种取值all写查询发往 master读查询随机发往 master 或 slaveslave写查询发往 master读查询发往 slave自定义函数function(nodes, command): node由你的函数决定读查询发往哪个节点写查询仍然发往 master。函数参数nodes中的第一个节点永远是服务相关槽位的 master如果函数返回一个节点数组则会从该列表中随机选择一个节点。只把读打到副本上的配置const cluster new Redis.Cluster( [ /* nodes */ ], { scaleReads: slave, } ); cluster.set(foo, bar); // This query will be sent to one of the masters. cluster.get(foo, (err, res) { // This query will be sent to one of the slaves. });如果需要按命令名精确控制读路由例如GET走第一个副本、其他读命令走第二个副本使用函数形式写法可以参考仓库测试 test/functional/cluster/index.ts 中的用例const cluster new Redis.Cluster( [ /* nodes */ ], { scaleReads: function (node, command) { if (command.name get) { return node[1]; } return node[2]; }, } );其中node[0]是负责该 key 槽位的 masternode[1]、node[2]依次是其副本。Cluster的选项类型定义见 lib/cluster/ClusterOptions.ts节点选择逻辑见 lib/cluster/index.ts。验证路由是否生效文档给出的验证方式就是上面这段set/get示例配置scaleReads: slave后set会由某台 master 处理get会由某台 slave 处理读到的值应与刚写入的一致。需要注意 README 明确给出的一个提示原文 NB在上面的代码片段里由于 master 和 slave 之间存在复制延迟res可能不等于bar。也就是说刚写入立刻从副本读取时读到旧值属于预期行为配置本身没有问题。如果选项值写错例如scaleReads: invalid构造客户端时会直接抛出Invalid option scaleReads invalid错误这是发现配置拼写问题的最快方式可参见单元测试 test/unit/clusters/index.ts。限制与注意事项只有读命令才会被路由到副本即使配置了slave写命令仍然始终发往 master函数形式下同理文档明确说明 “write queries keep being sent to master”。ioredis 内部根据命令是否为只读命令来判断路由见 lib/cluster/index.ts 中的isCommandReadOnly判断。复制到副本存在延迟依赖强一致读的场景不适合把读打到 slave这是 README 在示例后明确提示的取舍。每个scaleReads取值下 ioredis 的实际路由行为都有对应功能测试覆盖master只读 master、slave读 slave 写 master、all随机、custom 按函数选择可参考 test/functional/cluster/index.ts 中的describe(scaleReads)部分核对预期行为。scaleReads与 autopipelining 兼容开启enableAutoPipelining时ioredis 会把读写命令拆到不同的 pipeline 中保证写命令路由到 master见 lib/autoPipelining.ts 的处理逻辑。完整说明以 README.md 的 “Read-Write Splitting” 小节为准选项默认值汇总在 lib/cluster/ClusterOptions.ts 的DEFAULT_CLUSTER_OPTIONS中。【免费下载链接】ioredis A robust, performance-focused, and full-featured Redis client for Node.js.项目地址: https://gitcode.com/GitHub_Trending/io/ioredis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表