问候溢出者,
在Redis的标记/集群设置中,我们是否可以使用带有从站总数的WAIT命令来确保Redis服务器之间的一致性?为什么不?
亲切的问候
我如何告诉 StackExchange.Redis (v1.0.481) 它即将连接到 Redis 集群(v3.2.6,以防万一),而不仅仅是一个独立/复制的实例?例如,当我使用 redis-cli 时,我必须传递一个 -c 标志以使其能够识别集群。StackExchange.Redis 连接字符串中是否有等效标志?
我搜索并遇到了几个包含多个逗号分隔的 host:port 参数的连接字符串示例,但没有任何内容明确使 StackExchange.Redis 集群感知。
谢谢。
我尝试在 AWS Redis 集群上执行 hmset 命令,但出现以下“移动”错误。不知道发生了什么。
移动 7652 10.0.4.210:6379
from rediscluster import StrictRedisCluster
startup_nodes = [{"host": self.host, "port": self.port}]
client = StrictRedisCluster(startup_nodes=startup_nodes,
decode_responses=True,
skip_full_coverage_check=True)
client.hmset('my_key', {'abc':'123'})
Run Code Online (Sandbox Code Playgroud) “对不起,我的英语不是很好”。
这是我的 redis 配置类:
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
@Data
public class RedisClusterProperties {
List<String> nodes;
}
Run Code Online (Sandbox Code Playgroud)
@Configuration
public class RedisConfig {
@Autowired
RedisClusterProperties redisClusterProperties;
@Bean
public RedisConnectionFactory connectionFactory(){
return new JedisConnectionFactory(
new RedisClusterConfiguration(redisClusterProperties.getNodes()));
}
}
Run Code Online (Sandbox Code Playgroud)
接下来是我的 application.properties
spring.redis.cluster.nodes[0] = *.*.*.*:7001
spring.redis.cluster.nodes[1] = *.*.*.*:7002
spring.redis.cluster.nodes[2] = *.*.*.*:7003
spring.redis.cluster.nodes[3] = *.*.*.*:7004
spring.redis.cluster.nodes[4] = *.*.*.*:7005
spring.redis.cluster.nodes[5] = *.*.*.*:7006
Run Code Online (Sandbox Code Playgroud)
接下来是我的测试班
@Component
@Slf4j
public class TestRedis {
@Autowired
RedisConnectionFactory connectionFactory;
@Scheduled(cron = "0 26 18 ? * *")
public void scheduler(){
RedisClusterConnection connection =
connectionFactory.getClusterConnection(); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置Redis集群,并且在这里遵循了此指南:https://rancher.com/blog/2019/deploying-redis-cluster/
基本上,我将创建一个具有副本6的StatefulSet,以便可以拥有3个主节点和3个从属节点。在所有节点启动之后,我创建了集群,并且一切正常……但是,如果查看每个redis节点的文件“ nodes.conf”(应该保存所有节点的配置),可以看到它是空的。这是一个问题,因为每当重新启动redis节点时,它都会在该文件中搜索该节点的配置以更新其自身的IP地址,并与其他节点进行MEET,但是他什么也没找到,因此基本上可以在该节点上启动新集群他自己的,带有新的ID。
我的存储是一个NFS连接的共享文件夹。负责存储访问的YAML是这样的:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-provisioner-raid5
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner-raid5
spec:
serviceAccountName: nfs-provisioner-raid5
containers:
- name: nfs-provisioner-raid5
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-raid5-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: 'nfs.raid5'
- name: NFS_SERVER
value: 10.29.10.100
- name: NFS_PATH
value: /raid5
volumes:
- name: nfs-raid5-root
nfs:
server: 10.29.10.100
path: /raid5
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner-raid5
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: …
Run Code Online (Sandbox Code Playgroud) 我正在考虑在我的应用程序服务器中使用Lettuce和Redisson Java 客户端(以连接到 Redis)。我无法从尝试过这两种方法或其中一种方法的人那里找到对这两种方法的正确比较。我看到的唯一详细比较是here和Redisson自己发布的其他一些链接。我发现的另一个链接是这个SO post,它没有得到很好的接收。
我想听听实际使用过这两个客户端或其中一个客户端的人的意见,他们的经验/用例以及优缺点是什么。我目前有一个集群 Redis 设置,我正在使用 Lettuce。生菜达到了我想要的效果。然而,在故障转移时发现集群中的新节点有一些痛点。我在这个SO 线程中提出了这个问题,并且能够按照答案中的解释解决它。从积极的方面来说,我发现与 Redisson 的文档相比,Lettuce 文档更清晰、更易于遵循。
我主要考虑转向Redisson,因为我希望使用 Redisson 的RedLock 由 Redis实现,以便在我的应用服务器的多个实例之间进行领导者选举。Lettuce 没有提供它的实现。因此,开箱即用的唯一选项是 Redisson。在这种情况下,我还必须完全摆脱 Lettuce 和 Redisson。Redissons 如何支持 Redis 集群部署。我想知道 Redisson 是否报告/未决故障转移时的集群节点发现问题(我在他们的repo 中没有看到任何问题)。我也读到过关于库体积庞大且不如 Lettuce 轻巧的担忧。
鉴于上述问题和我已有的知识,我想了解有关使用这两个客户端的评论,以帮助我做出决定。
谢谢
我正在尝试使用 6 台机器实现 Redis 集群。我有一个由六台机器组成的流浪集群:
192.168.56.101
192.168.56.102
192.168.56.103
192.168.56.104
192.168.56.105
192.168.56.106
Run Code Online (Sandbox Code Playgroud)
所有正在运行的 redis-server
我编辑了以上所有服务器的 /etc/redis/redis.conf 文件添加了这个
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-slave-validity-factor 0
appendonly yes
Run Code Online (Sandbox Code Playgroud)
然后我在六台机器中的一台上运行它;
./redis-trib.rb create --replicas 1 192.168.56.101:6379 192.168.56.102:6379 192.168.56.103:6379 192.168.56.104:6379 192.168.56.105:6379 192.168.56.106:6379
Run Code Online (Sandbox Code Playgroud)
Redis 集群已启动并正在运行。我通过在一台机器上设置值来手动检查它在另一台机器上显示。
$ redis-cli -p 6379 cluster nodes
3c6ffdddfec4e726f29d06a6da550f94d976f859 192.168.56.105:6379 master - 0 1450088598212 5 connected
47d04bc98ab42fc793f9f382855e5c54ab8f2e20 192.168.56.102:6379 slave caf2cec45114dc8f4cbc6d96c6dbb20b62a39f90 0 1450088598716 7 connected
040d4bb6a00569fc44eec05440a5fe0796952ccf 192.168.56.101:6379 myself,slave 5318e48e9ef0fc68d2dc723a336b791fc43e23c8 0 0 4 connected
caf2cec45114dc8f4cbc6d96c6dbb20b62a39f90 192.168.56.104:6379 master - 0 1450088599720 7 connected 0-10922
d78293d0821de3ab3d2bca82b24525e976e7ab63 192.168.56.106:6379 …
Run Code Online (Sandbox Code Playgroud) 我谷歌了一下,找到了两个解决方案:
CLUSTER FORGET
( http://redis.io/commands/cluster-forget )
redis-trib.rb del-node
我认为CLUSTER FORGET
“是正确的做法。
但我真的很想知道有关redis-trib.rb del-node
.
有人可以解释它们之间的区别吗?
我有一个我认为是带有 Redis 的 AWS ElastiCache 的简单 Terraform 配置:
resource "aws_elasticache_replication_group" "my_replication_group" {
replication_group_id = "my-rep-group",
replication_group_description = "eln00b"
node_type = "cache.m4.large"
port = 6379
parameter_group_name = "default.redis5.0.cluster.on"
snapshot_retention_limit = 1
snapshot_window = "00:00-05:00"
subnet_group_name = "${aws_elasticache_subnet_group.my_subnet_group.name}"
automatic_failover_enabled = true
cluster_mode {
num_node_groups = 1
replicas_per_node_group = 1
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法定义端点输出:
output "my_cache" {
value = "${aws_elasticache_replication_group.my_replication_group.primary_endpoint_address}"
}
Run Code Online (Sandbox Code Playgroud)
当我通过 terragrunt 运行 apply 时,我得到:
错误:运行计划出错:发生 1 个错误:
module.mod.output.my_cache:资源“aws_elasticache_replication_group.my_replication_group”没有变量“aws_elasticache_replication_group.my_replication_group.primary_endpoint_address”的属性“primary_endpoint_address”
我在这里做错了什么?
amazon-web-services amazon-elasticache terraform redis-cluster
我一直在尝试根据 Helm Chart 中安装在 kubernetes 中的 Redis 集群来配置分布式 RedLock stable/redis-ha
。理想情况下,我希望集群有多个副本(主/辅助复制)。
我正在遵循使用 StackExchangeRedis 和 Redlock.Net 进行设置的标准示例
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");
var multiplexers = new List<RedLockMultiplexer>
{
redis
};
var redlockFactory = RedLockFactory.Create(multiplexers);
var resource = "the-thing-we-are-locking-on";
var expiry = TimeSpan.FromSeconds(30);
using (var redLock = await redlockFactory.CreateLockAsync(resource, expiry))
{
//This is almost always false and the lock status is NoQuorum
if (redLock.IsAcquired)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的行为是,即使在单用户环境中,通常也不会获取锁。状态为 NoQuorum,这表明 RedLock .Net 无法获得多数票,但在我当前的测试集群中,我只有一个副本。我已经让它工作了几次,但它通常不稳定并且随机停止工作。
我已经找到了关于集群锁定的部分https://github.com/samcook/RedLock.net
基本上我的理解是有基本的支持,但是你必须直接连接到集群中的所有副本。
以前有人成功地针对集群配置过分布式锁定吗?
redis-cluster ×10
redis ×8
c# ×2
consistency ×1
java ×1
kubernetes ×1
lettuce ×1
redisson ×1
redlock.net ×1
spring-boot ×1
terraform ×1