目前,我们的Redis设置涉及Jedis + 分片。向上和向下扩展涉及手动添加/删除分片,这是大量的操作工作。我们还严重依赖管道,因为我们每秒进行大量写入。
因此,我们正在研究 Redis 集群来自动化分片过程。然而,对我们来说,一个问题是 Jedis 不支持 Redis 集群的管道: https://groups.google.com/forum/#!msg /redis-db/4I0ELYnf3bk/Lrctk0ULm6AJ
我们知道Codis支持流水线+自动分片,但由于其对Zookeeper的依赖,需要大量的运维工作来维护。它也是 Redis 的一个分支,因此可能不会随上游更改而更新。如果没有好的解决方案将管道与官方 Redis 集群实现一起使用,我们很可能会使用它。
只是想知道官方 Redis 集群是否可以进行管道传输?也许以替代 Redis 客户端的形式?
我正在使用 spring redisTemplate 和 redis 扫描
它可以在单节点的情况下查找。
但在集群环境下就不行了
我无法获取数据。
有没有办法在集群环境中获取扫描数据?
这是我的 spring redisTemplate 代码。
//String key="products:aa";
//String key="products:aac";
//String key="products:ab";
//String key="products:ac";
String workKey="products:aa*";
ScanOptions options = ScanOptions.scanOptions().match(workKey).count(100).build();
ScanOptions options1 = ScanOptions.scanOptions().build();
RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
RedisConnection conn = factory.getConnection();
Cursor<byte[]> cursor = conn.scan(options);
List<Product> result = new ArrayList<Product>();
while(cursor.hasNext()){
String key=new String((byte[]) cursor.next());
Product pa=getById(key.replace("products:",""));
result.add(pa);
}
//result
//String key="products:aa";
//String key="products:aac";
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个地址上的 8 个副本的集群连接到另一个地址上的现有集群。
副本服务器均以集群模式运行。
当我尝试执行以下任一操作时:
./redis-trib.rb add-node --slave REPLICA_IP:6380 MASTER_IP:6380
或者
./redis-cli --cluster add-node REPLICA_IP:6380 MASTER_IP:6380 --cluster-slave
我得到同样的结果;
Waiting for the cluster to join...........................
无限期地挂起。
两台服务器绝对可以看到对方,并且我可以从任一服务器连接到任何相关的 redis 节点(副本或主节点)。发现/交流端口(16830 等)也全部开放且可联系。这些命令的输出还表明已找到集群,因为它显示了每个节点及其正确的节点 ID。
这是任一 add-node 命令的完整输出:
>>> Adding node REPLICA_IP:6380 to cluster MASTER_IP:6380
>>> Performing Cluster Check (using node MASTER_IP:6380)
M: 043a5fa4fdca929d3d87f953906dc7c1f030926c MASTER_IP:6380
slots:[0-2047] (2048 slots) master
M: e104777d31630eef11a01e41c7d3a6c98e14ab64 MASTER_IP:6386
slots:[12288-14335] (2048 slots) master
M: 9c807d6f57a9634adcdf75fa1943c32c985bda1c MASTER_IP:6384
slots:[8192-10239] (2048 slots) master
M: 0f7ec07deff97ca23fe67109da2365d916ff1a67 MASTER_IP:6383
slots:[6144-8191] (2048 slots) master
M: 974e8b4051b7a8e33db62ba7ad62c7e54abe699d MASTER_IP:6382
slots:[4096-6143] (2048 …Run Code Online (Sandbox Code Playgroud) 我们在生产环境中广泛使用 redis-cluster。我们目前有一个 30 节点的集群(15 个主节点,15 个从节点)我们正在尝试增加集群,为此我们已经创建了新的服务器并将它们加入到集群中。到目前为止一切都很好。
接下来 - 我们正在尝试将插槽重新分片给新的主人。我们使用redis-trib reshard命令编写了一个脚本来执行此操作。
但是 - 迁移中途失败(但离开始不是很远)并出现以下错误:
[ERR] Calling MIGRATE: ERR Target instance replied with error: BUSYKEY Target key name already exists.
这种情况偶尔会发生,有时它会在失败之前设法移动一些插槽,有时它会在第一个插槽上失败。每个此类故障都需要手动修复操作,这使得重新分片操作非常难以管理。
除了停机迁移之外,我们还没有找到任何具体的例子,也没有任何关于如何防止这种情况的想法。我们正在努力避免。
版本:
redis server 4.0.2
redis trib 3.3.3(在此问题后从 4.0.2 降级:redis cluster reshard [ERR] Calling MIGRATE: ERR Syntax error)
我们的下一步是升级到最新的 redis (4.0.11),即使我们在此问题的发行说明中没有找到任何指示。
希望听到我们做错了什么以及如何修复它,或者 redis-cluster 不是为实时重新分片而构建的?
谢谢
我正在尝试使用 python 3.8 中的 RedisCluster 模块连接到 redis 集群。
redis-py-cluster==2.1.0
Run Code Online (Sandbox Code Playgroud)
更新:添加 ssl=True 后,连接现在可以工作了。
然而,仍然抛出一个 AttributeError 是一个问题。这是 rediscluster 模块的一个可能的错误吗?
from rediscluster import RedisCluster
_host = os.getenv('REDIS_HOST')
_port = os.getenv('REDIS_PORT', 6379)
_password = os.getenv('REDIS_PASSWORD')
try:
startup_nodes = [{"host": _host, "port": _port}]
_redis_client = RedisCluster(startup_nodes=startup_nodes, decode_responses=True, ssl=True, password=_password)
except Exception as x:
print(x)
Run Code Online (Sandbox Code Playgroud)
错误信息:
{"event": "Starting gunicorn 20.0.4", "logger": "gunicorn.error", "level": "info", "timestamp": "2020-09-29T18:20:28.031445Z"}
{"event": "Listening at: http://0.0.0.0:8081 (1)", "logger": "gunicorn.error", "level": "info", "timestamp": "2020-09-29T18:20:28.032004Z"}
{"event": "Using worker: sync", "logger": "gunicorn.error", "level": "info", "timestamp": …Run Code Online (Sandbox Code Playgroud) 我有一个 Azure Redis 缓存 - 启用了高级和集群。我一直在尝试使用spring-boot-starter-data-redis(spring boot version: 2.3.4.RELEASE, Java version: 11) 并使用生菜客户端连接到该 Redis ,但是当我将 Redis 视为 Redis 集群时,生菜抛出以下 SSL 异常,但在使用它时连接很好作为独立的 Redis 服务器。
我的pom.xml依赖项是:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
爪哇代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.*;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration
class LettuceConfig {
@Bean
StringRedisTemplate getStringRedisTemplate(final RedisProperties redisProperties) { …Run Code Online (Sandbox Code Playgroud) 我想设置redis集群有6个节点(node1,node2,node3,node4,node5,node6),它有3个主服务器和3个从服务器.每个节点都有此配置文件
redis.conf
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 10000
appendonly yes
Run Code Online (Sandbox Code Playgroud)
创建集群时出错.创建命令:
redis-trib.rb create --replicas 1 node1:6379 node2:6379 node3:6379 node4:6379 node5:6379 node6:6379
Run Code Online (Sandbox Code Playgroud)
错误:
>>> Creating cluster
Connecting to node node1:6379: OK
Connecting to node node2:6379: OK
Connecting to node node3:6379: OK
Connecting to node node4:6379: OK
Connecting to node node5:6379: OK
Connecting to node node6:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
node6:6379
node5:6379
node4:6379
Adding replica node3:6379 to node6:6379
Adding replica node2:6379 to …Run Code Online (Sandbox Code Playgroud) 我有3台计算机并为Redis集群创建6个节点,我已经在几个月前成功创建了它,但是现在已删除,我尽力修复它,但是它不起作用,因此我清理所有数据并从零开始重新创建它,当我使用以下命令创建集群时,它在这里阻塞,并等待节点加入集群,我为此做了一些研究,我清理了数据,一次又一次地记录日志,一次又一次地执行,但是仍然无法正常工作。
redis-trib.rb create --replicas 1 10.2.1.208:6379 10.2.1.208:6380 10.2.1.209:6379 10.2.1.209:6380 10.2.1.15:6379 10.2.1.15:6380
Run Code Online (Sandbox Code Playgroud)
redis-trib.rb create --replicas 1 10.2.1.208:6379 10.2.1.208:6380 10.2.1.209:6379 10.2.1.209:6380 10.2.1.15:6379 10.2.1.15:6380
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.2.1.208:6379
10.2.1.209:6379
10.2.1.15:6379
Adding replica 10.2.1.209:6380 to 10.2.1.208:6379
Adding replica 10.2.1.208:6380 to 10.2.1.209:6379
Adding replica 10.2.1.15:6380 to 10.2.1.15:6379
M: 73b3b99bb17de63aa99eaf592376f0a06feb3d66 10.2.1.208:6379
slots:0-5460 (5461 slots) master
S: 05b33ed6691797faaf7ccec1541396472b9d2866 10.2.1.208:6380
replicates f14702ebb1462b313dd7eb4809ec50e30e4eef36
M: f14702ebb1462b313dd7eb4809ec50e30e4eef36 10.2.1.209:6379
slots:5461-10922 (5462 slots) master
S: 3a9f433a8503281b0ddfc6ec69016908735053b8 10.2.1.209:6380
replicates 73b3b99bb17de63aa99eaf592376f0a06feb3d66
M: 2fd97e8842828dba6b425b6a30e764fb06915737 …Run Code Online (Sandbox Code Playgroud) [更新]:当前redis将每个已发布的消息发送到整个集群中的每个节点:
/* -----------------------------------------------------------------------------
* CLUSTER Pub/Sub support
*
* For now we do very little, just propagating PUBLISH messages across the whole
* cluster. In the future we'll try to get smarter and avoiding propagating those
* messages to hosts without receives for a given channel.
* -------------------------------------------------------------------------- */
void clusterPropagatePublish(robj *channel, robj *message) {
clusterSendPublish(NULL, channel, message);
}
Run Code Online (Sandbox Code Playgroud)
这是问题的原始文本,这是不正确的:
据我所知,我需要:
给定一个通道,找到拥有该哈希槽的节点.
订阅该节点以及群集:插槽以检测迁移.
在插槽迁移时,订阅新节点上的通道并保持旧连接打开.
将消息从旧连接转发到应用程序,直到它关闭并记住这些消息.
迁移完成并关闭旧连接后,转发来自新连接的消息,修剪来自第一个连接的记忆消息.
golang redis客户端库中的任何一个都可以这样做吗?我已经浏览了很多,感觉我需要自己编写这个逻辑,不断轮询
CLUSTER SLOTS或监听该信息的pubsub,以了解分片何时增加或减少,并将我现有的pubsub脚本从一个服务器移动到另一个服务器.也就是说,即使分片数量发生变化,也有很多golang库可以处理普通的GET密钥.但是pubsub和cluster是另一回事吗?
我正在使用以下命令连接到 AWS redis 集群
redis-cli -c -h host.amazonaws.com -p 6379
Run Code Online (Sandbox Code Playgroud)
我从 springboot 应用程序将两个键“X1”和“X2”推送到 redis 缓存中(API 方法未用注释)@Cacheable,现在当我从 cli 终端运行时,KEYS *它会列出“X1”或“X2”,但不会同时列出两者。不过,两个键的 GET 都可以正常工作。
info keyspace返回以下内容;
键空间
db0:keys=11,expires=1,avg_ttl=1975400
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?