nodejs 使用 pm2 启动集群模式,全局变量怎么共享?

2019-06-11 18:23:53 +08:00
 rizon

nodejs 写了一个 map 做内存缓存,但是使用 pm2 启动集群模式,就会导致每个都有自己的 map 缓存,
这就导致数据不一致了,这怎么解决?

4069 次点击
所在节点    程序员
20 条回复
90928yao
2019-06-11 18:27:17 +08:00
redis 发布订阅 http 接口通知
rizon
2019-06-11 18:41:09 +08:00
@90928yao #1 太麻烦了,不想上中间件
WittBulter
2019-06-11 18:48:02 +08:00
集群模式每个都是独立的,应该没有状态共享,否则就 **不应该** 用集群模式。(业务应该用 redis 等第三方的共享状态)
如果你强行要这么做,可以用 rpc 通信,参考 dnode 项目。
yixiang
2019-06-11 18:48:59 +08:00
改用 cluster 然后互传信息。

或者内存映射一部分到磁盘,缓存写入这个磁盘里一个 json 文件。

上 redis 或类似的玩意其实是最简单直接的。
chenqh
2019-06-11 19:36:33 +08:00
还是 redis 把,简单粗暴
rizon
2019-06-11 21:07:20 +08:00
@WittBulter #3
@yixiang #4
@chenqh #5
1g 内存的机器不够用了快。
那我换个思路,有没有办法让指定链接的请求固定只走集群中的一个节点?
因为我只是对其中一个特定的请求做了缓存,所以这个请求可以有办法让他固定只走一个节点吗?
yangg
2019-06-11 21:11:05 +08:00
Haproxy 这样就用不了集群模式了
guagusi
2019-06-11 21:30:39 +08:00
@rizon Nginx 七层负载均衡
runtu2019
2019-06-11 21:44:37 +08:00
写个配置文件或者数据库保存集群主机的 ip 地址或者访问地址,明确哪台机器为主是可以写的

写个 json 接口,可以读取缓存内容和提交缓存内容
更新缓存的是时候,根据配置文件访问接口提交到可以写的主机内
其他的主机根据配置文件的 ip 和接口做定时同步,同时这个动作可以作为心跳检查,接口获取不了就切换主机

但是你这么做不觉得累的慌吗,redis 不好吗
rizon
2019-06-11 22:25:19 +08:00
@runtu2019 #9 我是一台机器,使用 pm2 开的 nodejs 的 cluster 模式,所以 ip 和端口号是同一个。我想要明确的调用其中一个是不是做不到?
jybox
2019-06-11 22:35:23 +08:00
Redis 本身也就 10M 内存,而且集中在 Redis 而不是每个进程存一份的话,应该是更省内存的。
rizon
2019-06-11 22:41:42 +08:00
@jybox #11 看了下 memcache 这个不是比 redis 还要轻便一些?
jybox
2019-06-11 22:47:31 +08:00
确实,但我还是更推荐 Reids,功能多太多了
version
2019-06-11 22:52:45 +08:00
优先选择 redis,没数据也占用 10m 内存都不到,pm2 集群部署不就是多进程,只能用第三方来处理,而且 1 核的主机开集群,真的会比之前快么,楼主应该不是后端开发吧
gzlock
2019-06-11 22:54:22 +08:00
用文本文件(json)或者 sqlite 就可以了啊
kawana
2019-06-11 22:56:37 +08:00
> 有没有办法让指定链接的请求固定只走集群中的一个节点

可以了解一下 nginx 的负载均衡用 **一致性哈希**
joouis
2019-06-11 23:32:04 +08:00
RPC 或 Redis 吧
rizon
2019-06-12 02:08:08 +08:00
@version #14 我是后端开发哈,单点开集群的作用似乎是没啥用。。。。算是为以后多点部署做准备吧。。。
已经换了 memcache 了,docker 版,初始化内存占用 2-3m。就是个分布式共享,memcache 足够了。
sunmonster
2019-06-12 08:49:01 +08:00
现在所谓的轻量级和重量级都是按功能算的吗。。。
rizon
2019-06-12 10:30:22 +08:00
@sunmonster #19 哈哈 本人小白,不专业,见笑哈。这东西应该怎么判断?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX