我们在生产环境中广泛使用redis集群。我们目前有一个30个节点的集群(15个主服务器,15个从服务器)我们正在尝试增加集群,为此我们创建了新的服务器
接下来-我们试图重新加载插槽到新的主人。我们编写了一个脚本来实现这一点,使用redis-trib
reshard
命令。
但是-迁移中途失败(但距离开始不远),出现以下错误:[ERR]调用MIGRATE:ERR目标实例时回答错误:BUSYKEY目标密钥名称已存在
这种情况偶尔发生,有时它会在失败之前移动一些插槽,有时它会在第一个插槽上失败。每次此类故障都需要手动修复操作,这使得reshard操作很难管理。
除了停机迁移之外,我们还没有找到任何具体的例子,也没有任何关于如何防止这种情况的想法。这是我们试图避免的。
版本:
redis server 4.0.2
redis trib 3.3.3(在出现此问题后从4.0.2降级:redis cluster reshard[ERR]调用迁移:ERR语法错误)
我们的下一步是升级到最新的redis(4.0.11),尽管我们在本期的发行说明中没有发现任何迹象。
希望听到我们做错了什么,以及如何修复它,或者redis集群不是为实时重播而构建的?
谢谢
我在为我们自己的项目使用redis集群支持时遇到过这样的问题。我发现redis-trib reshard
命令有问题。如果没有密钥存储在从一个主机迁移到另一个主机的插槽中,它可以正常工作。
但是redis-5(仍在开发中,还不稳定)有自己的redis-cli,我认为重新调整命令没有问题。只有较低版本的5才会发生。
如果你看一下redis的官方文档,比如redis重新配置和redis集群重播,你会发现他们在内部是如何重播的。
因此,我通过运行bash脚本而不是运行redis-trib-reshard
命令来完成这些任务,从而解决了这个问题。
假设您想将一些插槽从一个主节点重定向到另一个主节点。我们将把当前拥有散列槽所有权的节点称为源节点,并将要迁移目标节点的节点称为目标节点。
对于每个插槽,请执行以下步骤:
记住,根据redis官方文档,这些步骤的顺序在这里很重要。
>
群集设置批MIGRATEtarget_hosttarget_porttarget_database_id超时
在Redis集群中,不需要指定0以外的数据库,但MIGRATE是一个通用命令,可用于不涉及Redis集群的其他任务。
这里还提供了一个简单的bash脚本示例:
Source-ip:172.17.0.5
. Source-id:1f70a5107e0042a7d33a9efaf88dbdfed78076a
目标ip:172.17.0.4
。目的地id:7e428bae84697a3882ecad19bd0d13ac7ee97d02
另一个主ip:172.17.0.7
for i in `seq 0 5460`; do
redis-cli -c -h 172.17.0.4 cluster setslot ${i} importing 1f70a5107e0042a7d33a9efaf88dbdfecd78076a
redis-cli -c -h 172.17.0.5 cluster setslot ${i} migrating 7e428bae84697a3882ecad19bd0d13ac7ee97d02
while true; do
key=`redis-cli -c -h 172.17.0.5 cluster getkeysinslot ${i} 1`
if [ "" = "$key" ]; then
echo "there are no key in this slot ${i}"
break
fi
redis-cli -h 172.17.0.5 migrate 172.17.0.4 6379 ${key} 0 5000
done
redis-cli -c -h 172.17.0.5 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
redis-cli -c -h 172.17.0.4 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
redis-cli -c -h 172.17.0.7 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
done
我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运
Redis 集群(Redis Cluster) 是 Redis 提供的分布式数据库方案。 既然是分布式,自然具备分布式系统的基本特性:可扩展、高可用、一致性。 Redis 集群通过划分 hash 槽来分片,进行数据分享。 Redis 集群采用主从模型,提供复制和故障转移功能,来保证 Redis 集群的高可用。 根据 CAP 理论,Consistency、Availability、Partition
为 Redis 自带的主从复制提供主从切换方案。 2. TwenProxy 3. Redis Cluster 4. Codies 参考资料 Redis 集群方案
配置:三个redis集群分区,跨越三组一主一从。当主机停机时,莴苣立即检测到停机并开始重试。然而,莴苣没有检测到关联的从属服务器已将自己升级为主服务器,并继续使用无法访问且最终超时的旧主服务器重试。尝试将各种拓扑刷新选项设置为无效。 建议的解决方案:在第一次重试失败(这是一行中第二次重试失败)后,使用提供的任何节点的拓扑(因为它们都具有相同的拓扑信息)重新运行拓扑刷新(用于在初始化期间导出拓扑)。
我知道redis sentinel是在多个redis实例之间配置HA(高可用性)的一种方式。正如我所看到的,在任何给定的时间,都有一个redis实例主动地为客户机请求服务。另外还有两个服务器处于待机状态(等待发生故障,因此其中一个可以再次运行)。 是资源浪费吗? 是否有更好的方法充分利用现有资源? Redis集群是Redis Sentinel的替代方案吗? 我已经查了redis的sentinel和
本文向大家介绍Redis集群策略相关面试题,主要包含被问及Redis集群策略时的应答技巧和注意事项,需要的朋友参考一下 redis包含三种集群策略 主从复制 哨兵 集群