我的应用程序使用该StackExchange.Redis
包,我开始使用sentinel体系结构,以支持高可用性和故障.
我在网上搜索,试图ConnectionMultiplexer
在使用哨兵架构时找到正确的方法来使用该对象,并且无法找到有用的答案.
有些帖子说它不支持它或部分支持它,有些帖子告诉你将所有redis连接地址添加到连接字符串,有些帖子告诉你,他们通过订阅事件提供了自定义实现.
那么,ConnectionMultiplexer
支持这种架构吗?
如果答案是肯定的,我的连接字符串应该如何?
我正在使用以下配置启动 redis 和哨兵节点。我首先启动redis节点,当我启动Sentinel时,如果失败并出现错误:
sentinel_node |
sentinel_node | *** FATAL CONFIG FILE ERROR ***
sentinel_node | Reading the configuration file, at line 1
sentinel_node | >>> 'sentinel monitor MasterRedis redis_node 6000 3'
sentinel_node | Can't resolve master instance hostname.
sentinel_node exited with code 1
Run Code Online (Sandbox Code Playgroud)
Redis 撰写
version: '2.1'
services:
redis:
image: redis
container_name: redis_node
environment:
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 6000:6000
volumes:
- ./redis_startup.sh:/usr/local/bin/redis_startup.sh
- ./redis_server_stop.sh:/usr/local/bin/redis_server_stop.sh
command: ["redis_startup.sh", "-port", "6000"]
Run Code Online (Sandbox Code Playgroud)
redis_startup.sh
redis-server --port ${port:-6000}
Run Code Online (Sandbox Code Playgroud)
哨兵撰写
version: '2.1'
services:
sentinel:
image: redis
container_name: …
Run Code Online (Sandbox Code Playgroud) 我尝试了以下错误消息推荐的所有内容:
(错误)DENIED Redis正在受保护模式下运行,因为启用了保护模式,未指定绑定地址,也未向客户端请求身份验证密码.在此模式下,仅从环回接口接受连接.如果要从外部计算机连接到Redis,可以采用以下解决方案之一:1)通过从服务器的同一主机连接到Redis,只需禁用保护模式从环回接口发送命令'CONFIG SET protected-mode no'正在运行,但如果您这样做,则无法通过互联网公开访问.使用CONFIG REWRITE使此更改成为永久更改.2)或者,您可以通过编辑Redis配置文件并将protected mode选项设置为"no"来禁用保护模式,然后重新启动服务器.3)如果您手动启动服务器进行测试,请使用"--protected-mode no"选项重新启动它.4)设置绑定地址或验证密码.注意:您只需要执行上述操作之一,服务器就可以开始接受来自外部的连接.
我的/etc/redis/sentinel.conf
:
daemonize yes sentinel myid XXX sentinel monitor master XXX 6379 2 sentinel down-after-milliseconds master 60000 sentinel config-epoch master 0 protected-mode no bind 0.0.0.0 port 26379
编辑:我的/etc/redis/redis.conf
:
port 6379 bind 0.0.0.0 protected-mode no
我也尝试过添加sentinel auth-pass master XXX
.
我的整个后端都在私有子网上.我已经进入防火墙后面的数据中心,来自同一个专用网络,我仍然可以只在本地连接而不会收到令人沮丧的错误消息.
服务器环境: Debian 8,Redis 3.2.6
客户端环境: Ubuntu 16.10,redis-cli 3.2.1
Redis实例: 3个
Sentinel实例: 3
我不只是一个,而是建议的3/4(没有设置命令行标志).有没有人有任何指导或想法?我显然遗漏了一些我无法从错误消息,文档,Stackoverflow,Google和试错中找到的东西.在想深入了解源代码之前,我想先在这里发一个问题.
任何帮助表示赞赏.谢谢!
...而且,是的,我在配置更改后重新启动了守护进程.:)
我正在尝试提高将数据写入redis集群的性能。我们计划从 redi-sentinel 迁移到集群模式以实现可扩展性。
但是,与redis-sentinel相比,写操作的性能要差很多。我们在redis-sentinel中利用了管道,但集群模式不支持管道。
因此,我正在考虑将前往同一节点的所有密钥分组,并使用管道将批次发送到该特定节点。
所以,我想知道如何知道/计算(在写入集群之前)特定密钥将写入哪个节点/插槽?
我正在尝试在docker swarm中创建一个Redis集群.我正在使用bitnami-redis-docker图像来创建我的容器.通过bitnami文档,他们总是建议使用1个主节点,而不是阅读Redis文档,该文档声明应该至少有3个主节点,这就是为什么我对哪一个是正确的感到困惑.鉴于所有bitnami slave默认为只读,如果我在其中一个swarm leader节点中只设置了一个master,如果它失败了,我相信sentinel将尝试将不同的slave redis实例作为master提升,但鉴于它只读是所有写操作都会失败.如果我改变它以使主redis实例global
意味着它将在swarm中可用的所有节点中创建,在这种情况下我是否需要sentinel?此外,如果以下设置是好的,是否有理由引入负载均衡器?
+------------------+ +------------------+ +------------------+ +------------------+
| Node-1 | | Node-2 | | Node-3 | | Node-4 |
| Leader | | Worker | | Leader | | Worker |
+------------------+ +------------------+ +------------------+ +------------------+
| M1 | | M2 | | M3 | | M4 |
| R1 | | R2 | | R3 | | R4 |
| S1 | | S2 | | S3 | | S4 |
| …
Run Code Online (Sandbox Code Playgroud) 我想在coreOS集群上部署高可用性Redis,我需要一个可以工作的Redis Sentinel docker镜像(即Dockerfile).我已经收集了足够的信息/专业知识来创建一个(我认为)...但是我对高级网络的有限知识/经验是阻止我构建和共享它的唯一因素.
这里的专家可以帮我开发一个Redis Sentinel Dockerfile(现在不存在)吗?Redis/Docker社区真的会从中受益.
这是更广泛的问题和背景:https: //github.com/antirez/redis/pull/1908
我认为解决方案就在这里:https: //github.com/antirez/redis/pull/1908#issuecomment-54380876
这是我一直在使用的Dockerfile ...但如果你阅读上面的帖子,你会看到我的评论(joshula)......它缺乏mattsta所说的网络修复.请注意,因为我在coreOS上使用它,所以sentinel.conf中的任何配置设置都是在运行时通过命令行设置的(因此为ENTRYPOINT).
# Pull base image.
FROM dockerfile/ubuntu:latest
# Install Redis.
RUN \
cd /tmp && \
wget http://download.redis.io/redis-stable.tar.gz && \
tar xvzf redis-stable.tar.gz && \
cd redis-stable && \
make && \
make install && \
cp -f src/redis-sentinel /usr/local/bin && \
mkdir -p /etc/redis && \
cp -f *.conf /etc/redis && \
rm -rf /tmp/redis-stable* && \
sed -i 's/^\(bind .*\)$/# \1/' /etc/redis/redis.conf && …
Run Code Online (Sandbox Code Playgroud) 我将 Jedis Java 客户端用于 Redis,它非常棒。我分别使用了集群 (JedisCluster) 和高可用性 (JedisSentinelPool) 的功能。
这两种实现单独工作就像一个魅力,但它似乎不是一种同时使用两者的方法。
我希望在故障转移时自动提升高可用性,并在主站失败时自动发现其他主站(就像哨兵一样)。我知道 Redis-cluster 会自动进行故障转移,并且它还提供某种拓扑的自动发现。但是 Jedis-Cluster 似乎没有提供任何方法来处理自动故障转移并充分利用 Jedis 集群。
有没有办法用 JedisClient 实现自动故障转移?
JedisSentinel 和 JedisCluster 可以一起使用吗?
一些帖子表明这是不可能的:https : //groups.google.com/forum/#!topic/jedis_redis/HtDblX771bs
Jedis git 上关于此主题的文档有限。
我们有一个带有两个redis服务器的redis配置.我们还有3个哨兵来监控这两个实例并在需要时启动故障转移.
我们目前有一个流程,我们定期在redis服务器上进行FLUSHALL.这是一个阻塞操作,花费的时间比我们为哨兵分配的时间要长.换句话说,我们的哨兵配置包括:
sentinel down-after-milliseconds OurMasterName 5000
并且在服务器上执行redis-cli FLUSHALL需要> 5000毫秒,因此哨兵会启动故障转移.
我们承认做FLUSHALL并不是很好,而且我们也知道我们可以增加毫秒级的时间,但为了这个问题的目的,假设这些都不是选项.
问题是:如果由于FLUSHALL阻塞超过5000毫秒而我们的哨兵没有启动故障转移,我们怎么能进行FLUSHALL(或等效操作)?有没有人遇到并解决了这个问题?
我们计划将Redis用作集中式和高可用性缓存,因此我们使用Redis以及twemproxy和sentinel查看了Redis Labs企业集群和本地集群式设置.在研究RELC时,我们偶然发现了这个链接:
其中说 - RLEC适用于任何标准Redis客户端,包括独立的Redis客户端和Redis群集客户端.
究竟什么是开源Redis集群,我该如何使用它?这与独立的Redis不同吗?为什么在开源版本可用时才使用RELC,仅用于支持?我没有找到任何详细说明差异的来源,所以如果有人使用过这些解决方案之一,请解释为什么选择一个而不是另一个.
我redis replication
和sentinel
建筑师有这个:
5个服务器:.1
、.2
、.3
和.4
.5
.1
:nodejs应用程序、redis主控、redis哨兵.2
:nodejs应用程序,redis从属.3
:nodejs应用程序,redis从属.4
:redis哨兵.5
:redis哨兵Sentinel 按预期处理故障转移。
redis-cli -h x.y.z.5 -p 26379 sentinel get-master-addr-by-name mymaster
总是返回.1
服务器。
我连接到此复制的代码(我使用ioredis):
let sentinels = [
{ host: process.env.REDIS_SENTINEL_1, port: process.env.REDIS_PORT },
{ host: process.env.REDIS_SENTINEL_2, port: process.env.REDIS_PORT },
{ host: process.env.REDIS_SENTINEL_3, port: process.env.REDIS_PORT }
]
store = new Redis({
name: 'mymaster',
sentinels: sentinels
})
store.on('ready', () => {
store.set('foo', new Date()) …
Run Code Online (Sandbox Code Playgroud)