为何Lettuce需向Redis集群所有节点(含副本)发送脚本加载命令?
为啥Lettuce要给Redis集群所有节点发Lua脚本加载命令?
Redis主从复制管不到
SCRIPT LOAD操作:主从复制只会同步脚本的执行结果,不会同步脚本的缓存动作。你在主节点用SCRIPT LOAD把脚本存进缓存后,从节点不会自动跟着缓存这个脚本——只有当主节点执行该脚本时,从节点才会拿到完整脚本内容去执行,但执行完不会把它存在自己的缓存里。要是之后请求打到从节点,用EVALSHA调用脚本,就会因为从节点没缓存而报错。Lettuce要保证全集群脚本缓存一致:
scriptLoad默认给所有节点发命令,就是为了让集群里不管主节点还是从节点,都提前把脚本缓存好。这样不管后续请求路由到哪个节点(比如你开了从节点读请求的话),用EVALSHA都能直接执行,不会出问题。遇到节点宕机的解决办法:如果你能接受从节点首次执行脚本时传完整内容的开销,或者根本不会从从节点调用脚本,可以改Lettuce的配置,让
scriptLoad只发给主节点,这样就算有从节点宕机也不会影响加载操作。
内容的提问来源于stack exchange,提问作者Peter Phan
相关产品推荐
相关产品推荐

