案例基础:在Google Cloud中部署了一个redis实例(单个实例) . 使用基于NodeJS的服务器和redis-sentinel库连接到节点 . 原因是谷歌 Cloud 上节点的基于哨点的管理 .
我可以通过dashboard / console的SSH登录登录redis实例 . 使用redis-cli连接到redis的本地运行服务,可以创建/编辑各种数据集 .
问题:当我尝试通过我的localhost或部署在同一项目域中的任何其他计算实例访问它时 . 我正在使用公共IP和端口26379/6379进行连接,但连接被拒绝 .
可能的原因:
- 网络访问政策 .
3 回答
上周挣扎着为自己设置这个,想分享我在这里学到的经验教训 . 希望这是有帮助的,即使这已经晚了将近一年:)
我正在使用点击部署方案here(Redis by Redis,而不是Bitnami),它允许奇数个虚拟机作为集群 .
创建部署后,我必须在每个VM上执行以下手动步骤,以使其可用作标记集群:
redis-cli
并运行CONFIG SET protected-mode no
和CONFIG REWRITE
. 这将使redis服务器暴露给外部连接 .sudo vi /etc/redis/sentinel.conf
并添加protected-mode no
所以哨兵也可以相互连接sudo /etc/init.d/redis-sentinel start
启动哨兵服务redis-cli -p 26379
并通过运行sentinel ckquorum master
检查sentinel状态 . 期望看到'OK X usable Sentinels',X是群集中的VM数量 .剩饭剩菜:
redis-sentinel
不作为服务运行 . 需要添加到/etc/rc?.d
旁边redis-server
/etc/init.d/redis-{server,sentinel}
不是作为正确的Debian服务编写的,因此一旦被杀死它们就不会重生 .总体而言,这个产品非常失望,期待更完整的设置 .
通常,Google的点击部署服务不会自动添加网络/防火墙规则和策略 - 您必须自己执行此操作 .
显然,打开端口时应该小心,只允许从计算引擎网络进行访问 .
当您开始使用Google Cloud时,他们会将您的整个基础架构保留在私有 Cloud 中(即使是跨区域),除非您启动需要与外部 Cloud 通信并因此需要临时IP的实例,否则会为其分配私有IP . 允许私有 Cloud 中的所有实例使用私有IP进行相互访问 . 默认情况下,这是在系统的防火墙规则中设置的,因此您无需进行设置 .
最佳实践是为GUI / API的公共访问提供单一节点,并通过内部IP绑定其余节点 . 在私有 Cloud 中节省时间,减少延迟并确保安全 .
在我的案例中,问题当然是@Tom指定的防火墙规则 . 您可以修改策略以允许连接 . 但我建议任何人使用内部IP来连接不同的实例 .