Centrifugo(九)使用 Redis 实现伸缩

    Centrifugo 服务器支持多节点部署,并支持对客户端请求的负载均衡。本文中,我们将启动三个 Centrifugo 服务节点来进行演示,这些节点通过 Redis 互相连接。为了达到这个目的,我们将使用前面章节中讲到的 Redis engine

    首先,我们需要有一个处在运行状态的 Redis 服务器。然后,我们可以一次启动三个 Cetrifugofu 服务节点:

    打开命令行窗口,启动第一个节点:

 centrifugo --config=config.json --port=8000 --engine=redis --redis_host=127.0.0.1 --redis_port=6379  

    如果 Redis 和 Centrifugo 运行在同一台机器,并且使用了默认的端口号,上面命令中的 redis_hostredis_port 选项可以省略。

    然后打开一个新的命令行窗口,启动第二个节点:

 centrifugo --config=config.json --port=8001 --engine=redis --redis_host=127.0.0.1 --redis_port=6379  

    此命令中,我们指定了一个新的端口 8001,以防与节点一出现端口冲突。如果你的两个节点不在一台机器上,则不存在该问题。

    接下来再次开启一个新的命令行窗口,启动第三个节点:

 centrifugo --config=config.json --port=8002 --engine=redis --redis_host=127.0.0.1 --redis_port=6379  

    现在你已经拥有了三个 Centrifugo 实例,分别运行在 800080018002 端口,客户端可以选择连接任何一个实例。同样,你也可以发送 API 请求到任何一个节点。这三个节点通过 Redis 的 PUB/SUB 机制实现消息共享。

    多个节点之间的负载均衡可以通过 Nginx 实现。要非常注意的一点是,如果你的客户端使用了 SockJS 连接到 Centrifugo 节点,那么接下来的该客户端的请求只能路由到同一节点,因为该节点保存了客户端的会话信息。而使用 websocket 则不存在该问题。

Redis 分片

    从 V1.6.0 开始 Centrifugo 内置了对 Redis 分片的支持。

    该功能防止 Redis 在大型的 Centrifugo 应用中成为性能瓶颈。Redis 是单线程服务器,它速度非常快,但是当你的 Redis CPU 使用率接近 100% 的时候,分片可以帮助你的应用程序实现扩展。

    目前,Centrifugo 支持基于逗号的简单方法来配置 Redis 分片。

示例一(基于本机运行的两个 Redis 分片来启动 Centrifugo):

 centrifugo --config=config.json --engine=redis --redis_port=6379,6380  

示例二(基于运行在不同主机上的 Reids 实例来启动 Centrifugo):

 centrifugo --config=config.json --engine=redis --redis_host=192.168.1.34,192.168.1.35

    启用分片后,Centrifugo 将使用一致性哈希算法在已配置的 Redis 实例上传播频道和历史/状态信息。