运行 Redis Sentinel、HAProxy 和 Apache/w PHP 在同一台服务器上

Running Redis Sentinel, HAProxy and Apache/w PHP on the same servers

我正在尝试为我的服务器架构引入更多冗余和可靠性。

目前我有可变数量的 Web 服务器(至少两个)运行 apache,PHP 和 Memcached 用于会话,这意味着如果其中一台服务器出现故障,用户将拥有重新登录。

经过大量研究,我决定让 Redis 去存储会话,让 Redis Sentinel 管理 Redis 实例故障,让 HAProxy 将会话传递给指定的 Redis Master。

尽管阅读了几天,但我还是不清楚所有这些东西在哪里组合在一起。假设我至少有两台前端服务器和两台 Redis 服务器,可以这样吗:

 Load balanced connection
           |
     -------------
     |           |
----------  ----------       
| Apache |  | Apache |
|Sentinel|  |Sentinel|
| HAProxy|  | HAProxy|
----------  ---------- 
     |          |
     |----------
     ?          ?           - Managed by HAProxy,
----------  ----------        by talking to Sentinel
|        |  |        |
| Redis  |  |  Redis |
|        |  |        |
----------  ----------

然后通过添加更多 Apache/Sentinel/HAProxy 服务器来扩大规模?如果是这样,这是否适用于小型(1GB 内存)实例,或者 Sentinel/HAProxy 占用大量资源?

其次,HAProxy 如何可靠地与 Sentinel 通信?关于它的工作原理似乎有很多相互矛盾的建议。

非常感谢您提供的任何帮助!

最后,让它工作的最简单方法是避免使用 HAProxy,并使用 Sentinel 告诉 Web 服务器哪个 Redis 服务器是主服务器。

为此,我制作了一个 masterupdate.sh 脚本,其中包含以下内容

#!/bin/bash
echo  > /location/master.txt

并编辑 redis/sentinel.conf 以包含以下行

sentinel client-reconfig-script cache-master /location/masterupdate.sh

这意味着每次 master 切换时,Sentinel 都会将 IP 地址写入 master.txt 文本文件,我可以从 PHP 读取该文本文件以设置会话。简单!