nodejs 使用 pm2 启动集群模式,全局变量怎么共享? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX    程序员

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

  •  
  •   rizon
    othorizon 2019-06-11 18:23:53 +08:00 4654 次点击
    这是一个创建于 2314 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言    2019-06-11 22:33:57 +08:00
    或者有没有更轻便的全局共享的方案? redis 太大了,太占内存了。也太重了,我就是一个很小需求点。
    比如写文件或者其他的方式。
    第 2 条附言    2019-06-11 22:46:27 +08:00
    打算用 memcache 了,感觉这个比 redis 更轻量一些吧? 项目是 nodejs 的
    第 3 条附言    2019-06-12 02:08:55 +08:00
    已经上 memcached 了,docker 版初始化内存占用 2-3m。目前感觉良好,功能确实很少。
    20 条回复    2019-06-12 10:30:22 +08:00
    90928yao
        1
    90928yao  
       2019-06-11 18:27:17 +08:00
    redis 发布订阅 http 接口通知
    rizon
        2
    rizon  
    OP
       2019-06-11 18:41:09 +08:00
    @90928yao #1 太麻烦了,不想上中间件
    WittBulter
        3
    WittBulter  
       2019-06-11 18:48:02 +08:00
    集群模式每个都是独立的,应该没有状态共享,否则就 **不应该** 用集群模式。(业务应该用 redis 等第三方的共享状态)
    如果你强行要这么做,可以用 rpc 通信,参考 dnode 项目。
    yixiang
        4
    yixiang  
       2019-06-11 18:48:59 +08:00
    改用 cluster 然后互传信息。

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

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

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

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

    可以了解一下 nginx 的负载均衡用 **一致性哈希**
    joouis
        17
    joouis  
       2019-06-11 23:32:04 +08:00 via Android
    RPC 或 Redis 吧
    rizon
        18
    rizon  
    OP
       2019-06-12 02:08:08 +08:00
    @version #14 我是后端开发哈,单点开集群的作用似乎是没啥用。。。。算是为以后多点部署做准备吧。。。
    已经换了 memcache 了,docker 版,初始化内存占用 2-3m。就是个分布式共享,memcache 足够了。
    sunmonster
        19
    sunmonster  
       2019-06-12 08:49:01 +08:00
    现在所谓的轻量级和重量级都是按功能算的吗。。。
    rizon
        20
    rizon  
    OP
       2019-06-12 10:30:22 +08:00
    @sunmonster #19 哈哈 本人小白,不专业,见笑哈。这东西应该怎么判断?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2723 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 08:35 PVG 16:35 LAX 01:35 JFK 04:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86