标签: redis

如何通过主机名而不是 ip 链接 redis 集群中的节点?

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)。

redis

6
推荐指数
1
解决办法
6074
查看次数

Nginx 动态上游配置/路由

我正在尝试 nginx 的动态上游配置,但找不到任何好的解决方案来实现来自第三方源(如 redis 或 mysql)的上游配置。

其背后的想法是在主服务器中拥有单个文件配置,并根据环境条件将请求代理到各种应用程序服务器。考虑一下动态部署,其中有 X 个服务器在不同端口上运行 Y 个工作线程。例如,我创建一个新应用程序并部署。应用程序管理器选择一个服务器,然后推出一个工作程序(Ruby/PHP/Python),然后将 ip:port 报告给中央数据库,状态为“up”。此时,当我转到给定的 url 时,nginx 应该将所有请求代理到指定的 ip:port 上游。整个事情与 Heroku 所做的非常相似,除了这个概念验证不应该准备好生产,主要是为了内部需求。

我发现的最简单的解决方案是使用带有基于 ruby​​ 的 DNS 服务器的解析器。它可以工作,nginx 正确获取 IP 地址,但唯一的问题是您无法为该 IP 定义端口号。

第二个解决方案(我还没有尝试过)是使用其他东西作为代理服务器,可能是用 Erlang 编写的。在这种情况下,我们需要使用一些东西来提供静态内容。

有什么想法如何以更灵活和稳定的方式实现这一点?

PS 一些研究选择:

nginx proxy redis dynamic-routing

5
推荐指数
1
解决办法
1万
查看次数

在服务器上安装多个 redis 实例是个好主意吗?

正如标题所说。我正在考虑使用 redis 创建一个状态服务场,我想处理多个“区域”——这样,如果服务出现故障,只有一个区域会受到影响。最初这似乎是一个好主意,但我宁愿事先知道:

  1. 安装多个并排的 redis 实例是个好主意吗?
  2. Redis只在RAM中存储数据?
  3. 典型的 redis 实例使用多少 RAM?(我意识到这可能是一个理所当然的问题,但我喜欢一些猜测)

linux session redis

5
推荐指数
1
解决办法
3842
查看次数

Redis/Sentinel 集群故障转移导致“故障转移-中止-未选举主服务器”

我有一个 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)

cluster failover redis

5
推荐指数
1
解决办法
1万
查看次数

使用 Homebrew 在 OS X 上将 Redis 作为服务启动

我通过以下方式安装了 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 对我来说很好用)。

我没有看到其他人有这个问题,所以我不知道如何诊断。如果有人有任何建议,非常感谢!

mac-osx launchctl redis

5
推荐指数
2
解决办法
8288
查看次数

SELinux下无法启动Redis

我的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 …

selinux redis

5
推荐指数
1
解决办法
1万
查看次数

如何在 AWS elasticache 上保护 Redis 集群

我一直在使用 AWS Elasticache 阅读有关 Redis 的内容,但对安全性有点困惑。到目前为止,似乎唯一的安全措施是创建一个仅允许来自特定安全组或 IP 地址的访问的 Redis 安全组。

我可以/应该添加任何额外的安全性吗?

有没有办法将 Redis 访问安全附加到 IAM 角色?

amazon-web-services redis amazon-elasticache amazon-vpc

5
推荐指数
2
解决办法
3506
查看次数

AWS Redis 传输中加密 + TLS EC2 连接

我已经在使用 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。”

问题:

  • 我真的不知道如何在 EC2 上启用 TLS 加密。我该如何做到这一点?我需要使用隧道还是可以使用 AWS SSL 证书?
  • 这会对性能产生什么影响?
  • 我也在查看 Redis AUTH 密码。这对性能影响很大吗?我猜想如果 Redis 的频率很高的话它也能做到。

非常感谢。

amazon-ec2 amazon-web-services redis

5
推荐指数
1
解决办法
9283
查看次数

Redis:只读从站与故障转移从站?

我正在阅读大量有关 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

5
推荐指数
1
解决办法
3487
查看次数

如何将 Kubernetes 集群内的 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 kubernetes google-kubernetes-engine

5
推荐指数
1
解决办法
9143
查看次数