Redis 集群要求所有节点都能看到对方聊天;为了适应一些琐碎的情况(例如,所有节点都公开的 docker),提供了一些额外的配置选项:
cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380
Run Code Online (Sandbox Code Playgroud)
(有关这些选项的唯一可用文档,请参阅http://download.redis.io/redis-stable/redis.conf)
请注意,这些值被硬编码到配置文件中。这是非常不方便的。
是否可以以某种方式将 redis 配置为使用主机名而不是端点的 IP?有什么解决方法吗?
作为为什么需要这样做的具体示例,请考虑尝试通过 Dockerfile 在单个容器上具有多个 redis 实例的 docker 镜像中配置测试 redis 集群:
如果cluster-announce-ip设置了,则所有节点都尝试通过 进行聊天cluster-announce-ip。
如果cluster-announce-ip是外部IP,由于docker镜像在运行-p期间没有运行docker build...,外部IP不可用,无法配置集群。
如果cluster-announce-ip未设置,则可以配置集群,但由于 ip 是 docker-internal,一旦集群运行,就无法从外部看到它(外部客户端会在收到MOVED 10.0.0.x:2321外部客户端不可见的a 时抱怨)。
您必须使用docker build ...然后手动配置节点来docker commit ...对结果进行快照。\
当您在不同的物理主机上运行容器时,您必须手动更新映像以更改公告 ip(使用 DHCP 时,这变得更加成问题)。
我很欣赏 docker swarm 是解决这个问题的一种可能的解决方案,但对于测试目的(例如本地开发),它不是一个相关的解决方案。
简单地使用主机名而不是 ips 将允许开发人员只使用主机文件条目进行连接,而不必为每个开发人员手动更新 docker 映像(显然每个开发机器都有自己的外部 ip)。
我正在尝试 nginx 的动态上游配置,但找不到任何好的解决方案来实现来自第三方源(如 redis 或 mysql)的上游配置。
其背后的想法是在主服务器中拥有单个文件配置,并根据环境条件将请求代理到各种应用程序服务器。考虑一下动态部署,其中有 X 个服务器在不同端口上运行 Y 个工作线程。例如,我创建一个新应用程序并部署。应用程序管理器选择一个服务器,然后推出一个工作程序(Ruby/PHP/Python),然后将 ip:port 报告给中央数据库,状态为“up”。此时,当我转到给定的 url 时,nginx 应该将所有请求代理到指定的 ip:port 上游。整个事情与 Heroku 所做的非常相似,除了这个概念验证不应该准备好生产,主要是为了内部需求。
我发现的最简单的解决方案是使用带有基于 ruby 的 DNS 服务器的解析器。它可以工作,nginx 正确获取 IP 地址,但唯一的问题是您无法为该 IP 定义端口号。
第二个解决方案(我还没有尝试过)是使用其他东西作为代理服务器,可能是用 Erlang 编写的。在这种情况下,我们需要使用一些东西来提供静态内容。
有什么想法如何以更灵活和稳定的方式实现这一点?
PS 一些研究选择:
正如标题所说。我正在考虑使用 redis 创建一个状态服务场,我想处理多个“区域”——这样,如果服务出现故障,只有一个区域会受到影响。最初这似乎是一个好主意,但我宁愿事先知道:
我有一个 2 节点 Redis 集群设置。
[主站] 192.168.56.102:Redis主站(:6379),Redis从站(:6380),哨兵(:26379),哨兵#2(:26380)
[救援]192.168.56.103:Redis Master(:6379),Redis Slave(:6380),Sentinel(:26379)
每个从属实例都是同一机器上主实例的从属实例。每个哨兵实例监控两个主实例。
我将上述内容与 twemproxy (与这个问题无关)和 client-reconfig-script 结合使用来更新 twemproxy 配置,以便应用程序继续工作。
我正在停止服务器以查看发生了什么以及一切是否正常工作。
[master] stop redis master:法定人数能够成功选举新的master。登录下面。
==> /tmp/sentinel.log <==
[14701] 29 Dec 18:16:55.096 # +sdown slave 192.168.56.102:6379 192.168.56.102 6379 @ master 192.168.56.102 6380
[14705] 29 Dec 18:16:55.096 # +sdown slave 192.168.56.102:6379 192.168.56.102 6379 @ master 192.168.56.102 6380
[14701] 29 Dec 18:18:04.187 # -sdown slave 192.168.56.102:6379 192.168.56.102 6379 @ master 192.168.56.102 6380
[14705] 29 Dec 18:18:04.236 # -sdown slave 192.168.56.102:6379 192.168.56.102 6379 @ master …Run Code Online (Sandbox Code Playgroud) 我通过以下方式安装了 Redisbrew install redis并尝试通过以下方式将其添加为服务:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Run Code Online (Sandbox Code Playgroud)
这些没有产生任何错误;但是,Redis 似乎没有启动。如果我跑redis-cli ping,我就会回来Could not connect to Redis at 127.0.0.1:6379: Connection refused。
我可以redis-server在另一个终端窗口中手动运行,但我希望 Redis 在登录时自动启动。
我还尝试卸载 Redis,重新安装它,并使用它brew services来管理服务(brew services安装 MongoDB 和 Cassandra 对我来说很好用)。
我没有看到其他人有这个问题,所以我不知道如何诊断。如果有人有任何建议,非常感谢!
我的Redis实例有一个相当持久的问题。当SELinux处于enforcing模式时,Redis服务器无法启动:
[root@server ~]# service redis start
Starting redis-server: [ OK ]
Run Code Online (Sandbox Code Playgroud)
但事实上,它并没有像所示的那样开始lsof。它不返回结果:
[root@server ~]# lsof -i :6379
Run Code Online (Sandbox Code Playgroud)
为了进一步确认它没有运行,有一个redis日志:
[5539] 21 Nov 03:44:34 # Opening port 6379: bind: Permission denied
Run Code Online (Sandbox Code Playgroud)
现在,我对管理还很陌生SELinux,所以请耐心等待,因为我可能错过了一些东西。这是我能够看到的:
[root@server ~]# semanage port -l | grep "redis"
redis_port_t tcp 6379
[root@server ~]# semanage user -l
SELinux User Prefix MCS Level MCS Range SELinux Roles
....
redis user s0 s0 user_r
....
Run Code Online (Sandbox Code Playgroud)
上述redis用户最初并不存在,但我尝试将其添加为redis-server真正在其下运行的用户。那没有帮助...
需要注意的是,Redis …
我一直在使用 AWS Elasticache 阅读有关 Redis 的内容,但对安全性有点困惑。到目前为止,似乎唯一的安全措施是创建一个仅允许来自特定安全组或 IP 地址的访问的 Redis 安全组。
我可以/应该添加任何额外的安全性吗?
有没有办法将 Redis 访问安全附加到 IAM 角色?
我已经在使用 AWS Elasticache Redis,但没有“传输中加密”。我创建了一个启用此加密的新小型/临时集群,但无法连接到它 -
redis-cli error: Connection reset by peer
eg: redis-cli -h aws.host.name -p 6379
Run Code Online (Sandbox Code Playgroud)
注意:当 Redis 集群上未启用传输加密时,连接正常。
我确定这是因为我没有使用 EC2 实例中的 TLS 加密:
“要连接到启用了传输中加密的集群,必须启用数据库的传输层安全性 (TLS)。要连接到未启用传输中加密的集群,数据库不能启用 TLS。”
问题:
非常感谢。
我正在阅读大量有关 Redis 网络配置的文档,但我对架构心智模型中的要求似乎与当前选项不符的情况感到困惑。
首先:我不需要分片,因为目前可扩展性不是问题。所以现在只有一个主节点(节点 M)。
第二:我想要冗余,也就是说,如果一个主节点出现故障,我想要第二个节点接管,并执行客户端发送它们的请求。我们称其为第一个从站:故障转移从站(节点 FS)。
第三:我还想要另一个副本节点,它是一个从属节点,但只提供只读查询。如果客户端连接到它,并且客户端尝试修改数据,则节点应该给出错误。我们称其为第二个从站:只读从站 (RS)。
最后:我想要只读从属设备的故障转移。也就是说,如果 RS 死了,我希望另一个只读从站接管它的任务。我们称之为第四个从站:故障转移只读从站 (FRS)。
有没有办法像这样配置Redis?似乎所有的部署模式(正在阅读这篇文章:https : //blog.octo.com/en/what-redis-deployment-do-you-need/)除了集群之外都有一个主节点。现在,似乎我的“FS”节点将成为第二个主节点,因为它接受写查询,但是,集群配置默认启用分片,并且似乎没有正常的方法可以禁用它,除非我遗漏了一些东西。
failover replication high-availability failovercluster redis
我在将 Kubernetes 上的 Redis 集群暴露给外部应用程序时遇到问题。使用 Kubernetes 负载均衡器服务,我可以将外部 IP 分配给 Redis,以提供初始连接。问题是,每当客户端收到MOVED命令时,IP 地址都是 Kubernetes 内部 POD IP,集群外部的 Redis 客户端无法访问该 IP 地址。
redis-cli以下是演示的示例会话:
10.150.0.5:7000> set test value
-> Redirected to slot [6918] located at 10.28.1.9:6379
Could not connect to Redis at 10.28.1.9:6379: Operation timed out
Run Code Online (Sandbox Code Playgroud)
你如何解决这个问题?我读过的教程/指南都没有对将集群暴露给外部服务提供太多说明。大多数人关心的是在 K8s 中设置 Redis 集群。
redis ×10
failover ×2
amazon-ec2 ×1
amazon-vpc ×1
cluster ×1
kubernetes ×1
launchctl ×1
linux ×1
mac-osx ×1
nginx ×1
proxy ×1
replication ×1
selinux ×1
session ×1