野火IM 社区版IM Server集群部署思路
野火IM 免费版 集群部署思路
单机版本改造成集群版本需要解决的问题
- 集群缓存同步
- Session同步
- MQTT 连接状态同步
- nginx配置
集群缓存同步方案
1.将hazelcast切换成 jetcache 二级缓存 或 多级缓存,我使用的是三级缓存 Caffeine + Redis + DB,因为hazelcast使用到了MapStore功能,所以我添加了DB作为三级缓存
2.使用 mq 来用作集群缓存状态变更通知,使每台机器上的 jetcache 缓存值一致
Session同步
类似于web项目中的session状态都放在redis中,但是此处不可以,如果放入redis 需要更改项目实体,我的解决方案是
- session 发生变更则发送MQ 消息
- 其他机器收到session变更消息后,刷新本地session缓存
MQTT 连接状态同步方案
除了缓存之外,还有 MQTT 连接,例如
A 连接到 192.168.0.1 服务器
B 连接到 192.168.0.2 服务器
A 发送消息给 B,B 需要收到消息通知后再去拉取消息
但是 B 和 A 不在同一台服务器上,这个之后就要将消息通知到 192.168.0.2 服务去发送给 B
我的方案是:
如果判断接收方是否在当前服务器,
如果在则发送,
不在则发送 MQ 消息,通知所有服务器去发送消息,消费服务器发现接收方不在当前服务器则跳过,存在则发送
Nginx配置
- Im-server MQTT(1883端口) 域名配置,见文章最后nginx.conf参考
- Im-server 80 端口服务配置,broker 文件夹下的nginx 配置就可直接使用,可以通过 nginx 端口转发 换掉 80 端口,本地测试最好使用 80 端口,使用 nginx 转发可以换成其他端口
- Im-server 18080 端口 Admin API 服务配置,参考broker 文件夹下的nginx
MQTT nginx 配置参考
stream { log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time'; access_log /www/wwwlogs/tcp-access.log tcp_format; error_log /www/wwwlogs/tcp-error.log; include /www/server/panel/vhost/nginx/tcp/*.conf; upstream mqttserver{ server 192.168.0.179:1883; }
#MQTT nginx 配置 server{ listen 1883; proxy_pass mqttserver; }
}